ImageVerifierCode 换一换
格式:DOC , 页数:45 ,大小:530KB ,
资源ID:11086919      下载积分:10 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.docduoduo.com/d-11086919.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录   微博登录 

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统实验LINUX.doc)为本站会员(精品资料)主动上传,道客多多仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知道客多多(发送邮件至docduoduo@163.com或直接QQ联系客服),我们立即给予删除!

操作系统实验LINUX.doc

1、操作系统实验指导书烟台大学计算机学院操作系统课程组2008-9-201第一部分 操作系统上机指导Linux 操作系统环境:RedHat Enterprise Linux ES release 3 (Taroon Update 1) (2.4.21-9.EL)Red Flag Linux release 4.0 (HOT) (2.4)登录到系统常用命令练习:用 root 账号(超级用户)注册,口令为 computer(注意大小写) 。注册成功出现#号(超级用户系统提示符,普通用户的系统提示符为$) 。1 注销(退出)系统:logout 或 exit3练习使用命令 ls(注意 Linux 命令区分

2、大小写。 )使用 ls 查看当前目录内容;使用 ls 查看指定目录内容,如 /目录,/etc 目录使用 ls all 查看当前目录内容;使用 dir 查看当前目录内容4使用 cd 改变当前目录cd 回到上层目录 ;cd / 回到根目录5pwd 显示当前路径 6建立目录 mkdirLast login:web Oct 20 15:35:17 tty1rootlocalhost root#注意密码没有回显登录成功Localhost Login:Password:登录界面*用户名:root*密码:computer在GRUB中选择Red Flag Linux (Console Mode) /*命令行模

3、式*/启动GrubRed Flag Linux在GRUB中选择RedHat Enterprise Linux ES(2.4.21-9.EL)启动GrubRedHat Linux2mkdir 目录名 ; mkdir /home/s2001/newdir 7删除目录:rmdir;8复制文件 cp: 如 cp 文件名 1 文件名 29移动文件或目录: mv 10删除文件 rm11. 显示文件内容:more (分页显示); 12. 显示文件:cat 文件名 建立文件:cat 文件名,ctrl+d 结束输入使用编辑器 vi 编辑文件1. 进入 linux 的文本模式之后,在命令行键入 vi filena

4、me.c 然后回车。下面作一些简单的解释:首先vi 命令是打开 vi 编辑器。后面的 filename.c 是用户即将编辑的 c 文件名字,注意扩展名字是.c;当然,vi 编辑器功能很强,可以用它来编辑其它格式的文件,比如汇编文件,其扩展名字是.s;也可以直接用 vi 打开一个新的未命名的文件,当保存的时候再给它命名,只是这样做不很方便。2. 最基本的命令 I :当进入刚打开的文件时,不能写入信息,这时按一下键盘上的 I 键(insert) ,插入的意思,就可以进入编辑模式了。如下图所示: 3. a 与 i 是相同的用法4. 当文件编辑完后,需要保存退出,这时需要经过以下几个步骤:1)按一下键

5、盘上的 Esc 键;2)键入冒号(:),紧跟在冒号后面是 wq(意思是保存并退出) 。如果不想保存退出,则在第二步键入冒号之后,键入 q!(不带 w,机尾部保存) 。如下图所示:5. 退出 vi 编辑器的编辑模式之后,要对刚才编写的程序进行编译。编译的命令是:gcc filename.c -o 3outputfilename.out,其中 gcc 是 c 的编译器。参数:filename.c 是要编译的源文件的名称,outputfilename 表示输出文件名称,中括号表示括号内部的内容可输入也可以不输入(中括号本身不再命令行中出现) 。如果不输入 outputfilename.out,默认的

6、输出文件是 a.out 。6. 最后一步是运行程序,方法如下:./outputfilename.out添加新用户、修改文件属性1 添加新用户(在 root 下,按默认值回答)adduser 用户名;如 adduser s2001 ; 以新用户登录到系统2修改用户口令 passwd 用户名3控制文件属性使用 ls l 查看文件属性改变用户的所有权:chown 用户名 文件名改变文件权限:chmod g+w 文件名;chmod o-r 文件名或使用数字方式修改:如 chmod 644 文件名;chmod 755 文件名u (user 用户 ),g ( group 组) ,o (other 其他);

