操作系统实验报告Word格式文档下载.docx
《操作系统实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《操作系统实验报告Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
![操作系统实验报告Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2022-12/31/102c7b3e-a199-4b8e-892f-557430284180/102c7b3e-a199-4b8e-892f-5574302841801.gif)
三、实验内容
系统的启动,如图:
关闭使用shutdowm
还有列出文件夹内的信息ls,cp复制拷贝,touch创建文件命令等等
1 下载文件压缩包proftpd-1.3.4d.tar.gz,解压如图:
2 然后修改安装路径:
3 之后用make编译文件
4 在安装路径/home/liaoenrui/11里的etc中修改文件的组名和用户名:
将groud命名ftp,user也命名为ftp,然后用groudadd和useradd命令将这两个添加在该目录的sbin目录下:
5 最后运行文件,./profile即可
四、实验总结
通过本次的操作系统的上机实验,我熟练了Linux系统的基本操作命令,并且对安装文件有更深入的了解,比如在上述安装过程中对于通过froftpd来架构linux的ftp,由于之前都是用window系统,所以对于这些非常的生疏,因此在请教了多人和上网查询之后,终于有所了解,并且成功的将此实验顺利完成。
在本次实验中,我发现自己的动手能力又有很大的提高,相信以后继续努力的话会有更大的进步,当然这也要归功于老师的教导。
参考文献
[1]NeilMaththewRichardStonesLinux程序设计第四版人民邮电出版社
[2]周茜,赵明生.中文文本分类中的特征选择研究[J].中文信息学报,2003,Vol.18No.3
实验二Linux进程通信
1)了解有关Linux系统调用;
2)学习有关Linux的进程创建,理解进程创建后两个并发进程的执行。
二、实验内容
在Linux环境下,用C/C++语言编程,使用系统调用fork创建进程多个子进程。
(1)调试并完成下列程序,完成实验要求:
#include
"
stdio.h"
sys/types.h"
unistd.h"
int
main()
{
pid_tpid1;
pid_tpid2;
pid1
=
fork();
pid2
printf("
pid1:
%d,pid2:
%d\n"
pid1,pid2);
}
要求:
A.请说出执行这个程序后,将一共运行几个进程。
B.观察运行结果,并给出分析与解释。
答:
A.执行这个程序后,将一共运行4个进程。
A.运行结果如下:
分析与解释:
fork()函数能够建立子进程,且使得子进程得到父进程地址空间的一个复制;
而且,当创建成功时,如果是父进程则返回0,子进程则返回子进程的ID,但是,fork()创建的进程并不是从该程序开头开始执行,它只是和父进程一样继续执行后续代码,因此在之后的语句中,父子进程同时创建一个进程,就形成了四个进程,如图上所示。
所以,,在上面的截图中,第一次fork()函数时成功产生了父子进程pid分别为2775和0,第二次使用fork()函数时父子进程又各产生了一对父子进程父进程产生的父子进程的pid分别为2776和0,子进程产生的父子进程的pid分别为0和2777。
因为进程是并发的,他的调度我们无法干预,所以出现的结果并非都是一成不变的,执行多次后,输出的顺序有可能不一样。
(2)参考下面的相关程序实例,编写一个管道实验程序,实现两个进程之间的数据通信。
父进程顺序写入若干个字符串,子进程顺序读出内容,并写入文件piple.txt,并显示出来。
(写出设计步骤、数据结构、关键代码、实验结果及其分析说明)
①设计步骤:
用pipe()创建一个管道fd,用fork调用产生两个进程(父进程和子进程);
将父进程将要传输给子进程的信息写在readbuffer;
然后使子进程通过读端用write函数从缓存中读取父进程传输的消息。
②数据结构:
定义一个字符数组string用于存放父进程将要传输给子进程的消息,使用read函数和write函数配对实现管道的运行。
③关键代码:
#include<
unistd.h>
stdlib.h>
fcntl.h>
sys/stat.h>
sys/types.h>
intmain(void)
intfd[2],out;
pid_tchildpid;
charstring[]={"
abcdefghijklmnopqrstuvwxyz"
};
charreadbuffer[27];
pipe(fd);
childpid=fork();
if(childpid==-1)
{
printf("
forkerror"
);
exit
(1);
}
elseif(childpid!
=0)
close(fd[0]);
write(fd[1],string,sizeofstring);
exit(0);
else
close(fd[1]);
read(fd[0],readbuffer,27);
%s\n"
readbuffer);
out=open("
pipo.txt"
O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR);
write(out,readbuffer,80);
return0;
④实验结果:
⑤分析说明:
管道是用于进程间通信的一种通信机制。
Pipe函数在两个程序之间传递数据不需要启动shell来解释请求的命令,同时还提供了对数据的更多控制,因此用它来创建管道非常方便。
三、实验总结
在做这个实验之前,一直觉得这是一个非常复杂的实验,一直不太愿意去碰它。
终于不得不做了,发现其实没有想象中的那么难。
而且,通过这个实验,让我了解了关于页面调度方面的一些知识,对于系统是如何调度页面的更加的清晰明了。
通过这次的实验,使我学到了不少实用的知识,更重要的是,做实验的过程,思考问题的方法,这与做其他的实验是通用的,真正使我们受益匪浅。
在实验课上,由于时间关系以及考虑不全面,所以导致实验初始时的不完善,这启发了我要进行多方面的思考和研究,尤其是对于进程并发执行这种具有不确定性的问题,更要从多角度进行思索,并动手进行实际操作以及检验,才能验证自己的想法是否正确。
四、参考文献
[1]中国IT实验室
[2]陈向群,马洪兵.现代操作系统[M].北京:
机械工业出版社,2009.7
[3]黄志洪,钟耿扬,Linux操作系统[B].北京:
冶金工业出版社,2003.
[4]周巍松.Linux系统分析与高级编程技术[M].北京:
机械工业出版社,2000
实验三页面置换算法
本实验主要对操作系统中请求分页式内存管理及其应用的一些关键算法进行模拟。
学生通过设计与实现Clock算法,能够加强对相应理论的理解,并对了解操作系统内部的基本处理原理与过程也有很多益处。
基本要求:
描述Clock算法的基本原理、必要的数据结构、算法执行流程图、编码实现。
1)初始化:
输入作业可占用的总页框数,初始化置空。
2)输入序列:
输入一个页号访问请求序列,依次占用相应页框,直至全部占用;
3)Clock算法:
当页框全部占用后,对于后续新的页号访问请求,执行Clock算法,淘汰1个页面后装入新的页号。
4)显示当前分配淘汰序列:
显示淘汰的页号序列。
基本原理:
时钟页面置换算法是把所有的页面都保存在一个类似钟面的环形链表中,一个表针指向最老的页面,在采用请求分页机制的操作系统中,当运行一个程序的时候,若要访问的页面不在内存中而需要把它们调入内存,但此时内存已无空闲空间,为了保证该进程能正常运行,需选择内存中暂时不用的页面调出到磁盘交换区。
选择调出哪个页面,由页面算法决定。
页面置换算法的好坏,直接影响系统的性能,所以一个好的页面置换算法,应尽可能选择调出较长时间内不会再访问的页面,以保证较低的缺页率。
如图所示。
当发生缺页中断时,算法首先检查表针指向的页面,如果它的R位是0就淘汰该页面,并把新的页面插入这个位置,然后把表针前移一个位置;
如果R位是1就清除R位并把表针前移一个位置,重复这个过程直到找到了一个R位为0的页面为止
改进型的Clock算法的思想:
如图:
在将一个页面换出时,如果该页已被修改过,便须将它重新写到磁盘上;
但如果该页未被修改过,则不必将它拷回磁盘。
同时满足这两条件的页面作为首先淘汰的页。
由访问位uesbit和修改位change可以组合成下面四种类型的页面:
1类(usebit=0,change=0):
该页最近既未访问、又未修改,是最佳淘汰页。
2类(usebit=0,change=1):
该页最近未访问,但被修改,并不是好的淘汰页。
3类(usebit=1,change=0):
最近已被访问,但未被修改,该页有可能再被访问。
4类(usebit=1,change=1):
最近已被访问且被修改,该页有可能再被访问。
在内存中的每个页必定是这四类页面之一,在进行页面置换时,可采用与简单Clock算法相类似的算法,其差别在于须同时检查访问位和修改位,以确定该页是四类页面中的哪一种。
此算法称为改进型Clock算法。
其执行过程可分成以下三步:
(1)从指针所从当前位置开始扫描循环队列,寻找usebit=0且change=0的页面,将遇到的第一个页面作为所选中的淘汰页。
在第一次扫描间不改变访问位usebit。
(2)如果第一步失败,即查找一周后未遇到第一类页面,则开始第二轮扫描,寻找usebit=0且change=1的第二类页面,将所遇到的第一个这类页面作为淘汰页。
在第二轮扫描期间,将所有经过的页面的访问位置0。
(3)如果第二步也失败,即未找到第二类页面,则将指针返回到开始的位置,并将所有的访问位复0。
然后,重复第一步,如果仍失败,必要时再重复第二步,此时就一定能够找到被淘汰的页。
算法流程设计:
STEP1:
输入分配的页框数,页面访问次数和要访问的页面号序列
,在当前路径下建一个in.txt的文件作为输入使用。
STEP2:
内存页面初始化。
内存中页面的int数据结构为数组,用余项含有页号值now和访问位值usebit,修改位change。
开始时页号均为-1,访问位为0,修改位也为0。
STEP3:
测试数据。
具体算法是依要访问的页面号,运用写在main()函数里的clock算法查找是否已经存在于内存中。
若存在,则修改其访问位为1.若不存在,触发缺页中断。
最后,打印当前内存状态。
如此循环直至测试串都访问完毕
主要函数实现:
//CLOCK算法
if(mark[num]){
printf("
命中页%d*"
num);
usebit[num]=1;
if(work[now]==num)now=(now+1)%len;
//若是当前指针所在位置则移位,否则不变
}
else{
miss++;
mark[num]=usebit[num]=1;
change[num]=cha;
if(work[now]==-1){//判断是否还有空的内存块
work[now]=num;
now=(now+1)%len;
插入页%d*"
{
while(true){//循环的查找最佳的替换块
for(inti=0;
i<
len;
i++){//超找usebit=0,change=0的块
if(usebit[work[now]]==0&
&
change[work[now]]==0){f1=true;
break;
now=(now+1)%len;
}
if(!
f1){//查找usebit=0.change=1的块,查找过程中将不符合的usebit置0
for(intj=0;
j<
j++){
if(usebit[work[now]]==0&
change[work[now]]==1){f2=true;
usebit[work[now]]=0;
now=(now+1)%len;
f2){//将所有访问页置0
for(intk=0;
k<
k++){
if(f1||f2)break;
}
淘汰页%d,插入页%d*"
work[now],num);
mark[work[now]]=0;
now=(now+1)%len;
测试数据:
在这个模拟算法中我将所有的输入放在in.txt之中,并在文件中输入如下的数据:
3
005110304121204131001051
输出的结果如图:
结果分析:
由上图输出结果可以看到在第四个访问页时,需要淘汰页号,从总页框总看分别为:
0号的访问页和修改位为1:
0,5号的访问位和修改位为1:
1,1号的访问页和修改为为1:
0,所以在第一轮查找时没找到0:
0的,第二轮也没找到0:
1的,之后将访问页改为0时,在第二次的查找中可以找到0号页为0:
0,因此作为最佳淘汰页,之后的一样分析。
通过这几周的课程设计,加深了对操作系统的认识,了解了操作系统中各种资源分配算法的实现,特别是对虚拟存储,页面置换有了深入的了解,并能够用高级语言进行模拟演示。
对clock算法的理解。
通过与其他算法的比较,我也了解了他们的异同之处。
Clock算法其实是一种改进的第二次机会算法,它通过设置访问位,找到最早最不常访问的页面,即标号为0的页面。
之所以叫clock算法,依我理解是将内存中的排列顺序附上时间的概念。
clock指针扫过的页面要将他们1置0就是基于这个思想,因为他们都是没被访问的,且在时钟上的排列按照访问时间顺序。
这样就保证了每次替换的都是最早进来的且不最常访问的页面。
此算法较为简单,还有一种改进版的clock算法,增加了一个修改位,表示页框是否被修改过。
这样的设计更加符合现在操作系统的调度原则。
[1]朱振元,朱承.C++程序设计与应用开发.清华大学出版社
[2]谭浩强.C语言程序设计.第三版清华大学出版社
[3]
蒋爱军,李师贤,梅晓勇
著.
C++
Primer习题解答(第4版).
人民邮电出版社,
2007-02-01
[4]周峰,周艳.计算机操作系统原理教程郁实训.北京大学出版社
[5]王晓东.算法与数据结构.电子工业出版社,2001年08月[