毕业设计(论文)-基于C语言的小型模拟操作系统设计_第1页
毕业设计(论文)-基于C语言的小型模拟操作系统设计_第2页
毕业设计(论文)-基于C语言的小型模拟操作系统设计_第3页
毕业设计(论文)-基于C语言的小型模拟操作系统设计_第4页
毕业设计(论文)-基于C语言的小型模拟操作系统设计_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、本科生毕业设计(创作)基于c语言的小型模拟操作系统设计(只包含进程管理和存储管理)院 系计算机系专 业计算机科学与技术指导教师2013 年 6月 教务处制本科生毕业设计(论文、创作)声明本人郑重声明:所呈交的毕业设计,是本人在指导教师指导下,进 行研究工作所取得的成果。除文中已经注明引用的内容外,本设计的研 究成果不包含任何他人创作的、已公开发表或没有公开发表的作品内容。 对本论文所涉及的研究工作做出贡献的其他个人和集体,均已在文中以 明确方式标明。本设计创作声明的法律责任由本人承担。作者签名:年 月 曰本人声明:该毕业设计是本人指导学生完成的研究成果,已经审阅 过毕业设计的全部内容,保证题目

2、、关键词、摘要部分中英文内容的一 致性和准确性,并通过一定检测手段保证毕业设计未发现违背学术道德 诚信的不端行为。指导教师签名:基于c语言的小型模拟操作系统设计(只包含进程管理和存储管理)摘要木设计采用visual c+开发工具在windows环境下设一个模拟操作系统。根 据操作系统理论知识的学习实现了进程管理和存储管理。进程管理部分主要实现了进 程的创建和撤销、进程的运行。进程的创建和撤销主要应用指针和链表的知识,进程 的运行方式采用的是时间片轮转调度算法,通过输入相关指令可以看到多个进程在时 间片调度算法下由就绪态到运行态再到完成态的全过程。存储管理部分主要实现了进 程内存空间的分配和回收

3、。存储分配采用基木分页存储管理方式,通过数组来模拟主 存空间。创建进程的同时完成对用户提出内存块数的分配,并显示在屏幕上。内存回 收模块的作用是将处于指针队列的控制块移出队列并释放进程所占用的内存。木人在设计此系统过程中做了如下工作:(1)仔细阅读了操作系统的进程管理和 存储器管理部分的内容,并详细分析了其中的原理。(2)学习了 c语言中的数组、指 针等相关知识,并对相关算法做了仔细的阅读和分析。(3)熟悉了软件工程开发的基 木方法、模型、步骤等,确定了系统的框架。(4)使用c语言编写了模拟操作系统。通过这次模拟操作系统的设计,加深了自己对操作系统实现思路的理解,直观的 理解了操作系统的相关原

4、理,提高了自己编写程序和调试程序的能力,为以后的进一 步学习提供了一个良好的开端。关键词:操作系统,进程管理,存储管理,分页,时间片small simulation operating system design based on c language(only includes process management and storage management)abstractthis design uses the visual c+ development tools in windows environment design a simulation operating system.

5、 according to the operating system to study the theory knowledge to realize the process management and storage management. process management part is mainly to achieve the process of creation and cancellation,the operation of the process. process creation and revoke the main application of pointer a

6、nd linked list,process the operation mode of using the time slice rotation scheduling algorithm, through input the command can see multiple processes under the time slice scheduling algorithm by the ready state to a running state and then to finish the whole course of state. storage management part

7、mainly realizes the process memory space allocation and recycling. storage allocation using basic page storage management mode,through the array to simulate the main memory space.in the design of the system in the process of doing the following work: 1,read the process management and storage managem

8、ent component of the operating system, and analyzes in detail the principle of 2,to learn the relevant knowledge such as arrays, pointers in c language,and made a careful reading and analysis of relevant algorithm. 3, familiar with the basic method of the software engineering development,models, pro

9、cedures,etc.,determine the framework of the system. 4, using c language to write the simulation operating system.by designing simulation operating system, deepen their understanding of operating system implementation approach,intuitive understanding of the relevant principle of the operating system,

