操作系统原理实验报告

上传人:仙*** 文档编号:28396427 上传时间:2021-08-27 格式:DOC 页数:54 大小:1.13MB
收藏 版权申诉 举报 下载
操作系统原理实验报告_第1页
第1页 / 共54页
操作系统原理实验报告_第2页
第2页 / 共54页
操作系统原理实验报告_第3页
第3页 / 共54页
资源描述:

《操作系统原理实验报告》由会员分享,可在线阅读,更多相关《操作系统原理实验报告(54页珍藏版)》请在装配图网上搜索。

1、HUNAN UNIVERSITY操作系统原理实验报告本实验是在Linux RedHat 9.0环境下完成的,所用的Linux内核为2.4.20-8,gcc版本为,Part 1由于Linux下的命令众多,因而选取了实验材料中常用的大部分命令进行演示,结果如下:实验一(1)显示当前目录的全路径名(2)将当前目录改变为根目录(3)跳到自己的home directory(4)列出本目录中的文件(5)在用户主目录中创建一个名为mydir的新目录。然后调用长列表命令来查看/home/用户名mydir目录和/home/用户名目录(只查看目录文件的信息)(6)touch命令在mydir目录创建名为myfile

2、1,myfile2的两个文件(7)用cat查看/etc/passwd文件的内容(8)建立shell脚本运行shell脚本结果(9)使用cat命令与重定向,创建一个名为junk的文件。先随便输入几行内容使用cat命令在你刚刚创建的文件的末尾新加入几行文本(10)显示/etc/passwd文件的前10行的内容显示/etc/passwd文件的后10行的内容(11)报告当前进程状态(12)实时监测进程状态(13)在一台机子上从控制台同时登录两个用户,g1,g2,g1给g2发一封邮件。写上主题,忽略抄送(Cc:选项)首先查看本机IP用户创建然后进行远程登录(首先要检查时候安装telnet,否则要先安装,

3、然后才可能登陆成功。由于root用户一般情况下不能进行远程登录,所以如果当前用户是root时,远程登陆不会成功,要首先切换到普通用户,然后进行远程登录邮件由g1发送G2邮件接收(14)送一个通知给所有的用户,告诉他们你已经完成了这个练习通知由g2发出(15)写个简单的程序,并且运行Part 2实验一 中断处理一、实习内容模拟中断事件的处理。二、实习目的现代计算机系统的硬件部分都设有中断机构,它是实现多道程序设计的基础。中断机构能发现中断事件,且当发现中断事件后迫使正在处理器上执行的进程暂时停止执行,而让操作系统的中断处理程序占有处理器去处理出现的中断事件。对不同的中断事件,由于它们的性质不同,

4、所以操作系统应采用不同的处理。通过实习了解中断及中断处理程序的作用。本实习模拟“时钟中断事件”的处理,对其它中断事件的模拟处理,可根据各中断事件的性质确定处理原则,制定算法,然后依照本实习,自行设计。三、实习题目模拟时钟中断的产生及设计一个对时钟中断事件进行处理的模拟程序。 (1) 计算机系统工作过程中,若出现中断事件,硬件就把它记录在中断寄存器中。中断寄存器的每一位可与一个中断事件对应,当出现某中断事件后,对应的中断寄存器的某一位就被置成“1”。处理器每执行一条指令后,必须查中断寄存器,当中断寄存器内容不为“0”时,说明有中断事件发生。硬件把中断寄存器内容以及现行程序的断点存在主存的固定单元

5、,且让操作系统的中断处理程序占用处理器来处理出现的中断事件。操作系统分析保存在主存固定单元中的中断寄存器内容就可知道出现的中断事件的性质,从而作出相应的处理。本实习中,用从键盘读入信息来模拟中断寄存器的作用,用计数器加1来模拟处理器执行了一条指令。每模拟一条指令执行后,从键盘读入信息且分析,当读入信息=0时,表示无中断事件发生,继续执行指令;当读入信息=1时,表示发生了时钟中断事件,转时钟中断处理程序。 (2)假定计算机系统有一时钟,它按电源频率(50Hz)产生中断请求信号,即每隔20毫秒产生一次中断请求信号,称时钟中断信号,时钟中断的间隔时间(20毫秒)称时钟单位。可按确定的频率在键盘上键入

6、“0”或“1”来模拟按电源频率产生的时钟中断信号。(3) 中断处理程序应首先保护被中断的现行进程的现场(通用寄存器内容、断点等),现场信息可保存在进程控制块中;然后处理出现的中断事件,根据处理结果修改被中断进程的状态;最后转向处理器调度,由处理器调度选择可运行的进程,恢复现场使其运行。本实习主要模拟中断事件的处理,为简单起见可省去保护现场和处理器调度的工作。(4) 为模拟时钟中断的处理,先分析一下时钟中断的作用。利用时钟中断可计算日历时钟,也可作定时闹钟等。计算日历时钟把开机时的时间(年、月、日、时、分、秒)存放在指定的称为“日历时钟”的工作单元中,用一计时器累计时钟中断次数。显然,根据时钟中

7、断的次数和时钟单位(20毫秒)以及开机时的日历时钟可计算出当前的精确的日历时钟(年、月、日、时、分、秒)。因此,可按需要计算出一个作业装入时的时间,一个作业撤离时的时间,终端用户使用终端的时间,以及其它场合需要确定的时间。定时闹钟对需要定时的场合,例如,处理器调度采用“时间片轮转”策略调度时,可把轮到运行的进程的时间片值(以时钟单位计算)送到称为“定时闹钟”的工作单元中,每产生一次时钟中断就把定时闹钟值减1,当该值为“0”时,表示确定的时间已到,起到定时的作用。(5) 本实习的模拟程序可由两部分组成,一部分是模拟硬件产生时钟中断,另一部分模拟操作系统的时钟中断处理程序。模拟程序的算法如图1-1

8、。其中,保护现场和处理器调度的工作在编程序时可省去。约定处理器调度总是选择被中断进程继续执行。(6) 按模拟算法设计程序,要求显示或打印开机时间、定时闹钟初值、定时闹钟为“0”四、主要数据结构及符号说明local = localtime(&t); st=asctime(local);/获取进程开始时间,即开机时间int count=0,count1=0,k=8,w/设置为时钟闹铃为8,每个时间单位为2秒五、程序初值及运行结果开机时间:Dec 7 11:01:49 2011定时闹钟(时钟单位)闹钟结束时间(年、月、日、时、分、秒)2Dec 7 11:02:05 20111Dec 7 11:01:

9、57 20113Dec 7 11:02:13 2011六、实验体会和思考题通过本次实验明白了中断处理的详细过程,即中断处理程序应首先保护被中断的现行进程的现场,然后处理出现的中断事件,根据处理结果修改被中断进程的状态;最后转向处理器调度,由处理器调度选择可运行的进程,恢复现场使其运行。但是由于能力有限,对现场保护的过程不是很清楚,因此在实验的时候省去了这一过程,使得实验结过程大大简化。但是在今后的学习过程中会进一步探索中断保护的详细过程,希望能够有所突破。附录源码:interupt_dispose.cpp#include #include #includeint main() double p

10、;int a,m,r,n,e,o,u; struct tm *local; char *st,s27; time_t t; t=time(NULL); local = localtime(&t); /call library asctime(&) function display the process start time st=asctime(local); int i;for(i=0;i27;i+)/store the time as string si=*st;st+;printf(current system time:n);for( i=4;i=0.5)p=a+1;else p=a

11、;m=(int)p;printf(time have passed :%dn,m);r=s17-48;/count the passed time n=s18-48;e=r*10+n; p=p+e;if(p60) s17=(int)p/10)+48;s18=(int)p%10)+48;for( i=4;i27;i+)printf(%c,si);elses14=s14-48;s15=s15-48;o=s14*10+s15;o=o+(int)p/60;if(o60)s14=(o/10)+48; s15=(o%10)+48;s17=(int)p%60)/10+48; s18=(int)p%60)%1

