一.和进程有关的一些概念
①一个进程就是一个正在执行程序的实例,包括程序计数器,寄存器和变量的当前值。
从概念上说,每个进程拥有它自己的虚拟CPU,当然真实的CPU在各个进程之间来回切换。
②在某一瞬间,CPU只能运行一个进程,但在一秒钟时间他可以运行多个进程,这一就产生了并行的错觉,
通产这就是人们所说的伪并行。
③在伪并行状态下CPU在进程之间的快速切换称为多道程序设计。
④一个进程是某种类型的一个活动,他有程序,输入,输出以及状态,单个处理器可以被若干个状态进程共享,它使用某种调度算法
决定何时停止一个进程的工作,并转而为另外一个进程提供服务,值得注意的是一个进程如果运行了2遍则算作2个进程。
二.进程的创建
㈠有4种主要的方式创建进程
①系统初始化
②执行了正在运行的进程所调用的进程创建了系统调用
③用户请求创建一个新的进程
④一个批处理作业的初始化
㈡一些和进程创建有关的概念
①停留在后台诸如电子邮件,web页面,新闻,打印之类活动的进程称为守护进程
②在UNIX系统中,只有一个系统调用可以用来创建新进程:fork,这个系统调用会创建一个与调用进程相同的副本
③在windows中,情形正好相反,一个Win32函数调用CreatProcess既处理进程的创建,也负责把正确的程序装入新的进程。
④在UNIX系统中,子进程的的初始地址空间是父进程的一个副本,但这里涉及两个不同的地址空间,不可写的内存区是共享的
⑤在windows中,从一开始父进程的地址空间和子进程的地址空间就是不同的
三.进程的终止
进程通常有4种方式终止
①正常退出
②出错退出(自愿的)
③严重错误(非自愿)
④被其他进程杀死
多数进程是由于完成了他们的工作而终止,
Unix中该系统调用是exit,而在windows中相关的系统调用时ExitProcess
Unix中结束进程的系统调用是Kill,Win32对应的函数是TerminateProcess
四.进程的层次结构
某些系统中,当进程创建了另一个进程后,父进程和子进程就以某种形式继续保持关联,
子进程可以创建更多的进程,但注意的进程只有一个父进程,这与有性繁殖不同;
在Unix中,进程和他所有的子女以及后代共同组成了一个进程组,当用户从键盘发出一个信号时,该信号被送到当前与键盘相关的进程
组中的所有成员(他们通常是当前窗口创建的所有活动进程),每个进程可以分别捕获该信号,忽略该信号,忽略该信号或采取默认动作,
即该信号被杀死)
这里还有一个例子,可以用来说明进程的层次的作用,考虑UNIX在启动时如何初始化自己,一个称为Init的特殊进程出现在启动的映像
中,当它开始运行时,读入一个说明终端数量的文件,接着,为每个终端创建一个新的进程,这些进程等待用户的登录,如果有一个用户登
录成功,该登录进程就准备一个shell准备接受命令.所有接受的这些命令会启动更多的进程,以此类推,这样,在整个系统中都是以Init
为根的一颗树.
相反Windows中没有进程的层次概念,所有的进程都是地位相同的,唯一类似进程层次的暗示是在创建进程的时候,父进程得到一个特别的令牌(称为句柄),该句柄可以用来控制子进程,但是它有权把这个令牌传送给某个其他的进程,这样就不存在进程层次了,在Unix中,进程就不能剥夺其子女的"继承权".
五.进程的状态
①运行态
②就绪态
③堵塞态
1.运行--->堵塞---->进程为等待输入而堵塞
2.运行--->就绪---->调度程序选择另一个进程
3.就绪--->运行---->调度程序选择这个进程
4.堵塞--->就绪---->出现有效的输入
操作系统最底层的是调度程序,在它上面有许多进程,所有关于中断处理,启动进程和停止进程的具体细节都隐藏在调度程序中,那么是这样么?实际上,调度程序是一段非常短小的程序.操作系统的其他部分被简单的组织成进程的形式,不过很少有真实的系统是以这样理想的方式构造的.
六.进程的实现
(1)为了实现进程模型,操作系统维护着一张表(一个结构数组),即进程表(Process Table).
每个进程占用一个进程表项.(有的作者称这为进程控制块)
该表项包含了进程状态的重要信息,包括程序计数器,堆栈指针,内存分配状况,所打开的文件的状态,帐号和调度信息,以及其他在进程
中由运行态转换到阻塞态时必须保存的信息,从而保证该进程随后能再次启动,就像从未被中断过一样.
典型的进程表项中的一些字段
进程管理 | 存储管理 | 文件管理 |
寄存器 | 正文段指针 | 根目录 |
程序状态字 | 数据段指针 | 工作目录 |
程序计数器 | 堆栈段指针 | 文件描述符 |
堆栈指针 | 用户ID |
|
进程状态 | 组ID |
|
优先级 |
|
|
调度参数 |
|
|
进程ID |
|
|
父进程 父进程 |
|
|
进程组 |
|
|
信号 |
|
|
进程开始时间 |
|
|
使用CPU时间 |
|
|
子进程的CPU时间 |
|
|
下次报警时间 |
(2)在了解了进程表后,就可以对单个(或者每一个)CPU上如何维持多个顺序进程做出更多的描述
与每一个IO关联的是一个称为中断向量(interrupt vector)的位置(靠近内存底部的固定区域),它包括中断服务程序的入口地址.假设
当多个磁盘中断发生时,用户进程3正在运行,则中断硬件将程序计数器,程序状态字,有时还有一个或多个寄存器压入堆栈,计算机随机
跳转到中断所指示的地址,这些是硬件完成的所有操作,然后软件,特别是中断服务例程就接管剩余的工作.
所有的中断程序都从保存寄存器开始,对于当前进程而言,通常实在进程表项中,随后,会从堆栈中删除由硬件中断机制存入堆栈的那部
分信息,并将堆栈指针指向一个由进程处理程序所使用的临时堆栈,一些诸如保存寄存器值和设置堆栈指针等操作,无法用C语言这类高
级语言描述,所以这些操作通过一个短小的汇编语言例程来完成,通常该例程可以供所有的中断使用,因为无论中断是怎么样引起的,有
关保存寄存器的工作则完全是一样的.
当该例程结束后,他调用一个C过程处理某个特别定的中断类型剩下的工作,.在完成有关工作之后,大概就会使某些进程就绪,接着调用
调度程序,决定随后该运行哪个进程,随后将控制转给一段汇编代码,为当前的进程装入寄存器值以及内存映射并启动该进程运行,
当该进程结束时,操作系统显示一个提示符并等待新的命令,一旦它接到新命令,就能装入新的程序进入内存,覆盖前一个程序.
(3)中断发生后操作系统底层所做的一些事情
1.硬件压入堆栈程序计数器等.
2.硬件从中断向量装入新的程序计数器.
3.汇编语言过程保存寄存器值.
4.汇编语言过程设置新的堆栈,
5.C中断服务例程运行(典型的读和缓冲输入)
6.调度程序决定下一个将运行的进程
7.汇编语言过程开始运行新的当前进程
七.多道程序设计模型
设进程得到IO操作的时间与其停留在内存中的时间的比为P.当内存中同时有n个进程时(n也被称为多道程设计的道数),
CPU的利用率 = 1 - P的n次方
并行:进程和IO同步
并发:多个程序同步执行
一个计算的若干操作必须按照严格的先后次序顺序地执行,这类计算过程就是程序的顺序执行过程
(1)多道程序设计应该考虑到的3个问题:
1.存储保护
主存储器中同时存放了多个作业的程序,为了避免相互干扰,必须提供必要的手段使得主存储器中的各道程序只能访问自己的区域
2.程序浮动
程序可以随机的从主存储器的一个区域移动到另一个区域,程序被移动后,仍然不丝毫不影响他的执行,这种技术称为程序浮动
3.资源的分配和调度
(2)并行工作倒数与系统效率不成正比
1.主存储器空间大小限制了可同时装入的程序数量.
2.外围设备的数量也是一个制约条件
3.多个程序同时要求使用同一资源的情况也会经常发生
进程的一些基本的概念的笔记......备份....