10、it improves the ability of writing your own program and debugging,for future further study provides a good place to start.key words: operating system, process management, memory management,paging, time slice目录1 -1 -1.1 wm-1-1.3设计目标-1-1.4 意、义-1-1.5论文组织安排-1-2系统分析与设计-3-2.1进程管理要求-3-2.1.1进程状态-3-2.1.2进程控制

11、块-3-1.3进程创建-3-1.4进程调度-4-2. 1.5进程撤销-4-2.2存储管理要求-4-2.2. 1内存分配-4-2.2.2回收内存-5-2.3总体设计要求-5-3系统详细设计-6-3.1全局变量-6-3.2内存初始化-6-3.2.1内存定义-6-3.2.2主要代码-7-3.2.3测试结果-8-3.3 鯉删-8-3.3.1进程结构pcb的描述-8-3.3.2进程队列的描述-8-3. 3. 3流程图-9-3.3.4主要代码-11-3.3.5测试结果-12-3.4查看i人j存-13-3.4. 1 页表-13-3.4.2 流程图-13-3.4. 3主要代码-15-3.4.4测试结果-16-

12、3.5运行进程-16-3.5.1时间片轮转调度算法-16-3.5.2算法工作安排-16-流程图-18-5.4主要代码-21 -5.5测试结果-23-3.6撤销进程-23-3.6.1结束进程控制块-23 -3.6.2回收内存数组-24-3. 6. 3 流程图-24-3. 6.4主要代码-26-3.6.5测试结果-27-4问题与总结-28-隱-29-輯 5c 献-37-翻-38-1绪论1.1背景操作系统(os,operating system)是计算机系统的核心和灵魂,是计算机系统必 不可少的组成部分,任何其他软件都必须在操作系统的支持下冰能运行。操作系统的功能强大、代码量大,阅读理解实际系统对于

13、一般的学习者来说 几乎是不可能的,因此为了更好地理解操作系统的运行机制,根据操作系统的 原理和实际系统的组织结构和一些具体实现,设计一个模拟的操作系统来帮助 我们更好地掌握操作系统的原理是非常必要的。1.2设计目标在多道程运行环境下,用户可以通过模拟操作系统的交互界面创建进程并按照基 木分页存储管理方式分配必要的内存空间,按照时间片轮转算法选择一个或几个进程 在处理机上运行。当程序执行完毕时,系统可以撤销进程并收回它所占用的内存空间。 模拟操作系统不涉及具体的硬件,通过设计合理的数据结构来表示硬件资源,并通过 输出一些提示信息表示系统当前的运行状态。通过设计模拟操作系统,加深学生对操作系统实现

14、思路的理解,提高综合运用所 学知识的能力,以及培养系统设计能力,为以后更进一步的设计和分析系统打下坚实 的基础。1.3意义通过在平时原有认识的基础上又进一步的系统的学习y操作系统的相关知识,强 化丫自己的认知。通过本模拟操作系统的设计使自己更加直观的理解了操作系统的相 关知识,人人提高了自己分析问题和解决问题的能力,为以后的进一步学习起到了很 好的铺垫。1-4论文组织安排本文安排如下:第一章绪论。介绍课题的背景、设计目标和意义。第二章系统分析与设计。介绍进程管理存储管理的设计要求以及总设计框架。 第三章系统详细设计。介绍各个代码块的详细设计流程。第四章问题与总结。总结自己设计过程以及设计中遇到

15、的主要问题及解决方法。2系统分析与设计2.1进程管理要求2.1.1进程状态由于木系统采用的是基于时间片调度算法模拟进程的运行过程,所以设定的进程 基木状态为就绪运行、运行状态和完成状态。如图2-1进入,、释放图2-1进程基于时间片轮转算法的基木状态2.1.2进程控制块进程控制块pcb(process control block)是进程最重要的数据结构,它用于描述和 控制进程,是进程存在的唯一标识。进程控制块内容有进程标示符、处理机状态、进 程调度信息、进程控制信息。本系统采用链式方式来组织进程控制块。把具有同一状态的进程控制块链接成一 个队列,这样就形成了就绪状态、运行状态和完成状态。2.1.

