




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程实验目 录实验1 BACI环境下进程的并发执行3实验2 BACI环境下解决死锁问题11实验3 µC/OS-II操作系统的进程调度模块源码分析16实验4 µC/OS-II操作系统的动态内存管理18实验5 磁盘调度算法模拟实验21附1: 创建进程(开设Linux基础课程班级选作)26附2: 线程的创建及线程间互斥的实现(开设Linux基础课程班级选作)34实验1 BACI环境下进程的并发执行【实验目的】1)了解BACI并发运行环境。2)使用BACI设计并发程序,深入理解并发概念。【条件要求】1)认真阅读和掌握预备知识。2)上机操作。【预备知识】一、BACI简介并行和
2、同步是计算机科学中的重要课题。由于对并行和分布式计算的日益重视,理解并行和同步变得愈发重要。为了获得对于这些概念的感性认识,编写并行程序的实践经验将是必不可少的。BACI是帮助学生获得需要的“第一手”并行程序设计经验的选项之一。BACI是Ben-Ari Concurrent Interpreter(Ben-Ari并行解释器)的缩写。编译器和解释器最初由M. Ben-Ari设计完成,主要基于Niklaus Wirth的Pascal编译器。最初版本的BACI编译器和解释器基于这些代码,并运行于一个PRIME大型机。经过大量的修改和扩充,目前版本已经移植到了PC上,支持的语言包括Turbo Pasc
3、al, Sun Pascal以及C。此外,编译器和解释器被分成了两个独立的程序。后来,BACI中还加入了C-编译器,这是一个有限的C+子集,它可以编译C-程序为解释器能够解释的中间代码(PCODE object code)。与其他并行语言相比,BACI在学生熟悉的语法框架内提供了多种并行技术,所有具有C或Pascal程序设计经验的学生都可以在几小时内掌握BACI的使用,BACI已经被成功地运用于很多大学的课堂教学。二、C-编译器语法BACI的C-是C+的一个子集。换言之,C-符合C+语法,此外,它包括一些限制和新的数据类型,例如:1)除了标准输入输出(cout,cin,endl)之外不支持其他
4、文件操作。2)C- BACI只支持简单的C/C+类型:int和char。简单类型的常量修饰符(const)也被支持,所有的变量必须在代码块的开头定义。3)支持字符串类型(string)。BACI同时包括内建的字符串处理函数,例如stringCopy, stringCompare, stringConcat等等。 4)支持简单类型和字符串数组,数组定义遵循常见的C语法。5)支持过程和函数,采用标准的作用域规则,参数定义可以使用传值和传递引用的方式,执行开始于对“main()”的调用。6)过程控制语句包括if-else,switch/case,for,while,do-while,break和co
5、ntinue,这些语句的句法和标准的C/C+相同。三、并行结构1.cobegincobegin块包括一组并发执行的进程列表,这样的块不允许嵌套,而且只能出现在主程序中。列表中的PCODE语句将被解释器以任意、随机的顺序执行,于是多次执行包括cobegin块的相同程序的结果将呈现不可预测性。主程序将挂起,直到cobegin块终结,此时主程序将恢复执行紧随块后的下一条语句。下面是一个例子:cobegin proc1( . ); proc2( . ); . ; procN( . );2.semaphoresemaphore是一个BACI预定义类型,它是一个非负的整数变量,并且只能通过受限的方式访问。
6、BACI也提供了一个它的子类型binarysem,这是一个二元信号量,它的值只能是0或1。信号量函数包括: initialsem ( semaphore s, integer_expression ):能够初始化BACI中两种信号量s的唯一的函数。 p(semaphore s)和wait(semaphore s ):如果semaphore > 0,则递减1并返回,从而调用者能够继续运行;如果semaphore = 0,则递减1,p的调用者将休眠。 v(semaphore s)和signal(semaphore s):如果semaphore=0并且存在等待它的进程,则将随机地唤醒一个,并且
7、semaphore递增1。无论如何v的调用者将继续。3.monitorsBACI也支持有限的Hoare monitor概念,monitor是包括附加属性的C-块,所有monitor变量中的函数都对外可见,但monitor变量不可以在块外访问,而只能由monitor函数访问。在BACI中,monitor只能在全局域中定义,并且不能嵌套。任意时刻只能有一个monitor块中的过程或函数被执行。这一特性使得能够使用monitor来实现互斥。有三个可以被过程或函数使用的monitor机制:condition变量,waitc(条件等待)以及signalc(条件信号)。 condition变量:只能被mo
8、nitor的函数访问。这种变量不能有实际的值,它是进行P操作或V操作的标志。 void waitc(condition cond, int prio):monitor进程将被阻塞,并赋予指定的优先级(prio)以备重新唤醒。这个阻塞动作允许就绪的其他进程继续执行。 void waitc(condition cond):与waitc调用语义相同,但这一P操作将被赋予优先级10。 void signalc(condition cond):如果存在的话,唤醒等待cond的优先级最高的进程。 void empty(condition cond):当没有等待cond的进程时返回“1”,反之返回“0”。4
9、.其他并行结构 atomic(原子的)关键字:如果某个函数被定义为“atomic”,则函数将是不可剥夺的。解释器将不会在进程切换时中断atomic函数。 void suspend(void):将调用进程置为休眠状态。 void revive(int process_id):激活给定id的进程。 int which_proc( void ):返回当前进程的线程数。 int random(int range):返回0到“range-1”之间,包括端点的伪随机数。四、怎样使用BACIBACI C-编译器源文件的扩展名必须是“.cm”,在BACI中运行程序的步骤是:1)编译“.cm”文件以获得PCOD
10、E文件(.pco)。命令格式为:bacc 参数 源文件名常见的参数包括: h:显示帮助信息。 c:产生“.pob”目标文件,以便进行后续的连接操作。2)使用解释器解释执行PCODE(.pco)文件。命令格式为:bainterp 参数 PCODE文件名常见的参数包括: d:调试模式,单步执行,可以设置断点。 e:在每一进程项旁边显示活动记录(AR)。 x:每一进程退出时显示AR。 t:通知进程结束。 h:显示帮助信息。 p:执行时显示PCODE指令。【实验内容】1)设包含可执行文件bacc,bainterp的目录名为“balnxxe”,进入该目录。#cd balnxxe2)使用Vi编辑一个新文件
11、“exam8a.cm”。#vi exam8a.cm其内容如下:void func1() cout<<"*"<<endl; cout<<"AAAAAAAAAAAAAA"<<endl; cout<<"BBBBBBBBBBBBBB"<<endl;void func2() cout<<"$"<<endl; cout<<"CCCCCCCCCCCCCC"<<endl; cout<&l
12、t;"DDDDDDDDDDDDDD"<<endl;main() cobeginfunc1();func2();3)保存退出“exam8a.cm”。4)在Linux下编译“exam8a.cm”。#./bacc exam8a.cm 5)解释执行“exam8a.pco”。#./bainterp exam8a.pco记录执行结果。6)再次解释执行“exam8a.pco”。#./bainterp exam8a.pco比较这次结果与上次结果有何不同,试说明原因。7)使用Vi编辑一个新文件“exam8b.cm”。#vi exam8b.cm其内容如下:int x=0;int y
13、=0;void func1() x=4; cout<<endl; y=y+x;void func2() y=3; cout<<endl; x=x+2;main() cobeginfunc1();func2(); cout<<"x="<<x<<" "<<"y="<<y<<endl;8)保存退出“exam8b.cm”。9)在Linux下编译“exam8b.cm”。# ./bacc exam8b.cm 10)解释执行“exam8b.pco”。#.
14、/bainterp exam8b.pco 记录执行结果。11)再次解释执行“exam8b.pco”。#./bainterp exam8b.pco比较这次结果与上次结果有何不同,试说明原因。并解释每种结果的语句执行次序。12)使用Vi编辑一个新文件“exam8c.cm”。#vi exam8c.cm其内容如下:int x=0;void func1() int i=0; for(i=0;i<50;i=i+1) x=x+1;void func2()int i=0;for(i=0;i<50;i=i+1) x=x+1;main()cobeginfunc1();func2();cout<&
15、lt;"x="<<x <<endl;13)保存退出“exam8c.cm”。14)在Linux下编译“exam8c.cm”。# ./bacc exam8c.cm 15)解释执行exam8c.pco ./bainterp exam8c.pco 记录执行结果。看看x的结果是否等于100。试说明原因。16)使用Vi编辑一个新文件“exam8d.cm”。#vi exam8d.cm其内容如下:int x=0;int turn=0;void func1() int i=0;for(i=0;i<50;i=i+1) while(turn!=0); x=x+1;
16、/*临界区*/ turn=1; void func2()int i=0;for(i=0;i<50;i=i+1) while(turn!=1); x=x+1; /*临界区*/ turn=0; main()cobeginfunc1();func2();cout<<"x="<<x <<endl;17)保存退出“exam8d.cm”。18)在Linux下编译“exam8d.cm”。# ./bacc exam8d.cm 19)解释执行“exam8d.pco”。# ./bainterp exam8d.pco 记录执行结果。看看x的结果是否等于1
17、00。试说明原因。20)使用Vi编辑一个新文件“exam8e.cm”。#vi exam8e.cm其内容如下:int x=0;semaphore s;void func1() int i=0;for(i=0;i<50;i=i+1)wait(s); x=x+1; /*临界区*/ signal(s);void func2()int i=0;for(i=0;i<50;i=i+1) wait(s); x=x+1; /*临界区*/ signal(s); main()initialsem(s,1);cobeginfunc1();func2();cout<<"x="
18、<<x <<endl;21)保存退出“exam8e.cm”。22)在Linux下编译“exam8e.cm”。#./bacc exam8e.cm 23)解释执行“exam8e.pco”。# ./bainterp exam8e.pco 记录执行结果。看看x的结果是否等于100。试说明原因。实验2 BACI环境下解决死锁问题【实验目的】1)理解死锁产生的原因。2)使用BACI解决“生产者消费者”问题中的死锁问题。【条件要求】1)认真阅读和掌握预备知识。2)上机操作。【预备知识】一、什么是死锁操作系统中并发执行的进程会不断地申请、使用和释放系统的资源,虽然系统会尽量合理地控制资
19、源的分配,但是由于系统资源的数量是有限的,总会发生若干进程都相互等待对方释放己占用的资源才能继续运行下去的情况,使系统中的一部分进程和资源处于无限期停滞的状态。这种可能发生在一组相互合作或竞争的进程之间的问题,称为死锁。所谓进程死锁是指各并发进程彼此互相等待对方所拥有的资源,且这些并发进程在得到对方的资源之前不会释放自己所拥有的资源。即出现了各进程间相互的“永久”阻塞的状态,这一组进程就称为死锁进程。如果没有“外力”的推动,死锁就是永久性的。二、产生死锁的原因1)竞争资源:当系统中供多个进程所共享的资源不足以同时满足它们的需要时,引起它们对资源的竞争而产生死锁。2)进程推进顺序非法:进程在运行
20、过程中,请求和释放资源的顺序不当,导致了进程死锁。三、“生产者消费者”问题“生产者消费者”问题是一个典型的进程协作的例子。问题描述如下:一个或者多个生产者producers不断地产生数据并将数据data放入一个缓冲区buffer,一个或者多个消费者consumer不断地从缓冲区取出产品消费,每个消费者每次只取一个,只能有一个生产者producer(或者消费者consumer)在某一时刻可以访问缓冲区(对公共缓冲区的访问要互斥)。具体情况分析如下:1)一个生产者,一个消费者,一个缓冲区。要求P进程(生产者)不能往“满”的缓冲区中放产品,设置信号量为“S1”,表示空白缓冲区的数目,S1初值为1;要
21、求C进程(消费者)不能从“空的缓冲区中取产品,设置信号量“S2”,表示缓冲区中产品的数目,S2初值为0。算法描述如下:P: C:while (true) while (true) 生产一个产品; wait(s2); wait(s1) ; 从缓冲区取产品; 送产品到缓冲区; signal(s1); signal(s2); 消费产品; ;2)m个生产者,k个消费者,n个缓冲区。要求:只能有一个生产者(或者消费者)在某一时刻可以访问缓冲区(对公共缓冲区的访问要互斥);假定公用缓冲池中具有n个缓冲区,这时可利用互斥信号量mutex实现诸进程对缓冲池的互斥使用;利用信号量empty和full分别表示缓冲
22、池中空缓冲区和满缓冲区的数量。对“生产者消费者“问题可描述如下: P: C:while (true) while (true) 生产一个产品; wait(full); wait(mutex); wait(empty) ; 从缓冲区取产品; wait(mutex); signal(mutex); 送产品到缓冲区; signal(empty); signal(mutex); signal(full); 消费产品; ;细读上述同步流程可以发现:1)在每个程序中用于实现互斥的wait(mutex)和signal(mutex)必须成对地出现。2)对资源信号量empty和full的wait和signal操
23、作,同样需要成对地出现,但它们分别处于不同的程序中。3)在每个程序中的多个wait操作顺序不能颠倒。应先执行对资源信号量的wait操作,然后再执行对互斥信号量的wait操作,否则可能引起进程死锁。而两个signal操作的顺序无关紧要。【实验内容】1)设包含可执行文件bacc,bainterp的目录名为“balnxxe”,进入该目录。#cd balnxxe2)使用Vi编辑一个新文件“exam14a.cm”。# vi exam14a.cm其内容如下:/* hint在这里起到测试生产者消费者是否能互斥访问缓冲区,先加1后减1,如果互斥了,结果仍然为0,不变*/const int size=10;se
24、maphore s;semaphore n;semaphore e;int hint=0;int pcsize;int v=0;int w=0;int in=0;int out=0;void produce()v=v+1;void consume()int b=0;b=w;void append()int a=0;hint=hint+1;pcin=v;a= pcin ;in=in+1;in=in%size;cout<<"put the data "<< a<<endl ;void take()hint=hint-1;w=pcout;out
25、=out+1;out=out%size;cout<<"take the data "<< w <<endl;void p()int i=0; while(i<1000) produce(); wait(e);wait(s); append();signal(s);signal(n);i=i+1;void c() int i=0;while(i<1000)wait(n); wait(s); take();signal(s);signal(e);consume();i=i+1;void main()initialsem(s,1);
26、initialsem(n,0);initialsem(e,10);cobeginp(); c();cout<<"hint ="<<hint<<endl;3)保存退出“exam14a.cm”。4)使用BACI的bacc编译器编译“exam14a.cm”。#./bacc exam14a.cm 5)解释执行“exam14a.pco”。#./bainterp exam14a.pco记录执行结果。看看hint的结果是不是等于0。并观察生产者和消费者交替执行的过程。6)执行命令:#cp exam14a.cm exam14b.cm 7)使用Vi编辑“e
27、xam14b.cm”。交换p()函数中wait(e)与wait(s)的顺序。8)保存退出“exam14b.cm”。9)使用BACI的bacc编译器编译“exam14b.cm”。#./bacc exam14b.cm 10)解释执行“exam14b.pco”。#./bainterp exam14b.pco >pc.txt11)用Vi查看“pc.txt”的内容。查看hint的结果是否为0,并观察生产者和消费者交替执行的过程。如果发生死锁,试解释原因。12)执行命令:#cp exam14a.cm exam14c.cm13)使用Vi编辑“exam14c.cm”。交换c()函数中wait(n)与wa
28、it(s)的顺序。14)保存退出“exam14c.cm”。15)使用BACI的bacc编译器编译“exam14c.cm”。#./bacc exam14c.cm16)解释执行“exam14c.pco”#./bainterp exam14c.pco >pc.txt17)用Vi查看“pc.txt”的内容。查看hint的结果是否为0,并观察生产者和消费者交替执行的过程。如果发生死锁,试解释原因。实验3 µC/OS-II操作系统的进程调度模块源码分析【实验目的】掌握µC/OS-II操作系统的进程调度模块源码的实现思路【条件要求】1)认真查阅µC/OS-II操作系统的相
29、关资料。2)小组为单位提交报告。【任务解析】1)uC/OS的任务控制块-0.8 ( 25页2.3 ) 2)任务就绪表的结构-0.9 (29页2.4.1)3)对任务就绪表的操作(将就绪任务状态填入就绪表)-0.9 (31页2.4.2)4)根据就绪表确定最高优先级(采用查表法确定高优先级任务)-1 ( 31页2.4.2)5)任务调度器实现流程图表述-1 (43页2.4.3)6)任务调度器实现及源代码分析-1 (43页2.4.3 )7)任务切换的过程描述-0.8(可选) (43页2.4.3 )8)用户任务的实现(编写一个示例程序验证调度算法)-1 (43页例2-7)9)任务状态切换(挂起和恢复任务)
30、示例程序演示-0.9(可选)(48页例2-8)10)用信号量实现任务间同步和互斥示例程序演示-0.9(可选)(119页例4-4,122页例4-5)11)用消息邮箱实现任务间通信示例程序演示-0.9(可选)(136页例4-8)【任务说明】本次项目答辩拟定安排在课程的第三章结束后进行,老师课堂上讲解该项目(2-4学时),学生课下完成(10学时)。项目的整个过程是以小组为单位组织实施的(8人左右),小组长负责分配任务、监控实施过程并反馈实施情况,老师协助指导。该项目的考核:以小组为单位提交报告并参加答辩。采用该答辩成绩取代期中考试。小组成绩优秀的报告作品将收录到操作系统课程网站,供其他同学学习和参考
31、。小组成员可以从11个问题中选择1个或2个(选择2个的问题,权重按1记)完成相关任务。组内成员一定要协作把自己负责的那部分给其他成员讲解清楚,以助于推进任务的进行,最后选出1名同学阐述小组完成情况(可制作PPT)。答辩过程中至少讲清楚2个权重为1的问题。问题由老师指定,答辩过程中组内成员可以辅助回答。每组的答辩时间为自述5分钟+提问5分钟。答辩过程中完成自评(满分4分),指导老师评分(满分6分)。学生的期中考试成绩=(自评成绩+指导老师评分)*权重。指导老师有权利根据大家答辩准备情况,报告完成情况以及答辩回答问题情况调整大家的考试成绩(报告空白、抄袭、文不对题:0分记)。老师会根据大家的自评分
32、高低来决定问什么级别的问题。实验4 µC/OS-II操作系统的动态内存管理【实验目的】掌握µC/OS-II操作系统内存管理的实现思路以及如何对内存进行操作【条件要求】1)认真查阅µC/OS-II操作系统的相关资料。2)上机操作。【任务解析】1)描述内存块的数据结构:内存控制块定义 2)内存控制块与内存分区之间的关系 3)动态内存管理的实现【任务说明】本次实验拟定安排在课程的第四章结束后进行,需要了解µC/OS-II操作系统如何对内存分区进行管理以及如何使用系统提供的相关函数完成使用和释放动态内存。实验要求:设计一个含有3个任务的应用程序,这3个任务分别是
33、MyTask、YouTask和HerTask。在应用程序中创建一个动态内存分区,该分区有8个内存块,每个内存块的长度为6个字节。应用程序的任务YouTask和HerTask都在任务运行后请求一个内存块,随后就释放它。任务MyTask也在任务运行后请求一个内存块,但是要在任务MyTask运行6次后,才释放它所申请的内存块。为了了解内存分区变化的情况,编写代码来观察分区内内存块链表的头指针和已被使用内存块的个数。实现一个任务的参考程序#include "includes.h"#define TASK_STK_SIZE 512 /任务堆栈长度OS_STK MyTaskStkTAS
34、K_STK_SIZE;INT16S key; /用于退出uCOS_II的键 char *s;char *s1="MyTask"INT8U err;INT8U x=0,y=0; /字符显示位置OS_MEM *IntBuffer;INT8U IntPart56; INT8U *IntBlkPtr;OS_MEM_DATA MemInfo;void MyTask(void *pdata); void Quitkey(void);/*主函数*/void main (void) OSInit(); /初始化uCOS_II PC_DOSSaveReturn(); /保存Dos环境 PC_
35、VectSet(uCOS, OSCtxSw); /安装uCOS_II中断 IntBuffer=OSMemCreate(IntPart,5,6,&err); OSTaskCreate(MyTask,0,&MyTaskStkTASK_STK_SIZE - 1,0);/ 创建动态内存分区 OSStart(); /*MyTask*/void MyTask (void *pdata) pdata=pdata; OS_ENTER_CRITICAL(); PC_VectSet(0x08, OSTickISR); PC_SetTickRate(OS_TICKS_PER_SEC); OS_EXI
36、T_CRITICAL(); for (;) PC_DispStr(10,+y,s1,DISP_BGND_BLACK+DISP_FGND_WHITE); IntBlkPtr=OSMemGet(IntBuffer,&err);/ 请求获得一个内存块 OSMemQuery(IntBuffer,&MemInfo);/ 查询一个内存分区目前的状态信息 sprintf(s,"%0x",MemInfo.OSFreeList);/ 输出内存块链表的头指针 PC_DispStr(30,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE); sprintf(
37、s,"%d",MemInfo.OSNUsed);/输出已分配内存块数目 PC_DispStr(40,y,s,DISP_BGND_BLACK+DISP_FGND_WHITE); OSMemPut(IntBuffer,IntBlkPtr);/ 释放一个内存块 Quitkey(); OSTimeDlyHMSM(0,0,1,0); /*Quitkey()*/void Quitkey(void) if(PC_GetKey(&key)=TRUE) if(key=0x1B) PC_DOSReturn(); 小结:l Ucos通过定义一个二维数组在内存中划分一个内存分区,其中所有的
38、内存块应大小相等。l 系统通过与内存分区相关联的内存控制块来对内存分区进行管理。l 划分及创建内存分区根据需要有应用程序负责,而系统只提供了可供调用的相关函数。l 在Ucos中,使用和释放内存的安全性方面,要由应用程序全权负责。实验5 磁盘调度算法模拟实验【实验目的】1)掌握几种常用的磁盘调度算法。2)学会编写实现算法的C语言程序。【条件要求】1)认真阅读和掌握预备知识。2)上机操作。【预备知识】一、磁盘简介磁盘通常由若干个盘片(每片分两面)组成,每个盘片又划分若干个磁道(典型值为5002000),每个磁道可以存放相同容量的数据。每个磁道上又分出若干个扇区(典型值为10100),每个扇区通常都
39、存储512个字节数据。在磁盘上存储数据,必须将磁盘格式化。1.磁盘的类型1)固定头磁盘。这种磁盘在每条磁道上都有一个读/写磁头,所有的磁头都被装在一个刚性磁臂中。通过这些磁头可访问所有磁道,并进行并行读/写,从而有效地提高了磁盘的I/O速度。 这种结构主要用于大容量磁盘上。2)移动头磁盘。每一个盘面仅配有一个磁头,也被装入磁臂中。为了能访问该盘面上的所有磁道,该磁头必须能移动以进行寻道。可见,移动磁头仅能以串行方式读/写,致使其I/O速度较慢;但由于其结构简单, 故仍广泛应用于中小型磁盘设备中。 2.磁盘访问时间磁盘访问时间寻道时间+旋转延迟时间+数据传输时间。1)寻道时间:将磁头定位于相应磁
40、道上的时间。当代磁盘平均为5ms10ms。2)转延迟时间:相应扇区旋转到磁头处的时间。与磁盘转速有关,硬盘转速为5400 r/m 10000r/m,软盘转速为300 r/m 600r/m。3)传输时间:把数据从磁盘读出或向磁盘写入数据所经历的时间,速度较快。对于一个典型磁盘,平均寻道时间为10ms,旋转延迟时间为3ms,读一个扇区所花时间为0.01875ms。可见寻道时间对磁盘性能影响较大。二、几种常用的磁盘调度算法磁盘是可供多个进程共享的设备,当有多个进程要求访问磁盘时,应采用一种调度算法,以使各进程对磁盘的平均访问时间尽可能少。而磁盘调度的最终目标是减少磁盘的平均寻道时间。常用的调度算法有
41、:先来先服务FCFS,最短寻道时间优先SSTF,扫描算法SCAN和循环扫描算法CSCAN。例如:某磁盘共200个磁道,编号为0199。某时刻磁头刚从第96磁道移动到第100磁道,目前正停在第100磁道上。之后该磁盘依次接收到的磁道请求分别为:55,58,39,18,90,160,150,38,184。请采用各种磁盘调度算法进行调度。1.先来先服务FCFS(First-Come, First Served)1)按照进程请求的先后顺序;2)对所有进程而言是公平的;3)当有许多进程时,性能上接近随机调度。磁头访问次序为:55,58,39,18,90,160,150,38,184磁头移动距离为:45,
42、 3,19, 21,72,70,10,112,146平均寻道长度为:55.32.最短寻道时间优先SSTF(Shortest Seek Time First)1)选择磁头臂的移动距当前位置最近的磁盘I/O请求;2)经常可以获得最小的寻道时间。磁头访问次序为:90,58,55,39,38,18,150,160,184磁头移动距离为:10,32,3,16,1,20,132,10,24平均寻道长度为:27.53.扫描(SCAN)算法1)进程“饥饿”现象。SSTF算法虽然能获得较好的寻道性能, 但却可能导致某个进程发生“饥饿”(Starvation)现象。因为只要不断有新进程的请求到达, 且其所要访问的
43、磁道与磁头当前所在磁道的距离较近,这种新进程的I/O请求就必须优先满足。对SSTF算法略加修改后所形成的SCAN算法, 可防止老进程出现“饥饿”现象。2)SCAN算法。(1)磁头臂只沿着一个方向移动,并在途中满足所有未完成的请求,直到到 达这个方向上的最后一个磁道;(2)然后改变方向继续扫描。磁头访问次序为:150,160,184,90,58,55,39,38,18磁头移动距离为:50, 10, 24, 94,32, 3, 16, 1, 20平均寻道长度为:27.84.循环扫描(CSCAN)算法1)限制只在一个方向上扫描;2)当在一个方向上的最后一个磁道被访问之后,磁头臂返回磁盘的另一端再次开
44、始扫描。磁头访问次序为:150,160,184,18,38,39,55,58,90磁头移动距离为:50,10,24,166,20,1, 16, 3, 32平均寻道长度为:35.8【实验内容】1)某磁盘共200个磁道,编号为0199。某时刻磁头刚从第96磁道移动到第100磁道,目前正停在第100磁道上。之后该磁盘依次接收到的磁道请求分别为:55,58,39,18,90,160,150,38,184。编写磁盘调度算法,显示磁道的服务顺序、移动的总道数以及平均寻道长度。2)创建目录“ex17”,然后进入该目录。# mkdir ex17# cd ex173)使用Vi编辑一个新文件“exam17a.c”
45、。# vi exam17a.c实现最短寻道时间优先(SSTF)调度算法,其内容如下:#include "stdio.h"#include "math.h"void sstf(int current,int* queue,int len) int i=0,j=0,count=0,sum=0,min=0; while(1) if(count=len) break; i=0; while(queuei=-1) i+; min=abs(current-queuei); for(j=i+1;j<len;j+) if(queuej=-1) continue;
46、if(abs(current-queuej)<min) min=abs(current-queuej); i=j; printf("%dn",queuei); sum=sum+abs(current-queuei); current=queuei; queuei=-1; count+; printf("sum=%dn",sum); printf("average=%fn",sum*1.0/len);main() int current=100; int queue9=55,58,39,18,90,160,150,38,184;
47、sstf(current,queue,9);4)使用GCC编译器编译“exam17a.c”。#gcc exam17a.c o exam17a5)执行exam17a。#./exam17a显示结果为:905855393818150160184sum248average27.5555566)使用Vi编辑一个新文件“exam17b.c”。# vi exam17b.c实现先来先服务(fcfs)磁盘调度算法,编译并执行显示调度后的顺序,要求显示结果如下:555839189016015038184sum498average55.333333附1: 创建进程(开设Linux基础课程班级选作)【实验目的】 1)
48、通过运行程序,理解进程的创建,掌握程序与进程的区别和联系。2)理解并掌握fork系统调用的用法。3)理解并掌握exec系统调用的用法。【条件要求】1)认真阅读和掌握本实践的指导材料。2)上机操作。【预备知识】一、程序与进程的定义程序是为了完成某项任务而编排的语句序列,它告诉计算机如何执行,因此程序是需要运行的。程序运行过程中,需要占有计算机的各种资源。进程是具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。进程实体由PCB、用户程序段、用户数据段和栈组成。这里的PCB和栈是由操作系统为用户程序添
49、加的信息。见图6-1。图6-1 进程示意图二、进程和程序的区别与联系程序是静态概念,本身可以作为一种软件资源保存;而进程是程序的一次执行过程,是动态概念,它有一定的生命期,是动态地产生和消亡的。进程是一个能独立运行的单位,能与其他进程并发执行,进程是作为自愿申请和调度单位存在的;而通常的程序不能作为一个独立运行的单位。程序与进程并无一一对应关系,一方面一个程序可由多个进程共用;另一方面一个进程只能对应一个程序。进程和程序的关系犹如演出和剧本的关系。三、fork系统调用一个进程调用了fork以后,系统会创建一个子进程。这个子进程和父进程的不同之处在于进程ID和父进程ID,其他都一样。当一个程序中
50、调用fork函数后,内核会完成如下工作: 内核系统分配新的内存块和内核数据结构; 复制原来的进程到新的进程; 向运行进程集添加新的进程; 将进程返回给两个进程。设原来的进程为父进程,调用fork生成的新进程为子进程,则子进程会执行父进程中fork函数后的代码。 fork系统调用使用格式: 头文件:#include <sys/types.h> /* 提供类型pid_t的定义 */#include <unistd.h> 函数原形为:pid_t fork(void); 返回值为“pid_t”。对于父进程,fork函数返回了子程序的进程号,而对于子程序,fork函数则返回零。这
51、样,对于程序,只要判断fork函数的返回值,就知道自己是处于父进程还是子进程中。如果调用不成功,则返回“-1”。四、exec族函数exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容。换言之,就是在调用进程内部执行一个可执行文件。这里的可执行文件既可以是二进制文件,也可以是任何Linux下可执行的脚本文件。exec系统调用有6种不同的使用格式,但在核心中只对应一个调用入口。它们有不同的调用格式和调用参数。这六种调用格式分别为:#include <unistd.h>1)int execl (const char *path, const char *arg
52、0, ., const char*argn, (char *)0);2)int execv (const char *path, char *const *argv);3)int execle (const char *path, const char *arg0, ., const char*argn,(char *0), const char *envp);4)int execve (const char *path, char *const *argv, char *const *envp);5)int execlp (const char *file, const char *arg0, ., const char*argn, (char *)0);6)int execvp (const char *file, char *const *argv);参数“path”指出一个可执行目标文件的路径名,参数“f
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- DB32/T 3869-2020土地整治项目测量技术规范
- DB32/T 3761.45-2021新型冠状病毒肺炎疫情防控技术规范第45部分:核酸检测信息系统
- DB32/T 3761.13-2020新型冠状病毒肺炎疫情防控技术规范第13部分:公共浴室
- DB32/T 3583-2019生物中氚和碳-14的测定液体闪烁计数法
- DB32/T 1357-2021鲜食糯玉米青穗速冻加工技术规程
- DB31/T 864-2014景区旅游休闲基础设施规划导则
- DB31/T 1290-2021造(修)船舶企业明火作业安全规程
- DB31/T 1200-2019相控阵超声成像法检测混凝土缺陷技术规程
- DB31/T 1042-2017桃红颈天牛防治技术规程
- DB31/T 1034-2017分布式光伏发电项目服务规范
- 人格与精神障碍-学做自己的心理医生-暨南大学2中国大学mooc课后章节答案期末考试题库2023年
- 人力资源规划复盘
- 2025届苏教版高考仿真模拟英语试卷含解析
- 中建道路起重吊装施工方案
- 《产业政策》课件
- 第8课人工智能中的算法 说课稿 2023-2024学年浙教版(2023)初中信息技术八年级下册
- DB11T 745-2010 住宅采暖室内空气温度测量方法
- 小班班本课程《吃饭这件小事》
- 文学大数据中心建设项目需求
- 宠物乐园规划方案
- 2024年四川省成都市中考道德与法治试卷真题(含答案解析)
评论
0/150
提交评论