操作系统——进程

操作系统——进程

  • 进程前言
    • ①进程模型
    • ②创建进程
    • ③进程的终止
    • ④进程的层次结构
    • ⑤进程的状态
    • ⑥进程的实现
    • ⑦多道程序设计模型

进程前言

在任何多道程序设计系统中,CPU由一个进程快速切换到另一个进程,使得每一个进程各运行几十或几百个毫秒。严格的说,在某一瞬间,CPU只能运行一个进程。但是在1秒钟期间,它可能运行多个进程,从而产生并行的错觉,即我们所说的伪并行,并以此来区分多处理器系统【该系统有两个或多个CPU共享同一物理内存】的真正硬件并行。
人们很难对多个并行活动进行跟踪,操作系统的设计者发展了用于描述并行的一种概念模型【顺序进程】,使得并行更容易处理。有关该模型,它的使用以及它的影响是本章的主题。

①进程模型

  1. 在进程模型中,计算机上所有可运行的软件,通常包括操作系统,被组织成若干个顺序进程【sequential process】,简称进程一个进程就是一个正在执行程序的实例
  2. 从概念上说,每个进程拥有它自己的虚拟CPU。当然实际上真正的CPU在各进程之间来回切换,这种快速的切换称作多道程序设计

操作系统——进程_第1张图片
a:一台多道程序计算机的内存中有4道程序
b:这4道程序被抽象为4个各自拥有自己控制流程的进程【即每个程序有自己的逻辑程序计数器】,并且每个程序都独立的运行。当然实际上只有一个物理程序计数器,当每个程序运行时,它的逻辑程序计数器被装入实际的程序计数器中,当该程序执行结束或暂停执行时,物理程序计数器被保存在内存中该进程的逻辑程序计数器中。
c:在观察足够长一段时间后,所有的进程都运行了,但是在任何一个给定的瞬间仅有一个进程正真的在运行

一个有趣的例子
一位科学家正在为他的女儿做生日蛋糕,他现在有做生日蛋糕的食谱,厨房里有所需要的原料:面粉、鸡蛋等。
在这个比喻中:

  • 做蛋糕的食谱就是程序【也就是用适当形式描述的算法】
  • 科学家就是处理器CPU
  • 做蛋糕的原料就是输入数据
  • 进程就是科学家阅读食谱、取原料以及烘培蛋糕等一系列动作的总和。

噢,当科学家做着蛋糕时,发生意外了,他的儿子哭着跑了进来,说他被蜜蜂蛰了。科学家急忙记录下他照着食谱做到的步骤【保存进程的当前状态】,然后拿出一本急救手册,按照其中的指示处理蜇伤。

  • 我们看到处理器从一个进程【做蛋糕】切换到另一个高优先级的进程【实施医疗救治】,每个进程拥有各自的程序【食谱和急救手册】
  • 当处理完伤口,科学家又继续回来做蛋糕,从他离开时的那一步继续做下去

关键思想
一个进程是某种类型的一个活动,它有程序、输入、输出以及状态。单个处理器可以被若干个进程共享,它使用某种调度算法决定何时停止一个进程的工作,并转而为另一个进程提供服务。

②创建进程

在通用系统中,需要有某种方法在运行时按需要创建或撤销进程。
有四种主要时间导致进程的创建:

  1. 系统初始化
    系统启动时,会创建若干个进程。其中有些是前台进程,也就是同用户交互并且替他们完成工作的进程;其他的是后台进程,这些进程与特定的用户没有关系,相反,却具有某些专门的功能。例如接受电子邮件的后台程序。停留在后台处理诸如电子邮件、Web页面、打印之类活动的进程称之为守护进程【daemon】
  2. 正在运行发出系统调用,创建一个或多个新进程协助其工作
    在所要从事的工作可以容易的划分成若干个相关的但没有相互作用的进程时,创建新的进程就特别有效果。例如:有大量的数据要通过网络调取并进行顺序处理,那么创建一个进程取数据,并把数据放入共享缓冲区中,而让第二个进程取走数据项并处理之。
  3. 用户请求创建一个新进程
    双击一个图标或键入一个命令就可以启动一个程序,这两个动作都会开始一个新的进程并在其中运行所选择的程序。
  4. 一个批处理作业的初始化
    用户提交批处理作业,在操作系统认为有资源可运行另一个作业时,它创建一个新的进程,并运行其输入队列中的下一个作业

注意:

  • UNIX系统中,只有一个系统调用可以用来创建新进程:fork。这个系统调用会创建一个与调用进程相同的副本。在调用了fork后,这两个进程【父进程与子进程】拥有相同的存储映像、同样的环境字符串和同样的打开文件。通常,子进程接着执行execve或一个类似的系统调用,以修改其存储映像并运行一个新的程序。
  • Windows中,情形正好相反,一个Win32函数调用CreateProcess既处理进程的创建,也负责把正确的程序装入新的进程

③进程的终止