16、3进程创建一旦操作系统接收到用户输入的创建命令,便调用进程创建函数按k列方式为用户创建一个新进程。(1) 申请一个空白的pcb。(2) 为进程分配内存。(3) 初始化pcb中的内容。(4) 将pcb插入到就绪队列,等待调度。2.1.4进程调度进程调度采用吋间片轮转调度算法,吋间片大小由用户自己定义。进程调度函数主要完成下列工作:从就绪队列中选择队首进程插入到运行队列。修改pcb中的信息。假如进程运行完便插入到完成队列,从就绪队列取下一进程到运行队列。否则将这一进程插入到就绪队列队尾,等待下一次调度。2.1.5进程撤销进程撤销函数主要完成下列工作:将进程控制块pcb移出队列。释放进程所占内存。将

17、撤销信息显示在屏幕上。2.2存储管理要求2.2.1内存分配由于本系统采用的内存分配策略是基本分贞存储管理方式,又称为离散分配方 式。所以有必要对内存进行分块和初始化。采用二维数组模拟基本分页存储。内存分配主要完成下列工作:初始化内存数组,将其分割成-组不连续的块。为进程分配用户提出请求的页数。将分配的页号和块号显示在屏幕上。2.2.2回收内存当进程运行完释放内存时,系统根据用户的要求从相应的链表上摘下,然后释放 内存数组的数据,此时可能出现两种情况。(1) 回收的pcb在就绪队列。(2) 回收的pcb在完成队列。2.3总体设计要求木系统包括如下代码块:(1) 主函数模块。调用初始化代码块和菜单

18、代码块。(2) 初始化代码块。初始化内存数组。(3) 菜单代码块。调用创建进程、查看内存、运行进程、撤销进程代码块。(4) 创建进程代码块。创建并初始化进程控制块以及分配内存空间。(5) 查看内存代码块。查看内存的分配情况。(6) 运行进程代码块。采用时间片轮转调度算法调度进程运行。(7) 结束进程代码块。结束进程并释放其占用的内存空间。函数之间的调用的关系如图2-3所示。图2-3总体设计模块3系统详细设计3.1全局变量系统代码中定义的一些全局变量#define n 100/共有100个内存块int processinjin+lj; /存放每个进程的页表int blockn;/内存块状态标志数

19、组,0:空闲,1:使用int blockcount;/记录当前内存剩余空间int processcount;/记录当前进程.数bool flag = true;int m;typedef struct node int pid; int round; int needtime; int cputime; int count; int state;struct node *next;pcb;pcb *finish,*ready,*tail,*run;3.2内存初始化3.2.1内存定义定义内存块共有n个,初始化后的内存空间应该有一部分己经被使用,这可以 用系统提供的随机数函数rand()完成。假定

20、内存空间已经按块划分,目标程序无需关心内存块大小等底层细节,只需按 算法对内存块进行分配即可。采用二维数组3-2-1来模拟进程使用内存块情况。用一 个内存状态标志数组来记录内存的占用情况。块占用志图3-2-1內存二维数组示意图3.2.2主要代码void init()inti,j;for (i=0; i<n; i+) blocki = 0; for (i=0; i<80; i+)blockrand()%(n-l) = 1; blockcount = 0; for (i=0; i<n; i+) if (blocki = 0)blockcount+; for (i=0; i<

21、n; i+)process il 0 = 0; for(j=l;j<n;j+)processij = -1;)processcount = 0;printf(”初始化结果如下:");output();flag = false;13.2.3测试结果图 3-2-23.3创建进程3.3.1进程结构pgb的描述每个进程用一个进程控制块(pcb)表示。进程控制块包含如下信息:进程名、轮数、需要运行时间、已用cpu时间、进程状态、指针。 typedef struct node int pid; int round; int needtime; int cputime; int count;

22、 int state;struct node *next;)pcb;3. 3.2进程队列的描述进程队列包括就绪队列、运行队列和完成队列,指向进程队列的指针有就绪头队 列指针ready、运行队列头指针nm、完成队列头指针finish以及队列尾指针tail。图 3-3-2把具有统一状态的pcb用链接字链接成一个队列。现做如下定义。pcb *finish,*ready,*tail,*run;图3-3-2 pcb链接队列示意图3.3.3流程幵始输入进程数:m图3-3-3创建进程流程图3.3.4主要代码bool createprocess()int na;int pages,k = 0;pcb *p;

