进程与线程——进程
2.1 进程
在多道程序系统中,CPU要在程序间进行切换,每个程序运行数十或者数百秒,严格的说,在任一瞬间,CPU都只能运行一个程序,而在1秒的时间内,可能运行几个程序,这样就给用户一种并行的错觉。
人们称之为伪并行(pseudo-parallelism),以区分多处理器(multi-processor)(即有两个或多个CPU共享同一个物理内存)系统真正的硬件并行。
2.1.1 进程的特点
-
程序顺序执行的特点:
-
顺序性
程序顺序执行时,其执行过程可看作一系列严格按程序规定的状态转移过程,也即是每执行一条指令,系统将从上一个执行状态转移到下一个执行状态,且上一条指令的执行结束是下一条指令执行开始的充分必要条件。
-
封闭性
程序执行得到的最终结果由给定的初始条件决定,不受外界因素的影响。
-
可再现性
顺序执行的最终结果可再现是说它与执行速度无关。只要输入的初始条件相同,则无论何时重复执行该程序都会得到相同的结果。
-
-
程序并发执行的特点
-
间断(异步)性
程序并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的程序之间形成了互相制约的关系:并发程序具有“执行—暂停—执行”的间断性的活动规律。
-
失去封闭性
当系统中存在着多个可以并发执行的程序时,系统中的各种资源将为他们共享,而这些资源的状态也由这些程序来改变,致使其中任一程序在运行时,其他环境都必然受到其他程序的影响。
-
失去可再现性
两个循环程序A和B,它们共享一个变量N。
程序A每执行一次时,都要做N=N+1操作;
程序B每执行一次时,都要做执行Print(N)操作,之后执行N=0操作;
A、B以不同的速度运行,则可能出现下述3种情况(假设某时刻变量N的值为n)
n+1,n+1,0
n,n+1,0
n,0,n+1
-
2.1.2 进程模型
在该模型中,计算机中所有可运行软件,有时也包括操作系统,被组织为若干顺序进程(sequential process),简称为进程(process)。
进程的概念
进程就是一个正在执行的程序,包括程序计数器、寄存器和变量的当前值
从概念上说,每个进程都有其自己的虚拟CPU,其关键思想是:进程是某种类型的活动。它有程序、输入、输出和状态。而多道程序(multiprogramming)就是在几个进程之间快速的来回切换。
(a) 4程序的多道程序
(b) 4个独立连续的进程的概念模型
(c) 任何实例中都只有一个程序是激活的

由于CPU在进程间来回切换,进程执行其计算速率并不一致,甚至同一个进程再次运行的时候其速率也会不同。因此,进程的编写不能包含固定记时的假设。
当进程有此类严格的实时需求时,也就是特定事件按必须在指定的毫秒内发生,那么必须采用特殊的措施来确保其发生。
不过,通常大部分进程并不受基本的CPU多道程序或者不同进程的相对速度的影响。
进程模型的关键
-
进程是某种类型的活动。它有程序、输入、输出和状态。
-
单处理器可以被几个进程所共享,使用某些调度算法来确定什么时候停止一个进程的工作,并且给另一个进程服务。
2.1.3 进程创建
导致进程创建的四个主要事件
- 系统初始化
- 执行由运行进程调用的进程创建系统调用
- 用户请求创建新的进程
- 批处理作业的启动
系统初始化
操作系统引导后,一般会创建几个进程。
-
前台进程(其中一些):与用户交互并且为他们完成工作的进程
-
后台进程(其他):它们不与实际用户交往,但是有某些特殊的功能
保持在后台处理诸如email、网页、新闻、打印等作业的进程称为端口监控程序(daemons)
系统调用
- 正在运行的程序发出系统调用
- Linux:fork
- fork可以从当前复制所有进程信息都另一个进程,然后两个进程可以执行不同的代码。
- Windows:CreateProcess
- 看来用法是 指定一个exe的路径,然后指定参数,来运行这个exe。
- Linux:fork
- 交互式系统中启动一个程序
2.1.4 进程终止
进程终止的条件:
- 正常退出(自愿的):如用户点击交互式页面的叉号,或程序执行完毕调用发起系统调用正常退出,在linux中用exit,在windows中用ExitProcess
- 错误推出(自愿的):python a.py中a.py不存在
- 致命错误(非自愿的):执行非法指令,如引用不存在的内存,1/0等,可以捕捉异常,try...except...
- 被其他进程取消(非自愿的):如kill -9
- 我们经常会用到
kill命令去杀死一个进程,但是有时会出现kill不成功的现象,这是就要用到kill -9
- 我们经常会用到
2.1.5 进程层次
在某些系统中,当一个进程创建另一个进程时,父进程和子进程继续以某种方式关联。子进程自己也可以创建更多的进程,以形成进程层次。
在UNIX中,进程以及所有孩子,和更新的后裔一起形成了进程组
Windows没有进程层次的概念。所有进程都是平等的。唯一有点像就能成层次的就是,当一个进程创建后,其父进程赋予一个特殊的标记,称为句柄(handle),句柄可用于控制子进程。
2.1.6 进程状态
当一个进程被中断时,是因为从逻辑上它无法继续,典型的就是由于它等待输入
同样,也有可能出现这种现象,就是某个进程从概念上说已经就绪,而且也能够运行,但是因为操作系统决定把CPU分配给其他进程而被停止。
这两个条件是完全不同的。第一种情况,挂起是该问题的固有特性。而第二种情形,是系统的技术性问题。

转换1:阻塞
转换4:唤醒
转换2和3:调度
2.1.7 进程的实现
为了实现进程模型,操作系统保存着一张进程表(process table),每个进程有一项,通常称作进程控制块(Process Control Block,PCB)。包含了进程的状态、其程序计数器、堆栈指针、内存分配、打开文件的状态、账目和调度信息以及所有其他与进程有关的、必须保存的东西。
这样,当进程从运行态切换到就绪态或者阻塞态之后,稍后可以重启,就像从来没有停止过一样。

2.1.8 多道程序建模

采用多道程序设计,可以提高CPU的利用率。
更高的模型是从概率角度来看CPU的使用。假设某个进程等待I/O完成的事件占其运行时间的比例为p,当内存中有n进程时,则所有n个进程都等待I/O(此时CPU空闲)的概率为\(p^n\)。
则CPU的利用率为:
n称为多道程序道度(degree of multi-programming)。

浙公网安备 33010602011771号