-
课程名称:
实验项目:
实验地点:
专业班级:
学生姓名:
指导教师:
本科实验报告
操作系统
操作系统实验
逸夫楼
302
软件
1132
学号:
2011005131
窦小莎
赵哲峰
p>
2013
年
10
月
29
日
2013
年
11
月
5
、
12
日
实验题目:
几种操作系统的界面
一、实验目的和要求
(一)
目的
本实验的目的是使学生熟悉
1
—
2
种操作系统的界面,在熟练使用机器的基础上,能了
解各种操作命令和系统调用在系统中的大致工作过程。
也就是通过操作系统的外
部特征,
逐
步深入到操作系统的内部实质内容中去。
(二)
要求
1.
能熟练的在
1
—
2
种操作系统的环境下工作,学会使用各种命令,熟悉系统提供的
各种功能,主动而有效地使用计算机。
2.
熟悉系统实用程序的调用方法和各种系统调用模块的功能和作用
二、
实验内容和原理
在某种操作系统的环境下建立、
修改、运行、打印源程序和结果,最后撤消一个完
整的程序。
三、
实验步骤及程序流程图
1
.
编写一
个完整的源程序,通过编辑命令送入机器,建立源程序文件;
2
.
编译该源文件,建立相应的目标文件;
3
.
编译有
错时,再用编辑命令修改源文件,消除全部词法和语法错误;
4
.
连接目标文件,形成可执行文件;
5.
执行该文件,得到结果;
6.
打印输出源程序和运行结果;
7.
撤消本次实验中形成的所有文件。
四、程序清单
Java
程序:
class TestMain {
public static void main(String[] args)
throws
Exception
{n(
所有水
仙花数如下
int i,a,b,c;
for( i=100;i<=999;i++){
a=i /100;
c=i %10
b=(i%100)/10;
if(a*a*a+b*b*b+c*c*c==i)
n(i);
}
}
}
五、实验结果与分析
Dos
环境下
:
六、讨论、心得
Dos
环境下命令比较灵活,进入文
件夹,退出,新建文件,编译运行文件,但若不熟悉则
比较费时。
实验题目:进程调度程序设计
一、实验目的和要求
(一)
目的
进程是操作系统最重要的概念之一,
进程调度是操作系统的主要
内容,
本实验要
求学生独立地用高级语言编写一个进程调度程序
,
调度算法可任意选择或自行设计,
本
实验可使学生加深对进程调度和各种调度算法的理解。
(二)
要求
1
.
<
/p>
设计一个有几个进程并发执行的进程调度程序,
每个进程由一个进
程控制块
(PCB)
表示,进程控制块通常应包括下述信息:进
程名,进程优先数,进程需要运行的时间,占用
CPU
的时间以
及进程的状态等,且可按照调度算法的不同而增删。
2
.
<
/p>
调度程序应包含
2
—
3
种不同的调度算法,运行时可以任选一种,以利于各种方
法的分析和比较。
3
.
系统应能显示或打印各进程状态和参数的变化情况,便于观察。
二、实验内容和原理
1
.
本程序
可选用优先数法或简单轮转法对五个进程进行调度。每个进程处于运行
R(run)
p>
、就绪
W(wait)
和完成
F(finish)
三种状态之一,并假定起始状态都是就绪状态
W
。为
了便于处理,
程序
中进程的运行时间以时间片为单位计算。
各进程的优先数或轮转时间片数、
以及进程需要运行的时间片数,均由伪随机数发生器产生。进程控制块结构如表
2-1
所示:
表
2-1
PCB
进程标识符
链指针
优先数
/
轮转时间片
数
占用
CPU
时间片数
进程所需时间片数
进程状态
进程控制块链结构如图
2-1
所示:
RUN HEAD
TAIL
1
3
5
2
0
┇
?
┇
┇
┇
R
W
W
W
图
2-1
进程控制块链结构
其中:
RUN
—当前运行进程指针;
HEAD
—进程就绪链链首指针;
TAIL
—进程就绪链链尾指针。
三、实验步骤及程序流程图
算法与框图
程序框图如图
2-2
所示。
开始
输入调度算法
alog
priority
alog=priority/round robin?
生成并按优先数大小
排列进程控制块链
链首进程投入运行
生成并按进入次序
排列进程控制块链
链首进程投入运行
round
robin
时间片到,进程时间片
数减
1
,优先数减
3
是
否
时间片到,进程时间片数
减
1
,占用
CPU
时间加
1
进程时
间片数
为
0
?
否
优
先
p>
数
大
于
链
首进程
?
占
用
处
理
机
时
间片到
?
否
进程时
间片数
为
0
p>
?
是
撤消该进程
从链首取
一个
进程投入运行
否
进程队列空
?
是
结束
否
运行进程退出,按
优先数插入进程链
是
运行进程退出,
排到进程链尾部
是
撤消该进程
从
链首
取
一
个
进程投入运行
否
进程队列空
?
是
结束
图
2-2
进程调度框图
(1)
优先数法。
< br>进程就绪链按优先数大小从大到小排列,链首进程首先投入运行。每
过一个时间片
,运行进程所需运行的时间片数减
1
,说明它已运行了一个时间
片,优先数也
减
3
。理由是该进程如果
在一个时间片中完成不了,优先级应降低一级。接着比较现行进程
和就绪链链首进程的优
先数,
如果仍是现行进程高或者相同,
就让现行进程继续运行,
否则,
调度就绪链链首进程投入运行。
原运行进程再按其优先数大小插入就绪链,
且改变它们对应
的进
程状态,直至所有进程都运行完各自的时间片数。
(2)
简单轮转法。
进程就绪链按各进程进入的先后次序排列,
链首进程首先投入运行。
进程每次占用处理机的轮转时间按其重要程度登入进程控制块中的轮转时间片数记录项
(相
应于优先数法的优先数记录项位置)
。每过一个
时间片,运行进程占用处理机的时间片数加
1
,然后比较占用处
理机的时间片数是否与该进程的轮转时间片数相等,若相等说明已到达
轮转时间,
应将现运行进程排到就绪链末尾,
调度链首进程占用处理机,
且改变它们的进程
状态,直至所有进程完成各自的时间片。
四、程序清单
#include
#include
#define furthest 5
struct process /*PCB STRUCTURE*/
{ int id;
int priority;
int cputime;
int alltime;
char state;
int next;
}prochain[furthest-1];
int procnum;
int rand();
int algo;
int run,head,tail,j;
main() /*MAIN PROGRAM*/
{
agan: printf(
scanf(
if
(algo==2)
{ printf(
init();
prisch();}
else
{
if (algo==1)
{
printf(
init();
timesch();}
else
{
printf(
goto agan;}
}
for (j=1;j<=40;j++)
{
printf(
printf(
for
(j=1;j<=40;j++)
{ printf(
pri
ntf(
printf(
getch();}
print() /*PRINT THE
RUNNING PROCESS,WAITING
QUEUE AND PCB SEQUENCE LIST*/
{
int k,p;
for (k=1;k<=40;k++)
printf(
printf(
printf(
printf(
p=head;
while(p!=0)
{
printf(
p=prochain[p].next;}
printf(
for (k=1;k<=40;k++) <
/p>
printf(
printf(
prin
tf(
printf(
printf( printf(
for (k=1;k
printf(
printf(
for (k=1;k
printf
(
printf(
printf(
fo
r (k=1;k
printf(
printf(
printf(
for
(k=1;k
printf(
printf(
for
(k=1;k
printf(
printf(
for
(k=1;k
printf(
printf(
}
insert(int q) /*INSERT A PROCESS*/
{ int p,s;
p=head;
s=prochain[head].next;
while
((prochain[q].priority
{ p=s;
s=prochain[s].next;}
prochain[p].next=q;
prochain[q].next=s;
}
insert2() /*PUT A PROCESS ONTO THE
TAIL OF THE QUEUE*/
{
prochain[tail].next=run;
tail=run;
prochain[run].next=0;
}
init() /*CREATE A WAITING QUEUE*/
{ int i;
int alog;
head=0;
if (alog==2)
{ for (i=1;i
{ prochain[i].id=i;
prochain[i].priority=(rand()+11)%41;
prochain[i].cputime=0;
prochain[i].alltime=(rand()+1)%7;
prochain[i].state='W';
prochain[i].next=0;
if((proc
hain[i].priority
insert(prochain[i].id);
else
{
prochain[i].next=head;
head=
prochain[i].id;}
}
}
else
{ for
(i=1;i
{
prochain[i].id=i;
prochain[i].priority=(rand()+1)%3+1;
prochain[i].cputime=0;
prochain[i].alltime=(rand()+1)%7;
prochain[i].state='W';
prochain[i].next=(i+1)%(furthest+1);}
head=1;
tail=furthest;
prochain[furthest].next=0;
}
run=head;
prochain[run].state='R';