23、int time;/char naf 10; ready=null; finish=null; run=null;printf(”输入进程数:n);scanf(h%dh,&m);int an;for(int j=o;j<m;j+)kx)p:printfr请输入进程号(小于<1)和运行时间和所耑页面数:”,n); scanf(m%d%d%d", &na, &time,&pages);a|j=na;for(int k=o;k<j;k+)if(akj=ak+lj)printff进程号输入重复,请重新输入! nnh); goto loop;i

24、f(na>99)printf("错误!进程号过大! n"); goto loop;if (pages > blockcount)printf(”错误!闪存分配失败,没有你要求的进程块数! n"); return false;blockcount -= pages;processna0 = pages;for (int i=l; k=pages; i+)while (blockk=l && k< 100) k+;processnai = k; blockfk = 1; k+;p=(pcb *)malloc(sizeof(pcb);

25、/strcpy(p-pid,pid); p-pid=na; p-cputime=0; p->needtime=time; p->state='w,; p->round =0; p->count =0; if(ready!=null)insert(p);elsep-next=ready; ready=p; tail=ready;)processcount+;printf("创建新进程成功! nnreturn true;3. 3. 5测试结果11 11 , 4諸00考tl程存序程序德小加建貧象创查运驟菜->->->->-> 作

26、i i i i i输 喿1 2 3 4 0曹程程进进入新请创</功8进进入新讓请创3.4查看内存3.4.1页表在分页系统屮,允许将进程的各个页离散的存储在内存的不同物理块屮,但系统 应能保证进程的正确运行,即能在内存屮找到每个页面对应的物理块。为此,系统又 为每个进程建立丫一张页面映像表,简称页表。在进程地址空间内的所有页(0n), 依次在页表屮有一页表项,其屮记录了相应页在内存屮对应的物理块号,见图3-4-1。 在配置丫页表后,进程执行时通过查找页表,即可找到每页在a存屮的物理块号。内存输出函数output()主要功能是输出内存初始化k的内存占用信息以及在系统 执行撤销进程函数endp

27、mcesso后输出内存占用情况。页表页号块号0213263849511參參參參图3-4-1页表3.4.2流程阁3-4-2査看a存流程阁3.4. 3主要代码void output()printf("n内存总量:d块,己用空间:d块,剩余空间:d块,进程总数:。/od个11'n n-blockcount, blockcount, processcount);if (flag && blockcount < n)printff 已使用的內存块(<1): n",n-blockcount); for (int k=0,count=0; k<n

28、; k+)if (blockk = 1)printf(n%2d ”,k,+count);if (count = 10)putchar('n'); count = 0;)putchar('n');)if (processcount > 0)int id;printf(n请输入要查看的进程号:n);scanf("%d",&id);printf("内存详细使用情况如下:n");if (processid01 > 0)printf(n*n). printf("进程号:。/od n",id);

