操作系统原理与设计(下) - 图文(2)

2020-04-14 07:14

系统中维持一张proc表它有50个表目,每个表目为一个proc结构,供一个进程使用,因此UNIX中最多同时可存在50个进程。创建进程时,在proc表中找一个空表目,以建立起相应于该进程的proc结构。每个进程对应的proc结构,包含有22个字节,用C语言表示,下面列出其中最常用的几项加以说明。

struct proc

{ char p-stat; 进程状态 char p-flag; 进程特征 char p-pri; 进程优先数

char p-sig; 软中断号(送至进程的信号数)

char p-uid; 进程所属的用户标识数,指向终端用户的tty char p-time; 进程在内存或外存的驻留时间 char p-cpu; 用于调度优先数计算 char p-nice; 用于调度优先数计算 int p-ttyp; 指向对应终端的tty结构 int p-pid; 进程标识数

int p-ppid; 父进程的标识数

int p-addr; 进程数据段起始地址(在内存或盘上) int p-size; 数据段大小

int p-wchan; 标识进程睡眠的原因 int * p-textp; 指向本文的文本结构 } proc [NPROC] 其中,

p-stat 表示进程状态码

NULL 0 表示进程结构尚未分配任何进程 SSLEEP 1 进程处于高优先级睡眠状态 SWAIT 2 进程处于低优先级睡眠状态

SRUN 3 逻辑上可能运行,已获得处理机为运行态,否则为就绪态,等待处理机

SIDL 4 父进程正在创建子进程

SZOMB 5 表示进程终止态,等待父进程最后消灭它(使成为NULL) SSTOP 6 等待父进程发送跟踪命令 p-flag 进程特征标志码

SLOAD 01 表示进程映象已在内存中

SSYS 02 该进程是调度进程、不能换出内存 SLOCK 04 表示本进程映象不能换出内存 SSWAP 010 表示本进程映象不能换出内存 STRC 020 子进程已发出跟踪请求 SWTED 040 另一跟踪标志

进程诸状态之间的转换,如图13-4所示。

224

图13-4 UNIX的进程状态变迁图

(1) 运行状态SRUN

一个进程占有处理机时就处于运行状态。这时其ppda的起址为核心态第七页KISA6所指,即proc [i].p-addr就是KISA6所指的地址。

(2) 准备就绪状态

一个进程如等待占用处理机,则处于准备就绪状态,其p-stat也为SRUN,它与运行状态的主要区别是,第一,它的ppda的起始地址(或p-addr)尚未在KISA60。第二,可能进程映象尚未在内存,这时SLOAD尚未被置位,调度程度sched ( )按进程优先级从高到低将所有准备就绪进程调入内存。

(3) 睡眠状态

一个运行进程由于下列原因之一,放弃处理机而进入睡眠状态。 ① 进程使用系统调用wait ( )或sleep ( ),自身主动停止,以实现进程间的同步或进程自身定时间歇。

② 进程在运行过程中要求使用某种系统资源,由于系统资源不足,不能立即满足其要求,它被迫进入睡眠状态,等待其它进程释放这类资源。

③ 保护程序运行的临界区。例如,当进程A对进程通信文件pipe进行读写时,要对其它进程封锁。若此时有进程B企图使用pipe时,要迫使进程B进入睡眠状态。

④ 等待I/O操作结束。

⑤ 调度进程,即进程0在一次调度结束后进入睡眠状态。

进入睡眠状态的进程,系统按其睡眠的原因,赋予它当被唤醒时所具有的调度优先数分别有高低优先级睡眠状态SSLEEP和SWAIT。

(4) 停止状态SSTOP

这是一种特殊的睡眠状态,被用于跟踪机构,表明子进程已接收信号等待父进程对它进行跟踪处理。由stop ( )程序把其p-stat置成SSTOP。以后由setrun ( )程序将停止状态进程转入就绪状态。

(5) 等待善后处理状态SZOMB

225

一个进程用系统调用exit ( )自我终止,并未立即放弃proc结构,相应的user结构也暂留起来。这时p-stat被置成SZOMB状态,并唤醒其父进程对它进行善后处理。这是一个进程在消亡之前,等待父进程对其作某些处理的一个短暂状态。

·P-flag进程标志

进程标志实际上是对进程状态的进一步说明,它只有一个字节,利用该字节中各位的0和1取值,表示进程的映像是否在内存、是否可交换到磁盘的对换区上去,等等。共有六个标志位(图13-5),一个进程的标志可以是这六种标志的组合:

图13-5 UNIX的进程标志字节

SLOAD:该位为1,表示本进程的映像全在内存中; SSYS:该位为1,表示本进程为进程0,应常驻内存;

SLOCK:该位为1,表示本进程映像因某种原因不能调出内存; SSWAP:对换标志;

STRC:该位为1,表示本进程已向父进程提出跟踪请求; STWED:该位为1,表示父进程已接受了进程跟踪的请求。

·P-pri进程优先数

进程优先数表示一个进程的优先权,其值越小,则该进程的优先权越高。优先数的取值范围为-100~+127。

