基于c语言的小型模拟操作系统设计本科论文

上传人:无*** 文档编号:206195558 上传时间:2023-05-02 格式:DOC 页数:44 大小:382.50KB
收藏 版权申诉 举报 下载
基于c语言的小型模拟操作系统设计本科论文_第1页
第1页 / 共44页
基于c语言的小型模拟操作系统设计本科论文_第2页
第2页 / 共44页
基于c语言的小型模拟操作系统设计本科论文_第3页
第3页 / 共44页
资源描述:

《基于c语言的小型模拟操作系统设计本科论文》由会员分享,可在线阅读,更多相关《基于c语言的小型模拟操作系统设计本科论文(44页珍藏版)》请在装配图网上搜索。

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

2、毕业设计的全部内容,保证题目、关键词、摘要部分中英文内容的一致性和准确性,并通过一定检测手段保证毕业设计未发现违背学术道德诚信的不端行为。 指导教师签名: 年 月 日计算机系2013届本科毕业设计 基于C语言的小型模拟操作系统设计 王在平基于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

5、 environment design a simulation operating system. 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 cr

6、eation and revoke the main application of pointer and 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

7、 the whole course of state. Storage management part 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 wo

8、rk: 1, read the process management and storage management 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 me

9、thod of the software engineering development, models, procedures, 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 und

10、erstanding of the relevant principle of the operating system, 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背景- 1 -1.3设计目

11、标- 1 -1.4 意义- 1 -1.5论文组织安排- 1 -2 系统分析与设计- 3 -2.1 进程管理要求- 3 -2.1.1 进程状态- 3 -2.1.2 进程控制块- 3 -2.1.3 进程创建- 3 -2.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 进

12、程结构PCB的描述- 8 -3.3.2 进程队列的描述- 8 -3.3.3流程图- 9 -3.3.4 主要代码- 11 -3.3.5 测试结果- 12 -3.4 查看内存- 13 -3.4.1 页表- 13 -3.4.2 流程图- 13 -3.4.3主要代码- 15 -3.4.4 测试结果- 16 -3.5 运行进程- 16 -3.5.1 时间片轮转调度算法- 16 -3.5.2 算法工作安排- 16 -3.5.3 流程图- 18 -3.5.4 主要代码- 21 -3.5.5 测试结果- 23 -3.6 撤销进程- 23 -3.6.1 结束进程控制块- 23 -3.6.2 回收内存数组- 24

13、 -3.6.3 流程图- 24 -3.6.4 主要代码- 26 -3.6.5 测试结果- 27 -4 问题与总结- 28 -附录- 29 -参考文献- 37 -致谢- 38 -1 绪 论1.1背景操作系统(OS,Operating System)是计算机系统的核心和灵魂,是计算机系统必不可少的组成部分,任何其他软件都必须在操作系统的支持下才能运行。操作系统的功能强大、代码量大,阅读理解实际系统对于一般的学习者来说几乎是不可能的,因此为了更好地理解操作系统的运行机制,根据操作系统的原理和实际系统的组织结构和一些具体实现,设计一个模拟的操作系统来帮助我们更好地掌握操作系统的原理是非常必要的。1.2

14、 设计目标在多道程运行环境下,用户可以通过模拟操作系统的交互界面创建进程并按照基本分页存储管理方式分配必要的内存空间,按照时间片轮转算法选择一个或几个进程在处理机上运行。当程序执行完毕时,系统可以撤销进程并收回它所占用的内存空间。模拟操作系统不涉及具体的硬件,通过设计合理的数据结构来表示硬件资源,并通过输出一些提示信息表示系统当前的运行状态。通过设计模拟操作系统,加深学生对操作系统实现思路的理解,提高综合运用所学知识的能力,以及培养系统设计能力,为以后更进一步的设计和分析系统打下坚实的基础。1.3 意义通过在平时原有认识的基础上又进一步的系统的学习了操作系统的相关知识,强化了自己的认知。通过本

