操作系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《操作系统》课程实验报告
专业:软件工程
班级:软件二班
学号: 2220111350 姓名:韩培培
序号: 14
目录:
实验一、进程的创建
实验二、进程控制
实验三、进程的管道通信
实验四、消息通信
实验五、进程调度
实验六、FIFO页面调度
实验七、LRU页面置换算法
实验一进程的创建
一.实验目的:进程的创建
二.实验内容:编写一段程序,使用系统调用 FORK( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“A”子进程分别显示字符“B”和“C”。试观察记录屏幕上的显示结果,并分析原因。
三.实验代码:
#include <stdio.h>
Main()
{ int p1,p2;
While((p1=fork())==-1);
If (p1==0)
Putchar(ˊbˊ);
else
{
While((p2=fork())==-1);
If(p2==0)
Putchar(ˊcˊ);
else putchar(ˊaˊ);
}
}
四.实验运行结果
五.分析原因
程序首先调用Fork()函数创建一个子进程1.当创建进程不成功,循环创建进程,直至进程创建成功。如果Fork()返回值为0,表示当前进程是子进程1,显示字符B。如果Fork()返回值大于0,则表示当前进程是父进程,表示当前的程序代码是父进程所要执行的。父进程调用Fork()创建子进程2。当创建进程不成功时,循环创建进程直至成功。如果Fork()返回值为0,则表示当前进程是子进程2,显示字符C。如果Fork()返回值大于0,则表示当前进程
是父进程,输出字符A。
实验二:进程控制
一.实验目的:进程控制
二.实验内容:
修改已编写的程序,将每个进程的输出由单个字符改为一个字符串,再观察程序的执行时屏幕上出现的现象,并分析原因
三.实验代码:
# include<stdio.h>
Main()
{ int p1,p2,i;
While((p1=fork())== -1);
If (p1 == 0)
For (i=0;i<500;i++)
Printf("child %d/n",i);
else
{
While((p2 =fork()) == -1);
if(p2 == 0)
for (i= 0;i<500;i++)
printf("son%d\n",i)
else
for(i = 0;i<500;i++)
printf("daughter%d\n",i);
}
}
四.分析原因:
由于函数Printf()输出的字符串之间不会被中断,因此,字符串内部的字符顺序输出时不变。但是,由于进程并发执行时的调度顺序和父子进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。这与打印单字符的结果相同。
五.运行结果:
实验三进程的管道通信
一.实验目的:进程的管道通信
二.实验内容:
编制一段程序,实现进程管道通信。使用系统调用pipe()建立一条管道。两个子进程P1和P2分别向管道各写一句话。
再观察程序的执行时屏幕上出现的现象,并分析原因。三.实验代码:
# include<stdio.h>
# include<unistd.h>
# include<signal.h>
int pid1,pid2;
main()
{
int fd[2];
char outPipe[100],inPipe[100];
pipe(fd); //创建管道
while((pip1=fork())== -1);
if (pip1 == 0)
{
lockf (fd[1],1,0); //锁定管道
sprintf(o utPipe,“child 1 process is sending message!”);
write(fd[1], OutPipe,50); //向管道写入数据
sleep(5); //等待5秒
lockf(fd[1],0,0); //解除管道锁定
exit(0);
}
else
{
while((pip2 =fork()) == -1);
if(pip2 == 0)
{
lockf (fd[1],1,0);
sprintf(o utPipe,“child2process is sending message!”);
write(fd[1], outPipe,50);
sleep(5); 等待5秒
lockf(fd[1],0,0);
exit(0);
}
else
{
wait(0);
Read(fd[0], inpipe,50);
Printf(“%s\n”, inpipe)
Wait(0);
Read(fd[0],inpipe,50);
Exit(0);
}
}
}
四.分析原因
Pipe()函数用于创建一个管道,正确返回0,调用成功;错误返回-1,调用失败。首先使用系统调用Pipe()建立一条管道,调用Fork()函数创建一个子进程P1。当创建进程不成功时,循环创建进程,直至成功。如果Fork()返回值为0,则表示当前进程是子进程,向管道中写入一句话child1 process is sending message! 如果Fork()返回值大于0,则表示当前进程是父进程。当前程序代码是待父进程所要执行的。父进程调用Fork()函数创建子进程P2。当创建进程不成功时,循环创建进程直至成功。如果Fork()返回值为0,则表示当前进程是子进程P2,P2创建成功。向管道中写child2 process is sending