操作系统实验报告 下载本文

在linux系统下,make是我们经常用到的编译命令,所以关于make代码和他的操作指令一定要记清楚。所以,熟练掌握了make和makefile工具之后,源码安装软件就变的像windows下安装软件一样简单。

实验四进程控制与管理

一、实验目的

1. 掌握GCC编译器的用法,学会利用GCC编辑器来编辑C语言程序,学会利用GDB调试器

来调试C语言程序。

2. 理解进程和程序的区别和联系,

3. 掌握在Linux环境下观察进程运行情况和CPU工作情况的命令。 4. 了解fork()系统调用,掌握利用fork()创建进程的方法。

5. 了解Linux系统其他与进程相关的系统调用,如exec、wait和exit等。 6. 了解Linux常用的进程通信机制。

二、实验内容

1. 利用Linux的进程管理命令ps、top来监视和跟踪进程,体会进程和程序的关系。 2. 利用Linux的文字编辑器编写文件复制的C语言程序,并用gcc编译该程序,然后运行

该程序。

3. 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中

有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。

4. 修改上述程序,每一个进程循环显示一句话。子进程显示'daughter…'及'son……',

父进程显示'parent……',观察结果,分析原因。

5. 用fork()创建一个进程,再调用exec()用新的程序替换该子进程的内容。

三、实验过程及结果

1、利用Linux的进程管理命令ps、top来监视和跟踪进程,体会进程和程序的关系。 <1>从用户身份切换到ROOT身份

<2>输入命令ps查看进程 <2>输入命令top跟踪进程

2、利用Linux的文字编辑器编写一个计算机100个自然数和的C语言程序,并用gcc编译该程序,然后运行该程序。 <1>创建一个.C文件并进入进行编辑

<2>用GCC进行编译,再查看文件,发现产生执行文件a.out <3>执行这个可执行文件得到结果5050

1、 编写一段程序,使用系统调用fork()创建两个子进程。当此程序运行时,在系统中有一

个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。试观察记录屏幕上的显示结果,并分析原因。 <1>穿件一个.C文件并进行编写程序代码 <2>反复执行2次该程序

<3>可以看出两次执行的结果abc出现的顺序不同,原因是,3个进程的输出次序是随机的,并不会按规定的顺序出现,所以会出现上述结果。

4、修改上述程序,每一个进程循环显示一句话。子进程显示'daughter…'及'son……',父进程显示'parent……',观察结果,分析原因。 <1>重新修改代码 <3>执行这段程序 <4>原分析:

因和之前一样,可以看出执行的结果3个单词出现的顺序不同,原因是, 3个进程的输出次序是随机的,并不会按规定的顺序出现,所以会出现上述结果。 5、用fork()创建一个进程,再调用exec()用新的程序替换该子进程的内容。 <1>

编写代码 <2>

执行的结果

结果表明execl替代了son的内容

四、实验总结和体会

这个实验考察的是进程之间存在很多可能性以及对编辑器的使用。本次实验学习了在linux环境下用gcc编译器运行c语言程序,在linux环境下编写程序用到了vi编辑器,知道了该编辑器也需要各种命令来操作。编写C语言程序时用到了fork()函数,再调用execl()用新的程序替换该子进程的内容。

实验五进程调度模拟程序的设计与实现

一、实验目的

1. 2.

了解进程调度的概念,掌握常用进程调度算法的原理。 掌握Linux程序设计编辑、编译和调试的技巧。

二、实验内容

1. 编写程序实现进程调度调度算法先来先服务、优先级高优先和时间片轮转调度算法。(编

程语言不限)

2. 输入数据,输出运行结果。

三、实验过程及结果

1先来先服务?

#i?nclude? float?t,d;?? struct? {

?int?id;?

float?ArriveTime;? float?RequestTime; ?float?StartTime;? float?EndTime; ?float?RunTime;? float?DQRunTime; ?int?Status;? }arrayTask[4]; GetTask() ?{

?int?i;? float?a;?

for(i=0;i<4;i++)? {arrayTask[i].id=i+1;

?printf(\

printf(\scanf(\

arrayTask[i].ArriveTime=a;?

printf(\?scanf(\

arrayTask[i].RequestTime=a; ?arrayTask[i].StartTime=0; ?arrayTask[i].EndTime=0;? arrayTask[i].RunTime=0;? arrayTask[i].Status=0;? ?}? }?

int?fcfs()? ?{??

int?i,j,w=0;?

for(i=0;i<4;i++)?? {??

if(arrayTask[i].Status==0)? ?{??

t=arrayTask[i].ArriveTime;?? w=1;? ?}?? if(w==1) ??break;? ?}??

for(i=0;i<4;i++)? ??{??

if(arrayTask[i].ArriveTime

?for(i=0;i<4;i++)? ?{??

if?(arrayTask[i].ArriveTime==t)?? return?i;? ?}?? }??

int?sjf() {?

int?i,x=0,a=0,b=0; ?float?g;?

for(i=0;i<4;i++)? {?

if(arrayTask[i].Status==1)? {g=arrayTask[i].EndTime; ?x=1;? }? }?

if(x==0){?

t=arrayTask[0].ArriveTime;?

for(i=0;i<4;i++) ?{?

if(arrayTask[i].ArriveTime

t=arrayTask[i].ArriveTime;? a=i;? }? }?

return?a; }? else? {?

for(i=0;i<4;i++)? {

if(arrayTask[i].EndTime>g)? g=arrayTask[i].EndTime; ?}?

for(i=0;i<4;i++)? {

if(arrayTask[i].Status==0&&?arrayTask[i].ArriveTime<=g)? {

t=arrayTask[i].RequestTime;? a=i;? b=1;

}?/*判断有没有进程在前个进程完成前到达*/? }?

if(b!=0)?/*有进程到达则按SJF*/ ?{

for(i=0;i<4;i++) ?{?

if(arrayTask[i].Status==0&&arrayTask[i].ArriveTime<=g&&arrayTask[i].RequestTime

t=arrayTask[i].RequestTime; ?a=i; } ?}?

return?a; }? else{

?/*否则按FCFS*/? for(i=0;i<4;i++)?

{if(arrayTask[i].Status==0)?t=arrayTask[i].ArriveTime; ?}?