7、 w 写访问权限 ,r 读访问权限, x 执行权限4查看相关命令的帮助:man 命令名5显示当前系统中已注册的用户信息:who6显示当前注册的用户信息:whoami Tip:Unix 文件目录的属性显示格式:如:-rw-rw-rw- 1 steve users 138 Apr 5 19:34 readmedrwxrwxrwx 3 steve users 80 Apr 5 19:43 dir1 三种权限: owner group others文件或目录名最后修改的日期和时间文件的拥有者用户所在的组与文件链接的数文件的访问权限4第二部分 操作系统实验实验 1 Linux基本环境1、实验目的(1)熟

8、悉Linux下的基本操作,学会使用各种Shell命令去操作Linux,对Linux有一个感性认识。(2)学会使用vi编辑器编辑简单的C语言程序,并能对其编译和调试。2、实验预备内容(1)参阅相关Linux操作系统的安装手册,熟悉Linux的基本安装和配置;(2)参阅相关Linux的命令参考手册,熟悉Linux下的操作命令。3、实验内容(1) 以root用户身份登陆,并使用“ls”,“cat”“cd”等命令来实现基本的文件操作并观察Linux文件系统的特点;(2) 使用vi编辑器编写一C程序,并用gcc命令进行编译和链接,并用a.out来进行输出结果。4、思考(1)Linux系统在用户登陆和操作

9、界面以及文件系统上有哪些特点?实验 2 进程管理1、实验目的(1)加深对进程概念的理解,明确进程和程序的区别。(2)进一步认识并发执行的实质。(3)分析进程竞争资源现象,学习解决进程互斥的方法。(4)了解Linux系统中进程通信的基本原理。2、实验预备内容(1)阅读Linux的sched.h源文件,加深对进程管理概念的理解。(2)阅读Linux的fork.c源文件,分析进程的创建过程。3、实验内容(1)进程的创建编写一段源程序,使系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“

10、b”和字符“c”。试观察纪录屏幕上的显示结果,并分析原因。(2)进程的控制修改已编写的程序,将每个进程输出一个字符改为每个进程输出一句话,在观察程序执行时屏幕出现的现象,并分析原因。如果在程序中使用调用lockf()来给每一个子进程加锁,可以实现进程之间的互斥,观察并分析出现的现象。(3)编写一段程序,使其现实进程的软中断通信。要求:使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按DEL键);当捕捉到中断信号后,父进程用系统调用Kill()向两个子进程发出信号,子进程捕捉到信号后分别输出下列信息后终止:Child Processll is

11、 Killed by Parent!Child Processl2 is Killed by Parent!父进程等待两个子进程终止后,输出如下的信息后终止Parent Process is Killed!5在上面的程序中增加语句signal (SIGNAL, SIG-IGN) 和signal (SIGQUIT, SIG-IGN), 观察执行结果,并分析原因。(4)进程的管道通信编制一段程序,实现进程的管理通信。使用系统调用pipe()建立一条管道线;两个子进程P1 和P2 分别向管道中写一句话:Child 1 is sending a message!Child 2 is sending a

12、 message!而父进程则从管道中读出来自于两个子进程的信息,显示在屏幕上。要求父进程先接收子进程P1 发来的消息,然后再接收子进程P2 发来的消息。4、思考(1)系统是怎样创建进程的?(2)可执行文件加载时进行了哪些处理?(3)当首次调用新创建进程时,其入口在哪里?(4)进程通信有什么特点?实验 3 进程间通信1、实验目的Linux系统的进程通信机构 (IPC) 允许在任意进程间大批量地交换数据。本实验的目的是了解和熟悉Linux支持的消息通讯机制及信息量机制。2、实验预备内容阅读Linux系统的msg.c、sem.c和shm.c等源码文件,熟悉Linux的三种机制。3、实验内容(1)消息

13、的创建,发送和接收。使用系统调用msgget (), msgsnd (), msgrev (), 及msgctl () 编制一长度为 1k的消息的发送和接收程序。观察上面的程序,说明控制消息队列系统调用msgctl () 在此起什么作用?(2)共享存储区的创建、附接和段接。使用系统调用shmget(),shmat(),sgmdt(),shmctl(),编制一个与上述功能相同的程序。(3) 比较上述(1),(2)两种消息通信机制中数据传输的时间。实验 4 存储管理1、实验目的存储管理的主要功能之一是合理地分配空间。请求页式管理是一种常用的虚拟存储管理技术。本实验的目的是通过请求页式存储管理中页面