12、0+48; for( i=4;i27;i+) printf(%c,si);elses11=s11-48;s12=s12-48; u=s11*10+s12;u=u+o/60;if(u24)s11=u/10+48;s12=u%10+48;s14=(o%60)/10+48; s15=(o%60)%10+48; s17=(int)p%60)/10+48; s18=(int)p%60)%10+48; for( i=4;i27;i+) printf(%c,si); 实验二进程调度算法的设计一、实习内容实现短进程优先调度算法(SPF)和时间片轮转调度算法(RR)二、实习目的通过对进程调度算法的设计,深入理解

13、进程调度的原理。进程是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的一个独立单位。进程调度分配处理机,是控制协调进程对CPU的竞争,即按一定的调度算法从就绪队列中选中一个进程,把CPU的使用权交给被选中的进程。进程通过定义一个进程控制块的数据结构(PCB)来表示;每个进程需要赋予进程ID、进程到达时间、进程需要运行的总时间的属性;在RR中,以1为时间片单位;运行时,输入若干个进程序列,按照时间片输出其执行序列。三、实验设计思想和流程实现短进程优先调度算法(SPF)和时间片轮转调度算法(RR) (1) 先来先服务(FCFS)调度算法原理:每次调度是从就绪队列中,选择一个最先进入就绪

