1、进程与线程
1、线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位
2、一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线
3、进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等),及一些进程级的资源(如打开文件和信号)。某进程内的线程在其他进程不可见。
4、调度和切换,线程上下文切换要比进程切换快的多。
2、协程
历史上多线程在一些场景下的弊端:
J2EE系统中,都是给予每个请求占用一个线程去完成完整的业务逻辑(包括事务),所以系统的吞吐量取决于每个线程的操作时耗。如果遇到很耗时I/O行为,则整个系统的吞吐能力立刻下降。因为这个时候线程处于阻塞状态,如果线程线程个数很多,会存在很多线程处于空闲状态,(很多线程需要等待该线程执行完才能执行)造成资源应用不彻底。
例子:JDBC,它是同步阻塞的。这里的耗时其实是让CPU一直等待I/O返回,阻塞的线程根本没有利用CPU去做运算,而是处于空转状态。另外,线程过多,会带来更多的上下文切换带来的开销。
针对以上问题的一些解决办法:
1、但线程上加上异步回调,例如Node.js, 以及JAVA 里的Vert.x
2、协程,当出现长时间的I/O操作时,通过让出当前的协程调度,执行下一个任务的方式来消除上下文切换上的开销。
3、协程的特点
1、线程的切换由操作系统负责调度,协程由用户自己进行调度,因此减少来上下文切换
2、线程默认Stack大小是1M,而协程更轻量,接近1K.因此在大小相同的内存中,可以开启更多的协程。
3、由于在同一个线程,可以避免竞争关系而使用锁
4、适用于被阻塞的,且需要大量并发的场景。但不适用于大量计算的多线程。大量计算的需要利用多线程技术去解决。