操作系统实验-存储管理程序设计

合集下载

南京邮电大学-操作系统实验报告

南京邮电大学-操作系统实验报告

课内实验报告课程名:操作系统任课教师:沈超专业:信息管理与信息系统学号:姓名:二○一六至二○一七年度第一学期南京邮电大学经济与管理学院Process[numberschedul].order=tempcounter;}程序结果截图:二、银行家算法(网上借鉴)银行家算法,当进程提出资源申请时,系统首先检查该进程对资源的申请量是否超过其最大需求量及系统现有的资源能否满足进程需要。

若超过,则报错,若不能满足,则让该进程等待;否则进一步检查把资源分给该进程后系统能否出于安全状态,若安全,则分配,否则置该进程为等待资源状态。

算法实现过程:设进程i 提出请求REQUEST [j] ,则银行家算法按如下规则进行判断。

(1) 如果REQUEST [i] [j]<= NEED[i][j] ,则转(2) ;否则,出错。

(2) 如果REQUEST [i] [j]<= A V AILABLE[i][j] ,则转(3) ;否则,出错。

(3) 系统试探分配资源,修改相关数据:A V AILABLE[j]-=REQUEST[i][j];ALLOCATION[i][j]+=REQUEST[i][j];NEED[i][j]-=REQUEST[i][j];(4) 系统执行安全性检查,如安全,则分配成立;否则试探险性分配作废,系统恢复原状,进程等待。

