操作系统实验指导书V1分析解析Word格式文档下载.docx
- 文档编号:3031635
- 上传时间:2023-05-01
- 格式:DOCX
- 页数:21
- 大小:199.53KB
操作系统实验指导书V1分析解析Word格式文档下载.docx
《操作系统实验指导书V1分析解析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书V1分析解析Word格式文档下载.docx(21页珍藏版)》请在冰点文库上搜索。
实验一进程管理
4
验证
必做
2
实验二SPOOLing技术实现
6
设计
三、实验目的、内容与要求
(一)实验目的
1.加深对进程概念的理解,明确进程和程序的区别;
2.进一步认识并发执行的实质;
3.分析进程争用资源的现象,学习解决进程互斥的方法;
4.了解Linux系统中进程通信的基本原理。
(二)实验内容
1.进程的创建;
2.进程的控制;
3.进程的软中断通信;
4.进程的管道通信。
(三)实验要求
1.掌握Linux系统中进程的创建、控制和通信的实现;
2.根据实验内容,在Linux平台上用C语言编程实现,上机调试运行得出实验结果;
3.写出预习报告和实验报告。
1.加深对SPOOLing系统的理解;
2.进一步认识SPOOLing技术的实质;
3.分析、设计SPOOLing系统的实现方法;
4.了解Linux系统中SPOOLing的基本原理。
设计并运行一个简单的SPOOLing系统来模拟实际的SPOOLing输入/输出过程,以掌握这种以空间换时间的技术。
要求将SPOOLing输入/输出处理程序编成一个独立的进程模块并与其他请求输入/输出的进程并发运行。
SPOOLing进程负责把从输入设备输入的信息送到外存输入井中,或把外存输出井中的信息送到打印机等输出设备上输出。
其余进程只要求编写输入/输出部分的程序。
要求定义实施算法的相关数据结构,实现设备分配和SPOOLing算法。
1.掌握SPOOLing技术的实现;
四、考核方式
实验成绩占课程总成绩的比重为10%。
考核方式根据实验课考勤、课前预习情况、课上实验能力、原型系统效果验收与实验报告的完成情况综合评分。
每个实验考核:
实验预习占30%,实验能力和效果占30%,实验报告占40%。
五、建议教材与教学参考书
1.课程教材
[1]张尧学.计算机操作系统教程.第三版.北京:
清华大学出版社.2006
[2]赵俊生.操作系统实验指导书.自编.2008
2.教学参考书
[1]汤小丹.计算机操作系统.第三版.西安:
西安电子科技大学出版社.2008
[2]徐虹.操作系统实验指导.北京:
清华大学出版社.2004
[3]屠祁.操作系统基础.第三版.北京:
清华大学出版社.2000
[4]冯耀霖.操作系统.西安:
西安电子科技大学出版社.2001
[5]左万历.计算机操作系统教程.第二版.北京:
高等教育出版社.2004
六、编制说明
编制者:
系统软件课程组组长:
寿永熙
执笔人:
赵俊生编制时间:
2009年3月
一、实验目的
1.学会在Linux中利用系统调用fork()创建进程。
2.加深对进程概念的理解,明确进程和程序的区别。
3.进一步认识在系统内进程并发执行的实质。
4.分析进程竞争资源的现象,学习解决进程互斥的方法。
5.掌握Linux中进程通信的基本原理。
二、实验类型
验证性实验。
三、实验预备知识
1.阅读Linux的sched.h源码文件,加深对进程管理概念的理解。
2.阅读Linux的fork.c源码文件,分析进程的创建过程。
四、实验内容
1.进程的创建
【任务】
编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符;
父进程显示字符“a”,子进程分别显示字符“b”和“c”。
试观察记录屏幕上的显示结果,并分析原因。
【程序】
#include<
stdio.h>
main()
{
intp1,p2;
while((p1=fork())==-1);
/*创建子进程p1,失败时循环*/
if(p1==0)/*子进程p1创建成功*/
putchar(‘b’);
else/*父进程返回*/
{
while((p2=fork())==-1);
/*创建另一个子进程p2,失败时循环*/
if(p2==0)/*子进程p2创建成功*/
putchar(‘c’);
else
putchar(‘a’);
/*父进程执行*/
}
}
【执行结果】
同学自己得到实验结果。
【分析原因】
同学自己分析多次执行产生不同实验结果的原因。
2.进程的控制
【任务】
修改已编写的程序,将每个进程的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。
如果在程序中使用系统调用lockf()来给每个进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。
【程序1】
intp1,p2,i;
if(p1==0)
for(i=0;
i<
50;
i++)
printf(“child%d\n”,i);
while((p2=fork())==-1)
if(p2==0)
printf(“son%d\n”,i);
printf(“daughter%d\n”,i);
【执行结果】
同学自己分析多次执行产生不同实验结果的原因。
【程序2】
unistd.h>
lockf(1,1,0);
/*加锁*/
lockf(1,0,0);
/*解锁*/
3.软中断通信
【任务1】
编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按任意字母键和Enter键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:
childprocess1iskilledbyparent!
childprocess2iskilledbyparent!
父进程等待两个子进程终止后,输出以下信息后终止:
parentprocessiskilled!
#include<
sys/types.h>
signal.h>
voidwaiting(),stop();
intwait_mark;
/*创建进程p1*/
if(p1>
0)
/*创建进程p2*/
if(p2>
Printf(“parentrun!
\n”);
Printf(“p1=%d\n”,p1);
Printf(“p2=%d\n”,p2);
wait_mark=1;
getchar();
kill(p1,16);
/*向p1发软中断信号16*/
kill(p2,17);
/*向p2发软中断信号17*/
sleep(5);
/*父进程睡眠5秒*/
wait(0);
/*等待子进程结束,同步*/
/*等待另一子进程结束,同步*/
lockf(stdout,1,0);
/*标准输出加锁*/
printf(“parentprocessiskilled!
lockf(stdout,0,0);
/*标准输出解锁*/
exit(0);
/*父进程终止*/
printf(“p2run!
signal(17,stop);
/*接收父进程发来的软中断信号17,并转stop*/
waiting();
printf(“childprocess2iskilledbyparent!
/*子进程p2终止*/
printf(“p1run!
signal(16,stop);
/*接收父进程发来的软中断信号16,并转stop*/
printf(“childprocess1iskilledbyparent!
/*子进程p1终止*/
voidwaiting()
printf(“waitingbegin!
while(wait_mark!
=0);
printf(“waitingend!
voidstop()
wait_mark=0;
printf(“signalstop!
”);
同学自己分析产生该实验结果的原因。
【任务2】
在上面任务1中,增加语句signal(SIGINT,SIG_IGN)和语句signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。
这里signal(SIGINT,SIG_IGN)和signal(SIGQUIT,SIG_IGN)分别为忽略“Ctrl+c”键信号以及忽略中断信号。
【程序】
intpid1,pid2;
intendflag=0,pf1=0,pf2=0;
voidintdelete()
kill(pid1,16);
kill(pid2,17);
endflag=1;
voidint1()
printf(“childprocess1iskilledbyparent!
exit(0);
voidint2()
printf(“childprocess2iskilledbyparent!
main()
intexitpid;
signal(SIGINT,SIG_IGN);
signal(SIGQUIT,SIG_IGN);
while((pid1=fork())==-1);
if(pid1==0)
printf(“process1run!
signal(SIGUSR1,int1);
signal(16,SIG_IGN);
pause();
while((pid2=fork())==-1);
if(pid2==0)
printf(“process2run!
signal(SIGUSR2,int2);
signal(17,SIG_IGN);
printf(“parentrun!
signal(SIGINT,intdelete);
waitpid(-1,&
exitpid,0);
printf(“parentprocessiskilled!
4.进程的管道通信
编制一段程序,实现进程的管道通信。
使用系统调用pipe()建立一条管道线。
两个子进程p1和p2分别向管道各写一句话:
child1issendingamessage!
child2issendingamessage!
而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。
intfd[3];
charoutpipe[100],inpipe[100];
pipe(fd);
lockf(fd[1],1,0);
sprintf(outpipe,”child1processissendingamessage!
write(fd[1],outpipe,50);
sleep
(1);
lockf(fd[1],0,0);
sprintf(outpipe,”child2processissendingamessage!
wait(0);
read(fd[0],inpipe,50);
printf(“%s\n”,inpipe);
一、实验目的
1.加深对SPOOLing(SimultaneausPeriphernalOperatingOn—Line)系统组成与基本工作原理的理解。
2.使用客户/服务器模式进行程序设计。
3.使用Linux进程技术,模拟SPOOLing系统中输出进程的工作。
4.使用Linux进程通信技术,模拟SPOOLing系统工作进程与输出进程的数据输出。
5.使用Linux文件技术,模拟SPOOLing系统输出井的工作过程。
二、实验类型
设计性实验。
三、实验预备知识
1.阅读Linux进程通信技术(消息和管道)的使用方法。
2.阅读Linux文件操作技术,掌握文件的基本处理方法。
四、实验内容
假脱机打印是SPOOLing系统的典型应用。
本次实验的内容就是以客户/服务器模式模拟假脱机打印的工作过程。
工作原理见图2-1。
图2-1模拟假脱机打印工作原理
整个系统的工作是先启动打印服务器,初始化客户/服务器间的通信、准备输入缓存区、打印队列和输出井。
然后启动请求打印的客户机程序(如命令:
printmnfile.dat),将要打印的文件(如:
file.dat)读入客户机系统,包装成客户机和服务器之间通信的基本信息单位,放入输出缓存区,然后启动进程间通信机制,向打印服务器发出请求。
服务器通过进程间的通信机制,将客户机传送的数据放入输出缓存区,并向打印队列申请打印,填写打印清单,然后将数据放入输出井中。
五、实验要求
1、实现客户机请求打印程序和打印服务器程序。
1)基本要求:
实现1台客户机对1台服务器;
提高要求:
实现n台客户机对1台服务器;
2)要求服务器分别接收客户机数据。
3)要求每个客户机放入到输出井中的数据是连续的。
2、测试程序,给出测试结果并进行分析。
3、书写实验报告。
六、实验提示
1、进程间的通信可以选择:
消息队列、管道和共享内存实现。
2、输出井可以通过一个文件进行模拟。
3、下面是一个通过Linux消息队列实现的模拟假脱机打印系统。
1)消息的结构
structmsg{
longpid;
//进程号
intid;
//消息号
intuid;
//用户号
intallpage;
//总页数
intsize;
//页长
charname[MAX_NAME_LENGTH];
//文件名
chartext[MAX_MSG_SIZE];
//消息内容
}
2)打印队列
typedefstruct{
intpid;
intuid;
charfilename[MAX_NAME_LENGTH];
}WaitQueue[MAX_ARRAY_LEN];
3)程序执行结果
(1)服务器启动
服务器通过命令行启动:
./spooling。
启动界面如图2-2所示。
图2-2服务器界面
(2)客户机请求打印
客户机通过命令行启动:
./printmntest.dat。
分别启动两个客户机,进行文件test.dat和t.dat的打印输出。
如图2-3和2-4所示。
图2-3客户机1界面
图2-4客户机2界面
(3)执行结果
服务器和客户机模拟的结果如图2-5所示。
图2-5模拟结果
(4)输出井
打印结果放入输出井中(如:
pool.dat),文件内容如图2-6所示。
图2-6输出井数据
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 实验 指导书 V1 分析 解析