15、模拟操作系统的设计使自己更加直观的理解了操作系统的相关知识,大大提高了自己分析问题和解决问题的能力,为以后的进一步学习起到了很好的铺垫。1.4 论文组织安排本文安排如下:第一章 绪论。介绍课题的背景、设计目标和意义。第二章 系统分析与设计。介绍进程管理存储管理的设计要求以及总设计框架。第三章 系统详细设计。介绍各个代码块的详细设计流程。第四章 问题与总结。总结自己设计过程以及设计中遇到的主要问题及解决方法。2 系统分析与设计2.1 进程管理要求2.1.1 进程状态由于本系统采用的是基于时间片调度算法模拟进程的运行过程,所以设定的进程基本状态为就绪运行、运行状态和完成状态。如图2-1运行运行完进

16、入时间片用完进程调度释放就绪完成图2-1 进程基于时间片轮转算法的基本状态2.1.2 进程控制块进程控制块PCB(Process Control Block)是进程最重要的数据结构,它用于描述和控制进程,是进程存在的唯一标识。进程控制块内容有进程标示符、处理机状态、进程调度信息、进程控制信息。本系统采用链式方式来组织进程控制块。把具有同一状态的进程控制块链接成一个队列,这样就形成了就绪状态、运行状态和完成状态。2.1.3 进程创建一旦操作系统接收到用户输入的创建命令,便调用进程创建函数按下列方式为用户创建一个新进程。(1) 申请一个空白的PCB。(2) 为进程分配内存。(3) 初始化PCB中的

17、内容。(4) 将PCB插入到就绪队列,等待调度。2.1.4 进程调度进程调度采用时间片轮转调度算法,时间片大小由用户自己定义。进程调度函数主要完成下列工作:(1) 从就绪队列中选择队首进程插入到运行队列。(2) 修改PCB中的信息。(3) 假如进程运行完便插入到完成队列,从就绪队列取下一进程到运行队列。(4) 否则将这一进程插入到就绪队列队尾,等待下一次调度。2.1.5进程撤销进程撤销函数主要完成下列工作:(1) 将进程控制块PCB移出队列。(2) 释放进程所占内存。(3) 将撤销信息显示在屏幕上。2.2 存储管理要求2.2.1 内存分配由于本系统采用的内存分配策略是基本分页存储管理方式,又称

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

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

20、int blockCount; / 记录当前内存剩余空间int processCount; / 记录当前进程数bool flag = true;int M;typedef struct nodeint 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()完成。假定内存空间已经按块划分,目标

21、程序无需关心内存块大小等底层细节,只需按算法对内存块进行分配即可。采用二维数组3-2-1来模拟进程使用内存块情况。用一个内存状态标志数组来记录内存的占用情况。012N-10 1 2 N-1 N.进程号进程块数块占用标志图 3-2-1 内存二维数组示意图3.2.2 主要代码void init()int i, j;for (i=0; iN; i+)blocki = 0;for (i=0; i80; i+)blockrand()%(N-1) = 1;blockCount = 0;for (i=0; iN; i+)if (blocki = 0)blockCount+;for (i=0; iN; i+)

22、processi0 = 0;for (j=1; jN; j+)processij = -1;processCount = 0;printf(初始化结果如下:);output();flag = false;3.2.3 测试结果图 3-2-23.3 创建进程3.3.1 进程结构PCB的描述每个进程用一个进程控制块(PCB)表示。进程控制块包含如下信息:进程名、轮数、需要运行时间、已用CPU时间、进程状态、指针。typedef struct nodeint pid;int round; int needtime;int cputime;int count;int state;struct node

23、*next;PCB;3.3.2 进程队列的描述进程队列包括就绪队列、运行队列和完成队列,指向进程队列的指针有就绪头队列指针ready、运行队列头指针run、完成队列头指针finish以及队列尾指针tail。图3-3-2把具有统一状态的PCB用链接字链接成一个队列。现做如下定义。PCB *finish,*ready,*tail,*run; PCB1PCB2PCB3PCB6PCB7PCB9PCB8PCB5PCB4.43087901运行指针就绪队列指针完成队列指针图 3-3-2 PCB链接队列示意图3.3.3流程图输入进程数:Mj=0Jnext =q;tail=tail-next;p-next=re

