毕业设计(论文)-基于C语言的小型模拟操作系统设计(33页).doc

上传人:1595****071 文档编号:38811111 上传时间:2022-09-05 格式:DOC 页数:33 大小:286KB
返回 下载 相关 举报
毕业设计(论文)-基于C语言的小型模拟操作系统设计(33页).doc_第1页
第1页 / 共33页
毕业设计(论文)-基于C语言的小型模拟操作系统设计(33页).doc_第2页
第2页 / 共33页
点击查看更多>>
资源描述

《毕业设计(论文)-基于C语言的小型模拟操作系统设计(33页).doc》由会员分享,可在线阅读,更多相关《毕业设计(论文)-基于C语言的小型模拟操作系统设计(33页).doc(33页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-毕业设计(论文)-基于C语言的小型模拟操作系统设计-第 - 27 - 页 本科生毕业设计(创作)题目 基于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 Window

5、s 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 c

6、reation 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 finis

7、h 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 w

8、ork: 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 m

9、ethod 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 un

10、derstanding 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 回收内存数组- 2

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

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

24、dy; 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;/ch

25、ar 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;blockCou

26、nt -= 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 流程图开始proces

28、sCount 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, processCount

29、);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-sta

30、te=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; r

31、un - 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;结束输出运行队列时间片信息输出就绪队列时间片信息输出完成队列时间片信息truefalsetruefals

32、etruefalse图 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; f

33、inish = 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-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);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 小学资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com