29、printf("|n”);printf(u| 页号|块号|n");printfci|nh);for (int j=1,count=0; j<=processid0; j +)printf(.| %2d|%2d |nn,count,processid|j,count+);printf(”|n");printf(” * 输出结束*10;)elseprintf("当前内存无进程! n"); putchar(n);3.4.4测试结果请银入辱查看湖躍關详蘿使甬情況脉a#程号:,1页号:块号! 0 :0! 1 !1:2 !3:3!4:4!611:5:

30、8 :11:6 :19!7:12图 3-4-43.5运行进程3.5.1时间片轮转调度算法所有就绪进程按fcfs排成一个队列,总是把处理机分配给队首的进程,各进程 占用cpu的时间片相同。即将cpu的处理时间划分成一个个相同的时间片,就绪队 列的诸进程轮流运行一个时间片。当一个时间片结束时,如果运行进程用完它的时间 片后还未完成,就强迫运行机制进程让出cpu,就把它送回到就绪队列的末尾,等 待下一次调度。同时,进程调度又去选择就绪队列屮的队首进程,分配给它一时间片, 以投入运行。直至所有的进程运行完毕。3. 5.2算法工作安排(1)用户可以自行输入进程的数量,每一个进程由进程控制块(pcb)表示

31、,各种队 列均釆用链表数据结构。2. 按照进程输入的先后顺序排成一个队列。再设一个队首指针指向第一个到达进程 的首址。3. 执行处理机调度时,开始选择队首的第一个进程运行。另外,再设一个当前运行 进程的指针,指向当前正在运行的进程。4. 在规定的时间片内进程是根据先来先服务的方式配列的,每个进程只运行时间片 大小的时间然后转到下一个进程运行,直到所有进程运行完为止。3.5.3流程run=ready; ready=ready->next;tail->next =run;run->state-rr;调用输出函数:prt();调用输出函数:prt();结來3.5.4主要代码bool

32、 roundrun()int timeslice; if(processcount< 1)printf("当前程序无进程,请重新输入!nnn); return 0;pdmf(”请输入时间片的大小:n);scanf("%d",&timeslice);printf("时间片轮转法输出信bn'*);printf(iv1#置,1,、,i,ry%,j,*7、,j,7、,j,*7、,j,7、,j,*7、,j,7、,j* *7、,j*,i,*7、,j* *7、,i,*7、,j* rj%,j,rj,j,rj,j,rj,j,rj,卜 rj,r卜 rj

33、,卜 rj,卜 rj,r卜 rj,卜 rjw,卜,j,卜 rjw,卜 rjw,卜,j,卜 rjw rj* rj、rj* rj* rjw ,j、rjw rjw rj*,j,* * * *n") run=ready;ready=ready-next;tail->next =run;run-state=r.;prt();while(run != null)run-cputime = run-cputime + timeslice; run->needtime = run-needtime - timeslice; run-round+=timeslice;run->cou

34、nt+; if(run->needtime <= 0)run->needtime = 0; run->next = finish; finish = run; if(run != tail)tail-next = ready;)elseready = null;)run->state = f; run 二 null; if(ready != null)fir$tin();)elseif(ready != null)run->state = w; tail = run; run = ready; run -state = r; ready = ready -n

