像hello 这样的程序 在现代OS上运行时,OS会提供一种假象,就好像系统上只有这个程序在运行,看上去只有这个程序在使用CPU,主存,IO设备。
CPU看起来就像在不间断地一条接一条地执行程序中的指令,即该程序的代码与数据是 系统存储器中的唯一对象。这些假象是通过process的概念来实现的。
process 是OS对一个正在运行的程序的一种抽象, 在一个系统上可以同时运行多个
process
,而每个
process
都好像在独占的使用 hardware。 而并发运行,则是说一个process的指令和 另一个
process的指令 是在交错执行。
在大多数系统中,需要运行的process数量是多于运行它们的 CPU核心个数。传统系统在一个时刻只能执行一个程序,而先进的多核cpu 同时能够 执行 多个程序。
无论是单core 或者是多 core 系统中,一个CPU 看上去都像是在并发地执行多个
process,这是通过CPU在
process之间切换 时间片 来实现的。
OS实现这种交错执行的机制 称为: 上下文切换。
现在 只讨论单CPU 单core的系统的情况。多核 更复杂 以后再讲。
OS保持跟踪
process运行所需的所有状态信息。这种呢状态,也就是上下文。它包括许多信息,eg:PC和寄存器文件的当前值,以及主存的内容。 在任何一个时刻,单CPU系统都只能执行一个
process的指令(代码) ;当OS决定要把控制权 转移到某个新
process时,就会进行上下文切换,即保存当前
process的上下文,恢复新
process的上下文(context),然后将控制权传递到新process,新
process就会从上次停止的地方开始。
现在来描述下 hello 与shell的场景:
1: shell process和 hello process 。 起初,只有shell在运行(running)等待命令行的输入。
2: 当我们让它运行hello程序时,shell通过调用一个专门的函数,即 系统调用,来执行我们的请求,系统调用会将控制权 传递给 OS。
3: 操作系统 OS 保存shell process的上下文context 状态,创建一个新的 hello process及其context,然后将控制权传递给新的hello process(running)。
4:hello process return 0;终止后,操作系统OS 恢复shell的 context,并且将控制权 回传给了shell process,它将继续等待下一个命令输入。
实现 process这个抽象概念 需要低级硬件 和 操作系统软件 之间的 紧密合作。以后会结合 linux2.6 内核 讲代码。
一个process只有一个单一的控制流,但是现代OS,一个process中可以 由N个thread 执行单元组成,每一个thread 是一个单独的逻辑流。每个thread都运行在process的 context中,并共享同样地代码和全局数据。
在网络服务中 对并行处理要求高,所以多线程编程是越来越多的编程模型,因为多线程之间比多进程之间更容易共享数据,也因为thread 比 process更轻量,更高效