14、队列的进程,把处理器分配给该进程,使之得到执行。该进程一旦占有了处理器,它就一直运行下去,直到该进程完成或因发生事件而阻塞,才退出处理器。 将用户作业和就绪进程按提交顺序或变为就绪状态的先后排成队列,并按照先来先服务的方式进行调度处理,是一种最普遍和最简单的方法。它优先考虑在系统中等待时间最长的作业,而不管要求运行时间的长短。按照就绪进程进入就绪队列的先后次序进行调度,简单易实现,利于长进程,CPU繁忙型作业,不利于短进程,排队时间相对过长。 (2) 时间片轮转调度算法RR原理:时间片轮转法主要用于进程调度。采用此算法的系统,其程序就绪队列往往按进程到达的时间来排序。进程调度按一定时间片(q)

15、轮番运行各个进程. 进程按到达时间在就绪队列中排队,调度程序每次把CPU分配给就绪队列首进程使用一个时间片,运行完一个时间片释放CPU,排到就绪队列末尾参加下一轮调度,CPU分配给就绪队列的首进程。固定时间片轮转法: 1 所有就绪进程按 FCFS 规则排队。 2 处理机总是分配给就绪队列的队首进程。 3 如果运行的进程用完时间片,则系统就把该进程送回就绪队列的队尾,重新排队。 4 因等待某事件而阻塞的进程送到阻塞队列。 5 系统把被唤醒的进程送到就绪队列的队尾。可变时间片轮转法: 1 进程状态的转换方法同固定时间片轮转法。 2 响应时间固定,时间片的长短依据进程数量的多少由 T = N ( q

16、 + t )给出的关系调整。 3 根据进程优先级的高低进一步调整时间片,优先级越高的进程,分配的时间片越长。多就绪队列轮转法:(3) 算法类型(4)模拟程序可由两部分组成,先来先服务(FCFS)调度算法,时间片轮转。流程图如下:四、主要数据结构及符号说明enum Statusrunning,ready,block 用枚举类型来列举进程的状态enum Algorithmspf,rr 用枚举类型来列举两种进程调度算法typedef class PCB/define PCB class which store information of PCBpublic: int id,cputime,allt

17、ime,startblock,blocktime;/进程号、已经运行时间、还需要的时间、何时开始阻塞及阻塞时间的变量 Status state;/进程的状态 class PCB *next;/指向下一个进程的指针 PCB() PCB,*PCBptr,*PCBpp;定义类类型来存储一个进程的相关信息,并用链表的方式来存放进程五、程序初值及运行结果六、实验体会和思考题通过本次实验,对短进程优先调度算法(SPF)和时间片轮转调度算法(RR)有了一个更为深刻的认识,具体表现如下:通过对两种不同算法的数据结构的实现,深入的了解了两种算法的具体实现过程,为今后的学习打下了一个好的基础。附录源码:#incl

18、ude #include #define MAX 5 /define the time below 5using namespace std;enum Statusrunning,ready,block;/define state of processenum Algorithmspf,rr;/define two algorithmstypedef class PCB/define PCB class which store information of PCBpublic: int id,cputime,alltime,startblock,blocktime; Status state;

19、 class PCB *next; PCB() PCB,*PCBptr,*PCBpp;PCBpp pp;void Print(PCBptr head)/print information of PCB PCBptr p; coutnext;p=p-next) if(p-next-state=running) coutIDnext-id; break; coutnext;p=p-next) if(p-next-state=ready) coutIDnext-id ; coutnext;p=p-next) if(p-next-state=block) coutIDnext-id ; coutn-n

