进程在运行时一般会处于两种状态:用户态,内核态。
用户态是指进程在用户代码中运行。内核态是指进程进入内核代码,执行内核的代码。从用户态到内核态的转换情况一般有以下三种:
(1)发生系统调用;(2)CPU执行异常;(3)外围设备发来中断请求
进程切换,是指CPU执行一个进程A,进程A可能因为某些原因被阻塞(比如,等待进程B给它发送数据),那么CPU会被其他处于就绪状态的进程C抢占CPU,CPU执行进程C的相关指令。 CPU执行进程A的指令到执行进程C指令的过程就是进程切换。
在由进程A切换到进程C时,
(1)内核首先将进程A的状态以及在CPU寄存器存储的数据状态指令等,保存在进程A描述符指向的内存区域中。
(2)内核然后将进程C描述符指向的相应状态数据,装载到CPU的相应寄存器中。完之后,CPU开始执行进程B的相应指令。
因为进程是资源分配的基本单位, 因此进程之间切换时,需要保存、装载各种状态数据等资源, 所需的代价较高。
联想到线程是CPU调度的基本单位,同一个进程内的线程共享OS给该进程分配的资源,因此线程切换比进程间切换所需的代价较小。
建议:操作系统相关的理论书籍很多,但是如果只看理论,表面上理解了,但是在实际编程时就又糊涂了。 因此个人觉得,再看理论时,要结合实际编码,或者将自己假设为CPU或者OS来理解理论,这样理解的效果更好。