您的当前位置:首页正文

操作系统实验报告

2020-02-23 来源:步旅网
实验二进程管理

(二)进程的控制实验

思考题:

1. 可执行文件加载时进行了哪些处理?

解:可执行文件加载时首先是创建一个新进程的fork系统调用,然后用于实现进程自我终

止的exit系统调用;改变进程原有代码的exec系统调用;用于将调用进程挂起并等待子进程终止的wait系统调用;获得进程标识符的getpid系统调用等处理过程。

2. 什么是进程同步?wait(0)是如何实现进程同步的?

解:进程同步是指对多个相关进程在执行次序上进行协调,以使并发执行的主进程之间有

效地共享资源和相互合作,从而使程序的执行具有可在现行。

首先程序在调用fork()机那里了一个子进程后,马上调用wait(),使父进程在子进程调用之前一直处于睡眠状态,这样就使子进程先运行,子进程运行exec()装入命令后,然后调用wait(0),使子进程和父进程并发执行,实现进程同步。

实验三进程间的通信 (一) 信号机制实验

一.参考程序

#include

#include #include Void waiting(),stop(); Intwait_mark; Main() {

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 #include #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算法运行有可能出现错误。

因篇幅问题不能全部显示,请点此查看更多更全内容