进程、线程与协程原理及联系

进程

进程是操作系统分配资源(CPU、内存等)的基本单位,它是程序执行时的一个实例。程序运行时系统就会创建一个进程,并为它分配资源,然后把该进程放入进程就绪队列,进程调度器选中它的时候就会为它分配CPU时间,程序开始真正运行。

线程

线程是CPU调度的基本单位,它是进程的一个执行流,是CPU调度和分派的基本单位,一个进程可以由很多个线程组成,线程间共享进程的所有资源,每个线程有自己的堆栈和局部变量。线程由CPU独立调度执行,在多CPU环境下就允许多个线程同时运行,即实现并发处理操作,每个请求分配一个线程来处理。

需要注意的是,线程可以通过操作系统的系统调用来创建,这就是内核线程,由操作系统来调用。当然我们也可以在用户态自己来创建线程,自己编写调度算法,这种情况下,操作系统是不知道这些线程的存在哦,操作系统只会看到进程,而看不到进程里面用户自己创建的线程。

协程

协程是一种用户态的轻量级线程,又称微线程,英文名Coroutine,协程的调度完全由应用程序自己来控制,不需要操作系统的介入,操作系统也压根不知道协程的存在。协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈,直接操作栈则基本没有内核切换的开销,可以不加锁的访问全局变量,所以上下文的切换非常快。

进程是拥有资源的基本单位, 线程是CPU调度的基本单位

举个例子,有两个进程,一个是Word,一个是QQ音乐。Word进程打开了文件,这是它的资源,QQ音乐打开了Socket,这也是它的资源。假设Word有两个线程,T1负责接受用户的文字输入,T2负责自动保存。QQ音乐也有两个线程,T3负责从Socket中读取数据,T4负责对音乐数据进行解码。操作系统在做调度的时候,基本单位不是Word,QQ音乐这样的进程,而是T1,T2,T3以及T4这些线程。

线程池

线程池是一种对象池的思想,开辟一块内存空间,里面存放了众多(未死亡)的线程,池中线程执行调度由池管理器来处理。当有线程任务时,从池中取一个,执行完成后线程对象归池,这样可以避免反复创建线程对象所带来的性能开销,节省了系统的资源。线程池是一种池化技术,其中最核心的思想就是把宝贵的资源放到一个池子中,每次使用都从池子中获取,用完之后又放回池子供其他人使用。简单来说使用线程池有以下几个目的:

(1)线程是稀缺资源,不能频繁的创建

(2)解耦作用,线程的创建与执行完全分开,方便维护

(3)线程池是众多线程的池子,可以给其他任务进行复用

补充说明

(1)运行中的程序至少有一个进程,每个进程至少有一个线程(主线程)。

(2)进程和线程是操作系统支持的;而协程是用户态下模拟多线程的并发执行,是由开发者来负责协程的调度。