14、置换算法模拟设计,了解虚拟存储技术的技术特点,掌握请求页式存储管理的页面置换算法。2、实验内容(1)通过随机数产生一个指令序列,共 320条指令。指令的地址按下述原则生成:50%的指令是顺序执行的;50%的指令是均匀分布在前地址部分;50%的指令是均匀分布在后地址部分。具体的实施方法是:在 0,319 的指令之间随即选取一起点m;顺序执行一条指令,即执行地址为m+1 的指令;在前地址0,m+1中随机选取一条指令并执行,该指令的地址为m;6顺序执行一条指令,其地址为 m+ 1;在后地址m+ 2,319中随机选取一条指令并执行;重复上述步骤-,直到执行 320次指令。(2)将指令序列变换为页地址流

15、设:页面大小为 1k;用户内存容量为 4页到 32页;用户虚存容量为 32k。在用户虚存中,按每k存放 10条指令排在虚存地址,即 320条指令在虚存中的存放方式为:第 0条-第 9条指令为第 0页(对应虚存地址为0,9);第 10条-第 19条指令为第一页(对应虚存地址为10,19); 第 310条第 319条指令为第 31页(对应虚地址为310,319)。按以上方式,用户指令可组成 32页。(3)计算并输出下述各种算法在不同内存容量下的命中率。先进先出的算法(FIFO);最近最少使用算法(LRR);最佳淘汰算法(OPT)先淘汰最不常用的页地址;最少访问页面算法(LFR);最近最不经常使用算

16、法(NUR)。其中和为选择内容。命中率=1-页面失效次数/页地址流长度在本实验中,页地址流长度为 320,页面失效次数为每次访问相应指令时,该指令所对应的页不在内存的次数。3、随机数产生办法,Linux或UNIX系统提供函数strand()和rand(),分别进行初始化和产生随机数。例如:srand ();语句可初始化一个随机数;a0=10*rand()/65535*319+1;a1=10*rand()/65535*a0;语句可用来产生a0与a1中的随机数。实验 5 文件系统设计1、实验目的通过一个简单多用户文件系统的设计,加深理解文件系统的内部功能及内部实现。2、实验内容为linux系统设计

17、一个简单的二级文件系统。要求做到以下几点:(1)可以实现下列几条命令(至少 4条);login 用户登陆dir 列文件目录create 创建文件delete 删除文件open 打开文件7close 关闭文件read 读文件write 写文件(2)列目录时要列出文件名、物理地址、保护码和文件长度;(3)源文件可以进行读写保护。3、实验提示(1)首先应确定文件系统的数据结构:主目录、子目录及活动文件等。主目录和子目录都以文件的形式存放于磁盘,这样便于查找和修改。(2)用户创建的文件,可以编号存储于磁盘上。如file0,file1,file2.并以编号作为物理地址,在目录中进行登记。实验 6 处理器

18、调度一、实验内容选择一个调度算法,实现处理器调度。二、实验目的在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态。当就绪进程个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器。本实验模拟在单处理器情况下的处理器调度,帮助学生加深了解处理器调度的工作。三、实验题目本实验有两个题,学生可选择其中的一题做实验。第一题:设计一个按优先数调度算法实现处理器调度的程序。提示:(1) 假定系统有五个进程,每一个进程用一个进程控制块 PCB 来代表,进程控制块的格式为:进程名指针要求运行时间优先数状态其中,进程名作为进程的标识,假设五个进程的进程名分别为 P1,P 2,P 3,P 4

19、,P 5。指针按优先数的大小把五个进程连成队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程中的指针为“0” 。要求运行时间假设进程需要运行的单位时间数。优先数赋予进程的优先数,调度时总是选取优先数大的进程先执行。状态可假设有两种状态, “就绪”状态和“结束”状态。五个进程的初始状态都为“就绪” ,用“R”表示,当一个进程运行结束后,它的状态为“结束 ”,用“E”表示。(2) 在每次运行你所设计的处理器调度程序之前,为每个进程任意确定它的“优先数”和“要求运行时间” 。(3) 为了调度方便,把五个进程按给定的优先数从大到小连成队列。用一单元指出队首进程,用指针指出队列的连接情况。例:

