操作系统实验指导书V1分析解析.docx

上传人:b****0 文档编号:12472911 上传时间:2023-04-19 格式:DOCX 页数:21 大小:199.53KB
下载 相关 举报
操作系统实验指导书V1分析解析.docx_第1页
第1页 / 共21页
操作系统实验指导书V1分析解析.docx_第2页
第2页 / 共21页
操作系统实验指导书V1分析解析.docx_第3页
第3页 / 共21页
操作系统实验指导书V1分析解析.docx_第4页
第4页 / 共21页
操作系统实验指导书V1分析解析.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

操作系统实验指导书V1分析解析.docx

《操作系统实验指导书V1分析解析.docx》由会员分享,可在线阅读,更多相关《操作系统实验指导书V1分析解析.docx(21页珍藏版)》请在冰豆网上搜索。

操作系统实验指导书V1分析解析.docx

操作系统实验指导书V1分析解析

操作系统实验指导书

操作系统课程组编

 

内蒙古工业大学

信息工程学院计算机系

二〇一三年九月

目录

《操作系统》实验教学大纲1

实验一进程管理1

实验二SPOOLing技术实现12

《操作系统》实验教学大纲

一、基本信息

课程编码

020213008

课程学时

56

课程类别

学科基础课程

实验总学时

10

开出学期

5

开出单位

计算机系

适用专业

计算机科学与技术、软件工程

二、实验安排

序号

实验项目

实验学时

每组人数

实验类型

开出要求

1

实验一进程管理

4

1

验证

必做

实验二SPOOLing技术实现

6

1

设计

必做

三、实验目的、内容与要求

实验一进程管理

(一)实验目的

1.加深对进程概念的理解,明确进程和程序的区别;

2.进一步认识并发执行的实质;

3.分析进程争用资源的现象,学习解决进程互斥的方法;

4.了解Linux系统中进程通信的基本原理。

(二)实验内容

1.进程的创建;

2.进程的控制;

3.进程的软中断通信;

4.进程的管道通信。

(三)实验要求

1.掌握Linux系统中进程的创建、控制和通信的实现;

2.根据实验内容,在Linux平台上用C语言编程实现,上机调试运行得出实验结果;

3.写出预习报告和实验报告。

实验二SPOOLing技术实现

(一)实验目的

1.加深对SPOOLing系统的理解;

2.进一步认识SPOOLing技术的实质;

3.分析、设计SPOOLing系统的实现方法;

4.了解Linux系统中SPOOLing的基本原理。

(二)实验内容

设计并运行一个简单的SPOOLing系统来模拟实际的SPOOLing输入/输出过程,以掌握这种以空间换时间的技术。

要求将SPOOLing输入/输出处理程序编成一个独立的进程模块并与其他请求输入/输出的进程并发运行。

SPOOLing进程负责把从输入设备输入的信息送到外存输入井中,或把外存输出井中的信息送到打印机等输出设备上输出。

其余进程只要求编写输入/输出部分的程序。

要求定义实施算法的相关数据结构,实现设备分配和SPOOLing算法。

(三)实验要求

1.掌握SPOOLing技术的实现;

2.根据实验内容,在Linux平台上用C语言编程实现,上机调试运行得出实验结果;

3.写出预习报告和实验报告。

四、考核方式

实验成绩占课程总成绩的比重为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

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】

#include

main()

{

intp1,p2,i;

while((p1=fork())==-1);

if(p1==0)

for(i=0;i<50;i++)

printf(“child%d\n”,i);

else

{

while((p2=fork())==-1)

if(p2==0)

for(i=0;i<50;i++)

printf(“son%d\n”,i);

else

for(i=0;i<50;i++)

printf(“daughter%d\n”,i);

}

}

【执行结果】

同学自己得到实验结果。

【分析原因】

同学自己分析多次执行产生不同实验结果的原因。

【程序2】

#include

#include

main()

{

intp1,p2,i;

while((p1=fork())==-1);

if(p1==0)

{

lockf(1,1,0);/*加锁*/

for(i=0;i<50;i++)

printf(“child%d\n”,i);

lockf(1,0,0);/*解锁*/

}

else

{

while((p2=fork())==-1)

if(p2==0)

{

lockf(1,1,0);

for(i=0;i<50;i++)

printf(“son%d\n”,i);

lockf(1,0,0);

}

else

{

lockf(1,1,0);

for(i=0;i<50;i++)

printf(“daughter%d\n”,i);

lockf(1,0,0);

}

}

}

