《实验二 进程管理》由会员分享,可在线阅读,更多相关《实验二 进程管理(13页珍藏版)》请在金锄头文库上搜索。
1、1实验二实验二 进程管理进程管理一、实验目的一、实验目的1.加深对进程概念的理解,明确进程和程序的区别。 2.进一步认识并发执行的实质。 3.分析进程争用资源的现象,学习解决进程互斥的方法 4.了解 Linux 系统中进程通信的基本原理二、实验学时二、实验学时2 学时三、实验内容三、实验内容1.1.进程的创建进程的创建 编写一段程序,使用系统调用编写一段程序,使用系统调用 forkfork()创建两个子进程。当此程序运行时,()创建两个子进程。当此程序运行时, 在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个
2、字 符:父进程显示字符符:父进程显示字符“a”“a” ;子进程分别显示字符;子进程分别显示字符“b”“b”和字符和字符“c”“c” 。试观察记录。试观察记录 屏幕上的显示结果,并分析原因。屏幕上的显示结果,并分析原因。实验指导:实验指导:一、进程 Linux 中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基本单位。一个 进程实体由若干个区(段)组成,包括程序区、数据区、栈区、共享存储区等。每个区又 分为若干页,每个进程配置有唯一的进程控制块 PCB,用于控制和管理进程。 PCB 的数据结构如下: 1、进程表项(Process Table Entry) 。包括一些最常用的核心数据:
3、进程标识符 PID、用户标识符 UID、进程状态、事件描述符、进程和 U 区在内存或外存的 地址、软中断信号、计时域、进程的大小、偏置值 nice、指向就绪队列中下一个 PCB 的指 针 P_Link、指向 U 区进程正文、数据及栈在内存区域的指针。 2、U 区(U Area) 。用于存放进程表项的一些扩充信息。 每一个进程都有一个私用的 U 区,其中含有:进程表项指针、真正用户标识符 u- ruid(read user ID)、有效用户标识符 u-euid(effective user ID)、用户文件描述符表、计时器、 内部 I/O 参数、限制字段、差错字段、返回值、信号处理数组。 由于
4、UNIX 系统采用段页式存储管理,为了把段的起始虚地址变换为段在系统中的物理地 址,便于实现区的共享,所以还有: 3、系统区表项。以存放各个段在物理存储器中的位置等信息。 系统把一个进程的虚地址空间划分为若干个连续的逻辑区,有正文区、数据区、栈区等。 这些区是可被共享和保护的独立实体,多个进程可共享一个区。为了对区进行管理,核心 中设置一个系统区表,各表项中记录了以下有关描述活动区的信息: 区的类型和大小、区的状态、区在物理存储器中的位置、引用计数、指向文件索引结点的2指针。 4、进程区表 系统为每个进程配置了一张进程区表。表中,每一项记录一个区的起始虚地址及指向系统 区表中对应的区表项。核心
5、通过查找进程区表和系统区表,便可将区的逻辑地址变换为物 理地址。 二、进程映像 Linux 系统中,进程是进程映像的执行过程,也就是正在执行的进程实体。它由三部分组 成: 1、用户级上、下文。主要成分是用户程序; 2、寄存器上、下文。由 CPU 中的一些寄存器的内容组成,如 PC,PSW,SP 及通用寄存 器等; 3、系统级上、下文。包括 OS 为管理进程所用的信息,有静态和动态之分。 三、所涉及的系统调用 fork( ) 创建一个新进程。 系统调用格式: pid=fork( ) 参数定义: int fork( ) fork( )返回值意义如下: 0:在子进程中,pid 变量保存的 fork(
6、 )返回值为 0,表示当前进程是子进程。 0:在父进程中,pid 变量保存的 fork( )返回值为子进程的 id 值(进程唯一标识符) 。 -1:创建失败。 如果 fork( )调用成功,它向父进程返回子进程的 PID,并向子进程返回 0,即 fork( )被调用 了一次,但返回了两次。此时 OS 在内存中建立一个新进程,所建的新进程是调用 fork( ) 父进程(parent process)的副本,称为子进程(child process) 。子进程继承了父进程的许多 特性,并具有与父进程完全相同的用户级上下文。父进程与子进程并发执行。 核心为 fork( )完成以下操作: (1)为新进程
7、分配一进程表项和进程标识符 进入 fork( )后,核心检查系统是否有足够的资源来建立一个新进程。若资源不足,则 fork( )系 统调用失败;否则,核心为新进程分配一进程表项和唯一的进程标识符。 (2)检查同时运行的进程数目 超过预先规定的最大数目时,fork( )系统调用失败。 (3)拷贝进程表项中的数据 将父进程的当前目录和所有已打开的数据拷贝到子进程表项中,并置进程的状态为“创建” 状态。 (4)子进程继承父进程的所有文件 对父进程当前目录和所有已打开的文件表项中的引用计数加 1。 (5)为子进程创建进程上、下文 进程创建结束,设子进程状态为“内存中就绪”并返回子进程的标识符。 (6)
8、子进程执行 虽然父进程与子进程程序完全相同,但每个进程都有自己的程序计数器 PC(注意子进程的注意子进程的 PC 开始位置开始位置),然后根据 pid 变量保存的 fork( )返回值的不同,执行了不同的分支语句。 四、参考程序3#include main( ) int p1,p2; while(p1=fork( )=-1); /*创建子进程 p1*/ if (p1=0) putchar(b); else while(p2=fork( )=-1); /*创建子进程 p2*/ if(p2=0) putchar(c); else putchar(a); bca(有时会出现 abc 的任意的排列)
9、分析:从进程执行并发来看,输出abc的排列都是有可能的。 原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片 的获得却不是一定是顺序的,所以输出abc的排列都是有可能的。2.进程的控制进程的控制 修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观 察程序执行时屏幕上出现的现象,并分析原因。察程序执行时屏幕上出现的现象,并分析原因。 如果在程序中使用系统调用如果在程序中使用系统调用 lockf()来给每一个进程加锁,可以实现进程之间()来给每一个进程加锁,可以实现进程之间 的
10、互斥,观察并分析出现的现象。的互斥,观察并分析出现的现象。实验指导:实验指导: 一、所涉及的系统调用 lockf() lockf(files,function,size): 用作锁定文件的某些段或者整个文件,本函数适用的头文件为: #include 参数定义: int lockf(files,function,size) int files,function; long size; 其中:files 是文件描述符:function 是锁定和解锁;1 表示锁定,0 表示解锁。size 是锁定 和解锁的字节数,若用 0,表示从文件的当前位置到文件尾。二、参考程序 程序 1 #include mai
11、n( ) int p1,p2,i;4while(p1=fork( )=-1); /*创建子进程 p1*/ if (p1=0)for(i=0;i #include main() int p1,p2,i; while(p1=fork()=-1); if(p1=0) lockf(1,1,0); for(i=0;i #include #include main( ) int pid; pid=fork( ); /*创建子进程*/ switch(pid) case -1: /*创建失败*/printf(“fork fail!n“);exit(1);case 0: /*子进程*/execl(“/bin/l
12、s“,“ls“,“-1“,NULL); printf(“exec fail!n“);exit(1);default: /*父进程*/wait(NULL); /*同步*/printf(“ls completed !n“);, exit(0); 三、运行结果 执行命令 ls -l ,列出当前目录下所有文件和子目录; ls completed! 四、分析原因 程序在调用 fork( )建立一个子进程后,马上调用 wait( ),使父进程在子进程结束之前,一 直处于睡眠状态。子进程用 exec( )装入命令 ls ,exec( )后,子进程的代码被 ls 的代码取代, 这时子进程的 PC 指向 ls
13、的第 1 条语句,开始执行 ls 的命令代码。 注意在这里 wait( )给我们提供了一种实现进程同步的简单方法。 五、思考 (1)可执行文件加载时进行了哪些处理? (2)什么是进程同步?wait( )是如何实现进程同步的?4.4.编制一段程序,使其实现进程的软中断通信。编制一段程序,使其实现进程的软中断通信。 要求要求: :使用系统调用使用系统调用 forkfork()创建两个子进程,再用系统调用()创建两个子进程,再用系统调用 signalsignal()让父进程捕捉键盘上来的中断信号(即按()让父进程捕捉键盘上来的中断信号(即按 DelDel 键)键) ;当捕捉到中断信;当捕捉到中断信
14、号后,父进程用系统调用号后,父进程用系统调用 killkill()向两个子进程发出信号,子进程捕捉到信号()向两个子进程发出信号,子进程捕捉到信号 后分别输出下列信息后终止:后分别输出下列信息后终止: ChildChild processprocess 1 1 isis killedkilled byby parent!parent! ChildChild processprocess 2 2 isis killedkilled byby parent!parent!8父进程等待两个子进程终止后,输出如下的信息后终止:父进程等待两个子进程终止后,输出如下的信息后终止: ParentParent
15、 processprocess isis killed!killed! 实验指导实验指导 一、信号 1 、信号的基本概念 每个信号都对应一个正整数常量 ( 称为 signal number, 即信号编号。定义在系统头文件中 ) , 代表同一用户的诸进程之间传送事先约定的信息的类型,用于通知某进 程发生了某异常事件。每个进程在运行时,都要通过信号机制来检查是否有信号到达。若 有, 便中断正在执行的程序,转向与该信号相对应的处理程序,以完成对该事件的处理; 处理结束后再返回到原来的断点继续执行。实质上,信号机制是对中断机制的一 种模拟, 故在早期的 UNIX 版本中又把它称为软中断。 信号与中断的相似点: ( 1 )采用了相同的异步通信方式; ( 2 )当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;( 3 )都在处理完毕后返回到原来的断点; ( 4 )对信号或中断都可进行屏蔽。 信号与中断的区别: ( 1 )中断有优先级,而信号没有优先级,所有的信号都是平等的; ( 2 )信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行; ( 3 )中断响应是及时的,而信号响应通常都有较大的时间延迟。 信号机制具有以下三方面的功能: ( 1 )发送信号。发送信号的程序用系统调用 kil