20、8队首标志K2 K1 P1 K2 P2 K3 P3 K4 P4 K5 P50 K4 K5 K3 K12 3 1 2 41 5 3 4 2R R R R RPCB1 PCB2 PCB3 PCB4 PCB5(4) 处理器调度总是选队首进程运行。采用动态改变优先数的办法,进程每运行一次优先数就减“1” 。由于本实验是模拟处理器调度,所以,对被选中的进程并不实际的启动运行,而是执行:优先数-1要求运行时间-1来模拟进程的一次运行。提醒注意的是:在实际的系统中,当一个进程被选中运行时,必须恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行结束。在这里省去了这些工作。(5) 进程运行一次后,若要求

21、运行时间0,则再将它加入队列(按优先数大小插入,且置队首标志) ;若要求运行时间=0 ,则把它的状态修改成“结束” (E) ,且退出队列。(6) 若“就绪”状态的进程队列不为空,则重复上面(4)和(5)的步骤,直到所有进程都成为“结束”状态。(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次被选中进程的进程名以及运行一次后进程队列的变化。(8) 为五个进程任意确定一组“优先数”和“要求运行时间” ,启动所设计的处理器调度程序,显示或打印逐次被选中进程的进程名以及进程控制块的动态变化过程。第二题:设计一个按时间片轮转法实现处理器调度的程序。提示:(1) 假定系统有五个进程,每一个进程用

22、一个进程控制块 PCB 来代表。进程控制块的格式为:进程名指针要求运行时间已运行时间状态其中,进程名作为进程的标识,假设五个进程的进程名分别为 Q1,Q 2,Q 3,Q 4,Q 5。指针进程按顺序排成循环队列,用指针指出下一个进程的进程控制块的首地址,最后一个进程的指针指出第一个进程的进程控制块首地址。要求运行时间假设进程需要运行的单位时间数。已运行时间假设进程已经运行的单位时间数,初始值为“0” 。状态有两种状态, “就绪”和“结束” ,初始状态都为“就绪” ,用“R”表示。当一个进程运行结束后,它的状态为“结束” ,用“E”表示。(2) 每次运行所设计的处理器调度程序前,为每个进程任意确定

23、它的“要求运行时间” 。(3) 把五个进程按顺序排成循环队列,用指针指出队列连接情况。另用一标志单元记录轮到运行的进程。例如,当前轮到 P2执行,则有:标志单元K2 9K1 Q1 K2 Q2 K3 Q3 K4 Q4 K5 Q5K2 K3 K4 K5 K12 3 1 2 41 0 0 0 0R R R R RPCB1 PCB2 PCB3 PCB4 PCB5(4) 处理器调度总是选择标志单元指示的进程运行。由于本实验是模拟处理器调度的功能,所以,对被选中的进程并不实际的启动运行,而是执行:已运行时间+1来模拟进程的一次运行,表示进程已经运行过一个单位的时间。请同学注意:在实际的系统中,当一个进程被

24、选中运行时,必须置上该进程可以运行的时间片值,以及恢复进程的现场,让它占有处理器运行,直到出现等待事件或运行满一个时间片。在这时省去了这些工作,仅用“已运行时间+1”来表示进程已经运行满一个时间片。(5) 进程运行一次后,应把该进程的进程控制块中的指针值送到标志单元,以指示下一个轮到运行的进程。同时,应判断该进程的要求运行时间与已运行时间,若该进程的要求运行时间已运行时间,则表示它尚未执行结束,应待到下一轮时再运行。若该进程的要求运行时间=已运行时间,则表示它已经执行结束,应指导它的状态修改成“结束” (E)且退出队列。此时,应把该进程的进程控制块中的指针值送到前面一个进程的指针位置。(6)

25、若“就绪”状态的进程队列不为空,则重复上面的(4)和(5)的步骤,直到所有的进程都成为“结束”状态。(7) 在所设计的程序中应有显示或打印语句,能显示或打印每次选中进程的进程名以及运行一次后进程队列的变化。(8) 为五个进程任意确定一组“要求运行时间” ,启动所设计的处理器调度程序,显示或打印逐次被选中的进程名以及进程控制块的动态变化过程。四、实验报告(1) 实验题目。(2) 程序中使用的数据结构及符号说明。(3) 流程图。(4) 打印一份源程序并附上注释。(5) 打印程序运行时的初值和运行结果。要求如下: 进程控制块的初始状态。 选中运行的进程名以及选中进程运行后的各进程控制块状态。对于要求

26、每选中一个进程运行后都要打印。实验 7 主存储器空间的分配和回收一、实验内容主存储器空间的分配和回收。二、实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合1005k10k14k26k32k128k理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分

27、配和回收。三、实验题目本实验模拟在两种存储管理方式下的主存分配和回收。第一题:在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收。提示:可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:操作系统作业 1作业 3空闲区作业 2空闲区为了 说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:起 址 长 度 状 态第一栏 14 K 12 K

28、未 分 配第二栏 32 K 96 K 未 分 配空 表 目空 表 目其中,起址指出一个空闲区的主存起始地址。长度指出从起始地址开始的一个连续空闲的长度。状态有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效) ,可用来登记新的空闲区(例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态) 。由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。上述的这张说明表的登记情况是按提示(1)中的例所装入的三个作业占用的主

