(一) 进程的创建实验
思考题:
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 实验项目名称:进程控制
《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对Windows2000编程,进一步熟悉操作系统的…
操作系统实验报告实验名称理解UNIXLINUXShell及UNIX的进程树成绩专业班级计科姓名学号联系电话实验日期20xx年12月…
目录实验一进程的创建2实验二进程控制3实验三进程的管道通信4实验四消息通信6实验五进程调度算法8实验六FIFO页面置换算法12实验…
操作系统实验报告学号姓名班级实验一实验报告实验名称并发程序设计实验1实验目的掌握在程序中创建新进程的方法观察并理解多道程序并发执行…
《操作系统原理》实验报告院(部):管理工程学院专业:信息管理与信息系统实验项目:实验一二三五班级:信管102姓名:学号:目录引言.…
沈阳理工大学课程设计任务书1沈阳理工大学目录1课程设计目的32课程设计要求33相关知识34需求分析45概要设计56详细设计67测试…
实验二进程管理二进程的控制实验思考题1可执行文件加载时进行了哪些处理解可执行文件加载时首先是创建一个新进程的fork系统调用然后用…
XXXX大学20xx年20xx年第2学期院系计算机信息工程学院专业信息管理与信息系统课程名称操作系统原理及应用班级姓名学号指导教师…
实验一进程管理一目的进程调度是处理机管理的核心内容本实验要求编写和调试一个简单的进程调度程序通过本实验加深理解有关进程控制块进程队…
一、实验目的本实验要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁…
操作系统实验报告实验1分析实验结果参照实验指导书回答下面的问题56从实验中得到了两次不同的结果原因是程序采用了多线程的写法两个线程…