20、 next;p=p-next) cout next-id next-cputime next-alltime next-startblock next-blocktimenext-state) case ready:coutready;break; case running:coutrun;break; case block:coutblock;break; default:exit(0); coutn; cout-n next!=p) q=q-next; q-next=p-next; delete p;void InsertSort(PCBpp Rdy,PCBpp RdyEd,Algorit

21、hm algthm)/sort ready queue as least nedd time if use spf algorithm if(*(Rdy+1)/queue is not NULL if(RdyEd-1!=Rdy+1)/there are more than one PCB in the ready queue if(algthm=spf) if(*(RdyEd-1)-alltimealltime)/if the previous PCB still nend time is long than the next /then sort the queue PCBpp tt; *R

22、dy=*(RdyEd-1); *(RdyEd-1)=*(RdyEd-2); for(tt=RdyEd-3;(*Rdy)-alltimealltime;tt-) *(tt+1)=*tt; *(tt+1)=*Rdy; void Run_To_Block(PCBpp Run,PCBpp &BlkEd)/convert process from run to block (*Run)-state=block; *BlkEd=*Run; BlkEd+;void Ready_To_Run(PCBpp &Rdy,PCBpp Run,Algorithm algthm)/convert process from

23、 ready to run if(algthm=spf) if(*(Rdy+1) (*(Rdy+1)-state=running; *Run=*(Rdy+1); Rdy+; else if(*Rdy) (*Rdy)-state=running; *Run=*Rdy; Rdy+; void Run_To_Ready(PCBpp Run,PCBpp Rdy,PCBpp &RdyEd,Algorithm algthm)/convert process from run to ready (*Run)-state=ready; *RdyEd=*Run; RdyEd+; if(algthm=spf) I

24、nsertSort(Rdy,RdyEd,algthm);int main() coutn) cerrerror; exit(0); PCBptr Listhead,Listp,Listq; Listhead=new PCB; Listp=Listhead; for(i=0;inext=Listq; Listp=Listq; Listp-next=0; Algorithm algorithm; int num1,num2; coutnum1) cerrerror; exit(0); algorithm=Algorithm(num1); if(algorithm!=spf&algorithm!=r

25、r) coutinput againn; else break; coutnnow we have nnext; for(i=0;i=n-1;i+) coutbasic information of PCB about No.iid=i; Listp-cputime=rand()%MAX; coutthe time has been run: cputimealltime=rand()%MAX; coutthe time still need to run : alltimestartblock=rand()%MAX; coutwhen to block: startblockblocktim

26、e=rand()%MAX; coutblock time : blocktimeendl; coutnum2) cerrerror;exit(0); if(num2!=0&num2!=1&num2!=2) coutstate=Status(num2); Listp=Listp-next; PCBpp Run=new PCBptr(); /create run process PCBpp Ready=new PCBptr100; for(i=0;i=99;i+) *(Ready+i)=0; /create ready queue PCBpp ReadyEnd=Ready; PCBpp Block

27、=new PCBptr100; for( i=0;inext;Listp=Listp-next)/initialize the process queue switch(Listp-next-state) case running:*Run=Listp-next;break; case ready: *ReadyEnd=Listp-next;ReadyEnd+; if(algorithm=spf) InsertSort(Ready,ReadyEnd,algorithm); break; case block:*BlockEnd=Listp-next;BlockEnd+;break; coutn

28、now the nnext;time+)/run the process coutnafter timecputime+; if(*Run)-alltime0) (*Run)-alltime-; if(*Run)-startblock0) (*Run)-startblock-; if(*Block)/block queue changes for(pp=Block;pp!=BlockEnd;pp+) if(*pp)-blocktime0) (*pp)-blocktime-; Print(Listhead); if(*Block) pp=Block; while(pp!=BlockEnd) if

29、(*pp)-blocktime=0) (*pp)-state=ready; *ReadyEnd=*pp;ReadyEnd+; if(algorithm=spf) InsertSort(Ready,ReadyEnd,algorithm); for(PCBpp ss=pp;ss!=BlockEnd;ss+) *ss=*(ss+1); BlockEnd-; else pp+; if(*Run) if(*Run)-alltime=0) Delete(Listhead,*Run); Ready_To_Run(Ready,Run,algorithm); else if(*Run)-startblock=0

30、) Run_To_Block(Run,BlockEnd); Ready_To_Run(Ready,Run,algorithm); else if(algorithm=rr) (*Run)-state=ready; *ReadyEnd=*Run; ReadyEnd+; if(*Ready) (*Ready)-state=running; *Run=*Ready; Ready+; else Ready_To_Run(Ready,Run,algorithm); return 0;实验三 内存页面置换算法的设计一、实习内容实现最近最久未使用(LRU)置换算法二、实习目的LINUX中,为了提高内存利用率

31、,提供了内外存进程对换机制,内存空间的分配和回收均以页为单位进行,一个进程只需将其一部分(段或页)调入内存便可运行,还支持请求调页的存储管理方式。当进程在运行中需要访问某部分程序和数据时,发现其所在页面不在内存,就立即提出请求(向CPU发出缺中断),由系统将其所需页面调入内存。这种页面调入方式叫请求调页。 当CPU接收到缺页中断信号,中断处理程序先保存现场,分析中断原因,转入缺页中断处理程序。该程序通过查找页表,得到该页所在外存的物理块号。如果此时内存未满,能容纳新页,则启动磁盘I/O将所缺之页调入内存,然后修改页表。如果内存已满,则须按某种置换算法从内存中选出一页准备换出,是否重新写盘由页表

