操作系统原理实验报告.doc

上传人:小小飞 文档编号:5022757 上传时间:2020-01-29 格式:DOC 页数:54 大小:1.13MB
返回 下载 相关 举报
操作系统原理实验报告.doc_第1页
第1页 / 共54页
操作系统原理实验报告.doc_第2页
第2页 / 共54页
操作系统原理实验报告.doc_第3页
第3页 / 共54页
操作系统原理实验报告.doc_第4页
第4页 / 共54页
操作系统原理实验报告.doc_第5页
第5页 / 共54页
点击查看更多>>
资源描述

《操作系统原理实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统原理实验报告.doc(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) 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=run

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 研究报告 > 商业贸易


经营许可证编号:宁ICP备18001539号-1