《计算机操作系统》实验指导书Word文档下载推荐.docx
- 文档编号:18009577
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:31
- 大小:166.31KB
《计算机操作系统》实验指导书Word文档下载推荐.docx
《《计算机操作系统》实验指导书Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《《计算机操作系统》实验指导书Word文档下载推荐.docx(31页珍藏版)》请在冰豆网上搜索。
理解操作系统的接口功能;
掌握Linux操作系统的常用命令;
掌握vi编辑器的使用。
进程管理
4
加深对进程概念的理解,明确进程和程序的区别;
进一步认识并发执行的实质;
分析进程争用资源的现象,学习解决进程互斥的方法。
3
进程调度
通过编程熟悉进程控制块和进程组织方式;
熟悉进程调度的概念和时间片轮转调度算法。
进程间通信
验证Linux系统的进程通信机构(IPC)允许在任意进程间大批计算机量地交换数据。
实验的目的是了解和熟悉Linux支持的消息通信机制、共享存储区机制及信息量机制。
5
存储管理实验
设计
通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。
四、教材与参考资料
教材:
参考书:
汤小丹主编《计算机操作系统》(第四版),西安电子科学出版社,2007年
参考资料:
[1]任爱华等编著《操作系统实验指导》,清华大学出版社,2004年
[2]周苏编著《操作系统原理实验》,科学出版社,2004年
[3]孟静编著《操作系统题解与实验指导》,高等教育出版社,2002年
五、教学资源
多媒体实验室,实验指导,现场投影设备,linux,unix软件等。
六、考核评价
考核方式以提交的实验报告为主,考核成绩由平时成绩和实验报告两部分组成。
要求随时检查学生考勤,批改实验报告,对于上机实验,可以采用学生相互批阅、小组讨论的形式批阅学生作业,并对存在的问题及时给予反馈。
以上两个成绩累计60分以上(包括60分)算考核通过。
第一部分实验环境及所用系统函数介绍
DOS操作系统是单道操作系统,无法进行多道程序设计,Windows环境下的VisualC++虽然也可用于多道程序设计,但是并不是完全的多道,因为它也可用于DOS编程。
所以我们的实验选用Linux操作系统。
Linux操作系统是一个类UINX操作系统,是一个纯多道并发的网络操作系统。
1.1Linux操作系统简介
Linux是一个多用户操作系统,是UNIX的一个克隆版本(界面相同但内部实现不同),同时它是一个自由软件,是免费的、源代码开放的,这是它与UNIX的不同之处。
现在,Linux凭借优秀的设计,不凡的性能,加上IBM、Intel、CA、CORE、Oracle等国际知名企业的大力支持,市场份额逐步扩大,已成为与Windows和UNIX并存的三大主流操作系统之一。
1.2Linux的使用
1.2.1vi的使用
1)vi的简单应用
vi是linux环境下赫赫有名的文本编辑工具之一。
进入vi编辑器的方法:
vifilename.c注:
文件名必须带有扩展名.c,如filename.c否则无法通过编译;
进入vi后要按:
按“i”键从命令方式切换到输入方式;
从输入方式切换到命令方式的方法:
按“Esc”键
保存文件:
w
保存文件并退出:
wq
不保存文件退出:
q!
注:
以上操作必须在命令方式下进行。
2)其他常用vi操作命令
j,k,h,l:
上下左右
0:
行首
$:
行尾
ctrl+f
:
后翻页
ctrl+b:
前翻页
G
文件尾
数字G:
数字所指定行
i,I
插入命令,i
在当前光标处插入,
I
行首插入
a,A:
追加命令,a
在当前光标后追加,A
在行末追加
o,O:
打开命令,o
在当前行下打开一行,O在当前行上插入一行
x:
删除光标处字符
dd:
删除当前行
d0:
删除光标前半行
d$:
删除光标后半行
r,R
替换命令,r
替换当前光标处字符,R从光标处开始替换
/string:
查找字符串
n:
继续查找
N:
反向继续查找
%
:
查找对应括号
u
取消上次操作
1.2.2gcc的使用
gcc是linux下的一种c程序编译工具,使用方法如下(有提示符#的情况):
编译:
gcc–ofilename1filename.c
其中:
filename.c是源文件名,filename1是目标文件名,o代表object
执行:
./filenamel
示例:
键入一简单的程序:
viab.c按回车键输入以下代码段,
#include<
stdio.h>
unisted.h>
main()
{printf(“aaaa”);
}
按ESC键,再按“:
WQ”(W是保存,Q是退出)
出现提示符:
[root@GGG-LINUXroot]#
键入:
gcc–oabab.c进行编译。
执行:
./ab
1.2.3主要系统调用函数
1)系统调用fork()
功能:
创建一个新的进程.
头文件:
#include<
unistd.h>
说明:
本系统调用产生一个新的进程,叫子进程,是调用进程的一个复制品.调用进程叫父进程,子进程继承了父进程的几乎所有的属性。
(1)该子进程继承了父进程的程序空间,复制了父进程的数据段和栈段。
也就是说不管是父进程还是子进程,在占有处理机后,都从fork()调用的返回点开始运行;
(2)调用成功则对父进程返回子进程标识号pid;
(3)调用成功对子进程返回0,这也是最方便的区分父子进程的方法。
(4)若调用失败则返回-1给父进程,子进程不生成。
注意:
如果fork()值>
0,>
0的数即是子进程号。
但这时是父进程占有处理机。
2)系统调用wait(&
status)
功能:
等待子进程结束。
(1)当有多个子进程时,任一个子进程结束即将控制返回调用者,并将子进程调用exit(status)时的status值送到&
status指针所指单元中。
(2)在控制返回调用者时,同时将所等到的子进程pid作为wait()系统调用函数的返回值。
(3)waitpid(pid,…):
等待pid所指定的进程结束。
(4)返回值:
等待到一个子进程返回时,返回值为该子进程号;
否则返回值为–1。
允许调用进程(即父进程)取得子进程的状态信息,调用进程将会挂起直到其一个子进程终止。
3)系统调用exit()
终止进程.
语法:
#include<
stdlib.h>
voidexit(status)
intstatus
调用进程被该系统调用终止。
该系统调用发出后,操作系统将从系统中删除调用exit的进程,并将status值传给等待它结束的父进程。
返回值:
无
4)系统调用kill()
向一个或一组进程发送一个信号。
signal.h>
intkill(pid,sig);
pid_tpid;
intsig;
向一个或一组进程发送一个信号,该信号由参数sig指定,为系统给出的信号表中的一个。
Sig是signal的缩写。
调用成功则返回0,否则返回-1.
kill-STOP[pid]:
发送SIGSTOP(17,19,23)停止一个进程,而并不消灭这个进程。
kill-CONT[pid]:
发送SIGCONT(19,18,25)重新开始一个停止的进程。
kill-KILL[pid]:
发送SIGKILL(9)强迫进程立即停止,并且不实施清理操作。
kill-9-1:
终止拥有的全部进程。
SIGKILL和SIGSTOP信号不能被捕捉、封锁或者忽略。
5)系统调用lockf()
应用、检测或删除打开文件的一个POSIX锁
语法:
intlockf(intfd,intcmd,off_tlen);
说明:
应用、检测或删除打开文件某部分的一个POSIX锁,文件通过fd指明,文件的描述符的请求操作通过cmd指明。
#defineF_ULOCK0解锁一个区域
#defineF_LOCK1上锁一个区域
#defineF_TLOCK2检测并上锁一个区域
#defineF_TEST3检测一个区域是否上锁
文件上锁区域的请求起始于隐含的偏移并包好len字节,假如len为负,从pos…pos+len-1,这里pos为当前文件位置,假如len为零,则位置从当前文件位置延伸延伸到无限长,包括当前和以后的文件最后的位置。
在所有情况下,位置可延伸到以前当前的文件的最后位置。
在Linux中,这称为fcntl
(2)的接口(一般会指明lockf和fcntl的关系)。
6)系统调用pipe()
是用来建立管道的。
intpipe(intfd[2]);
这里fd[1]为写入端,fd[0]为读出端。
从管道里写或从管道里读。
第二部分实验内容
实验一熟悉LINUX基本命令及编程环境
1、实验类型
本实验为验证性实验。
2、实验目的与任务
1)熟悉使用Linux字符界面,窗口系统的常用命令;
2)熟悉运用Linux常用的编程工具;
3)熟悉运用Linux的在线求助系统。
3、预习要求
1)熟悉一种操作系统的使用和安装,如windows操作系统的安装,DOS系统的使用
2)了解进程的概念及进程的状态
3)熟悉c语言程序设计
4)熟悉c语言程序编译过程
4、实验基本原理
进入Linux操作系统后,控制终端的命令行输入方式下输入各种命令,并显示各种命令操作后的输出结果,操作包括文件操作命令的使用,vi命令的使用以及gcc编译器的使用,详细的各种命令及使用方式见第一部分的介绍。
5、实验仪器与设备(或工具软件)
实验设备:
计算机一台,软件环境要求:
安装RedHatLinux操作系统和gcc编译器。
6、实验内容
1)使用常用的操作命令ls,cp,rm,mkdir,man,vi等。
2)熟悉怎么编辑一个程序(编辑,调试,运行见),输入一个简单的C程序进行练习,参考练习程序如下:
程序1
{
intp1;
while((p1=fork())==-1);
if(p1==0)
putchar(‘B’);
elseputchar(‘A’);
程序2
#include"
stdafx.h"
main()
introw,column,num,n=6;
for(row=1;
row<
n;
row++)
{for(column=1;
column<
n-row;
column++)
printf("
"
);
for(num=row;
num>
=1;
num--)
%d"
num);
for(num=2;
num<
=row;
num++)
\n"
}}
7、实验步骤
1)进入Linux操作系统
开机后,选择进入Linux操作系统方式,输入用户名和密码,即可进入Linux操作系统。
2)进入控制终端的命令行输入方式
在Linux操作系统环境下,点击“小红帽”菜单,选择“系统”下拉菜单,选择“终端”选项,进入命令行输入方式。
3)输入命令后按回车键
在命令行输入方式下,输入各种文件操作命令,并按回车查看显示结果。
8、注意事项
1)gcc编译器不能编译不带扩展名的c语言程序。
2)注意编译和运行程序的基本过程。
3)注意熟练使用man命令来查看某条命令的含义及使用方式。
9、实验报告要求
要求列出多条命令的使用和相应结果,需要列出运行了的程序清单及相应结果,并对结果进行分析和讨论。
实验二进程管理
本实验为设计性实验。
1)加深对进程概念的理解,明确进程和程序的区别。
2)进一步认识并发执行的实质
1)进程的概念
2)进程控制的概念及内容
3)进程的并发执行
4)熟悉互斥的概念
5)用到的Linux函数有:
fork(),lockf()等。
使用fork()系统调用来创建一个子进程,父进程和子进程并发执行,交替输出结果。
使用lockf()系统调用对临界区进行加锁操作,实现对共享资源的互斥使用。
实验设备:
1)进程的创建
编写一段程序,使用系统调用fork()创建两个子程序。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:
父进程显示字符“a”;
子进程分别显示字符“b”和字符“c”。
运行程序10次,观察记录屏幕上的显示结果,并分析原因。
2)进程的控制
修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,再观察程序执行时屏幕上出现的现象,并分析原因。
如果在程序中使用系统调用lockf()来给每一个进程加锁,可以实现进程间的互斥,观察并分析出现的现象。
(1)进程的创建参考程序如下:
intp1,p2;
while((p1=fork())==-1);
if(p1!
=0)
{
while(((p2=fork())==-1);
if(p2==0)putchar('
b'
elseputchar('
c'
}
a'
运行结果:
bca(或bac)
分析:
从进程并发执行来看,输出bac,acb等情况都有可能。
原因:
fork()创建进程所需的时间要多于输出一个字符的时间,因此在主程序创建进程的同时,进程2就输出了”b”,而进程2和主程序的输出次序是随机的,所以出现上述结果。
(2)进程的控制参考程序如下
{intp1,p2,i;
while((p1=fork())==-1);
{for(i=0;
i<
500;
i++)
child%d\n"
i);
else
{
while((p2=fork())==-1);
if(p2==0)
for(i=0;
son%d\n"
elsefor(i=0;
daughter%d\n"
略
由于函数printf()输出和字符串之间不会被中断,因此字符串内部的字符顺序输出不变。
但是由于进程并发执行时的调度顺序和父进程的抢占处理机问题,输出字符串的顺序和先后随着执行的不同而发生变化。
进程加锁后的参考程序如下:
lockf(1,1,0);
for(i=0;
lockf(1,0,0);
lockf(1,1,0)
lockf(1,0,0)
else
{
lockf(1,1,0)
学生自己完成
1)进入vi编辑器
2)在编译器中输入所要运行的程序代码
3)退出编辑器,返回命令行输入方式,使用gcc编译器编译程序,获得能运行的目标程序。
4)运行目标程序,查看运行结果。
1)如果使用gcc编译程序有错的话,需要重新修改程序,直到无错为止。
2)注意系统是如何创建进程的?
3)查看结果是否是交替输出,如果修改输出的次数是否会出现交替现象?
4)相关函数的介绍见第一部分的介绍。
需要列出运行了的程序清单及相应结果,并对结果进行分析和讨论。
对结果的分析主要讨论结果为什么会交替出现?
并发进程是如何执行的?
实验三进程调度
本实验为综合性实验
在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。
当就绪进程个数大于处理机数时,就必须依照某种策略来决定那些进程优先占用处理机。
本实验模拟在单处理机情况下的处理机调度,帮助学生加深了解处理机调度的工作。
1)熟悉进程控制块和进程组织方式
2)熟悉进程调度的概念
3)熟悉时间片轮转调度算法等
4)熟悉c语言编程,指针及结构体等知识
5)数据结构中的链表的建立及基本操作
进程控制块通过链表队列的方式组织起来,系统中存在运行队列和就绪队列(为简单起见,不设阻塞队列),进程的调度就是进程控制块在运行队列和就绪队列之间的切换。
当需要调度时,从就绪队列中挑选一个进程占用处理机,即从就绪队列中删除一个进程,插入到运行队列中,当占用处理机的进程运行的时间片完成后,放弃处理机,即在运行队列中的进程控制块等待一段时间(时间片)后,从该队列上删除,如果该进程运行完毕,则删除该进程(节点);
否则,则插入到就绪队列中。
设计一个时间片轮转调度算法实现处理机调度的程序,具体内容如下
1)实验中使用的数据结构
(1)PCB进程控制块
内容包括参数①进程名name;
②要求运行时间runtime;
③优先数prior;
④状态state;
⑤已运行时间runedtime。
(2)为简单起见,只设运行队列,就绪链表两种数据结构,进程的调度在这两个队列中切换,如图3.1所示
图3.1PCB链表
2)每个进程运行时间随机产生,为1~20之间的整数。
3)时间片的大小由实验者自己定义,可为3或5
4)可参考的程序流程图如图3.2
图3.2模拟进程调度的流程图
5)参考程序
stdio.h"
stdlib.h"
typedefstructPCB
intname;
intruntime;
intrunedtime;
intstate;
intkilltime;
structPCB*next;
}PCB;
#defineNUM10
voidmain()
inttimeslice=3;
PCB*runqueue;
PCB*top,*tail,*temp;
/*队列指针
inti;
srand(10);
NUM;
temp=(structPCB*)malloc(sizeof(structPCB));
temp->
name=i;
temp->
runtime=rand()%20;
runedtime=0;
next=NULL;
killtime=0;
if(i==0){top=temp;
tail=temp;
}
else{
tail->
next=temp;
tail=temp;
}
printf("
processname=%d,runtime=%d,runedtime=%d,killtime=%d\n"
tail->
name,tail->
runtime,tail->
runedtime,tail->
killtime);
while(top!
=NULL)
runqueue=top;
top=top->
next;
runqueue->
runt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机操作系统 计算机 操作系统 实验 指导书