2.1进程

2.1.1 进程模型

定义:计算机上所有可以运行的软件,操作系统,被组织成若干顺序进程,简称进程。一个进程就是一个正在执行程序的实例,包括程序计数器,寄存器,私有的虚拟地址空间。

如果计算机只有一个cpu,运行多个进程时会来回地切换进程上下文(context)。如图:

2.1.2 进程的创建

进程的创建有主要有四种事件:

1.系统初始化   2.正在运行的程序执行了创建进程的系统调用(fork)   3.用户请求创建一个新进程   4.一个批处理作业的初始化

ps:在linux系统中通过fork系统调用复制出一个与调用进程一样的进程,包括地址空间与程序计数器,堆栈等,可以在调用execve替换掉当前的印象,达到运行其他进程的目的。

2.1.3 进程的终止

进程的终止也主要有四种事件:

1.正常退出(自愿的)   2.出错的退出(自愿的)   3.严重错误(非自愿的)   4.被其他进程杀死(非自愿)

ps:linux系统中进程可通过调用exit系统调用终止自身,这是自愿的;若进程自己处理某个事件有错误则会收到信号(被中断);调用进程调用kill向其子进程发送信号可导致子进程终止。

2.1.4 进程的结构层次

进程创建子进程后存在着父子关系,同属于一个进程组。

2.1.5 进程的状态

进程的状态实际上可以表示为FSM(finite state machine)有限状态机。如图:

进程状态的切换是通过调度程序切换的。 在2.4节的时候会提及。

2.1.6 进程的实现

操作系统维护着一张表格(一个结构数组),即进程表(progress table),该表中的字段包括:进程管理相关的寄存器,程序计数器,堆栈指针等等;存储管理相关的正文段指针(代码指针),数据段指针,堆栈指针;文件管理相关的根目录,工作目录,用户组ID等等。

与I/O相关的是一个称作中断向量(interrupt vector)的位置,包含中断程序的入口地址。例如:我们回想一下,c语言中的scanf,c艹中的cin实际上都会利用这个中断向量来使进程阻塞直到终端(键鼠)输入数据。另外,程序发送错误时也可能会引发中断。

中断发生后的工作步骤如下图:

2.1.7 多道程序设计模型

由于实际中通常有几十上百个进程在操作系统中运行,所以让cpu单独运行一个进程通常来讲是不可能的,所以经常有进程上下文的切换,这就给了我们操作系统好像只在运行一个程序的假象。

为此,我们需要cpu利用率的最大化。假设一个进程等待I/O操作的时间与其停留在内存中的时间比为p,当内存中有n个进程时,所有进程等待I/O的概率为p的n次方,则cpu的利用率为:

1-p的n次方

其中n称为多道程序设计的道数(degree of multiprogramming)

函数图像:

我们可以看到,如果你的计算机此时有8GB的内存,操作系统相关程序通常占用2GB左右(这也是为什么你的windows开机会占用内存),如果有三个2GB进程,则CPU的利用率为1-0.8^3,大概为百分之49。如果此时你觉得计算机太卡,要升级内存,那么8GB则是一个不错的选择,可以允许7个2GB进程同时运行,且cpu利用率提高到百分之79;然而再增加一个8GB内存则只提高到百分之91,提高仅为12,不是一个很划算的投资。

猜你喜欢

转载自www.cnblogs.com/manch1n/p/10296298.html