操作系统毕业课程设计报告Word格式.docx
《操作系统毕业课程设计报告Word格式.docx》由会员分享,可在线阅读,更多相关《操作系统毕业课程设计报告Word格式.docx(21页珍藏版)》请在冰豆网上搜索。
![操作系统毕业课程设计报告Word格式.docx](https://file1.bdocx.com/fileroot1/2022-11/25/49c7a531-68d9-415f-9fcc-389ecb1434e8/49c7a531-68d9-415f-9fcc-389ecb1434e81.gif)
设计任务:
根据课本相关章节,提供若干模拟作进程,分别采用占式和非抢占式优先权调度算法对进程进行调度,对就绪队列中的进程进行调度执行,每个模拟进程执行时打印自身的进程名、优先权、服务时间等信息,最后要打印出所调度作业的平均周转时间和平均带权周转时间。
和其他调度算法相比较,分析该调度算法的优缺点。
(2)题目:
Linux内核分析
设计任务:
对Linux操作系统的处理机管理、存储器管理、文件管理、设备
管理中一个或几个功能进行较全面系统分析,分析内容包括设计实现原理、典型
算法、主要实现函数,分析内容写入综述报告,报告内容还要包括函数间调用关
系图、功能模块图、系统主要流程图。
2.前言(绪论)(设计的目的、意义等)
通过课程设计,一是要通过对进程调度算法的设计,深入理解进程调度的原理。
加深对高优先权调度算法的理解。
实现已经学过的调度算法,对其有更深入的认识,能真切体会到每种算法的特点及与其他调度算法的区别。
二是通过linux内核进行分析,对linux内核有一个整体的了解。
重点分析的内存管理主要包括虚拟内存、磁盘缓存的相关结构体系及其存储方式等等。
锻炼我们综合运用知识的能力。
3.设计主体(各部分设计内容、分析、结论等)
【高优先权调度算法的模拟实现】
源程序:
#include<
iostream>
cstring>
stdio.h>
cstdlib>
usingnamespacestd;
#definenum6
#defineRUN1
#defineREADY0
#defineRUNOUT-1
inttimes=0;
structPROCESS
{
intid;
doubleresponse_rate;
intcputime;
intwaittime;
intendtime;
intSTATE;
}pro[10];
intpro_list[10],q=0;
voiddisplay()
cout<
<
"
Time:
times<
endl;
==========================================================="
ID\t\t0\t1\t2\t3\t4\t5"
respone_rate\t"
;
for(inti=0;
i<
num;
i++)
{
pro[i].response_rate<
'
\t'
}
cputime\t\t"
pro[i].cputime<
waittime\t"
pro[i].waittime<
endtime\t\t"
pro[i].endtime<
STATE\t\t"
if(pro[i].STATE==RUN)
RUN\t"
elseif(pro[i].STATE==READY)
READY\t"
elsecout<
RUNOUT\t"
theendprocess<
endtime>
:
"
q;
->
pro_list[i]<
pro[pro_list[i]].endtime<
>
}
voidinit()
pro[i].id=i;
pro[i].response_rate=1;
pro[i].waittime=0;
pro[i].endtime=-1;
pro[i].STATE=READY;
pro[0].cputime=5;
pro[1].cputime=3;
pro[2].cputime=1;
pro[3].cputime=2;
pro[4].cputime=4;
pro[5].cputime=6;
voidchange()
doublerunflag=0;
intrunprocess=0;
if(pro[i].STATE!
=RUNOUT)
pro[i].response_rate=1.0*(pro[i].waittime+pro[i].cputime)/pro[i].cputime;
if(pro[i].response_rate>
runflag)
runflag=pro[i].response_rate;
runprocess=i;
pro[i].waittime=-1;
pro[runprocess].cputime--;
pro[runprocess].waittime=-1;
pro[runprocess].STATE=RUN;
if(pro[i].STATE==RUNOUT)
continue;
pro[i].waittime++;
if(pro[i].cputime==0)
pro[i].endtime=times;
pro[i].STATE=RUNOUT;
pro[i].response_rate=0;
pro_list[q++]=i;
voidno_change()
intrunprocess=0,flag=0;
flag=1;
pro[i].cputime--;
for(intj=0;
j<
j++)
if(pro[j].STATE==RUNOUT)
pro[j].waittime++;
break;
if(!
flag)
if(pro[runprocess].cputime==0)
pro[runprocess].STATE=RUNOUT;
pro[runprocess].endtime=times;
pro[runprocess].response_rate=0;
pro_list[q++]=runprocess;
main()
intflag=0,type;
选择调度类型(1.抢占式调度2.非抢占式调度):
cin>
type;
init();
while
(1)
flag=0;
display();
if(pro[i].STATE!
flag)break;
times++;
if(type==1)
{change();
else
no_change();
getchar();
endl<
Allprocesseshaverunedout!
!
4.运行结果
1.采用抢占式调度算法:
3.采用非抢占式调度算法
5、和其他调度算法相比较,分析该调度算法的优缺点。
1)优先权调度算法类型
a)非抢占式优先权算法适用:
批处理系统,实时性要求不高的实时系统。
b)抢占式优先权算法适用:
实时性要求高的实时系统,对性能要求高的批处理和分时系统。
2)优先权类型
a)静态优先权
优点:
1单易行 ②系统开销小。
缺点:
①不太灵活,很可能出现低优先级的作业(进程),长期得不到调度而等待的情况。
②静态优先级法仅适用于实时要求不太高的系统。
b)动态优先权
使相应的优先级调度算法比较灵活、科学,可防止有些进程一直得不到调度,也可防止有些进程长期垄断处理机。
需要花费相当多的执行程序时间,因而花费的系统开销比较大。
【Linux内核分析】
介绍linux,分析linux下存储器管理系统的设计原理。
前言:
内存是现代计算机系统进行操作的中心,CPU和I/O系统都要和内存打交道,Linux内核采用虚拟页式存储管理,采用三次映射机制实现从线性地址到物理地址的映射,Linux的虚拟内存管理需要各种机制的支持,首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时如果发现程序中要用的虚拟地址没有对应的物理地址,就发出请页要求:
如果有空闲的内存可供分配,就请求分配内存,并把正在使用的物理页记录在页缓存中,如果没有足够的内存分配,就调用交换机制,腾出一部分内存。
另外在地址映射中要通过TLB(后援存储器)来寻找物理页,交换机制中要用到交换缓存,并且把物理页内容交换到交换文件中也要修改页表来映射文件地址。
设计主体:
1、Linux虚拟内存的实现结构
首先我们从整体结构上看一下Linux对虚拟内存的实现结构,如图1.1所示。
图1.1Linux虚存的实现结构
从图中可看到实现虚拟内存的组成模块,其实现的原代码大部分放在/mm目录下。
1).内存映射模块(mmap)—负责把磁盘文件的逻辑地址映射到虚拟地址,以及把虚拟地址映射到物理地址。
2).交换模块(swap)—负责控制内存内容的换入和换出,它通过交换机制,使得在物理内存的页面(RAM页)中保留有效的页,即从主存中淘汰最近没被访问的页,保存近来访问过的页。
3).核心内存管理模块(core)—负责核心内存管理功能,即对页的分配、回收、释放及请页处理等,这些功能将被别的内核子系统(如文件系统)使用。
4).结构特定的模块—负责给各种硬件平台提供通用接口,这个模块通过执行命令来改变硬件MMU的虚拟地址映射,并在发生页错误时,提供了公用的方法来通知别的内核子系统。
这个模块是实现虚拟内存的物理基础。
2、虚拟内存实现机制间的关系
Linux虚拟内存的实现需要各种机制的支持,因此,我们将对内存的初始化进行描述以后,围绕以下几种实现机制进行介绍,包括内存分配和回收机制、地址映射机制、缓存和刷新机制、请页机制、交换机制和内存共享机制等,这几种机制的关系如图1.2所示:
图1.2虚存内存机制间关系
其中请页要求①;
如果有空闲的内存可供分配,就请求分配内存②(于是用到了内存的分配和回收),并把正在使用的物理页记录在页缓存中③(使用了缓存机制)。
如果没有足够的内存可供分配,那么就调用交换机制,腾出一部分内存④⑤。
另外在地址映射中要通过TLB(翻译后援存储器)来寻找物理页⑧;
交换机制中也要用到交换缓存⑥,并且把物理页内容交换到交换文件中后也要修改页表来映射文件地址⑦。
讲了那么多,肯定还是有人不清楚什么才是虚拟内存?
其实Linux支持虚拟内存,就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大。
核心把当前不用的内存块存到硬盘,腾出内存给其他目的。
当原来的内容又要使用时,再读回内存。
这对用户全透明:
运行于Linux的程序只看到大量的可用内存而不甘心哪部分在磁盘上。
当然,读写硬盘比真的内存慢(慢千倍),所以程序运行较慢。
用做虚拟内存的这部分硬盘叫对换空间。
Linux可以使用文件系统中的普通文件或单独的分区作为对换空间。
对换分区更快,但对换文件更易于改变大小(无须对硬盘重分区)。
如果知道要多少对换空间,应该用对换分区;
如果不能确认,可以先用对换文件,用一段时间后再根据所需空间建立对换分区。
Linux允许同时使用多个对换分区和/或对换文件。
即如果偶尔需要更多的对换空间,可以随时建立一个额外的对换文件。
许多操作系统内置虚拟内存,由于他们只需在运行时使用,即不会同时,那么除了当前运行的,其他所有对换空间都浪费着。
如果他们共享同一个对换空间将更有效。
这是可能的但需要一些Hacking工作。
Tips-HOWTO包含了一些如何完成这项任务的忠告。
3、linux对虚拟内存的管理
虚拟内存不仅可以解决内存容量的问题,还可以提供以下附加的功能:
大地址空间;
进程保护;
内存映射;
灵活的物理内存分配;
共享虚拟内存。
Linux对虚拟内存的管理以进程为基础。
32位的线性地址映射的4G的虚拟空间中,从0XC到0XFFFFFFFF的1G空间为所用进程所共享的内核空间,每个进程都有自己的3G用户空间。
Linux的虚拟内存管理需要各种机制的支持,首先内存管理程序通过映射机制把用户程序的逻辑地址映射到物理地址,在用户程序运行时时如果发现程序中要用的虚拟地址没有对应的物理地址,就发出请页要求:
Linux在管理进程虚存空间时定义了虚存段(vma)。
虚存段是进程一段持续的虚存空间,在这段虚存里,所有单元拥有相同的特征。
这样分割是因为每个虚拟内存区域可能来源不同,因此,Linux把虚存分割管理。
Linux用数据结构vm_area_struct描述虚存段的属性,vm_area_struct主要包括以下几项:
(1)vma在虚存中的起始地址和终止地址。
(2)vma段内容来源。
(3)一系列对vma的操作例程。
这些处理操作有:
页错误处理,页换入,页换出等。
当某个程序的映像开始执行时,可执行映像装入到进程的虚拟地址空间。
此时Linux将产生一组vm_area_struct结构来描述虚存段。
每个vm_area_struct结构描述可执行映像的一部分,例如可执行代码,初始化变量和未初始化数据等。
同一进程的vma段的vm_area_struct结构通过vm_next指针连接组成链表。
系统以虚拟内存地址的降序排列vm_area_struct结构。
这样建立了文件的逻辑地址到虚拟线性地址的映射。
在讨论Linux是如何具体实现对虚拟内存的支持前,有必要看一下更简单的抽象模型。
在处理器执行程序时需要将其从内存中读出再进行指令解码。
在指令解码之前它必须向内存中某个位置取出或者存入某个值。
然后执行此指令并指向程序中下一条指令。
在此过程中处理器必须频繁访问内存,要么取指取数,要么存储数据。
虚拟内存系统中的所有地址都是虚拟地址而不是物理地址。
通过操作系统所维护的一系列表格由处理器实现由虚拟地址到物理地址的转换。
为了使转换更加简单,虚拟内存与物理内存都以页面来组织。
不同系统中页面的大小可以相同,也可以不同,这样将带来管理的不便。
AlphaAXP处理器上运行的Linux页面大小为8KB,而IntelX86系统上使用4KB页面。
每个页面通过一个叫页面框号的数字来标示(PFN)。
页面模式下的虚拟地址由两部分构成:
页面框号和页面内偏移值。
如果页面大小为4KB,则虚拟地址的11:
0位表示虚拟地址偏移值,12位以上表示虚拟页面框号。
处理器处理虚拟地址时必须完成地址分离工作。
在页表的帮助下,它将虚拟页面框号转换成物理页面框号,然后访问物理页面中相应偏移处。
如图1.3就是虚拟内存的抽象模型:
图1.3虚拟地址到物理地址映射的抽象模型
4、linux内存的分配与回收
1)内存分配:
1、当收到内存分配请求时,系统照buddy算法,根据请求的页面数在free_area[]数组对应的空闲页面组中搜索。
2、若请求的页面不是2的整数次幂,则按照稍大于请求数的2的整数次幂的值搜索对应的页面块组。
例如请求2个页面时,则搜索2页面块组,请求3个页面时,就搜索4页面块组。
3、当搜索对应的页块组,而没有可利用的空闲页块时,再搜索更大一些的页块组,例如当查找4页块组没有可利用的空闲页块时,就再搜索8页块组。
4、在找到可利用的空闲页块后,就按照请求的页面块数分配所需的页面。
5、当某一空闲页面块被分配后,若仍有剩余的空闲页面,则根据剩余页面的大小把它们加入相应的空闲页块组中。
如图1.4所示:
图1.4buddy算法演示
2)内存回收:
1、当释放内存页面时,系统将这些页面回收并作为空闲页面看待。
2、然后检查是否存在与这些页面相邻的其它空闲页块,若存在,则把它们合并为一个连续的空闲区。
3、再按照上述buddy算法划分不同的页面块,并加到相应的页面块组中。
5、linux地址空间分配:
1)linux线性地址空间的分配(举例说明),如图1.5
图1.5
上图中的程序代码就说明了linux中的空间地址分配
2)我们也可以利用/proc命令来查看各进程的用户地址空间,如图1.6所示:
图1.6
6、linux下的缓存与刷新机制:
为了更好的发挥系统性能,Linux采用了一系列和内存管理相关的高速缓存机制:
(1)缓冲区高速缓存(Buffercache):
包含了从设备中读取的数据块或写入设备的数据块。
缓冲区高速缓存由设备标示号和块索引,因此可以快速找到数据块。
如果数据可以在缓冲区中高速缓存中找到,则不需要从物理块设备上读取,从而加快了访问速度。
(2)页高速缓存(Pagecache):
这一高速缓存用来加速对磁盘上的映像和数据访问,它用来缓存某个文件的逻辑内容,并通过文件VFS索引节点和偏移量访问。
当页从磁盘读到物理内存时,就缓存在页高速缓存。
(3)交换高速缓存(Swapcache):
用于多个近程共享的页面被换出到交换区的情况。
当页面交换到交换文件之后,如果有进程再次访问,它会被重新调入内存。
(4)联想存储器(Associativememory):
完成对页表项的缓存。
由于访问页表的速度会直接影响虚拟内存系统的效率,为了减少在内存频繁查找页表,基于大部分程序倾向于集中在小部分页访问的事实,Linux采用了高速的联想存储器。
以实现快速的地址变换。
结束语:
Linux是近年来应用的比较广泛的一个实时操作系统,应用于各个行业,而且由于全世界计算机爱好者的支持与厚爱,并且是开放源代码的系统,它也成为世界上发展最快的操作系统Linux在其发展过程中不断的在完善和优化内存管理单元的功能和性能。
针对具体领域,我们可以根据自己的需要定制Linux内核,而内存管理单元作为Linux操作系统的核心部分,在整个系统的运行过程中发挥着举足轻重的作用。
参考文献:
【1】SyedMansoorSarwar,RobertKoretsky,SyedAqeelSarwar(美)著,李善平等译Linux:
THETEXTBOOK北京:
清华大学出版社,2005;
【2】
李成大操作系统-Linux篇北京:
人民邮电出版社,2003;
【3】
马忠梅李善平康慨叶楠ARM&
LINUX嵌入式系统教程北京:
北京航空航天大学出版社,2004
四、参考资料
【1】汤小丹,梁红兵编《计算机操作系统》(第三版)·
西安电子科技大学出版社
【2】严蔚敏,吴伟民编《数据结构》(C语言版)·
清华大学出版社
五、设计时间与安排
1、设计时间:
2周
2、设计时间安排:
熟悉实验设备、收集资料:
4天
设计图纸、实验、计算、程序编写调试:
编写课程设计报告:
3天
答辩:
1天