操作系统实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档