(二)进程的控制实验
思考题:
1. 可执行文件加载时进行了哪些处理?
解:可执行文件加载时首先是创建一个新进程的fork系统调用,然后用于实现进程自我终
止的exit系统调用;改变进程原有代码的exec系统调用;用于将调用进程挂起并等待子进程终止的wait系统调用;获得进程标识符的getpid系统调用等处理过程。
2. 什么是进程同步?wait(0)是如何实现进程同步的?
解:进程同步是指对多个相关进程在执行次序上进行协调,以使并发执行的主进程之间有
效地共享资源和相互合作,从而使程序的执行具有可在现行。
首先程序在调用fork()机那里了一个子进程后,马上调用wait(),使父进程在子进程调用之前一直处于睡眠状态,这样就使子进程先运行,子进程运行exec()装入命令后,然后调用wait(0),使子进程和父进程并发执行,实现进程同步。
实验三进程间的通信 (一) 信号机制实验
一.参考程序
#include #include Int P1,P2,stdout; While((P1=fork())==-1); /*创建子进程P1*/ If(P1>0) { While((p2=fork())==-1); /*创建子进程P2*/ If(P2>0) { Wait_mark=1; Signal(SIGINT,stop); /*接收到^C信号,转stop*/ Waiting(); Kill(P1,16); /*向P1发软中断信号16*/ Kill(P2,17); /*向P2发软中断信号17*/ Wait(0); /*同步*/ Wait(0); Printf(“Parent process is killed!\\n”); Exit(0); } Else { Wait_mark=1; Signal(17,stop); /*接收到软中断信号17,转stop*/ Waiting(); Lockf(stdout,1,0); Printf(“Child process 2 is killed by parent!\\n); Lockf(stdout,0,0); Exit(0); } } Else { Wait_mark=1; Signal(16,stop); /*接收到软中断信号16,转stop*/ Waiting(); Lockf(stdout,1,0); Printf(“Child process 1 is killed by parent!\\n”); Lockf(stdout,0,0); Exit(0); } } Void waiting() { While(wait_mark!=0); } Void stop() { Wait_mark=0; } 二.思考: 1. 该程序段前面部分用了两个wait(0),他们起什么作用? 解:用了两个wait(0)的作用是同时使两个子进程P1和P2发出软中断信号,而不用等待。 2. 该程序段中每个进程退出时都用了语句exit(0),为什么? 解:用exit(0)的作用是使子进程实现自我终止,正常退出此次操作,返回操作系统。 3. 为何预期的结果并未显示出来? 解:因为只执行成功两个子进程,但是并没有调用两个子进程P1,P2。当signal()让父进程捕捉从键盘上来的信号(按下^C或者break键时),只有捕捉到信号后,父进程用系统调用kill()向两个子进程发出信号。当子进程捕捉到信号后才能输出信息,之后父进程输出信息。 4. 程序该如何修改才能得到正确结果? #include Void waiting(),stop(),alarming(); Intwait_mark; Main() { Int P1,P2,stdout; if (P1=fork()); /*创建子进程P1*/ { If (p2=fork()); /*创建子进程P2*/ { Wait_mark=1; Signal(SIGINT,stop); /*接收到^C信号,转stop*/ Signal(SIGALRM,alarming);/*接收SIGALRM*/ Waiting(); Kill(P1,16); /*向P1发软中断信号16*/ Kill(P2,17); /*向P2发软中断信号17*/ Wait(0); /*同步*/ Wait(0); Printf(“Parent process is killed!\\n”); Exit(0); } Else { Wait_mark=1; Signal(17,stop); /*接收到软中断信号17,转stop*/ Signal(17,stop); Signal(SIGINT,SIG_IGN);/*忽略^C信号*/ While(wait_mark!=0); Lockf(stdout,1,0); Printf(“Child process 2 is killed by parent!\\n); Lockf(stdout,0,0); Exit(0); } } Else { Wait_mark=1; Signal(16,stop); /*接收到软中断信号16,转stop*/ Signal(SIGINT,SIG_IGN); While(wait_mark!=0) Lockf(stdout,1,0); Printf(“Child process 1 is killed by parent!\\n”); Lockf(stdout,0,0); Exit(0); } } Void waiting() { Sleep(5); if(wait_mark!=0); kill(getpid(),SIGALRM); } Void alarming() { Wait_mark=0; } Void stop(); { Wait_mark=0 } 5. 不修改程序如何得到期望的输出? 解:不做任何操作等待五秒钟父进程会在子进程先退出后退出,并打印退出顺序。 (二) 进程的管道通信实验 思考题: 1. 程序中的sleep(5)起什么作用? 解:sleep(5)是使管道自我阻塞5秒,这样做的目的是令读进程把管道中的已有数据读完后,暂时进入睡眠状态等待,直至写进程又将数据写入管道后,再将读进程唤醒。 2. 子进程1和子进程2为什么也能对管道进行操作? 解:因为他们的读指针和写指针都指向了管道的索引节点。 实验四存储管理 常用页面置换算法模拟实验 思考题: 1.从分析算法的命中率看,OPT最高,其次是NUR相对较高,而FIFO与LRU相差无几,最低的是LFU? 从上述结果可知,在内页面数较少(4~5)时,五种算法的命中率差别不大,都是30%左右,在内页面为7~18个页面之间,五种算法的访内命中率大致在35%~60%之间变化。但是,FIFO算法与OPT算法直接爱你的差别一般在6~10个百分点左右。在内页面为25~32个页面时,由于用户进程的所有指令基本都已装入内存,是命中率增加。因而OPT算法运行有可能出现错误。 因篇幅问题不能全部显示,请点此查看更多更全内容