版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统原理操作系统原理实验报告学院:电信学院班级:电信(硕)81班姓名:尹鑫学号:08058029提交日期:2011年6月11日星期六操作系统原理实验报告一、 实验目的:1.1了解进程与程序的区别,加深对进程概念的理解;1.2进一步认识进程并发执行的实质;1.3分析进程争用资源的现象,学习解决进程互斥的方法;1.4了解linux系统中进程通信的基本原理。二、 实验要求:2.1熟悉linux系统所提供的“系统功能调用”;阅读linux的sched.h源码文件,加深对进程管理概念的理解;阅读linux的fork.c源码文件,分析进程的创建过程;2.2按照实验内容,认真完成各项实验,并完成实验报告
2、;2.3实验报告必须包括:程序清单(含注释)、实验结果、实验中出现的问题;2.4观察到的现象的解释和说明,以及实验体会。三、 实验内容:3.1进程的创建 :编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕生显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。试观察记录屏幕上的显示结果,并分析原因。 3.2进程的控制 :修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕上出现的现象,并分析原因。如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程
3、之间的互斥,观察并分析出现的现象。 3.3进程的通信:3.3.1软中断通信:编制一段程序,使其实现程序的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按del键);当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:child process1 is killed by parent!child process2 is killed by parent!父进程等待两个子进程终止后,输出如下的信息然后终止:parent process is killed!在上面的
4、程序中增加语句signal(sigint,sig-ign)和signal(sigquit,sig-ign),观察执行结果,并分析原因。 3.3.2管道通信:编制一段程序,实现进程的管道通信。使用系统调用pipe()建立一条管道线;两个子进程p1和p2分别向管道各些一句话:child 1 is sending a message!child 2 is sending a message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程p1发来的消息,然后在接收子进程p2发来的消息。 四、 实验环境:在windows平台上运行 cygwin软件模拟linux环境。
5、五、 实验结果以及结果分析:5.1进程的创建 :实验所用c语言程序段,见“六、程序清单:6.1进程的创建”。运行cygwin软件,在命令框中键入指令gcc o fork1 fork1.c,即可得到编译文件fork1,然后再在命令框中键入指令./fork1,就可以运行该程序。实验结果截图如下:实验中出现的问题:实验过程中,从所得到的实验结果可以看出,实验结果具有不确定性、随机性,输出的结果既有bca,又有bac,并且两者出现并没有什么规律性。实验结果分析:从进程执行并发来看,输出abc的排列都是有可能的,因为fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却
6、不是一定是顺序的,所以输出abc的排列都是有可能的。5.2进程的控制 :5.2.1语句输出:实验所用c语言程序段,见 “6.2.1语句输出”。运行cygwin软件,在命令框中键入指令gcc o fork10 fork10.c,即可得到编译文件fork10,然后再在命令框中键入指令./fork10,就可以运行该程序。实验结果截图如下:实验中出现的问题:从所得到的实验结果可以看出,进程1先运行,待到其运行结束后,进程2和父进程通过竞争临界资源运行,两个进程的运行结果差异很大,最好的情况,进程2和父进程都能够完整的运行结束,最坏的情况下,进程2或者父进程只能运行一到两步,不能完全运行,并且,通过实验
7、,当去除程序语句中的回车符时,实验中的三个进程都能够顺利地运行完,只是子进程2和父进程的运行顺序不同,如下图:实验结果分析: 由于进程没有加锁,所以在竞争临界资源的时候,有可能会使得某一个进程进入死等状态而得不到执行;当去除回车符后,每个进程相对独立,可以顺利运行完,但是子进行2和父进程之间还是需要竞争资源,由于函数printf()输出的字符串之间不会被中断,因此,每个字符串内部的字符顺序输出时不变。但是 , 由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。5.2.2进程加锁:实验所用c语言程序段,见“6.2.2
8、进程加锁”。运行cygwin软件,在命令框中键入指令gcc o fork3 fork3.c,即可得到编译文件fork3,然后再在命令框中键入指令./fork3,就可以运行该程序。实验结果截图如下:实验中出现的问题:在程序中lockf(1,1,0)是加锁操作,lockf(1,0,0)是解锁操作,当各个进程中的循环输出部分被加锁,各个进程只能互斥进行,所以,在理论上子进程1输出, 子进程2输出, 父进程输出的顺序可能不同,但是每个进程内部的输出过程不会被打断,然而,实际输出中任然会有交叉输出,并且有些进程(进程2或者父进程)的结果输出不完整。实验结果分析:这个实在不知道是什么原因,或许真的像同学说
9、的那样 cygwin软件有问题。5.3进程的通信:5.3.1软中断通信:实验所用c语言程序段,见“6.3.1软中断通信”。运行cygwin软件,在命令框中键入指令gcc o signal_kill1 signal_kill1.c,即可得到编译文件signal_kill1,然后再在命令框中键入指令./ signal_kill1,就可以运行该程序。当子进程中不含有signal(sigint,stop);wait_mark=1;waiting();这3条语句时,实验结果截图如下:当子进程中含有signal(sigint,stop);wait_mark=1;waiting();这3条语句时,实验结果截
10、图如下:实验结果分析:进程的软中断通信是利用函数signal()和kill()来实现的,子进程中的signal()函数通过接收父进程的kill()函数发来的信号来执行输出终止操作。程序中的stop()函数是接受到相应信号后执行的操作,在signal()之后有wait_mark=1;waiting();两条语句,其中前一条语句将wait_mark置1后,第二条语句便会进入一个死循环,直至运行了stop()函数(即接收到相应的信号)。父进程中的signal(sigint,stop)是用来完成按键启动的(ctrl-c键)。由于按ctrl-c是终止进程的指令,会终止掉子进程,如此以来子进程不会运行,只
11、有父进程运行,结果如第一幅图所显示。此时,需要给子进程添加父进程中相同的按键启动指令即signal(sigint,stop);wait_mark=1;waiting();这3条语句。便可实现按键启动,父进程发送终止子进程的信号。结果如第二幅图显示。当增加signal(sigint,sig_ign)语句时,实验结果截图如下:当增加signal(sigquit,sig_ign)语句时,实验结果截图如下:结果分析:signal(sigint,sig_ign)和signal(sigquit,sig_ign)分别为忽略键入信号以及忽略中断信号。在子进程中开始添加signal(sigint,sig_ign
12、)则子进程会忽略键盘中断信号,此时按ctrl-c不会将子进程终止,程序可以正常运行,而在子进程中开始添加signal(sigquit,sig_ign),则相应的中断信号被忽略。 5.3.2管道通信:实验所用c语言程序段,见“6.3.2管道通信”。运行cygwin软件,在命令框中键入指令gcc o pipe pipe.c,即可得到编译文件signal_kill1,然后再在命令框中键入指令./ signal_kill1,就可以运行该程序。实验结果截图如下:结果分析:本实验利用函数pipe()建立通信管道,两个子进程分别向管道写入信号,父进程读取管道信号再进行显示,管道的写入操作分别加锁实现互斥操作
13、。子进程1先建立,所以第一次读取的管道信号是子进程1发来的,等待子进程1终止后再从管道读取信号,此时的信号是子进程2发来的。由于管道通信的互斥、同步等通信机制,执行结果不会出现随机性。 六、 程序清单:6.1进程的创建:#include main()int p1,p2;while(p1 = fork() = -1);/创建子进程1if(p1=0)putchar(b);/子进程1输出elsewhile(p2 = fork() = -1); /创建子进程2if(p2 = 0)putchar(c); /子进程2输出else putchar(a);/父进程输出6.2进程的控制:6.2.1语句输出:#i
14、nclude main()int p1,p2,i;while(p1 = fork() = -1); /创建子进程1if(p1=0)for(i=1;i=10;i+) printf( the number of child process1 is %d,i); /子进程1输出elsewhile(p2 = fork() = -1); /创建子进程2if(p2 = 0) for(i=1;i=10;i+) printf( the number of child process2 is %d,i); /子进程2输出 else for(i=1;i=10;i+) printf( the number of p
15、arent process is %d,i); /父进程输出 6.2.2进程加锁:#include main()int p1,p2,i;while(p1 = fork() = -1);if(p1=0) lockf(1,1,0); /加锁for(i=0;i100;i+)fprintf(stderr, son %dn,i);/子进程1输出lockf(1,0,0);/解锁elsewhile(p2 = fork() = -1);if(p2 = 0)lockf(1,1,0);/加锁for(i=0;i100;i+)fprintf(stderr, daughter %dn,i);/子进程2输出lockf(1
16、,0,0);/解锁else lockf(1,1,0);/加锁for(i=0;i100;i+)fprintf(stderr, parent %dn,i);/父进程输出lockf(1,0,0);/解锁6.3进程的通信:6.3.1软中断通信#include #include #include #include volatile int wait_mark;void waiting()/定义子函数waiting()while(wait_mark!=0);void stop()/定义子函数stop()wait_mark=0; main()int p1,p2,i;while(p1 = fork() = -
17、1);if(p10)while(p2 = fork() = -1);if(p20)signal(sigint,stop); /接受键盘中断(按ctrl-c键), 转stopwait_mark=1;waiting();/若无按键将等待sleep( 1 ); /休眠,保证子进程先运行,且会就收信号kill(p1,sigusr1); /向子进程1发送信号sleep( 1 ); /休眠kill(p2,sigusr2); /向子进程2发送信号wait(0); /等待子进程结束,同步wait(0); /等待子进程结束,同步printf(parent process is killed!n);exit(0)
18、; /退出进程else signal(sigint,stop); /接受键盘中断(按ctrl-c键),转stopwait_mark=1;waiting(); /若无按键将等待signal(sigusr2,stop); /接收父进程发送的信号wait_mark=1;waiting(); /死循环,直至父进程发送信号lockf(1,1,0);printf(child process 2 is killed by parent!n);lockf(1,0,0);exit(0); /进程终止else signal(sigint,stop);wait_mark=1;waiting();signal(sig
19、usr1,stop);wait_mark=1;waiting();lockf(1,1,0);printf(child process 1 is killed by parent!n);lockf(1,0,0);exit(0);当增加signal(sigint,sig_ign) 语句和signal(sigquit,sig_ign)语句时:#include #include #include #include volatile int wait_mark;void waiting()while(wait_mark!=0);void stop()wait_mark=0; main()int p1,p
20、2,i;while(p1 = fork() = -1);if(p10)while(p2 = fork() = -1);if(p20)wait_mark=1;signal(sigint,stop); /接收到信号,转stop/wait_mark=1;waiting();sleep( 1 ); /休眠,保证子进程先运行,且会就收信号kill(p1,sigusr1); /向子进程1发送信号sleep( 1 ); /休眠kill(p2,sigusr2); /向子进程2发送信号wait(0); /等待子进程结束,同步wait(0); /等待子进程结束,同步printf(parent process is
21、 killed!n);/输出exit(0);else /signal(sigint,sig_ign);signal(sigquit,sig_ign);signal(sigusr2,stop); /接收父进程发送的信号wait_mark=1;waiting(); /死循环,直至父进程发送信号lockf(1,1,0);printf(child process 2 is killed by parent!n);lockf(1,0,0);exit(0); /进程终止else /signal(sigint,sig_ign);signal(sigquit,sig_ign);signal(sigusr1,s
22、top); /接收父进程发送的信号wait_mark=1;waiting();/死循环,直至父进程发送信号lockf(1,1,0);printf(child process 1 is killed by parent!n);lockf(1,0,0);exit(0);6.3.2管道通信#include #include #include #include int pid1,pid2; / 定义进程变量 main()int fd2;char outpipe100,inpipe100; / 定义两个字符数组pipe(fd); / 创建管道while(pid1 = fork() = -1); / 如果进程1创建不成功,则空循环 if(pid1=0) / 如果子进程1创建成功,pid1为进程号lockf(fd1,1,0); / 锁定管道sprintf(outpipe,child 1 process is sending message!n);/给outpipe赋值write(fd1,outpipe,50); / 向管道写入数据sleep(5); / 等待读进程读出数据lockf(fd1,0,0); / 解除管道的锁定exit(0); / 结束进程else while(pid2=fork
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 西京学院《建筑装饰材料及施工工艺》2022-2023学年第一学期期末试卷
- 西京学院《国际商务谈判与礼仪》2022-2023学年第一学期期末试卷
- 西京学院《电工电子学》2021-2022学年期末试卷
- 杯弓蛇影英文课件
- 2024-2025学年高中物理举一反三系列专题2.3 气体的等压变化和等容变化(含答案)
- 电工教程 课件
- 西华师范大学《普通地质学》2021-2022学年第一学期期末试卷
- 西华师范大学《计算机组成原理》2023-2024学年期末试卷
- 西华师范大学《大气污染防治技术》2021-2022学年第一学期期末试卷
- 西昌学院《英汉翻译理论与技巧》2022-2023学年第一学期期末试卷
- 装配式建筑综合设计组任务书
- 四方变频器e380说明书
- 第七单元整体教学设计-高中语文新教材必修上册单元备课+群文阅读-课件
- with复合结构(公开课)课件
- 仪表-xk3102s使用手册
- 社会学概论第五章 社会互动课件
- 2022全国119消防安全日消防安全主题班会课件
- 内蒙古通辽市基层诊所医疗机构卫生院社区卫生服务中心村卫生室地址信息
- 《安宁疗护评估表》《安宁共同照护表》
- 电影票采购合同(最新修订版)
- 四川省泸州市各县区乡镇行政村村庄村名居民村民委员会明细
评论
0/150
提交评论