进程迟早会终止,通常由下列条件引起:

  • 正常退出【自愿的】
    工作完成而终止;当编译器完成了所给定程序的编译之后,编译器执行一个系统调用,通知操作系统它的工作已经完成。
    在UNIX中调用exit;在Windows中,调用ExitProcess
  • 出错退出【自愿的】
    进程引起的错误,通常是程序中的错误所致。例如执行了一条非法指令、引用不存在的内存、或除数是零等。
  • 严重错误【非自愿】
    编译程序cc foo.c时,该文件并不存在,编译器会退出
  • 被其他进程杀死【非自愿】
    某个进程执行一个系统调用通知操作系统杀死某个其他进程。
    在UNIX中是kill;Windows中是TerminateProcess
    在有些系统中,当一个进程终止时,无论是自愿的还是其他原因,由该进程创建的所有进程都将一律立即被杀死。不过UNIX和Windows都不是这种工作方式。

④进程的层次结构

在某些系统中,当进程创建了另一个进程后,父进程和子进程就以某种形式继续保持关联。子进程自己可以创建更多的进程,组成一个进程的层次结构。【进程只能有一个父进程,但是可以有零个、一个、两个或多个子进程】
UNIX:
进程和它的所有子女以及后裔共同组成一个进程组。当用户从键盘发出一个信号时,该信号被送给当前与键盘相关的进程组中的所有成员,每个进程可以分别捕获该信号、忽略该信号或采取默认的动作,即被该信号杀死。
Windows:
Windows中没有进程层次的概念,所有的进程都是地位相同的。唯一类似于进程层次的暗示是在创建进程的时候,父进程会得到一个可以控制子进程的令牌【称之为句柄】。但是,它有权将令牌传送给别的进程,这样就不存在进程层次了。在UNIX中进程不能剥夺其子女的“继承权”。

⑤进程的状态

进程三种状态:

  • 运行【该时刻进程实际占用CPU

  • 就绪【可运行,但因为其他进程正在运行而暂时停止】

  • 阻塞【除非某种外部事件发生,否则进程不能运行】
    操作系统——进程_第2张图片
    进程的三种状态之间有四种可能的转换关系:

  • 转换1:在某些系统中,进程可以调用pause来进入阻塞状态。在其他一些系统中,当一个进程从管道或设备文件【如终端】读取数据时,如果没有有效的输入存在,则进程会被阻塞。

  • 转换2和3:是由进程调度程序引起的;调度程序的主要工作就是决定应当运行哪个进程、何时运行以及它应该运行多长时间。

  • 转换4:当进程等待的一个外部事件发生时,比如一些输入到达,则发生转换4
    操作系统——进程_第3张图片
    操作系统最底层是调度程序,在它上面有许多进程。**所有关于中断处理、启动进程和停止进程的具体细节都隐藏在调度程序中。**实际上,调度程序是一段非常短小的程序。操作系统的其他部分被简单的组织成进程的形式。不过,很少有真实的系统是一这样的理想方式构造的。

⑥进程的实现

为了实现进程模型,操作系统维护着一张表格【结构数组】,即进程表process table】。每个进程占用一个进程表项【这些表项也称为进程控制块】。
该表项包含了进程状态的重要信息,包括程序计数器、堆栈指针、内存分配状况、所打开文件的状态、账号和调度信息,以及其他在进程由运行态转换到就绪态或阻塞态时必须保存的信息,从而保证该进程随后能够再次启动,就像从未中断过一样。

典型的进程表表项中的一些字段
操作系统——进程_第4张图片
第一列中的字段与进程管理有关。其他两列分别与存储管理和文件管理有关。

⑦多道程序设计模型

从概率的角度看CPU利用率
假设一个进程等待I/O操作的时间与其停留在内存中的时间的比为p
当内存中同时有n个进程时,则所有n个进程都在等在I/O【此时CPU空转】的概率为pn
那么 CPU的利用率=1-pn
操作系统——进程_第5张图片
从图中可以看到:如果进程花费80%的时间等待I/O【一个用户从终端输入的交互式进程是处于I/O等待状态】,为了使CPU的浪费低于10%,至少要有10个进程同时在内存中。

性能模拟
假设计算机有512MB内存,操作系统占用128MB,每个用户程序也占用128MB。这些内存空间允许3个用户程序同时驻留在内存中。
若80%的时间用于I/O等待,则【忽略操作系统开销下】CPU的利用率1-0.83=49%;
若增加512MB内存,可从3道程序设计提高到7道程序设计,CPU的利用率1-0.87=79%;也就是说第二个512MB内存提高了30%的吞吐量!
我们继续增加第三个512MB内存,CPU利用率1-0.8^11=91%,吞吐量的提高为12%;
通过这一模型计算,计算机用户可以确定第一次增加内存是一个合算的投资,而第二个不是。

注意:该图并不精确,是一个粗略的模型;假设所有n个进程是独立的,即内存中的5个进程中,3个运行,2个等待,是完全可接受的。但是在单CPU中,不能同时运行3个进程,所以当CPU忙时,已就绪的进程也必须等待CPU。因为进程不是独立的;
更精确的模型应该用排队论构造。

你可能感兴趣的:(操作系统)