35、ext;)prt();)printf(11<f*! *1*! *1* «£««£««£« *«£««£« *<tw <tw <tw <tw <tw <tw <tw <tw#t%#t%#t%#t%#t% <、#t% <、#t% <、#t% t% #t7 t% 7 <、氺*氺氺nnyprintfc.输出结束n");return true; 3.5.5测试结果*进程

36、号12进程号21进程号12逬程号21cpu时|司00cpu时间03cpi耐间33cpu时间36cpu时间66所需时间56所需时间62所需时间23所需时间30所需时间00数 教t3己 己vi vi12时间片0时间片03时间片33时间片36时间片66c、mc:program filesmicrosoft visual studiomyprojectsfdebugf.exe-|n|x|请響m曬1时间片轮转法输出信息3出结:图 4-5-23.6撤销进程3.6.1结束进程控制块当用户提出结束进程命令,系统依次用指针搜索就绪队列和完成队列,如果找到 要结束的的进程控制块就将其删去,这里的删去并不是真正的从

37、内存中把它抹掉,而 是把它从链表中分离出来,只要撤销原来的链接关系即可。可以设两个指针变量pi和p2,先使pi指向第一个结点(图3-6-l(a)0如果删除 的不是第一个结点,则使pi后移指向下一个结点(pl-next赋给pi),在此之前应将 pi的值赋给p2,使p2指向刚才检查过的那个结点,见图3-6-1 (b)。如此一次一次地 使pi后移,直到找到所要删除的结点或检查完全部链表都找不到要删除的结点为止。 如果找到某一节点是要删除的节点,还要区分两种情况:(1)要删除的是第一个结点 (pi的值等于ready的值,如图3-6-1(a)那样),则应将pl-next赋给ready,见图3-6-1 (

38、c)o这时ready指向原来的第二个结点。第一个结点虽然仍存在,但它己与链表脱离。(2)如果要删除的不是第一个结点,则将pl-next赋给p2->next,见阁3-6-1 (d)。plreadynullreadynullnull图 3-5-13. 6.2回收内存数组在模拟ih收内存的算法中主要采用的是数组形式和一些计数的变量,所以在hl收 内存数组中并没有真正的回收内存,面是通过改变其中的变量模拟回收的过程。首先找到要回收的内存数组的进程号,并用processid0记录所要回收的页面 数。然后清除processtds行的内容,同时罝内存标志数组blockn为0表示释 放。最后进程计数器p

39、rocesscount减1,相应的把剩余块计数器blockcount加上回收 的页面数。3.6.3流程图3.6.4主要代码bool endprocess()int id,pages; if (processcount < 1)printf("当前内存没有进程! nn); return false;printf("当前内存巾的进程有d个,进程号力:",processcount); for (int i=0; i<n; i+)if (processi0 > 0) printf(',o/o2d ", i);putchar('n

40、');printf("请输入您要结朿的进程号(小于(1): *,n); scanf(n%d",&id);pcb *pl,*p2;if(pl=ready)while(id!=pl ->pid&&p 1 ->next!=null)p2=pl;pl=pl->next;if(id=pl-pid)if(pl=ready)ready=p i ->next;elsep2->next=pl ->next;printf(” 已删除进程<1 nmd);elseprintf("对不起!您所要结束的进程(1不存在,

41、请重新输入nit,id);elseif(pl=finish)while(id!=pl ->pid&&p 1 ->next!=null)p2=pl;pl=pl->next;if(id=pl->pid)if(pl=finish)ready=pl->next;elsep2-next=p 1 ->next; printfc1 已删除进程。/od nn,id);elseprintf("对不起!您所要结朿的进程(1不存在,请重新输入nn",id);)elseprintff对不起!您所要结束的进程3不存在,请重新输入nn”,id); p

42、ages = processid0; for (int j= 1; j<pages; j+)blockprocessfidlfj = 0; processidj =-l;processid0 = 0; processcount-; blockcount+= pages; return true;3.6.5测试结果图 3-6-54问题与总结在模拟进程管理和存储管理的模拟操作系统设计中,处于核心的问题是如何实现 时间片轮转调度算法和基本分页存储算法。其中最难的是模拟时间片轮转算法的执行 过程和控制流程,经过阅读相关代码和c语言的学习解决了这一问题。基本分页的思想是比较简单的,而且应用了一种可

43、行的数据结构来存储程序中需 要用到的数据,因此这个实验在构思上是没有多少难度的。由于程序中主要使用的是 数组,操作起来比较方便,不像前时间片轮转算法需要用到大量的链表操作。在这次 设计中,主要遇到了以下一些问题:2. 内存使用情况应该以哪种形式输出以及输出哪些信息。最终选择了尽可能详细地 输出有用信息,通过空格、空行、对齐等手段尽力使输出格式简洁美观。比如,在输 出每个进程的内存使用情况时,首先输出该进程占用的总内存,然后以统一的对齐方 式依次输出各个内存块编号。当然,对于不同的模块输出的信息也应该不一样,比如,内存初始化结束后应该 输出哪个内存块被占用了,否则无法判断后续的内存分配是否正确,

44、但在以后查看内 存使用情况时则不必把所有已占用的内存块输出,因为每个进程都会单独把自己占用 的内存块显示出来。为了达到这种效果,使用了一个全局变量作为判断依据,详细情 况见附录中代码。3. 程序的容错性。这是一个容易被忽略的问题。这个程序起初基本没考虑这个问题, 但在后来的调试过程中,逐渐加上了一些基本的容错功能,比如用户在结束某进程时, 其输入的进程号可能根本不存在,这时应该给出用户出错提示,并要求用户重新输入, 但这里用了一个编程中不太推荐的方式:goto语句。总体而言,这次设计还是比较顺利的,没有遇到什么特别难解决的问题。通过自 己编程模拟内存分配,我不仅加深了对进程调度和这类内存管理方

