操作系统实验报告

                实验二   进程管理

(一)    进程的创建实验

思考题:

1.     系统是怎样创建进程的?

解: linux 系统创建进程都是用 fork() 系统调用创建子进程.

2.     当首次调用新创建进时,其入口在哪里?

解: 由 fork() 系统调用创建的新进程被称为子进程。该函数被调用一次,但返回两次。如果 fork()进程调用成功,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程 .

实验二   进程管理

(二)进程的控制实验

思考题:

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

解:可执行文件加载时首先是创建一个新进程的fork系统调用,然后用于实现进程自我终止的exit系统调用;改变进程原有代码的exec系统调用;用于将调用进程挂起并等待子进程终止的wait系统调用;获得进程标识符的getpid系统调用等处理过程。

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

解:进程同步是指对多个相关进程在执行次序上进行协调,以使并发执行的主进程之间有效地共享资源和相互合作,从而使程序的执行具有可在现行。

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

实验三  进程间的通信

(一)信号机制实验

一.参考程序

#include<stdio.h>

#include<signal.h>

#include<unistd.h>

Void waiting(),stop();

Int wait_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<stdio.h>

#include<signal.h>

#include<unistd.h>

Void waiting(),stop(),alarming();

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

 

第二篇:操作系统实验报告四

《操作系统原理》实验报告

实验序号: 04 实验项目名称:进程控制

操作系统实验报告四

操作系统实验报告四

操作系统实验报告四

操作系统实验报告四

操作系统实验报告四

操作系统实验报告四

操作系统实验报告四

相关推荐