【执行结果】

同学自己得到实验结果。

【分析原因】

同学自己分析多次执行产生不同实验结果的原因。

3.软中断通信

【任务1】

编制一段程序,使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按任意字母键和Enter键),当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后,分别输出下列信息后终止:

childprocess1iskilledbyparent!

childprocess2iskilledbyparent!

父进程等待两个子进程终止后,输出以下信息后终止:

parentprocessiskilled!

【程序】

#include

#include

#include

#include

voidwaiting(),stop();

intwait_mark;

main()

{

intp1,p2;

while((p1=fork())==-1);/*创建进程p1*/

if(p1>0)

{

while((p2=fork())==-1);/*创建进程p2*/

if(p2>0)

{

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);/*等待子进程结束,同步*/

wait(0);/*等待另一子进程结束,同步*/

lockf(stdout,1,0);/*标准输出加锁*/

printf(“parentprocessiskilled!

\n”);

lockf(stdout,0,0);/*标准输出解锁*/

exit(0);/*父进程终止*/

}

else

{

printf(“p2run!

\n”);

wait_mark=1;

signal(17,stop);/*接收父进程发来的软中断信号17,并转stop*/

waiting();

lockf(stdout,1,0);/*标准输出加锁*/

printf(“childprocess2iskilledbyparent!

\n”);

lockf(stdout,0,0);/*标准输出解锁*/

exit(0);/*子进程p2终止*/

}

}

else

{

printf(“p1run!

\n”);

wait_mark=1;

signal(16,stop);/*接收父进程发来的软中断信号16,并转stop*/

waiting();

lockf(stdout,1,0);/*标准输出加锁*/

printf(“childprocess1iskilledbyparent!

\n”);

lockf(stdout,0,0);/*标准输出解锁*/

exit(0);/*子进程p1终止*/

}

}

voidwaiting()

{

printf(“waitingbegin!

\n”);

while(wait_mark!

=0);

printf(“waitingend!

\n”);

}

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”键信号以及忽略中断信号。

【程序】

#include

#include

#include

#include

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!

”);

exit(0);

}

main()

{

intexitpid;

signal(SIGINT,SIG_IGN);

signal(SIGQUIT,SIG_IGN);

while((pid1=fork())==-1);

if(pid1==0)

{

printf(“process1run!

\n”);

signal(SIGUSR1,int1);

signal(16,SIG_IGN);

pause();

exit(0);

}

else

{

while((pid2=fork())==-1);

if(pid2==0)

{

printf(“process2run!

\n”);

signal(SIGUSR2,int2);

signal(17,SIG_IGN);

pause();

exit(0);

}

else

{

printf(“parentrun!

\n”);

signal(SIGINT,intdelete);

waitpid(-1,&exitpid,0);

printf(“parentprocessiskilled!

\n”);

exit(0);

}

}

}

【执行结果】

同学自己得到实验结果。

【分析原因】

同学自己分析产生该实验结果的原因。

4.进程的管道通信

【任务】

编制一段程序,实现进程的管道通信。

使用系统调用pipe()建立一条管道线。

两个子进程p1和p2分别向管道各写一句话:

child1issendingamessage!

child2issendingamessage!

而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。

【程序】

#include

#include

#include

intpid1,pid2;

main()

{

intfd[3];

charoutpipe[100],inpipe[100];

pipe(fd);

while((pid1=fork())==-1);

if(pid1==0)

{

printf(“p1run!

\n”);

lockf(fd[1],1,0);

sprintf(outpipe,”child1processissendingamessage!

”);

write(fd[1],outpipe,50);

sleep

(1);

lockf(fd[1],0,0);

exit(0);

}

else

{

while((pid2=fork())==-1);

if(pid2==0)

{

printf(“p2run!

\n”);

lockf(fd[1],1,0);

sprintf(outpipe,”child2processissendingamessage!

”);

write(fd[1],outpipe,50);

sleep

(1);

lockf(fd[1],0,0);

exit(0);

}

else

{

printf(“parentrun!

\n”);

wait(0);

read(fd[0],inpipe,50);

printf(“%s\n”,inpipe);

wait(0);

read(fd[0],inpipe,50);

printf(“%s\n”,inpipe);

exit(0);

}

}

}

【执行结果】

同学自己得到实验结果。

【分析原因】

同学自己分析产生该实验结果的原因。

实验二SPOOLing技术实现

一、实验目的

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];

intallpage;

}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输出井数据

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1