32、的修改位决定,然后将缺页调入,修改页表。利用修改后的页表,去形成所要访问数据的物理地址,再去访问内存数据。整个页面的调入过程对用户是透明的。本实习要求学生通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的技术特点,掌握请求页式存储管理的页面置换算法。三、实验设计思想和流程实现最近最久未使用(LRU)置换算法 (1) 最近最久未使用(LRU)置换算法原理就是:当需要淘汰某页面时,选择当前一段时间内最久未使用过的页先淘汰,即淘汰距当前最远的上次使用的页。(2)本实验可以采用数组结构实现,首先随机产生页面序列,当发生请求调页时,若内存已满,则需要利用LRU算法,将当前一段时间内最久未使用

33、过的页替换出去。模拟程序的算法如图四、主要数据结构及符号说明struct pageInfor/定义一个页面信息的结构体,用来存放页面的大小及是否被访问过 int content;/page number int timer;/visit flagclass LRU/定义一个最近最少的类,用来封装对页面的查找情况 public: LRU(int qstring); int findSpace(void);/查找是否有空闲内存 int findExist(int curpage);/查找内存中是否有该页面 int findReplace(void);/查找应予置换的页面 void display(

34、void);/显示 int LRUpro(void);/LRU算法 void BlockClear(void);/BLOCK恢复 pageInfor * block;/物理块 pageInfor * page;/页面号串;五、程序初值及运行结果六、实验体会和思考题通过本次实验,对页面置换的LRU算法有了一个更为深入的认识,进一步深刻理解了具体表现如下:页面置换的过程,对于理解其他的页面置换方法有极大的帮助同时随着对页面置换方法的深对入理解,后面内存管理的学习也有极大的帮助附录源码page_replacement.cpp# include # include # include # includ

35、e # define Bsize 3 /define the size of page block# define Psize 10 /define the length of visitstruct pageInfor int content;/page number int timer;/visit flag;class LRU/define LRU class public: LRU(int qstring); int findSpace(void);/fine free memory int findExist(int curpage);/find whether the page a

36、lready exists int findReplace(void);/find page that should be replaced void display(void);/print the result int LRUpro(void);/LRU Algorithm void BlockClear(void); pageInfor * block;/physical block pageInfor * page;/string of page;LRU:LRU(int qstring) int i; block = new pageInforBsize; for(i=0; iBsiz

37、e; i+) blocki.content = -1;/initialize physical block blocki.timer = 0; page = new pageInforPsize; for(i=0; iPsize; i+) pagei.content = qstringi; pagei.timer = 0; int LRU:findSpace(void)/find free memory and return its position for(int i=0; iBsize; i+) if(blocki.content = -1) return i; return -1; in

38、t LRU:findExist(int curpage)/find existed page and return its position for(int i=0; iBsize; i+) if(blocki.content = pagecurpage.content) return i; return -1; int LRU:findReplace(void)/find page that should be replaced int pos = 0; for(int i=0; i= blockpos.timer) pos = i; return pos; void LRU:display

39、(void) for(int i=0; iBsize; i+) if(blocki.content != -1) coutblocki.content ; coutendl; void LRU:BlockClear(void)/clear the block for(int i=0; iBsize; i+) blocki.content = -1; blocki.timer = 0; int LRU:LRUpro(void)/record the number of no scarpage int exist,space,position ;int noscarBsize=0; for(int

40、 i=0; iPsize; i+) exist = findExist(i); if(exist != -1) noscarBsize+; coutno scarpageendl; blockexist.timer = -1;/assign visited block page TIMER is -1 else space = findSpace(); if(space != -1) blockspace = pagei; /stand for visited TIMER display(); else position = findReplace(); blockposition = pag

41、ei; display(); for(int j=0; jBsize; j+) blockj.timer+;return noscarBsize; int main(void) cout|-page replacement algorithm-|endl; coutplease select:endl; cout1. applying algorithm LRUendl; cout0. exitselect; switch(select) case 0: break; case 1: coutthe amount of page block is 3:endl; coutproduce the sequence of 10 length randomlyendl; srand( (unsigned)time(NULL) ); for(i=0;iPsize;i+) if(!(i%10) coutendl; qstringi=rand()%8; cout*qstringi; co

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!