进程和线程
背景:当我们执行一段代码,运行一个程序的时候,这个程序所需要的资源必须到位(显卡,GPS之类的),我们将除了CPU之外的PC资源统称为程序的上下文。
一个电脑中会有多个任务同时执行,每个任务的时间片(CPU的分配时间)是定义好的,当任务的时间片用完之后,就会被切换出去,等待下一次CPU的到来。(所以说电脑中的任务看似是同时执行的,其实是CPU切换的速度很快—这是对于单核处理器而言)
程序的执行过程CPU加载程序A的上下文—然后执行程序A—时间片用完—CPU保存程序A的上下文—切换到B…
进程:资源拥有的基本单位
通俗的来说进程就是一段程序的执行过程(CPU加载上下文+CPU执行+CPU保存上下文,这段时间)进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。
为什么引入线程
没有引入线程之前进程作为能拥有资源和独立运行的基本单位。它拥有独立的堆栈空间和数据段,所以每当启动一个新的进程必须分配给它独立的地址空间,建立众多的数据表来维护它的代码段、堆栈段和数据段,这对于多进程来说十分“奢侈”,系统开销比较大(多进程的时候,每当你切换下一个进程时,都要加载和保存上下文环境,这样会浪费时间,为了提高CPU资源的利用率引入线程)。所以在进程中引入线程,进程只是作为资源的分配和调度的基本单位,而线程作为CPU调度和分配的基本单位。
线程:CPU调度和分配的基本(最小)单位。
它可以与同一进程的其他线程共享进程的上下文环境,彼此之间使用相同的地址空间。线程之间的切换开销就会变得很小(无需加载和保存上下文环境,开辟新的地址空间),当一个进程中有多个线程的时候,多任务的处理会比没有引入线程之前快。
并发是把CPU运行时间划分成若干个时间段,每个时间段再分配给各个线程执行,当一个线程在运行时,其它线程处于挂起状。(多线程并发只是表面和感觉上的并发,并不是实质上的并发。一个线程要运行,它必须占有CPU,而我们目前用的计算机大多都是单CPU的,所以一次最多只能有一个线程获取CPU并运行。)从宏观角度是同时进行的,但从微观角度并不是同时进行。
多线程的好处:
- 在多个cpu核心下,多线程的好处是显而易见的,不然多个cpu核心只跑一个线程其他的核心就都浪费了;
- 即便不考虑多核心,在单核下,多线程也是有意义的,因为在一些操作,比如IO操作阻塞的时候,是不需要cpu参与的,这时候cpu就可以另开一个线程去做别的事情,等待IO操作完成再回到之前的线程继续执行即可。