24、ady; ready=p;tail=ready;p-pid=na;p-cputime=0; p-needtime=time; p-state=W; p-round =0;p-count =0;blockCount -= pages;processna0 = pages;i=1i=pagesprocessnai = k;blockk = 1;k+;i+;falsetrueetruefalsej+;truefalse开始结束图 3-3-3 创建进程流程图3.3.4 主要代码bool createProcess()int na;int pages, k = 0; PCB *p;int time;/c

25、har na10;ready=NULL;finish=NULL;run=NULL; printf( 输入进程数:); scanf(%d,&M); int aN; for(int j=0;jM;j+) loop:printf(请输入进程号(小于%d)和运行时间和所需页面数:, N);scanf(%d%d%d, &na, &time,&pages); aj=na; for(int k=0;k 99)printf(错误!进程号过大!n);goto loop;if (pages blockCount)printf(错误!内存分配失败,没有你要求的进程块数!n);return false;blockCo

26、unt -= pages;processna0 = pages;for (int i=1; i=pages; i+) while (blockk=1 & kpid,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(创建新进程成功!nn);return true;3.3.5 测试结果图 3-3-53.4 查看内存3.4.1 页

27、表在分页系统中,允许将进程的各个页离散的存储在内存的不同物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面对应的物理块。为此,系统又为每个进程建立了一张页面映像表,简称页表。在进程地址空间内的所有页(0n),依次在页表中有一页表项,其中记录了相应页在内存中对应的物理块号,见图3-4-1。在配置了页表后,进程执行时通过查找页表,即可找到每页在内存中的物理块号。内存输出函数output()主要功能是输出内存初始化下的内存占用信息以及在系统执行撤销进程函数endProcess()后输出内存占用情况。0123452368911.页号块号页表图3-4-1 页表3.4.2 流程图开始proc

28、essCount 0processid0 0j=processid0;输出 页号:count 块号:processidjcount+;printf(|-|n);printf(| 页号| 块号|n);printf(|-|n);结束j=1,count=0;j+falsetruetruefalse输入要查看的进程:id输出:内存无进程!false图 3-4-2 查看内存流程图3.4.3主要代码void output()printf(n内存总量:%d 块, 已用空间:%d 块, 剩余空间:%d 块, 进程总数:%d 个n, N, N-blockCount, blockCount, processCou

29、nt);if (flag & blockCount N)printf(已使用的内存块(%d):n, N-blockCount);for (int k=0,count=0; k 0)int id;printf(请输入要查看的进程号: );scanf(%d,&id);printf(内存详细使用情况如下:n);if (processid0 0) printf(*n); printf(进程号: %d n, id); printf(|-|n); printf(| 页号| 块号|n);printf(|-|n);for (int j=1,count=0; jnext;tail-next =run;run-s

30、tate=R;调用输出函数:prt();run != NULLrun-cputime=run-cputime+timeSlice;run-needtime=run-needtime-timeSlice;run-round+=timeSlice;run-count+;run != tailtail-next = ready;ready = NULL;run-state = F; run = NULL;run = NULL;ready!= NULLrun=ready;run-state=R;ready=ready-next;run-state = W;tail = run;run = ready;

31、 run - state = R; ready = ready - next;调用输出函数:prt();结束run-needtimeneedtime = 0;run-next = finish; finish = run;falsetruefalsefalsetruetrue输入时间片:timeSlice图 3-5-3(a)进程运行流程图开始run!=NULLq=ready;q!=NULL&q!=runq-next= runq = q-next;q=finish;q!=NULLq=q-next;结束输出运行队列时间片信息输出就绪队列时间片信息输出完成队列时间片信息truefalsetruefa

32、lsetruefalse图 3-5-3(b)prt输出函数流程图3.5.4 主要代码bool Roundrun() int timeSlice; if(processCountnext;tail-next =run;run-state=R;prt();while(run != NULL)run-cputime = run-cputime + timeSlice;run-needtime = run-needtime - timeSlice;run-round+=timeSlice;run-count+;if(run-needtime needtime = 0;run-next = finish

33、; finish = run;if(run != tail)tail-next = ready;elseready = NULL;run-state = F;run = NULL;if(ready != NULL)firstin();elseif(ready != NULL)run-state = W;tail = run;run = ready; run - state = R; ready = ready - next; prt();printf(*n); printf( 输出结束n);return true;3.5.5 测试结果图 4-5-23.6 撤销进程3.6.1 结束进程控制块当用

34、户提出结束进程命令,系统依次用指针搜索就绪队列和完成队列,如果找到要结束的的进程控制块就将其删去,这里的删去并不是真正的从内存中把它抹掉,而是把它从链表中分离出来,只要撤销原来的链接关系即可。可以设两个指针变量p1和p2,先使p1指向第一个结点(图 3-6-1(a) )。如果删除的不是第一个结点,则使p1后移指向下一个结点(p1-next赋给p1),在此之前应将p1的值赋给p2,使p2指向刚才检查过的那个结点,见图 3-6-1 (b)。如此一次一次地使p1后移,直到找到所要删除的结点或检查完全部链表都找不到要删除的结点为止。如果找到某一节点是要删除的节点,还要区分两种情况: (1)要删除的是第

35、一个结点(p1的值等于ready的值,如图3-6-1(a) 那样),则应将p1-next赋给ready,见图3-6-1 (c)。这时ready指向原来的第二个结点。第一个结点虽然仍存在,但它已与链表脱离。(2) 如果要删除的不是第一个结点,则将p1-next赋给p2-next,见图3-6-1 (d)。123readyp1(a)NULL123readyp2p1NULL(b)123NULL(c)readyp1123NULL(d)readyp1p2图 3-5-13.6.2 回收内存数组在模拟回收内存的算法中主要采用的是数组形式和一些计数的变量,所以在回收内存数组中并没有真正的回收内存,而是通过改变其

36、中的变量模拟回收的过程。首先找到要回收的内存数组的进程号,并用processID0记录所要回收的页面数。然后清除processID这一行的内容,同时置内存标志数组blockN为0表示释放。最后进程计数器processCount减1,相应的把剩余块计数器blockCount加上回收的页面数。3.6.3 流程图开始输入结束进程号:IDp1=ready|finishID!=p1-pid&p1-next!=NULLp2=p1; p1=p1-next;p1=p1-next;ID=p1-pidp1=readyp1=finishready=p1-next;finish=p1-next;p2-next=p1-

37、next;输出:已经删除进程结束输出:结束进程不存在falsefalsetruetruefalsefalsetruefalsetrue图 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 0)printf(%2d , i);putchar(n);printf(请输入您要结束的进程号(小于%d):, N);scanf(

38、%d, &ID);PCB *p1,*p2;if(p1=ready)while(ID!=p1-pid&p1-next!=NULL)p2=p1;p1=p1-next;if(ID=p1-pid)if(p1=ready)ready=p1-next;elsep2-next=p1-next;printf(已删除进程%d n,ID);elseprintf(对不起!您所要结束的进程%d不存在,请重新输入nn,ID);else if(p1=finish)while(ID!=p1-pid&p1-next!=NULL)p2=p1;p1=p1-next;if(ID=p1-pid)if(p1=finish)ready=

39、p1-next;elsep2-next=p1-next;printf(已删除进程%d n,ID);elseprintf(对不起!您所要结束的进程%d不存在,请重新输入nn,ID); else printf(对不起!您所要结束的进程%d不存在,请重新输入nn,ID);pages = processID0;for (int j=1; jpages; j+)blockprocessIDj = 0;processIDj =-1;processID0 = 0;processCount-;blockCount+= pages;return true;3.6.5 测试结果图 3-6-54 问题与总结在模拟进

40、程管理和存储管理的模拟操作系统设计中,处于核心的问题是如何实现时间片轮转调度算法和基本分页存储算法。其中最难的是模拟时间片轮转算法的执行过程和控制流程,经过阅读相关代码和C语言的学习解决了这一问题。基本分页的思想是比较简单的,而且应用了一种可行的数据结构来存储程序中需要用到的数据,因此这个实验在构思上是没有多少难度的。由于程序中主要使用的是数组,操作起来比较方便,不像前时间片轮转算法需要用到大量的链表操作。在这次设计中,主要遇到了以下一些问题:(1) 内存使用情况应该以哪种形式输出以及输出哪些信息。最终选择了尽可能详细地输出有用信息,通过空格、空行、对齐等手段尽力使输出格式简洁美观。比如,在输

41、出每个进程的内存使用情况时,首先输出该进程占用的总内存,然后以统一的对齐方式依次输出各个内存块编号。当然,对于不同的模块输出的信息也应该不一样,比如,内存初始化结束后应该输出哪个内存块被占用了,否则无法判断后续的内存分配是否正确,但在以后查看内存使用情况时则不必把所有已占用的内存块输出,因为每个进程都会单独把自己占用的内存块显示出来。为了达到这种效果,使用了一个全局变量作为判断依据,详细情况见附录中代码。(2)程序的容错性。这是一个容易被忽略的问题。这个程序起初基本没考虑这个问题,但在后来的调试过程中,逐渐加上了一些基本的容错功能,比如用户在结束某进程时,其输入的进程号可能根本不存在,这时应该

42、给出用户出错提示,并要求用户重新输入,但这里用了一个编程中不太推荐的方式:goto 语句。 总体而言,这次设计还是比较顺利的,没有遇到什么特别难解决的问题。通过自己编程模拟内存分配,我不仅加深了对进程调度和这类内存管理方式的理解,也增强了C语言的编程能力。附录全局变量代码:#include #include #include#include#define N 100 / 共有100个内存块int processNN+1; / 存放每个进程的页表int blockN; / 内存块状态标志数组,0:空闲,1:使用int blockCount; / 记录当前内存剩余空间int processCoun

43、t; / 记录当前进程数bool flag = true;int M;typedef struct nodeint pid;int round;int needtime;int cputime;int count;int state;struct node *next;PCB;PCB *finish,*ready,*tail,*run;/void init();void output();/bool createProcess();/bool endProcess();初始化模块代码:void init()int i, j;/ 初始化内存状态标志数组for (i=0; iN; i+)block

44、i = 0;for (i=0; i80; i+)blockrand()%(N-1) = 1;blockCount = 0;for (i=0; iN; i+)if (blocki = 0)blockCount+;/ 初始化存放进程的数组for (i=0; iN; i+)processi0 = 0;for (j=1; jN; j+)processij = -1;processCount = 0;printf(初始化结果如下:);output();flag = false;输出模块代码:void output()printf(n内存总量:%d 块, 已用空间:%d 块, 剩余空间:%d 块, 进程总

45、数:%d 个n, N, N-blockCount, blockCount, processCount);if (flag & blockCount N)printf(已使用的内存块(%d):n, N-blockCount);for (int k=0,count=0; k 0)int id;printf(请输入要查看的进程号: );scanf(%d,&id); /if(id=ID) /break;printf(内存详细使用情况如下:n);/for (int i=0; i 0) printf(*n);printf(进程号: %d n, id); printf(|-|n);printf(| 页号|

46、块号|n);printf(|-|n);for (int j=1,count=0; jstate=R;ready=ready-next;void prt1(PCB *q)printf(* %-10d %-10d %-10d %-10d %-10d %-10c*n, q-pid,q-cputime,q-needtime,q-count,q-round,q-state);void prt()PCB *q; printf(* 进程号 cpu时间 所需时间 记数 时间片 状态 *n);if(run!=NULL) prt1(run); q=ready; while(q!=NULL&q!=run)prt1(q);if(q-next = run) break;else q = q-next;q=finish;while(q!=NULL)prt1

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