29、存区域后填写的。(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续11空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。为了方便查找还可使表格“紧缩” ,总是让“空表目”栏集中在表格的后部。(3) 采用最先适应算法(顺序分配算法)分配主存空间。按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第

30、一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。最先适应分配算法如图 4-1。(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。例如,在提示(1)中列举的情况下,如果作业 2 撤离,归还所占主存区域时,应与上、下相邻的空闲区一起合成一个大的空闲区登记在空闲区说明表中。归还主存时的回收算法如图 4-2。(5) 请按最先适应算法设计主存分配和回收

31、的程序。然后按(1)中假设主存中已装入三个作业,且形成两个空闲区,确定空闲区说明表的初值。现有一个需要主存量为 6K 的作业 4 申请装入主存;然后作业 3 撤离;再作业 2 撤离。请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。第二题:在分页式管理方式下采用位示图来表示主存分配情况,实现主存空间的分配和回收。提示:(1) 分页式存储器把主存分成大小相等的若干块,作业的信息也按块的大小分页,作业装入主存时可把作业的信息按页分散存放在主存的空闲块中,为了说明主存中哪些块已经被占用,哪些块是尚未分配的空闲块,可用一张位示图来指出。位示图可由若干存储单

32、元来构成,其中每一位与一个物理块对应,用 0/1 表示对应块为空闲/已占用。(2) 假设某系统的主存被分成大小相等的 64 块,则位示图可用 8 个字节来构成,另用一单元记录当前空闲块数。如果已有第 0,1,4,5,6,9,11,13,24,31,共 10 个主存块被占用了,那么位示图情况如下:字 位节 数号 0 1 2 3 4 5 6 70 1 1 0 0 1 1 1 01 0 1 0 1 0 1 0 02 0 0 0 0 0 0 0 03 1 0 0 0 0 0 0 14 0 0 0 0 0 0 0 05 0 0 0 0 0 0 0 06 0 0 0 0 0 0 0 07 0 0 0 0

33、0 0 0 012图 4-1 最先适应分配模拟算法图 4-2 主存回收算法(3) 当要装入一个作业时,根据作业对主存的需要量,先查当前空闲块数是否能满足作业要求,若不能满足则输出分配不成功。若能满足,则查位示图,13找出为“0”的一些位,置上占用标志“1” ,从“当前空闲块数”中减去本次占用块数。按找到的计算出对应的块号,其计算公式为:块号= j8+i其中,j 表示找到的是第 n 个字节, I 表示对应的是第 n 位。根据分配给作业的块号,为作业建立一张页表,页表格式:页 号 块 号012(4) 当一个作业执行结束,归还主存时,根据该作业的页表可以知道应归还的块号,由块号可计算出在位示图中的对

34、应位置,把对应位的占用标志清成“0” ,表示对应的块已成为空闲块。归还的块数加入到当前空闲块数中。由块号计算在位示图中的位置的公式如下:字节号 j=块号/8 ( 表示取整)位数 i=块号/8 ( 表示取余)(5) 设计实现主存分配和回收的程序。假定位示图的初始状态如(2)所述,现有一信息量为 5 页的作业要装入,运行你所设计的分配程序,为作业分配主存且建立页表(格式如(3)所述) 。然后假定有另一作业执行结束,它占用的块号为第 4,5,6 和 31 块,运行你所设计的回收程序,收回作业归还的主存块。要求能显示和打印分配或回收前后的位示图和当前空闲块数,对完成一次分配后还要显示或打印为作业建立的

35、页表。四、实验报告(1) 实验题目。(2) 程序中使用的数据结构及符号说明。(3) 流程图。(4) 打印一份源程序并附上注释。(5) 打印程序运行时的初值和运行结果,要求如下:第一题:打印空闲区说明表的初始状态,作业 4 的申请量以及为作业 4 分配后的空闲区说明表状态;再依次打印作业 3 和作业 2 的归还量以及回收作业 3,作业 2 所占主存后的空闲区说明表。第二题:打印位示图和当前空闲块数的初值;要求装入的作业对主存的申请量,为作业分配后的位示图、当前空闲块数和页表;作业归还的块号、回收作业所占主存后的位示图和当前空闲块数。14第三部分 操作系统实验指导实验 2 指导实验内容1进程的创建

36、任务编写一段程序,使用系统调用 fork( )创建两个子进程。当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示一个字符;父进程显示字符“a” ,子进程分别显示字符“b”和“c” 。试观察记录屏幕上的显示结果,并分析原因。程序#includemain()int p1,p2;if(p1=fork() /*子进程创建成功*/putchar(b);else if(p2=fork() /*子进程创建成功*/putchar(c);else putchar(a); /*父进程执行*/bca(有时会出现 abc的任意的排列)分析:从进程执行并发来看,输出 abc的排列都是有可能的

37、。原因:fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,所以输出 abc的排列都是有可能的。2进程的控制修改已编写好的程序,将每个程序的输出由单个字符改为一句话,再观察程序执行时屏幕上出现的现象,并分析其原因。如果在程序中使用系统调用 lockf()来给每个程序加锁,可以实现进程之间的互斥,观察并分析出现的现象。程序 1#includemain()int p1,p2,i;if(p1=fork()15for(i=0;imain()int p1,p2,i;if(p1=fork()lockf(1,1,0);for(i=0;i17程序#incl

38、ude#include#include void waiting(),stop(),alarming();int wait_mark;18main()int p1,p2;if(p1=fork() /*创建子进程 p1*/if(p2=fork() /*创建子进程 p2*/wait_mark=1;signal(SIGINT,stop); /*接收到c 信号,转 stop*/signal(SIGALRM,alarming);/*接受 SIGALRMwaiting();kill(p1,16); /*向 p1 发软中断信号 16*/kill(p2,17); /*向 p2 发软中断信号 17*/wait(

39、0); /*同步*/wait(0);printf(“parent process is killed!n“);exit(0);elsewait_mark=1;signal(17,stop);signal(SIGINT,SIG_IGN); /*忽略 c 信号*/while (wait_mark!=0);lockf(1,1,0);printf(“child process2 is killed by parent!n“);lockf(1,0,0);exit(0);elsewait_mark=1;signal(16,stop);signal(SIGINT,SIG_IGN); /*忽略c 信号*/wh

40、ile (wait_mark!=0)lockf(1,1,0);printf(“child process1 is killed by parent!n“);lockf(1,0,0);exit(0);19void waiting()sleep(5);if (wait_mark!=0)kill(getpid(),SIGALRM);void alarming()wait_mark=0;void stop()wait_mark=0;不做任何操作等待五秒钟父进程回在子进程县推出后退出,并打印退出的顺序;或者点击 ctrl+C后程序退出并打印退出的顺序。任务 2在上面的任务 1中,增加语句 signal(

41、SIGINT,SIG_IGN)和语句 signal(SIGQUIT,SIG_IGN),观察执行结果,并分析原因。这里,signal(SIGINT,SIG_IGN)和 signal(SIGQUIT,SIG_IGN)分别为忽略键信号以及忽略中断信号。#include#include#includeint pid1,pid2;int EndFlag=0;int pf1=0;int pf2=0;void IntDelete()kill(pid1,16);kill(pid2,17);void Int1()printf(“child process 1 is killed !by parentn“);ex

42、it(0);20void Int2()printf(“child process 2 is killed !by parentn“);exit(0);main()int exitpid;if(pid1=fork()if(pid2=fork()signal(SIGINT,IntDelete);waitpid(-1,waitpid(-1,printf(“parent process is killedn“);exit(0);elsesignal(SIGINT,SIG_IGN);signal(17,Int2);pause();elsesignal(SIGINT,SIG_IGN);signal(16,

43、Int1);pause();运行结果请读者将上述程序输入计算机后,执行并观察。3进程的管道通信任务编制一段程序,实现进程的管道通信。使用系统调用 pipe()建立一条管道线。两个子进程 p1和 p2分别向通道个写一句话:child1 process is sending message!child2 process is sending message!而父进程则从管道中读出来自两个进程的信息,显示在屏幕上。程序#include 21#include #include int pid1,pid2;main( ) int fd2;char outpipe100,inpipe100;pipe(fd

44、); /*创建一个管道*/while (pid1=fork( )=-1);if(pid1=0)lockf(fd1,1,0);sprintf(outpipe,“child 1 process is sending message!“); /*把串放入数组 outpipe 中*/write(fd1,outpipe,50); /*向管道写长为 50 字节的串*/sleep(5); /*自我阻塞 5 秒*/lockf(fd1,0,0);exit(0);elsewhile(pid2=fork( )=-1);if(pid2=0) lockf(fd1,1,0); /*互斥*/sprintf(outpipe,

45、“child 2 process is sending message!“);write(fd1,outpipe,50);sleep(5);lockf(fd1,0,0);exit(0);else wait(0); /*同步*/read(fd0,inpipe,50); /*从管道中读长为 50 字节的串*/printf(“%sn“,inpipe);wait(0);read(fd0,inpipe,50);printf(“%sn“,inpipe);exit(0);运行结果延迟 5 秒后显示:22child1 process is sending message! 再延迟 5 秒:child2 pro

46、cess is sending message!分析请读者自行完成 。 1、程序中的 sleep(5)起什么作用?2、子进程 1 和 2 为什么也能对管道进行操作?实验 3指导实验内容1 消息的创建,发送和接收任务使用系统调用 msgget( ), megsnd( ), msgrev( )及 msgctl()编制一长度为 1K的消息发送和接收的程序 。程序设计(1) 为了便于操作和观察结果,用一个 程序为“引子” ,先后 fork( )两个子进程,SERVER 和CLIENT,进行通信。(2) SERVER端建立一个 Key为 75的消息队列,等待其他进程发来的消息。当遇到类型为 1的消息,则

47、作为结束信号,取消该队列,并退出 SERVER 。SERVER 每接收到一个消息后显示一句“(server)received”。(3) CLIENT端使用 Key为 75的消息队列,先后发送类型从 10到 1的消息,然后退出。最后的一个消息,既是 SERVER 端需要的结束信号。CLIENT 每发送一条消息后显示一句“(client)sent” 。(4) 父进程在 SERVER 和 CLIENT 均退出后结束。程序#include #include #include #include #define MSGKEY 75 /*定义关键词 MEGKEY*/struct msgform /*消息结构

48、*/long mtype;char mtexe100; /*文本长度*/msg;int msgqid,i;void CLIENT( )int i;msgqid=msgget(MSGKEY,0777|IPC_CREAT);for(i=10;i=1;i-)msg.mtype=i;printf(“(client)sentn“);23msgsnd(msgqid, /*发送消息 msg 入 msgid 消息队列*/exit(0);void SERVER( ) msgqid=msgget(MSGKEY,0777|IPC_CREAT); /*由关键字获得消息队列*/domsgrcv(msgqid, /*从队列 msgid 接受消息 msg*/printf(“(server)receiven“);while(msg.mtype!=1); /*消息类型为 1 时,释放队列*/msgctl(msgqid, IPC_RMID,0);main()if(fork() SERVER();wait(0);else CLIENT( );从理想的结果来说

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报