ImageVerifierCode 换一换
格式:DOCX , 页数:37 ,大小:117.58KB ,
资源ID:10167305      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/10167305.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(操作系统课程设计小型的操作系统资料.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

操作系统课程设计小型的操作系统资料.docx

1、操作系统课程设计小型的操作系统资料操作系统课程设计报告 题目:一个小型的操作系统 班级:计122(杏) 学号:1213023075 姓名:贾苏 日期:2014/06/231.实验平台(1)软件平台: 开发系统平台:Windows 7 (64) Microsoft visual c+ 6.0 测试系统平台:Windows 7 (64)(2)硬件平台: cpu:AMD A6-3420 APU 内存:4GB 硬盘:500G2.所需实现的功能及相应的阐述:(1)进程调度管理 为了贴切现实中的os,采用RR(轮转调度算法),且不提供用户显式的选择调度算法,即对用户是透明的。 现实中的处理器主频为1Ghz

2、3Ghz,选取中间点为1.5Ghz,得时间片大小为0.7ns ,为方便计算*10,则时间片大小定为7ns。 假设进程之间的调度和切换不耗费cpu时间。(2)死锁的检测与处理 检测当然采用的是 银行家算法 处理:让用户选择kill一个进程,释放他所占有的所有资源。(3)虚拟分页调度管理 虚拟分页:给出的是逻辑值 访问磁盘 将那个数据块放入到内存中内存中的地址采用一定的算法相对应于磁盘的地址。 特规定 访存采用的是 按字节寻址 内存的大小 128KB 外存的大小 1MB 即整个系统可以提供1MB的逻辑地址空间供进程进行访问(在地址总线足够扫描内存的情况下)。虚拟地址映射采用:直接映射法规定的8kB

3、为一个页面,故内存有16个页面,外存有128个页面。如果产生了内存已满,便会产生缺页中断,淘汰采用FIFO算法,利用一个队列来做。部分内外存的对应表00,128,2*128+0.11,129,2*128+1.22,130,2*128+2.16127,128+16,2*128+16.(4)I/O中断处理 设中断来自两个方面: 1.DMA输送开始和结束时的中断 设定一个宏 定义为DMA一次传输的数据量的大小-DmaNum假定为10kb每次 DMA开始:耗费1ns cpu时间进行中断处理 DMA结束:耗费2ns cpu时间进行中断处理 由操作系统课程知,DMA传输数据时不需要CPU的干预。2.随机的

4、中断 发生外部随机中断,cpu无条件的立即响应,并执行中断处理程序,同样的假设中断处理程序的调度和切换不耗费cpu时间。(5)内存地址越界或内存不足进程访问内存时超过了进程所要的最大值,此时发生中断,已达到内存保护的功能。内存不足时即为当前的动态地址重定位寄存器中的值+进程所需的内存大小超过了内存的上限,此时进行内存紧凑,同时修改被移动的进程中的各个有关参数。3.总体设计 开始 内存管理查看运行情况开始运行外存空间查看查看cpu运行内存空间查看死锁检测与解除进程信息查看4.程序所需的数据结构及其抽象过程 先定义本次操作系统外设的资源,假设有A类资源10个,B类资源5个,C类资源6个-NeedR

5、escourse; 作业中的各个进程都需要一个代号-ProcessName,各个进程到来的时间不同,故需要记录一下-ArriveTime,每个进程所需要的cpu时间是不够的-NeedCpuTime,每个进程所需的内存空间大小是不一样的-NeedMem。 各个进程中的任务是不同的故需要预先设定本进程中所要执行的操作类型-OpKind,如果是计算型的直接给出所需要的cpu时间即可,如果是I/O型的还需要给出所传输的数据量的大小-NeedTranDataNum,在此可以给OpKind做一个union型的结构。 多道程序程序在运行的过程中需要对进程所需内存的地址进行动态地址重定位,故在系统之中需要设置

6、一个动态地址重定位寄存器,其中的内容是下次进程可以使用的内存始址-DynReg。抽象结果: struct Process char ProcessName10;/进程的名字 int ArriveTime; / ns级别 int NeedCpuTime; /此进程所需要的时间 int NeedMem; /所需要的cpu时间 FlagForOp OpKind; /用于指示是何种操作 int NeedTranDataNum; /给IO用的数据块 int OpCpus; /计算类型的操作所需的cpu时间 int NeedRescourse3 ;/需要资源的数目 NULL代表不需要使用 Process

7、*next;5.详细设计1.进程信息查看依次遍历全部的链表,并将它们的信息依次打印出来。实现函数名:void ShowProcessInfo()2.死锁的检测和解除假定本系统中的各个所需资源均是独占型资源,在进程运行的过程中不再释放,故只需要遍历链表将各个进程中所需的资源统计出来,只要不大于系统中预设的即可,一旦进程所需的资源大于系统中的最大量,给予用户选择kill一进程,已达到释放资源的目的。死锁检测函数:void DeedLock() void DeedLock_LookNeedRescourse()死锁解除函数:void DeedLock_KillProcess()3.内存空间查看查看各

8、个进程所占用的内存的空间,借助于DynReg这个全局变量实行内存空间的动态重定位。实现函数:void LookMem()4.查看CPU运行以CPU的角度,查看作业的运行情况,实现函数:void LookCpu() void LookCpu_ShowRunningProcess()5.外存空间查看外存空间是用户的工作区间,故只要遍历整个进程链表,统计出所有进程占有的全部空间即可。实现函数:void LookDiskMem()6.查看运行查看系统运行中各个资源的使用情况:实现函数: void ShowRunningProcess() void ShowRunningProcess_Calculat

9、eCpuNeed(int*,int)7.内存管理缺页调度算法:FIFO(借助于循环队列实现)实现函数:void MemToDiskMem()6.程序运行和调试1.打开程序的初始界面:按系统提示输入进程数,及其相关的各个参数2.输入完成后的主界面:用户可以按下相关的选择键实施有关的各个操作。3.按下1 查看各个进程的信息可以看到刚刚输入的各个进程的有关信息4.按下25.按下3 查看运行时CPU的使用情况可见此时系统是安全的。系统出差提示按下1显示当前各个进程所需的资源然后kill进程1后在查看一下作业中的进程,发现被kill的进程没有的,实现了此功能。6.按下4 查看内存的使用情况7.按下5 查

10、看外存空间8.按下6 查看运行情况9.按下7 产看内存使用情况(1)没有产生缺页 (2)产生缺页 10.按下9 退出此系统7.遇到的问题(1)自己编写映射表相当的困难,一度想改用Java语言,在于对C+语言的了解不够。(2)出错处理没有完全做完,做的不够精细,很多地方直接结束(3)对用户输入的数据做的类型检查不够充分(4)delete job时总是出现系统错误,后debug发现,由于对象之中存在不为空的指针,导致出错,故再释放指针所占空间后系统正常运行。8.源代码#include#include#include#include#includeCirQueue.h /循环队列的头文件using

11、namespace std;#define MAXMEM 128 /定义本次操作系统的最大内存容量#define MAXDISKMEM 1024 /定义本次操作系统的最大外存容量 #define YE 10 /定义本次操作系统的分页大小 并 以此实现 虚拟存储int UsedMAXMEM=0;int UsedMAXDISKMEM=0;/定义进程可能用到的外部资源 #define A 10#define B 5#define C 6 /cpu #define RR 7 /定义时间片大小为7ns#define BEFOREDMA 1 /DMA之前所需的cpu时间 #define AFTERDMA

12、2 /DMA之后所需的cpu时间 #define ONEDMANUM 10/DMA一次最多传送10kb的数据 enum FlagForOp IO,Calculate,others; int DynReg=0;/定义用于描述动态地址重定位寄存器的全局变量 struct Process char ProcessName10;/进程的名字 int ArriveTime;/ ns级别 int NeedCpuTime;/此进程所需要的时间 int NeedMem;/所需要的cpu时间 FlagForOp OpKind;/用于指示是何种操作 int NeedTranDataNum;/给IO用的数据块 in

13、t OpCpus;/计算类型的操作所需的cpu时间 /假设others不需要其他的各个操作。 int NeedRescourse3;/需要资源的数目 NULL代表不需要使用 0a. Process *next;class JOB Process *p; Process *head; Process *head1;/建立一个备用的链表 / Process *wait,*runing; /wait 为等待链表 running是正在运行的进程 public: JOB() head1=p=head=NULL;/初始化为空 coutPlease waiting .The System is initia

14、l.endl; Sleep(2000);/暂停一秒 maybe Sleep() coutSystem is already. Now you should enter information of you job.endl; int n; coutenter your jobs process num.n; while(n) p=new Process(); coutplease enter the name of process.p-ProcessName; coutplease enter the arrivetime of process.p-ArriveTime; coutplease

15、 enter the NeedCpuTime of process.p-NeedCpuTime; coutplease enter the NeedMem of process.p-NeedMem; while(p-NeedMem128) coutThis System cant not accept your job! Maybe your job is too large! Please enter a num 128p-NeedMem; coutplease enter the operation of process.0 to TranDiskNum ,1 to cpunn; if(n

16、n=0) coutplease enter the NeedTranDataNum.p-NeedTranDataNum; p-OpKind=IO; else coutplease enter the OpCpus.p-OpCpus; p-OpKind=Calculate; coutPLease enter the A,B or C you needendl; for(int i=0;ip-NeedRescoursei; p-next=NULL;/尾结点为空 表示 一个节点的完成 下面进行插入链表的工作 head=SortLinkTable(head,p); n-; /while LinkCop

17、y();/将本次整理好的链表依次赋值赋给备用链表 Provide_Same_Process_Name();/检查重名现象 void Provide_Same_Process_Name(); void VisitLinkTable(); Process* SortLinkTable(Process*,Process*); void BeginRunning(); void ShowProcessInfo(); void DeedLock(); void DeedLock_KillProcess(); void DeedLock_LookNeedRescourse(); void LookCpu(

18、); void LookCpu_ShowRunningProcess(); void LookMem(); void ShowRunningProcess(); void ShowRunningProcess_CalculateCpuNeed(int*,int); void LookDiskMem(); void LookMem_ChangeMem(); bool CheckMem(); void LookDiskMem_Change(); void LinkCopy(); void MemToDiskMem(); JOB() delete head; delete head1; delete

19、 p; ;JOB *job;/设置全局变量 void JOB:Provide_Same_Process_Name() system(cls); char buffer10; Process *temp=head1; Process *temp1=head1; while(temp) temp1=temp-next; while(temp1) if(strcmp(temp-ProcessName,temp1-ProcessName)=0) coutMini_OperationSystem had detect the same name process in your job!endl; cou

20、tThis System cant accept this sitution.Please Rename your Process! nThanks for your corporation!endl; coutThis is ALL your process name:endl; VisitLinkTable(); coutEnter 1 to rename the former,0 to rename the later!n; coutNow Enter new Name:buffer; strcpy(temp1-ProcessName,buffer); else cinbuffer; s

21、trcpy(temp-ProcessName,buffer); /end if temp1=temp1-next; /end while temp1 temp=temp-next; /whilevoid AgainEnterJOB() system(cls); delete job; job=new JOB(); void JOB:VisitLinkTable()/不加JOB前缀的时候编译不过 加上代表此函数是JOBclass之中的 while(head1) coutProcessNamenext; coutnNow , You can see The List to checkout.end

22、l;void JOB:LinkCopy() Process *temp=NULL,*temp2=head; if(head1=NULL) coutLinkCopy() is Here!next=NULL; head1=NULL; while(temp2) /apply a new node temp=new Process(); strcpy(temp-ProcessName,temp2-ProcessName); temp-ArriveTime=temp2-ArriveTime; temp-NeedCpuTime=temp2-NeedCpuTime; temp-NeedMem=temp2-N

23、eedMem; if(temp2-OpKind=IO) temp-OpKind=IO; temp-NeedTranDataNum=temp2-NeedTranDataNum; else temp-OpKind=Calculate; temp-OpCpus=temp2-OpCpus; for(int i=0;iNeedRescoursei=temp2-NeedRescoursei; /apply end temp-next=NULL; /coutcopy is right!next)/寻找到最后一个节点 不断的循环退不出去 k=k-next; k-next=temp; / coutcopy is

24、 right!next; /while if(head1=NULL) coutLinkCopy() is out!endl; system(pause);void JOB:MemToDiskMem() system(cls); CirQueue q(16); /一共定义的16个页面 q.EnQueue(e); int *Mem; int count=0; /记录下进程的数目 Process *temp_head1=head1; while(temp_head1) count+; temp_head1=temp_head1-next; temp_head1=head1; Mem=new intc

25、ount; int temp_count=0; while(temp_head1) int Begin=0; coutProcess: ProcessName memery use situation:NeedMem; int k=0; /所需的页面数目 if(Begin%YE=0) k=Begin/YE; else k=Begin/YE+1; Memtemp_count+=k; coutk页被占用!next; /end while coutendl; temp_head1=head1; coutWant to see 缺页调度过程 Y/N. option; if(option=y|optio

26、n=Y) for(int i=0;icount;i+) AllTotal+=Memi; for(int j=0;jMemi;j+) if(q.EnQueue(true) temp_count=0; while(temp_countnext; temp_count+; coutProcess :ProcessName need mem is loading.okendl; temp_head1=head1; else temp_count=0; while(temp_countnext; temp_count+; coutProcess :ProcessName need mem is loading error 缺页调度endl; temp_head1=head1; total+; bool flag=q.DeQueue(); if(q.EnQueue(true)

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1