进程
进程是操作系统对正在运行程序的一种抽象。
单核CPU只能同时运行一个程序,多核CPU能同时运行与核心数相当的程序,当总运行的核心数大于CPU核心数时,CPU就需要不断在进程中切换,实现并行运行。
当操作系统决定要把控制权从当前进程转移到某个新进程时,即进程切换时,就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程。
上下文:进程运行所需的所有状态信息,比如 PC 和寄存器文件的当前值,以及主存的内容。
最开始,只有 shell 进程在运行,即等待命令行上的输人。当我们让它运行 hello 程序时,shell 通过调用一个专门的函数,即系统调用,来执行我们的请求,系统调用会将控制权传递给操作系统。操作系统保存 shell 进程的上下文,创建一个新的 hello 进程及其上下文,然后将控制权传给新的 hello 进程。hello 进程终止后,操作系统恢复 shell 进程的上下文,并将控制权传回
给它,shell 进程会继续等待下一个命令行输人。
从上述可以看出,从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的。那么什么是内核呢?
内核是操作系统代码常驻主存的部分,是应用程序和操作系统的中间人。当应用程序需要操作系统的某些操作时,比如读写文件,它就执行一条特殊的系统调用(system call)指令,将控制权传递给内核。然后内核执行被请求的操作并返回应用程序。
注意,内核不是一个独立的进程。相反,它是系统管理全部进程所用代码和数据结构的集合。
线程
在现代系统中,一个进程上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。