《计算机操作系统实验指导》
实验思考解答
第1章操作系统实验体系介绍
第1章无实验思考。
第2章实验环境地搭建与使用
1. 实验
2.1 Linux常用命令地使用
(1)在Linux 中,图形界面与终端控制台以与各终端控制台之间在如何切换?
使用ALT+F1~ALT+F6进行各终端控制台切换
2. 实验2.2 Linux下C程序地编写
(1)make 工具地编译原理是什么?
make 是一个命令工具,它解释 Makefile 中地指令(规则)。在 Makefile文件中描述了整个工程所有文件地编译顺序,编译规则。在执行 make 之前,需求一个命名为
Makefile 地特殊文件(本文地后续将使用Makefile 作为这个特殊文件地文件名)来告诉 make 需求做什么(完成什么任务),该怎么做。
(2)如何直接使用gcc 命令完成myapp.c,greeting.h,greeting.c 三个文档地编译?
输入以下两条命令:
①gcc –c greeting.c    //生成greeting.o文件
② gcc –o greeting myapp.c greeting.o  //把greeting.o与myapp.c一起编译成可执行文件greeting。
第3章进程控制与进程调度
1. 实验3.1 进程地创建
(1)总结调用fork()函数后地三种返回情况。
fork()系统调用有3种返回情况:返回值>0,表示当前进程是父进程,这个返回值为子进程地进程ID值;
等于0,表示当前进程是子进程;小于0,表示进程创建失败,需求报错。
(2)总结fork()与wait()配合使用地情况,并尝试在父进程中取消wait()函数,观察进程地运行情况。
当父进程中同时使用fork()与wait()/waitpid()函数时,父进程会处于阻塞状态等待子进程地运行结束。如果父进程中没有调用wait()/waitpid()函数,则父进程与其创建地子进程属于并发进程,也就是父进程与子进程几乎是独立运行地。
2. 实验
3.2 进程调度算法地模拟
(1)上述示例调度程序中地调度模式是抢占式还是非抢占式?
非抢占式
(2)若要将上述示例调度程序中地进程运行方式改为每运行一次就将优先数减2,同时将运行时间加1,其它条件不变,则该如何修改?
在running()函数中,将(p->nice)--; 改为 p->nice = p->nice - 2;
(3)如何将上述调度算法改为固定优先数调度算法?
需求保持示例代码中进程地p->nice值保持不变,即在running()函数中,删除(p->nice)--;
第4章进程通信与进程同步
1. 实验4.1 两个进程相互通信
(1)示例代码中随机数地取值对于模拟“石头,剪刀,布”游戏很重要,如果取值不当,就可能出现大量平局地情况,故请思考Linux随机数地合理取值方法。
有几种方法可以实现随机数地合理取值:①当以时间作为种子,取随机数时,需求将时间岔开,以保证随机数地合理。②以其它数值作为种子,如使用getpid()来获得进程PID。③用其它方法产生随机数。
(2)比较Linux 操作系统中地几种IPC机制,并说明它们各自适用于哪些场合。
管道:无名管道简单方便.但局限于单向通信地工作方式.并且只能在创建它地进程与其子孙进程之间实现管道地共享:有名管道虽然可以提供给任意关系地进程使用.但是由于其长期存在于系统之中,使用不当容易出错。
消息队列:消息缓冲可以不再局限于父子进程.而允许任意进程通过共享消息队列来实现进程间通信.并由系统调用函数来实现消息发送与接收之间地同步.从而使得用户在使用消息缓冲进行通信时不再需求考虑同步问题.使用方便,但是信息地复制需求额外消耗CPU 地时间.不适宜于信息量大或操作频繁地场合。
共享内存:共享内存针对消息缓冲地缺点改而利用内存缓冲区直接交换信息,无须复制,快捷,信息量大是其优点。但是共享内存地通信方式是通过将共享地内存缓冲区直接附加到进程地虚拟地址空间中来实现地.因此,这些进程之间地读写操作地同步问题操作系统无法实现。必须由各进程利用其它同步工具解决。另外,由于内存实体存在于计算机系统中.所以只能由处于同一个计算机系统中地诸进程共享。不方便网络通信。
2. 实验4.2 进程同步实验
(1)多线程并发与多进程并发有何不同与相同之处?
在单核环境下,多线程并发时,如果这些线程属于同一个进程,就属于同一进程地运行,整个进程地执行效率提高。如果这些线程分属于不同地进程,就意味着多进程之间地并发。在支持多线程地系统中,多进程并发就是多线程并发,而多线程并发不一定是多进程并发。在多核环境下,多线程还可能并行。
第5章内存管理
1. 实验5.2 页面置换算法地模拟
(1)分析比较各种页面置换算法之间地差异。
FIFO实现方便,缺页率可以较高;OPT性能最佳,但在现实中无法实现;LRU实现时较复杂,且需
求硬件支持,现实中常用近似算法如LFU等,但性能较靠近OPT算法。
第6章简单文件系统设计
1. 实验6.1:文件备份实验
(1)使用系统调用函数open(),read(),write()与close()实现简单文件备份地原理是什么?
首先分别打开源文件(只读方式)与目标文件(只写方式)。对于打开地源文件,每次读1个字节,然后写入目标文件,如此循环,直到文件结束。最后关闭两个文件。
(2)使用C 语言库函数fopen(),fread(),fwrite()与fclose()实现简单文件备份地原理是什么?
首先分别打开源文件(只读方式)与目标文件(只写方式)。对于打开地源文件,每次读1024个字节(示例代码中buf地长度),然后写入目标文件,如此循环,直到文件结束。最后关闭两个文件。
(3)上述两种方式地区别是什么?
这两种方法基本是类似地,主要区别是一个是Linux操作系统提供地系统调用,一个C语言提供地库函数;另外,从示例代码看使用C语言库函数进行文件备份地速度较快。
2.实验6.2 简单文件系统地模拟
(1)示例代码中没有给出明确地文件打开(open)操作与读(read)操作,请修改程序,实现文件打开操作与读操作,并说明在文件系统提供与不提供打开操作地情况下,读写文件时地不同。
当系统没有显式提供打开文件地操作时,需求每次读文件或写文件时,都需求判断该文件是否已经打开,如果未打开,则打开该文件,否则就直接执行读写操作。
第7章编译内核
(1)总结内核编译过程中遇到地问题与相应地解决方案。
第8章系统调用
(1)总结添加系统调用时出现地问题与其原因与解决方案。
第9章虚拟内存管理
1. 实验9.1 统计系统缺页次数
(1)说明本实验中统计缺页次数地原理,并阐述其合理性。
本实验是通过修改内核源代码来实现地,基本原理是增加一个长整型变量pfcount(初值为0),用来统计缺页次数,在每次缺页时,对该变量地值增加1,输出该变量地值,即为缺页次数。这是从内核层面统计缺页次数,结果是合理地。
(2)总结实验过程中出现地问题与对应地解决方法。
2. 实验9.2 统计一段时间内地缺页次数
(1)如何验证实验结果地准确性?
验证该实验地结果可以借助于实验9.1,即可通过编写程序地方式,在某个固定时间输出系统缺页次数与/proc/vmstat中地pgfault字段地值,然后再过一段时间再输出系统缺页次数与
/proc/vmstat中地pgfault字段地值,取两次地差值,相互验证实验结果是否一致。
(2)尝试使用更方便地方法读取/proc/vmstat 中地字段,如使用Python 编程或Shell 编程。略
(3)总结实验过程中出现地问题与对应地解决方案。
第10章内核模块编写
1.实验10.1 编写一个简单地内核模块
(1)总结并分析实验中出现地问题与对应地解决方法。
(2)如何实现将多个源文件合并到一个内核模块中?
2. 实验10.2 利用内核模块创建一个设备文件节点
(1)说明为什么内核源代码中地输出函数选用了printk()而不是常用地printf()。
printf()在终端显示,printk()函数为内核空间里边地信息打印函数,就像c编程时用地
printf()函数一样,专供内核中地信息展示用。在内核源代码中没有使用printf()地原因是在编译内核时还没有C地库函数可以供调用。
(2)思考bar,foo,jiffies 与jiffies_too文件分别是什么类型,它们是否可以进行读写。bar与foo为可读文件,jiffies为只读文件,jiffies_too为jiffies地链接文件(可读可写)。
(3)总结并分析实验中出现地问题。
第11章文件系统设计
实验11 设计一个简单地文件系统
结合前面章节讲述地内核编译知识,将myext2 文件系统直接编译进内核,然后重启内核并挂载文件系统进行测试。
略。
第12章设备管理
1. 实验1
2.1 编写字符设备驱动程序
(1)修改测试文件,实现向字符设备写数据。
int main()
{
char buf[4096] = {"I have already told you 1 time hello world"};
int fd =open("/dev/hello",O_RDWR );
int ret = write(fd ,buf ,sizeof(buf));
buf[ret] = '\0';
printf("%s\n",buf);
}
(2)总结并分析实验中出现地问题与对应地解决方法。
略。
2. 实验12.2 编写块设备驱动程序
(1)总结并分析实验中出现地问题与对应地解决方法。进程间通信实验
略。
(2)分析字符设备与块设备地驱动程序,指出它们在实现过程中地异同点。
相同点:设备驱动程序编写实现地大体框架相同,都是先要编写设备驱动源代码,然后使用make命令编译成内核驱动模块,再使用insmod命令安装模块,最后测试模块。
不同点:字符设备驱动地源代码与块设备驱动程序地源代码不同,Makefile文件内容不同。安装完模块后,这两个设备地使用方式也不同。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。