版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、操作系统课程设计报告时间:2015-12-28 2013-1-8地点:信息技术实验中心计算机科学与技术专业2013 级 2 班 07 号2015-12-28目录一 课程设计的目的和意义 3二 进程调度算法模拟 41 设计目的 42 设计要求 43 使用动态优先权的进程调度算法的模拟 64. 程序流程图 105. 实验结果 116. 实验代码 147. 实验总结 20三 动态分区分配方式模拟 211 设计目的 212 设计要求 213 模拟算法的实现 214 程序流程图 245 实验结果 246 实验代码 257.实验总结 30四 请求调页存储管理方式模拟 311 设计目的 312 设计要求 3
2、13 模拟算法的实现 324 程序流程图 375. 实验结果 386. 实验代码 397. 实验总结 42五 简单文件系统的实现 431 设计目的 432 设计要求 433 算法的实现 444.程序流程图 465实验结果 466 实验代码 477.实验总结 61操作系统课程设计总结 62课程设计的目的和意义目的:1. 根据课堂讲授内容,学生做相应的自主练习,消化课堂所讲解的 内容。2. 通过调试典型例题或习题积累调试程序的经验。3. 通过完成辅导教材中的编程题,逐渐培养学生的编程能力,用计 算机解决实际问题的能力。意义:1. 有助于加深我们对操作系统这门课程的理解, 我们在课堂上学的都 是基础
3、理论知识, 对于如何用程序语言来描述所学知识还是有一定难 度。通过课程设计,我们可以真正理解其内涵。2. 有利于我们逻辑思维的锻炼, 程序设计能直接有效地训练学生的创 新思维、培养分析问题、解决问题能力。即使是一个简单的程序,依 然需要学生有条不理的构思。3. 有利于培养严谨认真的学习态度, 在程序设计过程里, 当我们输入 程序代码的时候,如果不够认真或细心,那么可能就导致语法错误, 从而无法得出运行结果。 那么,这个我们反复调试, 反复修改的过程, 其实也是对我们认真严谨治学的一个锻炼。二进程调度算法模拟1设计目的通过进程的创建、撤销和运行加深对进程概念和进程并发执行的 理解,明确进程与程序
4、的区别。2设计要求1) 、了解系统调用 fork()、exec()、exit()、waitpid()的功能及实 现过程;2) 、编写一段程序,使用系统调用 fork()来创建两个子进程,并 由父进程重复显示字符串“ pare nt: ”和自己的标识数,而子进程则 重复显示字符串“ child: ”和自己的标识数;3) 、编写一段程序,使用系统调用fork()来创建一个子进程,子进程通过调用 exec()更换自己的执行代码,新的代码显示“newprogram. ”后,调用exit()结束进程。而父进程则调用 waitpid()等 待子进程结束,并在子进程结束后,显示子进程的标识符然后正常结 束。
5、4) 、用C语言实现对N个进程采用动态优先权优先算法的进程调 度:(1) 每个用来标识进程的进程控制块PCB用结构来描述,包括以下字段:进程标识符id进程优先数priority,并规定优先数越大的进程,其优先权越高;进程已占用的CPU时间cputime ;进程还需占用的 CPU时间alltime,当进程运行完毕时,alltime 变为 0;进程的阻塞时间 startblock,表示当进程再运行 startblock个时间片后,进程将进入阻塞状态;进程被阻塞的时间blocktime ,表示已阻塞的进程再等待blocktime个时间片后,将转换成就绪态;进程状态state ;队列指针next,用来
6、将PCB排成队列(2)优先数改变的原则:进程在就绪队列中呆一个时间片,优先数增加1 ;进程每运行一个时间片,优先数减3。(3)假设在调度前,系统中有5个进程,它们的初始状态如下:ID 012PRIORIT Y38 30 29 037CPUTIME 0ALLTIME 3STARTBLOCK-1-1-1 -1BLOCKTIME 3STATE READ YREAD YREAD Y READ Y READ Y4 )为了清楚地观察诸进程的调度过程, 程序应将每个时间片内的进程的情况显示出来,参照的具体格式如下:RUNNING PROG: iREADY_QUEUE:-id1-id2BLOCK_QUEUE:
7、-id3-id4ID01234PRIORITYP0P1P2P3P4CPUTIMEC0C1C2C3C4ALLTIMEA0A1A2A3A4STARTBLOCKT0T1T2T3T4BLOCKTIMEB0B1B2B3B4STATES0S1S2S3S43 使用动态优先权的进程调度算法的模拟1) 主要数据结构设计1. 包含 PCB 信息的结构体(1) 进程标识数 ID 。(2)进程优先级PRIORITY,并规定优先级越大的进程,其优先权越高。( 3) 进程已占用的 CPU 时间 CPUTIME。(4) 进程还需占用的 CPU 时间 ALLTIME 。当进程运行完毕时,ALLTIME 变为 0(5) 进 程
8、 的 阻 塞 时 间 STARTBLOCK , 表 示 当 进 程 再运 行 STARTBLOCK 个时间片后,进程将进入阻塞状态。(6) 进程被阻塞的时间 BLOCKTIME ,表示已阻塞的进程再等 待 BLOCKTIME 个时间片后,将转换成就绪状态。( 7) 进程状态 STATE。(8)队列指针NEXT,用来将PCB排成队列。用算法描述为struct pcb / 定义进程控制块 PCBchar name10; / 定义进程名称char state;/ 进程状态int super;/ 优先数int ntime;/ 需要运行的时间int rtime;/ 已占用的CPU 时间struct pc
9、b* link; / 指向进程的下一个进程的指针*ready=NULL,*p;2. 用队列结构存储进程序列2) 算法代码实现1.建立对进程进行优先级排列函数voidsort() / 建立对进程进行优先级排列函数 PCB *first, *second; / 定义指向当前进程和插入进程的指针int insert=0;/ 各进程按优先数大小从大到小排列if(ready=NULL)|(p-super)(ready-super) /优先级最大者 ,插入队首p-link=ready; /p 进程的下一个进程为原队首进程ready=p; / 队首进程为优先级最大者else / 进程比较优先级 ,插入适当的
10、位置中 first=ready;/ 队首进程不变 second=first-link; / 第二个进程则在当前进程后面 while(second!=NULL)/while 循环,各进程比较优先级 if(p-super)(second-super) / 若插入进程比当前进程优先数大 / 插入到当前进程前面 p-link=second; / 当前进程赋给插入进程的后面那个进程 first-link=p;/ 插入进程在放在当前进程所在位置 second=NULL;/ 当前进程为空 insert=1; / 进程的排列与各优先数不对应else / 插入进程优先数最低 ,则插入到队尾 first=firs
11、t-link; /将第一个进程的下一进程赋给 firstsecond=second-link;/将第二个进程的下一进程赋给 second if(insert=0) first-link=p; / 若插入进程比当前进程优先数小,则插入到当前进程后面 2.建立进程控制块函数void input() / 建立进程控制块函数 int i,num; / 定义进程号以及进程个数 system(cls); / 清屏 printf(n 请输入进程号 :); / 输出输入提示 scanf(%d,&num); / 输入进程号 for(i=0;iname); / 输入进程名 printf(n 输入进程优先数 :);
12、/ 输出输入进程优先数提示 scanf(%d,&p-super); / 输入进程优先数 printf(n 输入进程运行时间 :);/ 输出输入进程运行时间提示 scanf(%d,&p-ntime);/ 输入进程运行时间 printf(n);/ 换行p-rtime=0;/ 已占用 cpu 时间为 0 p-state=w;/ 进程状态为就绪 p-link=NULL;/ 当前进程的下一个进程为 sort(); / 调用 sort 函数 建立进程显示函数 ,用于显示当前进程 void disp(PCB * pr) / 建立进程显示函数 ,用于显示当前进程 printf(n qname t state
13、t super t ntime t rtime n);printf(%st,pr-name);/ printf(%ct,pr-state); / printf(%dt,pr-super);/ printf(%dt,pr-ntime); / printf(%dt,pr-rtime);/ printf(n); / 换行显示进程名显示进程状态显示进程优先级 显示进程需要运行的时间 显示进程占用 CPU 时间进程查看函数,检查等待队列的进程是否进入就绪队列voidcheck() / 建立进程查看函数,检查等待队列的进程是否进入就绪队列提示 PCB* pr;printf(n *当前正在运行的进程是 :%
14、s,p-name); /输出当前正在运行的进程disp(p);/ 显示当前 运行进程pr=ready;printf(n * 当前就绪队列为 :n); / 显示就绪队列状态while(pr!=NULL) disp(pr);/ 显示就绪进程pr=pr-link;/进程就绪函数void running() / 建立进程就绪函数 (进程运行时间到 ,置就绪状态(p-rtime)+;(p-super)-;/ 进程优先权减 1 p-state=w;/ 进程状态为就绪 sort(); / 调用 sort 函数4.程序流程图定义进程控制块PCB输入进程想相关信息构造进程控 制块,将pcb插入到队列中显示当前进
15、程对进程优先级进行排序检查等待队列是否进入就绪队列显示当前就绪队列及状态,被运行过的进程优先权减1若进程时间到,则将进程置就绪状态5实验结果C F:憔炸蛋统遷程设计A4A4ngin,exe|Tiine:0RUNNING PROG;READY_QUEUE:-BLOCK_QUEtIE:1-2-3-0-4ID01234PRIORITY93830290CPUTIME00000ALLTIME33634STARTBLOCK2-1-1-1-1BLOCKTINE30000STATEReadyReadyReadyReailyReadyRUNOUT二二:1Time: 1RUNNING PROG: 1READY_Q
16、UEUE:-l-2-3-0-4BLOCK_QUEUE:ID01234PRIORITY103531301CFUTIME01000ALLTIME32634STARTBLOCK2-1-1-1-1BLOCKTIIE30000STATEReadyRunReadyReadyReadyRUNOUT LIST:ime: 2RUNNING PROG: 1READY_QUEUE:-l-2-3-0-4BLOCK.QUEUE:ID01234PRIORITY113232312TUT I ME02000虬LTIME31634STARTBLOCK2-1-1-1-1BLOCKTIME30000STATEReadyRunRea
17、dyReadyReadyRUNOUT2LIST:Time: 3RUNNING PROG: 1READY QUEUE:-2-3-0-4BLOCK QUEUE:ID01234PRIORITY122933323CPUTIME03000ALLTIME30634STAKTBLOCK21-1-1BLOCKT1IE30000STATEReadyRunReadyReadyReadyRUNOUTLIST:-1(3)Time:4RUNNING PROG:2READY.QUEUE!-3-2-0-4BLOCK.QUEUE:ID0 1234PRIORITY132930334CPUTTME03100ALLTIME3053
18、4STARTBLOCK2-1-1-1-1BLOCKTIME30000STATEReadyRurtOutRunReadyReadyRUNOUTfT|LIST:-1(3)Time: 5RUNNING PROG:3READYQUEUE:-2-3-0-4BLOCK.QUEUE:ID01234PRIORITY142931305CPUTIME03110ALLTIME30524STARTBLOCK2-1-1-1-1BLOCKTIME30000寵ATEReadyF RunOutReadyRunReadyRUNOUT Lm:-1(3)Time:&RUNNING PROG:2READY QUEUE:-3-2-0-
19、4BLOCK QUEUE:ID01234PRICiRITYIE292S316CPUTIME03210ALLTIME30424STARTBLOCK2-1-1-1-1BLOCKTTME30000STATEReadyRuhOutRunReadyReadyRUNOUTLIST:-1(3)0Tima: 7RUNNING PROG: 3READY.QUEUE: -2-3-0-4BLOCK-QiUEUE:ID01234PRIORITY162929281CPUTIMEQ3220ALLTIME30414STAKTBLOCK2-1-1-1-1BLOCKTIME30000&TATEReadyRunOutReadyR
20、unReadyRUNOUTLIST:-1(3)iTime: 8RUNNING PROG:2READY QUEUE:-3-2-0-4BLOCK_QUEUE:IDO1234PRIORITY172926298CPUTIME03320ALLTINE30314STARTBLOCK2-1-1-1-1BLQCKTTME30000STATEReady RunOutRunReadyReadyRUNOUTLIST:-1(2)4Tiine:9RUNNINGPROG:3READY-QUEUE:-2-0-4BLOCK_QUEUE:ID01234PRIORITY18292726gCPUTIME03330ALLTIME30
21、304STARTBLOCK2-1-1-1-1BLOCKTINE30000STATEReadyRunOutReadyRunReadyRUNOUTLIST:-1(3)-3(9)Time: 10RUNNING PROG: 2READY_QUEUE: -2 -0 -4BLOCK_QUEUE:ID01234PRIORITY1929242&10CPUTIME03430ALLTIME30204STARTBLOCK2-1-1-1-1BLOCKTIME30000STATEReadyRunOutRunRunOutReadyLf-.1 6.实验代码#include #define N 5 void init();v
22、oid print();int getRunning();void sort();int run(int time);enum STATEReady, Run, Block, RunOut; / 状态 ready:0; run:1; block:2; runout:3 struct PROCESSint ID;/ 进程标识符 IDint Priority;/ 进程优先数 priority ,并规定优先数越大的进程,其优先权越高int Cputime;/ 进程已占用的 CPU 时间 cputimeint Alltime;/ 进程还需占用的 CPU 时间 alltime ,当进程运行完毕时, al
23、ltime 变为 0int Startblock;/ 进程的阻塞时间 startblock ,表示当进程再运行 startblock 个时间片后,进程将进入阻塞状态int Blocktime;/ 进程被阻塞的时间 blocktime ,表示已阻塞的进程再等待 blocktime 个时间片后,将转换成就绪态enum STATE State;/ 进程状态 stateProcessN;int READYN;/ 就绪 队列int BLOCKN;/ 阻塞 队列int RUNOUTN2;/ 运行 结 束的 进 程, RUNOUTi0 表 示 第 i 个 结 束进 程 队 列的 进程 号RUNOUTi1 表
24、示结束时间 int main() int Time = 0;init(); printf(Time:%dn, Time); sort();print();while (1) Time+;getchar(); printf(Time:%dn, Time);if (run(Time) break;return 0; void init() int i;for (i = 0; i = 0) ? printf(tRUNNING PROG: %dn, getRunning() : printf(tRUNNING PROG: %cn, );printf(tREADY_QUEUE:);for (i = 0;
25、 i = 0) printf(-%d, ProcessREADYi.ID);else break; printf(ntBLOCK_QUEUE:);for (i = 0; i = 0) printf(-%d, ProcessBLOCKi.ID); else break;n); printf(n=printf(IDt);for (i = 0; i N; +i) printf(t%d, Processi.ID);printf(nPRIORITY);for (i = 0; i N; +i)printf(t%d, Processi.Priority); printf(nCPUTIMEt);for (i
26、= 0; i N; +i) printf(t%d, Processi.Cputime); printf(nALLTIMEt);for (i = 0; i N; +i) printf(t%d, Processi.Alltime); printf(nSTARTBLOCK);for (i = 0; i N; +i) printf(t%d, Processi.Startblock); printf(nBLOCKTIME);for (i = 0; i N; +i) printf(t%d, Processi.Blocktime); printf(nSTATEt);for (i = 0; i N; +i)
27、switch (Processi.State) case 0:printf(tReady); break; case 1:printf(tRun);if (Processi.Alltime = 0) Processi.State = RunOut; else Processi.State = Ready; break;case 2:printf(tBlock); break;case 3:printf(tRunOut); break; printf(n);printf(tRUNOUT LIST:);for (i = 0; i = 0) printf(-%d(%d), ProcessRUNOUT
28、i0.ID, RUNOUTi1); else printf(n);break; printf(n);int getRunning() int i;for (i = 0; i N; +i) if (Processi.State = Run) return i;return -1;void sort() int i, j, k;for (i = 0; i N; +i) READYi = -1;BLOCKi = -1;/ 遍历 i 个进程for (i = 0; i N; +i) / 如果进程 i 不是阻塞的if (Processi.State = Ready | Processi.State = R
29、un) / 不考虑运行完的进程if (Processi.Alltime = 0) continue;/ 遍历就绪队列,将第 i 个进程放到合适的就绪队列中 for (j = 0; j N; +j) if (READYj 0) READYj = i;break;else if (Processi.Priority j; -k) READYk = READYk - 1;READYj = i;break;/ 阻塞队列的按阻塞时间排序else if (Processi.State = Block) / 遍历 阻塞 队列for (j = 0; j N; +j) if (BLOCKj = ProcessB
30、LOCKj.Blocktime) continue;else for (k = N - 1; kj; -k) BLOCKk = BLOCKk - 1;BLOCKj = i;break;int run(int time) int i, runNum;runNum = READY0;/ 如果就绪队列空了,并且没有也没有阻塞的进程,那么所有进程都运行完了if (runNum 0 & BLOCK0 = 0) / 改变当前运行态进程的属性 ProcessrunNum.Priority -= 3; ProcessrunNum.Alltime -= 1; ProcessrunNum.Cputime += 1
31、; ProcessrunNum.State = Run;/ 改变非运行态进程的属性for (i = 0; i N; +i) if (i != runNum) if (Processi.State = Ready) Processi.Priority += 1;else if (Processi.State = Block) Processi.Blocktime -= 1; if (Processi.Blocktime = 0) Processi.State = Ready;/ 当前进程结束,放到 runout 队列中if (ProcessrunNum.Alltime = 0) for (i =
32、 0; i N; +i) if (RUNOUTi0 = 0) ProcessrunNum.Startblock -= 1; if (ProcessrunNum.Startblock = 0) ProcessrunNum.State = Block;/ 如果就绪队列空了,阻塞队列没空else if (BLOCK0 = 0) for (i = 0; i data.ID = ID;temp-data.size = request;temp-data.state = Busy;DuLNode *p = block_first-next;while (p) if (p-data.state = Free
33、 & p-data.size = request) / 有大小恰好合适的空闲块 p-data.state = Busy;p-data.ID = ID;return OK;break;if (p-data.state = Free & p-data.size request) / 有空闲块能满足需求且有剩余 temp-prior = p-prior;temp-next = p;temp-data.address = p-data.address; p-prior-next = temp;p-prior = temp;p-data.address = temp-data.address + tem
34、p-data.size; p-data.size -= request;return OK;break;p = p-next;return ERROR;2) 最佳适应算法Status Best_fit(int ID, int request) int ch; / 记录最小剩余空间DuLinkList temp = (DuLinkList)malloc(sizeof(DuLNode);temp-data.ID = ID;temp-data.size = request; temp-data.state = Busy;DuLNode *p = block_first-next;DuLNode *q
35、 = NULL; /记录最佳插入位置/ 初始化最小空间和最佳位置while (p) if (p-data.state = Free & (p-data.size request | p-data.size = request) q = p; ch = p-data.size - request;break;p = p-next;while (p) if (p-data.state = Free & p-data.size = request) / 空闲块大小恰好合适p-data.ID = ID; p-data.state = Busy; return OK;break;if (p-data.s
36、tate = Free & p-data.size request) / 空闲块大于分配需求if (p-data.size - request data.size - request;/更新剩余最小值q = p;/ 更新最佳位置指向 p = p-next;if (q = NULL) return ERROR;/没有找到空闲块else / 找到了最佳位置并实现分配 temp-prior = q-prior; temp-next = q;temp-data.address = q-data.address; q-prior-next = temp;q-prior = temp;q-data.add
37、ress += request; q-data.size = ch;return OK;4程序流程图5实验结果* F:煙作圣统浬程设计冶5A5m aimexe动态分区分配方式的模拟:杠* 来十卓垛* 1)首次适应算法2)最佳适应算法*+请选择分配算法请选择分e己算法:1* 1:分配内存2:回收内存*+* 3:杳看分S&Q:退 出+*本*水朮容*水水*末*倉*卡*沐*本*床*床帝:4:未* 请输入您的撫作:1请输入作业(分区号):5请输人需要分配的主存大小单位:KBh E8分齟成讪专二:栏*:!:*:*3*3* 平并* * 1:分配内存2:回收内存*+* 3:查看分配0:退 出+学半*半半宇*#
38、半学半*寧*半*举半*请输入您的操作:3 十十+十十 卄 十十+十十十+十十+十十 卄 十十+十十十+十十+十十 卄 十十+十 + 王存分配情况 + +十十+H十+十+十+十+十十+十十+十+十+十十+十号址小态地犬始区分起分护号扯?h态 区始区 分專状KB闲552空1:分配内存3:查看分配2:回收內存 Q:退 出*1:分配內存3:查看分配2:回收内存0:退出*+卄卄+4THF+卄卄+ +主存分配情况+ 分区号:3起始地址:0分区大小“ 66 KB状 态*已分配分区号:Free 起始地址;66 分成大小:574 KB 狀 态:空闲6实验代码为避免重复,已将实现两种算法部分代码删除#includ
39、e#includeusing namespace std;#define Free 0 /空闲状态#define OK 1#define Busy 1 /已用状态/完成#define ERROR 0 / 出错#define MAX_length 640 /最大内存空间为 640KBtypedef int Status;/ 定义一个空闲区说明表结构typedef struct freearea int ID; / 分区号long size; / 分区大小long address; / 分区地址int state; / 状态ElemType;/ 线性表的双向链表存储结构 /double linke
40、d listtypedef struct DuLNode ElemType data;struct DuLNode *prior; /前趋指针struct DuLNode *next;/ 后继指针DuLNode, *DuLinkList;DuLinkList block_first; /头结点DuLinkList block_last;/ 尾结点Status alloc(int);/ 内存分配Status free(int); / 内存回收Status First_fit(int, int);/ 首次适应算法Status Best_fit(int, int); / 最佳适应算法void show();/ 查看分配Status Initblock(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度全球N95口罩采购框架合同
- 《JP公司营运资金管理研究》
- 高二数学下学期期中全真模拟卷(2)-2021-2022学年高二数学下学期考试满分全(人教A版2019选修第二册第三册)(原卷版)
- 《Ⅱ型胸神经阻滞技术在胸部手术围术期镇痛中的临床研究》
- 2024年城市智能化照明系统建设合同
- 《新型c-KIT-BCR-ABL双靶点抑制剂JLPN-41的体外抗肿瘤活性及作用机制研究》
- 《平衡性肌力训练法与神经发育疗法改善痉挛型脑瘫患儿踝关节运动功能的疗效对比观察》
- 《知识产权滥用的反垄断规制》
- 房屋买卖协议格式 2024年
- 2024年工厂维修服务合同
- 小学 四年级 体育水平二 基本运动技能平衡篇 课件
- 巧克力简介课件
- 初中语文人教七年级上册要拿我当一挺机关枪使用
- 北京颂歌原版五线谱钢琴谱正谱乐谱
- PSUR模板仅供参考
- 火力发电企业作业活动风险分级管控清单(参考)
- 民法典合同编之保证合同实务解读PPT
- 全国第四轮学科评估PPT幻灯片课件(PPT 24页)
- 大气污染控制工程课程设计-某厂酸洗硫酸烟雾治理设施设计
- 名牌包包网红主播电商直播带货话术脚本
- 高考语文作文素材人物速递——苏炳添课件18张
评论
0/150
提交评论