Check()关键代码:{int k, f, no=0;int work[M],a[M];char finish[M];anquan=1;for(i=0;i<n; i++) finish[i]='F';for(j=0;j<m; j++) work[j]=available[j]; k=n;do{ for (i=0;i<n; i++){if (finish[i]=='F'){ f=1;for (j=0;j<m; j++)if (need[i][j]>work[j]) printf("处于安全状态.");printf("安全序列号:");for (i=0;i<n;i++) printf ("%d ",a[i]); printf("\n");printf("进程");printf(" ");printf(" Max ");rintf(" ");rintf("allocation");printf(" ");printf("need");printf(" ");f=0;if (f==1)//找到还没完成的且需求数小于可提供进程继续运行的{ finish[i]='T';a[no++]=i;//记录安全序列号for (j=0;j<m; j++)work[j]=work[j]+allocation[i][j];//释放该进程已分配的资源available[j] =work[j];}}}k--; }while(k>0);f=1;for (i=0;i<n; i++)//判断有没有进程没完成{ if (finish[i]=='F'){f=0;break; }} if (f==0) {printf("不安全状态!\n");anquan=0;} else {printf("available");printf("\n");for (i=0;i<n; i++){ printf("%2d",i);printf(" ");for(j=0;j<m; j++)printf("%2d",max[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",allocation[i][j]);printf(" ");for(j=0;j<m; j++)printf("%2d",need[i][j]);printf(" ");for(j=0;j<m; j++){if(i>0)break;printf("%2d",available[j]);}printf("\n");}}}程序结果截图:三、实验总结:这次上机模拟了进程调度过程和解决了死锁问题,让我对短作业优先调度算法和银行家算法有了比在课堂上更深刻的认识。

操作系统课程设计

操作系统课程设计

操作系统课程设计一、课程目标知识目标:1. 理解操作系统的基本概念、功能、类型和结构,掌握操作系统的五大核心功能模块(处理器管理、存储器管理、设备管理、文件管理、用户接口);2. 掌握操作系统的发展历程、主要操作系统(如Windows、Linux、Mac OS)的特点及应用场景;3. 了解操作系统的设计与实现原理,包括进程管理、内存管理、设备管理、文件系统等关键技术;4. 学会使用操作系统提供的命令行或图形界面进行基本的系统操作与维护。

技能目标:1. 培养学生对操作系统的实际操作能力,能够熟练使用至少一种操作系统进行日常管理与维护;2. 培养学生运用操作系统原理解决实际问题的能力,如分析系统性能、诊断故障、优化配置等;3. 提高学生的编程能力,使其能够编写简单的系统程序或脚本,实现特定功能。

情感态度价值观目标:1. 培养学生对操作系统的兴趣,激发学生学习计算机科学的热情;2. 培养学生的团队合作意识,使其在讨论、分析、解决问题的过程中学会倾听、交流、协作;3. 培养学生具备良好的信息素养,关注操作系统领域的最新发展,增强信息安全意识。

课程性质:本课程为计算机科学与技术专业(或相关领域)的必修课,具有较强的理论性和实践性。

学生特点:学生已具备一定的计算机基础知识,具有较强的学习兴趣和动手能力,但可能对操作系统原理的理解和应用尚有不足。

教学要求:注重理论与实践相结合,以案例驱动、任务导向的方式进行教学,注重培养学生的实际操作能力和问题解决能力。

通过本课程的学习,使学生能够掌握操作系统的基本原理,提高实际应用水平,为后续专业课程学习打下坚实基础。

二、教学内容1. 操作系统概述:介绍操作系统的基本概念、功能、类型,比较不同操作系统的特点,分析操作系统的发展趋势。

教材章节:第一章 操作系统概述2. 进程与线程管理:讲解进程与线程的概念、状态与转换,进程调度算法,同步与互斥,死锁与饥饿问题。

教材章节:第二章 进程管理3. 存储管理:介绍内存分配与回收策略,虚拟内存技术,页面置换算法,内存保护机制。

计算机操作系统课程设计教学大纲

计算机操作系统课程设计教学大纲

《计算机操作系统》课程设计教学大纲课程编号:08120070课程名称:计算机操作系统/Computer Operating System课程总学时/学分:56/3.5(其中理论46学时,实验10学时课程设计时间/学分:1周/1学分适用专业:计算机科学与技术一、设计任务及目的《计算机操作系统》课程是计算机科学与技术专业的一门重要专业基础课,“计算机操作系统课程设计”的目的是在学生学习了《计算机操作系统》课程之后理论联系实践,一方面延续《计算机操作系统》课程实验的要求,进一步加深与巩固学生对计算机操作系统中概念、基本原理、算法的理解和掌握,培养学生对计算机常用操作系统的操作能力;另一方面通过本环节加强培养学生分析、修改和设计操作系统的能力。

期望达到学为所用,并且能进一步提高使用计算机和编程能力。

二、课程设计的基本要求1、了解所选择开发环境的调试功能,掌握跟踪,修改错误的技巧。

2、能根据实际问题选择数据结构,清淅的描述算法。

3、培养良好的编程风格。

4、撰写课程设计报告,按格式要求写出完整的、规范的报告并打印,其中模块图、流程图要清楚规范,特别要求学生独立完成。

三、设计需运用的基本理论设计需运用计算机系统知识、操作系统基本概念、进程管理、存储管理技术、I/O管理技术、文件管理、高级语言程序设计、数据结构等内容。

四、课程设计内容与时间安排1、设计内容:可以选择下面提供的参考选题,也可以自选,如果自选,需要将自选题,目的详细内容以及实现要求提供给老师,老师批准后方可采用。

课题一:进程管理演示设计目的:加深对进程概念及进程管理各部分内容的理解;熟悉进程管理中主要数据结构的设计及进程调度算法、进程控制机构、同步机构及通讯机构的实施。

设计内容:设计一个允许n个进程并发运行的进程管理模拟系统。

该系统包括有简单的进程控制、同步与通讯机构,其进程调度算法可任意选择(优先级调度,时间片轮转,短进程优先中的一种)。

每个进程用一个PCB表示,其内容根据具体情况设置。

计算机操作系统(汤小丹第三版)第4章 存储器管理

计算机操作系统(汤小丹第三版)第4章 存储器管理
0
10000
1000 2500
LOAD 1,2500
365
11000 12500 15000
LOAD 1,2500 365
LOAD 1,12500
5000
作业地址空间
内存空间
图 4-3 作业装入内存时的情况
11
第四章 存储器管理
3、动态运行时装入方式(Denamle Run-time Loading)
3)重定位分区分配算法:
4)优、缺点:
30
第四章 存储器管理
4.3.7 对换(Swapping)
1、 对换的引入 对换:把内存中暂时不能运行的进程或者暂时不用的 程序和数据,调出到外存上。
对换是提高内存利用率的有效措施。
* * 整体对换 部分对换 进程对换
页面对换
分段对换
31
第四章 存储器管理
4.3.7 对换(Swapping)
图 4-7 内存分配流程
25
第四章 存储器管理
(2)回收内存
空闲块合并
图 4-8 内存回收时的情况
26
第四章 存储器管理
4.3.6 可重定位分区分配
1、 动态重定位的引入
操作系统 用户程序1 10 KB 用户程序3 30 KB 用户程序6 14 KB 用户程序9 26 KB (a) 紧凑前 (b) 紧凑后
33
第四章 存储器管理
4.4.1 页面与页表
1、页面 (1)将一个进程的逻辑地址空间分成若干个大小相等
的片,称为页面或页,并加以编号。 (2)把内存空间分成与页面相同大小的若干个存储块, 称为(物理)块或页框(frame), 同样加以编号。 (3)分配内存时,以块为单位将进程中的若干个页分 别装入到多个可以不相邻接的物理块中。 (4)由于进程的最后一页经常装不满一块而形成了不 可利用的碎片,称之为“页内碎片”。

操作系统实验报告哈工大

操作系统实验报告哈工大

计算机操作系统课程实验报告专业信息管理与信息系统班级 1203601学号 120360117姓名乐云指导教师周学权计算机操作系统课程实验报告专业信息管理与信息系统班级 1203601学号 120360114姓名郭鑫指导教师周学权操作系统实验实验1 使用虚拟机安装系统 4学时【实验目的】1.了解虚拟机软件的使用。

2.了解使用虚拟机安装Windows及Ubuntu操作系统。

【实验内容】1. 安装虚拟机软件VirtualBox。

2. 配置VirtualBox环境安装WindowsXP,并在虚拟机中启动windowsXP。

3. 配置VirtualBox环境安装Ubuntu 10.10,并在虚拟机中启动Ubuntu。

【实验环境】VirtualBox4.0Windows XPUbuntu 8.04【实验过程】一、创建虚拟机首先运行VirtualBox,单击左上角的“新建”。

单击下一步。

出现如下图的界面,在名称后输入自己起的名字,如test选择自己想要安装的系统类型和版本,本次试验是安装windows xp系统设置完成后,单击下一步。

接下来是设置虚拟机的内存大小,本次实验操作的计算机内存为4GB,所以我选择分配给我的虚拟机的内存为512MB,然后单击下一步。

接着创建虚拟硬盘,选择创建新的虚拟硬盘,单击下一步。

选择虚拟硬盘的类型,默认选择了VDI类型,单击下一步。

接下来选择为动态扩展类型,因为计算机的存储空间不大。

单击下一步。

动态扩展:如果你为你的虚拟磁盘分配的是10G空间,虚拟磁盘占用真实磁盘空间的范围就为0~10G。

固定大小:如果你为你的虚拟磁盘分配的是10G空间,虚拟磁盘占用真实磁盘空间永远不是10G,不管虚拟磁盘空间是否被全部使用。

选择虚拟机在本地磁盘中的位置和大小,单击下一步。

确认虚拟机的详细情况,点击下一步。

这时我们已经成功的创建了一个虚拟机了,接下来我们要开始配置这个虚拟机安装操作系统选择刚才创建的虚拟机,然后单击上方的“开始”弹出了首次运行向导,单击下一步。

蒲晓蓉_操作系统原理第_章_存储管理

蒲晓蓉_操作系统原理第_章_存储管理

存储分配步骤
? 首先,根据系统的内存分配算法,在空 闲的内存分区中寻找到一块满足进程需 要的内存空间,将其分配给进程。
? 然后,更新进程的资源分配清单应的数据结构,将回收的内存空 间标识为“空闲可用”就行了。
? 该内存空间是否可以被回收 ? 被其他进程共享 ? 属于相应的进程 ? 与相临的空闲空间进行合并
存储共享
? 为了进程通信和节约内存空间,两个或多个进 程共用内存中相同的分区,即他们的物理空间 有相交的部分。
? 可以共享进程的代码,也可以共享进程数据。
? 一般地,进程之间共享代码的目的主要是为了 节约存储空间,共享数据的目的主要是为了实 现进程间相互通信。
PCB1
PCB2
PCB3
数据
代码 代码
? 操作越权:进程对共享存储区的操作违反了系 统规定的权限。
存储保护的实现
? 存储保护只能进程执行过程中动态地进行,不 可能在运行前一次性静态完成。
? 若采用动态映射动态计算物理地址,可能计算 出错误地址;若采用静态映射,进程执行过程 中也可能出错,从而导致地址越界或操作越权。
? 为了提高系统效率,存储保护的主要工作必须 由高速的专用硬件来完成:在地址管理部件中。
共享代码
? 可以将进程的代码视为处理数据的一组规则或 公式,这一组规则或公式存储在内存中的某个 分区。
? 进程的执行:利用这一组规则或公式来完成数 据的运算。
? 多个进程共享代码:多个进程需要使用同一组 规则或公式处理不同的数据。
? PCB :告诉进程其所需的规则或公式以及需要 处理的数据存储在哪里,进程的进度等
用于内存管理的数据结构
? 如位示图、空闲页框表等。 ? 记载哪些内存被分配给了哪个进程,哪些内存

北大操作系统高级课程-陈向群作业-虚拟内存管理实习报告

虚拟内存管理实习报告目录内容一:总体概述 (3)内容二:任务完成情况 (3)任务完成列表(Y/N) (3)具体Exercise的完成情况 (3)内容三:遇到的困难以及解决方法 (11)内容四:收获及感想 (11)内容五:对课程的意见和建议 (11)内容六:参考文献 (11)内容一:总体概述本次lab主要是针对操作系统内存管理的学习,内存管理主要有固定分区、可变分区、页式和段式管理。

现代操作系统主要采用页式内存管理,它把用户程序地址空间划分成大小相等的部分,称为页。

内存空间按页的大小划分为大小相等的区域,称为内存块(物理页面,页框,页帧)。

以页为单位进行分配,逻辑上相邻的页,物理上不一定相邻。

虚拟内存的基本思想:每个程序拥有自己的地址空间,这个空间被分割成多个块,每一块称作一页或者页面,每一页有连续的地址范围。

这些页被映射到物理内存,但并不是所有页都必须在内存中才能运行。

当程序引用到一部分在物理内存中的地址空间时,由硬件立即执行必要的映射。

当程序引导到一部分不在物理内存中德的地址空间时,由操作系统负责将缺失的部分装入屋里内存并重新执行失效的指令。

内容二:任务完成情况任务完成列表(Y/N)Exercise1 Exercise2 Exercise3 Exercise4 Exercise5 Exercise6 Exercise7 Challange 完成情况Y Y Y Y Y Y N N具体Exercise的完成情况一、TLB异常处理目前,Nachos系统对于内存的管理是基于软件模拟的TLB机制。

其工作原理、异常处理、替换算法等方面,与分页式内存管理非常相像。

Exercise 1 源代码阅读Ø阅读code/userprog/,着重理解nachos执行用户程序的过程,以及该过程中与内存管理相关的要点。

Ø阅读code/machine目录下的machine.h(cc),translate.h(cc)文件和code/userprog目录下的exception.h(cc),理解当前Nachos系统所采用的TLB机制和地址转换机制。

操作系统-动态分区分配算法实验报告

实验题目:存储器内存分配设计思路:1.既然是要对内存进行操作,首先对和内存相关的内容进行设置我使用的是用自定义的数据结构struct来存放内存中一个内存块的内容包括:始地址、大小、状态(f:空闲u:使用e:结束)之后采用数组来存放自定义的数据类型,这样前期的准备工作就完成了2.有了要加工的数据,接下来定义并实现了存放自定义数据类型的数组的初始化函数和显示函数,需要显示的是每个内存块的块号、始地址、大小、状态3.接着依此定义三种动态分区分配算法首次适应算法、最佳适应算法和最差适应算法4.对定义的三种算法逐一进行实现①首次适应算法:通过遍历存放自定义数据类型的数组,找到遍历过程中第一个满足分配大小的内存块块号i,找到之后停止对数组的遍历,将i之后的块号逐个向后移动一个,然后将满足分配大小的内存块i分为两块,分别是第i块和第i+1块,将两块的始地址、大小、状态分别更新,这样便实现了首次适应算法②最佳适应算法:和首次适应算法一样,首先遍历存放自定义数据类型的数组,找到满足分配大小的内存块后,对内存块的大小进行缓存,因为最佳适应是要找到最接近要分配内存块大小的块,所以需要遍历整个数组,进而找到满足分配大小要求的而且碎片最小的块i,之后的操作和首次遍历算法相同③最差适应算法:和最佳适应算法一样,区别在于,最佳适应是找到最接近要分配内存块大小的块,而最差适应是要找到在数组中,内存最大的块i,找到之后的操作和最佳适应算法相同,因此不在这里赘述。

5.定义并实现释放内存的函数通过块号找到要释放的内存块,把要释放的内存块状态设置成为空闲,查看要释放的块的左右两侧块的状态是否为空闲,如果有空闲,则将空闲的块和要释放的块进行合并(通过改变块的始地址、大小、状态的方式)6.定义主函数,用switch来区分用户需要的操作,分别是:①首次适应②最佳适应③最差适应④释放内存⑤显示内存⑥退出系统实验源程序加注释:#include<bits/stdc++.h>#define MI_SIZE 100 //内存大小100typedef struct MemoryInfomation//一个内存块{int start; //始地址int Size; //大小char status; //状态 f:空闲 u:使用 e:结束} MI;MI MList[MI_SIZE];void InitMList() //初始化{int i;MI temp = { 0,0,'e' };for (i = 0; i < MI_SIZE; i++){MList[i] = temp;}MList[0].start = 0; //起始为0MList[0].Size = MI_SIZE;//大小起始最大MList[0].status = 'f'; //状态起始空闲}void Display() //显示{int i, used = 0;printf("\n---------------------------------------------------\n");printf("%5s%15s%15s%15s", "块号", "始地址", "大小", "状态");printf("\n---------------------------------------------------\n");for (i = 0; i < MI_SIZE && MList[i].status != 'e'; i++){if (MList[i].status == 'u'){used += MList[i].Size;}printf("%5d%15d%15d%15s\n", i, MList[i].start, MList[i].Size, MList[i].status == 'u' ? "使用" : "空闲");}printf("\n----------------------------------------------\n");}void FirstFit(){int i, j, flag = 0;int request;printf("最先适应算法:请问你要分配多大的内存\n");scanf("%d", &request);for (i = 0; i < MI_SIZE && MList[i].status != 'e'; i++){if (MList[i].Size >= request && MList[i].status == 'f') {if (MList[i].Size - request <= 0){MList[i].status = 'u';}else{for (j = MI_SIZE - 2; j > i; j--){MList[j + 1] = MList[j];}MList[i + 1].start = MList[i].start + request; MList[i + 1].Size = MList[i].Size - request;MList[i + 1].status = 'f';MList[i].Size = request;MList[i].status = 'u';flag = 1;}break;}}if (flag != 1 || i == MI_SIZE || MList[i].status == 'e'){printf("没有足够大小的空间分配\n");}Display();}void BadFit(){int i, j = 0, k = 0, flag = 0, request;printf("最坏适应算法:请问你要分配多大的内存\n");scanf("%d", &request);for (i = 0;i < MI_SIZE - 1 && MList[i].status != 'e';i++){if (MList[i].Size >= request && MList[i].status == 'f') {flag = 1;if (MList[i].Size > k){k = MList[i].Size;j = i;}}}i = j;if (flag == 0){printf("没有足够大小的空间分配\n");j = i;}else if (MList[i].Size - request <= 0){MList[i].status = 'u';}else{for (j = MI_SIZE - 2;j > i;j--){MList[j + 1] = MList[j];}MList[i + 1].start = MList[i].start + request;MList[i + 1].Size = MList[i].Size - request;MList[i + 1].status = 'f';MList[i].Size = request;MList[i].status = 'u';}Display();}void M_Release() //释放内存{int i, number;printf("\n请问你要释放哪一块内存:\n");scanf("%d", &number);if (MList[number].status == 'u'){MList[number].status = 'f';if (MList[number + 1].status == 'f')//右边空则合并{MList[number].Size += MList[number].Size;for (i = number + 1; i < MI_SIZE - 1 && MList[i].status != 'e'; i++) { //i后面的每一个结点整体后移if (i > 0){MList[i] = MList[i + 1];}}}if (number > 0 && MList[number - 1].status == 'f')//左边空则合并{MList[number - 1].Size += MList[number].Size;for (i = number; i < MI_SIZE - 1 && MList[i].status != 'e'; i++){MList[i] = MList[i + 1];}}}else{printf("该块内存无法正常释放\n");}Display();}void BestFit(){int i, j = 0, t, flag = 0, request;printf("最佳适应算法:请问你要分配多大的内存\n");scanf("%d", &request);t = MI_SIZE;for (i = 0; i < MI_SIZE && MList[i].status != 'e'; i++){if (MList[i].Size >= request && MList[i].status == 'f'){flag = 1;if (MList[i].Size < t){t = MList[i].Size;j = i;}}}i = j;if (flag == 0){printf("没有足够大小的空间分配\n");j = i;}else if (MList[i].Size - request <= 0){MList[i].status = 'u';}else {for (j = MI_SIZE - 2; j > i; j--){MList[j + 1] = MList[j];}MList[i + 1].start = MList[i].start + request;MList[i + 1].Size = MList[i].Size - request;MList[i + 1].status = 'f';MList[i].Size = request;MList[i].status = 'u';}Display();}int main(){int x;InitMList();while (1){printf(" \n"); printf(" 1.首次适应\n");printf(" 2.最佳适应\n");printf(" 3.最差适应\n"); printf(" 4.释放内存\n"); printf(" 5.显示内存\n"); printf(" 6.退出系统\n"); printf("请输入1-6:");scanf("%d", &x);switch (x){case 1:FirstFit();break;case 2:BestFit();break;case 3:BadFit();break;case 4:M_Release();break;case 5:Display();break;case 6:exit(0);}}return 0;}实验测试结果记录:1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存10---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 90 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存25---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 25 使用2 35 65 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存15---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 25 使用2 35 15 使用3 50 50 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:1最先适应算法:请问你要分配多大的内存20---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 使用1 10 25 使用2 35 15 使用3 50 20 使用4 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:4请问你要释放哪一块内存:---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 空闲1 10 25 使用2 35 15 使用3 50 20 使用4 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:4请问你要释放哪一块内存:2---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 10 空闲1 10 25 使用2 35 15 空闲3 50 20 使用4 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:2最佳适应算法:请问你要分配多大的内存5---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 5 使用1 5 5 空闲2 10 25 使用3 35 15 空闲4 50 20 使用5 70 30 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:3最坏适应算法:请问你要分配多大的内存25---------------------------------------------------块号始地址大小状态---------------------------------------------------0 0 5 使用1 5 5 空闲2 10 25 使用3 35 15 空闲4 50 20 使用5 70 25 使用6 95 5 空闲----------------------------------------------1.首次适应2.最佳适应3.最差适应4.释放内存5.显示内存6.退出系统请输入1-6:总结与自评:总结:分区存储管理是操作系统进行内存管理的一种方式。

1-4章习题讲解、练习题、内存实验(操作系统)

解答:没有。都要经过中间状态: 1.等待状态的进程获得所需的资源后,必须 转入就绪状态,直到获得CPU后才能运行。 2.进程在运行过程中才会请求资源,才有可 能因请求不到资源而转入等待状态。
一个状态转换的发生,是否一定导致另一 个转换发生,列出所有的可能。
解答:不一定。可能的情况如下: 1.就绪执行 导致 执行就绪 2.执行阻塞 导致 就绪执行(就绪队列不空) 3.执行就绪 导致 就绪执行(就绪队列不空) 4.阻塞就绪 可能导致 就绪执行 (在抢占方式下,该进程优先级高于当前进程和 就绪队列中的所有进程) 作业问题:认为阻塞就绪一定导致就绪执行。
31.(c)(e)会发生死锁。
34.(a)不是死锁状态,(b)是死锁状 态。
P1
R1 P1
R2
14.在一个请求分页系统中,采用LRU页面置换算法,假如 一个页面的页面走向为4、3、2、1、4、3、5、4、3、2 、1、5,当分配给作业的物理块数为3和4时,试计算在访 问过程中所发生的缺页次数和缺页率,并比较所得结果
选择题
1、在计算机系统中配置操作系统的主要目的是(A),操作系 统的主要功能是管理计算机系统中的(B),其中包括(C)管 理和(D)管理,以及设备管理和文件管理。这里的(C)管理 主要是对进程进行管理。 A:(1)增强计算机系统的功能;(2)提高系统资源的利用 率;(3)提高系统的运行速度;(4)合理地组织系统的工作 流程,以提高系统吞吐量。 B:(1)程序和数据;(2)进程;(3)资源;(4)作业 ;(5)任务。 C、D:(1)存储器;(2)虚拟存储器;(3)运算器; (4)处理机;(5)控制器。
8、对于记录型信号量,在执行一次P操作时,信号量的值应 当 A ;当其值为 B 时,进程应阻塞。在执行V操作时 ,信号量的值应当 C ;当其值为 D 时,应唤醒阻塞队 列中的进程。 A,C:(1)不变; (2)加1; (3)减1; (4)加指定数值; (5)减指定数值。 B,D:(1)大于0; (2)小于0; (3)大于等于 0; (4)小于等于0。

五邑大学计算机学院20142015操作系统试验使用班级120801

实验项目名称:进程的同步(实验一)1、实验目的(1) 掌握进程和线程基本概念和属性;(2) 掌握用PV操作解决并发进程的同步问题;(3) 掌握用于同步的信号量初值的设置;(4) 掌握如何处理共享资源的直接制约关系。

2、实验内容(1) 设计一个模拟若干售票网点的售票程序。

界面可以参考图1。

还应设计多个后台售票线程并发运行。

图1售票(2) 模拟:桌上有一只盘子,每次只能放入一个水果。

爸爸专向盘子中放苹果,妈妈专向盘子中放桔子,一个女儿专等吃盘子里的苹果,一个儿子专等吃盘子里的桔子。

只要盘子空则爸爸或妈妈都可以向盘子放一个水果,仅当盘子中有自己需要的水果时,儿子或女儿可以从盘子中取出水果。

放-取水果的几种情况如图2(a)~(f)所示,可以参照进行设计。

(a)盘子空时取水果 (b)父亲放入苹果(c) 儿子取水果 (d) 女儿取水果(e)儿子取走桔子 (f)盘子满时放水果图2 放-取水果(3) 自选其它能反映进程互斥问题的应用。

实验项目名称:处理机调度(实验二)1、实验目的(1) 掌握几种处理机调度算法的基本思想和特点;(2) 理解并发与并行的区别;(3) 比较几种算法的特点。

2、实验内容编写程序模拟处理机调度,参照图3。

(1) 时间片轮转(2) 动态优先权调度(3) 高响应比优先调度图3 模拟处理机调度实验项目名称:银行家算法(实验三)1、实验目的银行家算法是避免死锁的一种重要方法,本实验要求用高级语言编写和调试一个简单的银行家算法程序。

加深了解有关资源申请、避免死锁等概念,并体会和了解死锁和避免死锁的具体实施方法。

2、实验内容(1) 设计进程对各类资源最大申请表示及初值确定。

(2) 设定系统提供资源初始状况。

(3) 设定每次某个进程对各类资源的申请表示。

(4) 编制程序,依据银行家算法,决定其申请是否得到满足。

具体设计可参照图4(a)~(c) 进行。

(a) 某时刻系统资源情况(b)测试安全性(c)安全序列图4银行家算法实验项目名称:存储器管理(实验四)1、实验目的存储器是计算机系统的重要组成部分。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程名称: 实验项目: 实验地点: 专业班级: 学生姓名: 指导教师:

本科实验报告 操作系统 B 存储管理程序设计

学号:

2011 年 11 月 目录 存储管理程序设计 一、实验目的和要求 .................................................................................1 二、实验内容及原理 .................................................................................1 三、实验仪器及设备 .................................................................................3 四、操作方法与实验步骤 .........................................................................3 五、实验数据记录和处理 .........................................................................3 六、实验结果分析 .....................................................................................8 七、实验感想 .............................................................................................9

1 实验三 一、实验目的和要求 存储管理程序设计

(一) 目的 存储管理的主要功能之一是合理地分配主存空间。请求页式管理是一种常用的虚拟存 储管理技术。 本实验的目的是通过请求页式存储管理中页面置换算法的模拟设计,来了解虚拟存储 技术的特点,掌握请求页式存储管理的页面置换算法。 (二) 要求 模拟页式虚拟存储管理中硬件的地址转换和缺页中断的处理过程,并用先进先出调度 算法(FIFO)处理缺页中断。

二、实验内容及原理 (1) 为了装入一个页面而必须调出一页时,如果被选中调出的页面在执行中没有修改 过,则不必把该页重新写到磁盘上(因磁盘上已有副本)。因此,在页表中可以增加是否修 改过的标志,当执行“存”指令、“写”指令时把对应页的修改标志置成“1”,表示该页修 改过,否则为“0”,表示该页未修改过。页表格式如表 3-1 所示。

表 3-1 页表格式 页 号 标 志 主存块号 修改标志 磁盘上的位置

(2) 设计一个地址转换程序来模拟硬件的地址转换和缺页中断处理过程。当访问的页 在主存时则形成绝对地址,但不去模拟指令的执行,可用输出转换后的绝对地址来表示一 条指令已完成。当访问的页不在主存时则输出“*该页页号”来表示硬件产生了一次缺页中 断。模拟地址转换的程序流程如图 3-1 所示。 (3) 编制一个 FIFO 页面调度程序。FIFO 页面调度算法总是先调出作业中最先进入主 存的那一页,因此,可以用一个数组来构成页号队列。数组中每个元素是该作业已在主存 的页面号,假定分配给作业的主存块数为 m,且该作业开始的 m 页已装入主存,则数组可 由 m 个元素组成: P[0],P[1],…,P[m-1] 它们的初值为 P[0]∶=0,P[1]∶=1,…,P[m-1]∶= m-1 用一指针 k 指示当要装入新页时应调出的页在数组的位置,k 的初值为“0”。

1 开始 页标志=1? 是”存”指令?

有后继指令? 结束

模拟 FIFO 页面调度

j 页的修改标志=1?

图 3-1 地址转换和 FIFO 页面调度流程 当产生缺页中断后,操作系统总是选择 P[k]所指出的页面调出,然后执行 P[k]∶=要装入的新页页号 k∶=(k+1)mod m 在实验中不必实际地启动磁盘执行调出一页和装入一页的工作,而用输出“OUT 调出的页 号”和“IN 要装入的新页页号”来模拟一次调出和装入的过程。模拟程序的流程见图 3- 1。 (4) 假定主存的每块长度为 1024 个字节,现有一个共 7 页的作业,其副本已在磁盘上。 系统为该作业分配了 4 块主存块,且该作业的第 0 页至第 3 页已经装入主存,其余 3 页尚

2

j∶= P[k] 输出“OUTj” P[k]∶=L k∶=(k+1) mod m

修改页表

输出“IN L”

取一条指令 输出绝对地址 取一条指令

输出“﹡页号”

取指令中访问的页号=>L 查页表

形成绝对地址 置 L 页修改标志”1”

否(产生缺页中断)

是 否 否 否 是

是 模拟硬件 地址转换

是 未装入主存,该作业的页表见表 3-2 所示。 表 3-2 作业的页表 页号 标志 主存块号 修改标志 在磁盘上的位置

0 1 5 0 011 1 1 8 0 012 2 1 9 0 013 3 1 1 0 021 4 0 0 022 5 0 0 023 6 0 0 121

如果该作业依次执行的指令序列如表 3-3 所示。 表 3-3 作业依次执行的指令序列 操作 页号 页内地址 操作 页号 页内地址

+ 0 070 移位 4 053 + 1 050 + 5 023 × 2 015 存 1 037

存 3 021 取 2 078

取 0 056 + 4 001

- 6 040 存 6 084

依次执行上述的指令序列来调试你所设计的程序(仅模拟指令的执行,不必考虑指令序列 中具体操作的执行) (5) 为了检查程序的正确性,可自行确定若干组指令序列,运行设计的程序,核对执 行结果。

三、实验仪器及设备 计算机一台、c++6.0 编程软件 四、操作方法与实验步骤 1.编写源程序 2. 编译运行

五、实验数据记录和处理 源程序: #include #include #include

3 #include #define N 6//实验中假定的页表长度 #define M 4 //主存物理块数 struct {int lnumber; //页号 int flag; //表示该页是否在主存,"1"表示在主存,"0"表示不在主存 int pnumber; //该页所在主存块的块号 int write; //该页是否被修改过,"1"表示修改过,"0"表示没有修改过 int dnumber; //该页存放在磁盘上的位置,即磁盘块号 }page[N]; //页表定义

int p[M]; //用数组模拟]FIFO 算法中的队列(使用循环队列) int head; void initial(void); int do_mmap(int); //模拟地址转换 void do_page_fault(int); //缺页中断处理程序 void run_first_instructon(int);//执行进程的第一条指令 void run_a_instruction(int); //CPU 执行一条指令 void print_page_and_fifoqueue(void); //输出页表和 FIFO 队列

main() { int laddress, paddress; //逻辑地址,物理地址 int lnumber, ad, pnumber; //页号,页内地址和物理块号 initial(); print_page_and_fifoqueue(); //输出页表和 FIFO 队列

run_first_instructon(0x0000); //运行进程的第一条指令的地址 cout<<"输入下一条指令的逻辑地址(0~32767)(-1 to end)">laddress; while(laddress>32767){ cout<<"输入错误! 请重新输入下一条指令的逻辑地址(0~32767)(-1 to end)">laddress; } while(laddress!=-1){ lnumber=laddress>>10; //取逻辑地址的页号 lnumber if(page[lnumber].flag==1){ //指令所在的页面已装入在内存中 paddress=do_mmap(laddress); //形成物理地址

cout

相关文档
最新文档