·P-time 进程映像调入内存后,在内存的驻留时间,或进程映像调出到盘对换区后,在盘对换区的驻留时间。

·P-addr 进程数据段的起始地址,也就是除正文段外,进程非常驻内存部分的起始地址(ppda)。

·P-size 数据段的长度。

·P-wchan 标明处于睡眠状态的进程的睡眠原因。

·P-textp 是一个指向text结构指针,在那里存放着与该进程正文段有关的信息。 ·P-cpu 记录进程使用处理机的程序,值越大意味着进程使用处理机的程度越高。 2) 数据段

UNIX进程映像中的数据段由如下三部分顺序排列组成(图13-6):

图13-6 UNIX的数据段

USER数据结构的C语言表示如下:

226

struct user {

int u-rsav [2]; 保存r5, r6,用于程序的正常或非正常返回 int u-fsav [2]; 用于保留浮点寄存器

char u-segflg; I/O目的地址在用户空间或系统空间的标志 char u-error; 返回出错号码 char u-uid; 有效用户标识数

char u-ruid; 有效用户小组标识数 char u-rgid; 实际用户小组标识数

int u-procp; 指向本进程proc结构的指针

char * u-base; 指向读写缓冲存储器的起始地址 char * u-count; 用来存放读写字节数nbytes

char * u-offset[2]; 在文件中进行读、写的起始位置 int * u-cdir; 当前工作目录文件的inode的指针

char u-dbuf [DIRSIZ]; 用于存放当前工作文件的路径名DIRSIZ=14 char * u-dirp; 指向当前目录文件名的指针,路径名最多14个字符 struct {构成文件的目录项,由文件所在节点的节点号ino和文件的路径 int u-ino; 名组成 char u-name [DIRSIZ]; } u-dent;

int * u-pdir; 指向父目录项i节点的指针

int u-uisa [16]; 本进程用户空间地址寄存器样本,由16个组成 int u-uisd [16]; 本进程用户空间说明寄存器样本,由16个组成

int u-ofile [NOFILE]; 用户打开文件表,由指向系统打开文件表的表项指针 组成,NOFILE=15,共有15项

int u-arg [5]; 用于存放当前系统调用所带的参数 int u-tsize; 本进程的文本段的块数 int u-dsize; 本进程的数据段的块数 int u-ssize; 本进程用户栈的块数

int u-sep; 指令空间I(文本段)和数据空间D(数据段)是否分离的标志 int u-qsav [2]; 保存r5, r6 int ussav [2]; 保存r5, r6

int u-signal [NSIG]; 软中断处理程序入口表,NSIG=20,共20项 int u-utime; 本进程用户态运行时间 int u-stime; 本进程核心态运行时间

int u-cutime [2]; 子进程用户态运行时间之和 int u-cstime [2]; 子进程核心态运行时间之和

int * u-aro 中断保留区中保留R0的栈内单元的地址 int u-prof [4]; 用于保存程序直方图计算的参数 char u-intflg; 表示系统调用执行完成与否的标志 } u; ·进程系统数据区,通常称作ppda,它位于数据段的前面,进程proc结构中的P-addr

227

指向这个区域的首址。该区共有1024个字节,由两块内容组成:最前面的289个字节为进程的扩充控制块user结构,剩下的734个字节为核心栈,当进程运行在核心态时,这里是它的工作区。

·用户数据区,这时通常存放程序运行时用到的数据,如果进程运行的程序是非享的,那么这个程序也放于此地。

·用户栈区,当进程运行在用户态时,这里是它的工作区。 对于数据段,做如下几点说明:

第一,在user结构里,总共包含35项内容,涉及到现场保护、内存管理、系统调用、文件管理、文件读写、时间信息、进程映像位置等方面。譬如,u-procp是指向本进程基本控制块proc的指针,于是u-procp与proc结构中的p-addr就形成了互相勾链。又譬如在进程的user结构里劈了两个数组,一个为uisa,一个为uisd,这们是该进程用户态虚地址空间八个页面的相对虚、实地址映照表。再譬如,在user结构里有一个整形数组u-ofile[15],共有15个元素,称作为该进程的打开文件表,进程每打开一个文件,就在此表里做一登记,所以每个进程可同时最多打开十五个文件。

第二,一个进程的proc结构是常驻内存的,当该进程运行时,进程映像的其余部分也都全部在内存。但当处理机转去运行别的进程时,为了节省内存,就可能会把该进程映像的绝大部分换出送到磁盘上去。由于进程运行的程序可能是共享的,这种共享正文段此时就不能交换出去。所以一个进程的数据段不能包含共享正文段,它是进程映像的非常驻内存部分。在UNIX里,进程映像的非常驻内存部分在内、外存之间的对换操作是经常进行的,磁盘上被开辟专门存放进程非常驻内存部分的那部分区域,在UNIX里称为盘对换区。

图13-7 UNIX进程映像的基本结构

228


操作系统原理与设计(下) - 图文(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:边城中的悲剧意识

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: