实现多任务方法:一是多颗CPU,二是单个CPU多个核心
一般桌面端产品(手机、计算机)等很注重体积的产品,一般采用多核;
而服务端领域,同时采用两者,更关注如何尽可能提升单台计算机的计算力密度
那么对于单核CPU如何实现多任务?
答案是分时系统:将CPU时间切成一段段时间片,每个时间片只运行某一个软件,比如这个时间段给软件A,下个时间段给软件B,由于时间片很小,我们会感觉AB同时运行,这种分时间片来实现的多任务系统就是分时系统。
分时系统实现原理:把当前任务保存起来,把另一个任务的状态恢复,并把CPU执行权交给它。
从CPU角度来看,执行程序主要依赖内置存储:寄存器和内存(RAM)
1、寄存器:数量少,通过寄存器名进行数据存取。
在把cpu执行权从软件A切换到软件B时候,要把软件A所有用到的寄存器先保存起来,以便于后续轮到软件A执行时候恢复,并把寄存器值恢复到软件B上一次执行时的值,然后把执行权交给软件B
2、内存(RAM):cpu在实模式和保护模式下的内存访问机制完全不同。
在实模式下,多个执行体同在一个地址空间,相互并无干扰
在保护模式下,不同任务可以有不同的地址空间,它主要通过不同的地址映射表来体现,怎么切换地址映射表,也是寄存器。
总结:执行体的上下文,就是一堆寄存器的值,要切换执行体,只需要保存和恢复一堆寄存器的值即可,无论是进程、线程、协程均如此。
1、进程(类比火车)
进程是资源(cpu、内存等)分配的基本单位。
进程控制块 (Process Control Block, PCB) 描述进程的基本信息和运行状态,所谓的创建进程和撤销进程,都是指对 PCB 的操作。
线程是独立调度的基本单位。
一个进程中可以有多个线程,它们共享进程资源。
QQ 和浏览器是两个进程,浏览器进程里面有很多线程,例如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以响应用户的其它事件。
进程是资源分配的基本单位,但是线程不拥有资源,线程间可以共享进程的所有资源。
一个进程可以包含多个线程,不同进程间数据很难共享,同一进程下不同线程间数据很容易共享,进程间不会相互影响,一个线程挂掉一般导致整个进程挂掉
线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程中的线程时,会引起进程切换。(火车换车厢)
进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,操作昂贵,而线程共享进程资源,使用相同的地址空间,因此线程切换开销要小
由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
线程间可以通过直接读写同一进程中的数据进行通信,但是进程通信需要借助 IPC。