45、式的理解,也增强 了 c语言的编程能力。附录全局变量代码:#include <stdio.h>#includewindows.h#include<stdlib.h>#include<string.h>#define n 100/共有100个内存块int processfnfn+l;/存放每个进程的页表int blockn;/内存块状态标志数组,0:空闲,1:使用int blockcount;/记录当前内存剩余空间int processcount;/记录当前进程.数bool flag = true;int m;typedef struct node int p

46、id; int round; int needtime; int cputime; int count; int state;struct node *next;jpcb;pcb *finish,*ready,*tail,*run;/void init();void output();/bool createprocess();/bool endprocess();初始化模块代码:void init()int ij;/初始化a存状态标志数俎 for (i=0; i<n; i+)blockil = 0; for (i=0; i<80; i+)blockfrand()%(n-l)l =

47、 1; blockcount = 0; for (i=0; i<n; i+)if(blockil = 0) blockcount+;/初始化存放进程的数俎 for (i=0; i<n; i+)processfi問=0; for(j=l;j<n;j+)process filfj = -1;processcounl = 0; printff初始化结果如下:n);output(); flag = false;)输出模块代码:void output()printf("n内存总量:d块,己用空间:d块,剩余空间:d块,进程总数:d个11'n n-blockcount,

48、 blockcount,processcount);if (flag && blockcount < n)printf("已使用的内存块(<1): n",n-blockcount); for (int k=0,count=0; k<n; k+)if (blockfk = 1)printf("%2d ,k,+count);if (count = 10)putchar(n.); count = 0;)putchar('n');)/输出各进程占用内存详细情况 if (processcount > 0)int id;

49、printf("请输入要查看的进程号:”); scanf("%d",&id);/if(id=id)/break printf("内"存详细使用情况如下:n'*);/ for (int i=0; i<n; i+)/if (processid0 > 0)printfc进程%dn",id); printffl|nn);printf(n| 页号| 块号|n"); printfc'l|nu);for (int j=l ,count=0; j<=processid0; j+)printf(&qu

50、ot;| %2d|%2d |n,count,processidj,count+);printfflin");/printf("%2d ", processij, count+);/*if (count = 15)putchar('n');printffh);count = 0;*/printf(n* 输出结朿 *nn);/ putchar( n);)/ )elseprintf("当前内存无进程! n"); putcharcvn.);)void firstin()run=ready;run-state=r;ready=ready-

51、next;voidprtl(pcb *q)!printf("*%-1 od %-1 od %-1 od %-1 od %-10d %-10c*nn,q-pid,q-cputime,q-needtime,q-count,q-round,q-state);void prt()所需时间记数时间片状态pcb *q;printf("* 进程号 cpu时间 *n");if(run!=null)prtl(run);q=ready;vvhile(q!=null&&q!=run)!prtl(q);if(q-next = run) break;else q = q-&

52、gt;next;q=finish;while(q!=null)prtl(q);q=q->next;)getchar();void insert(pcb *q)tail-next =q; tail=tail->next;)创建进程模块代码:bool createprocess()int na;int pages, k = 0;pcb *p; int time;/char na10; ready=null; finish=null; run=null;printf("输入进程数:n);scanf("%d",&m);int an;for(int j=

53、0;j<m;j+)!ioop:printf("请输入进程号(小于<1)和运行时间和所需页面数:",n); scanf("%d%d%d' &na, &time,&pages);aj=na;for(int k=0;k<j;k+)if(ak=ak+1)printf(n进程号输入重复,诺重新输入! nrt); goto loop;if (na > 99)!printf("错误!进程号过大! n"); goto loop;)if (pages > blockcount)!printf("错误!内存分配失败,没有你要求的进程块数! n”); return false;)blockcount -= pages; processna0 = pages; for (int i=l; i<=pages; i+)while (blockk=l && k<100) k+;processnai = k; blockk = 1; k+;p=(pcb *)malloc(sizeof(pcb);/strcpy(p_pid,pid); p->pid=na; p->cpu

温馨提示

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

评论

0/150

提交评论