操作系统综合实践论文
操作系统综合实践论文

*****大学操作系统课程综合实践题目:编写一个简单的命令解释器----模拟shell功能班级:姓名:学号:指导教师:2010年12月21日编写一个简单的命令解释器—模拟shell功能摘要:在计算机科学中,Shell俗称壳(用来区别于核),是指“提供使用者使用界面”的软件(命令解释器)。
它类似于DOS下的。
它接收用户命令,然后调用相应的应用程序。
同时它又是一种程序设计语言。
作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高阶语言中才具有的控制结构,包括循环和分支。
命令解释器首先读取用户输入的命令,并进行解析,若为内建命令则查找命令文件执行;若错误,则输出错误信息。
本次编写的命令解释器显示提示符并能执行一些简单的命令,如cd、pwd、ls、exit等命令。
关键字:解析;命令;提示符;Shell1.引言在操作系统的综合实践课题当中,编写简单命令解释器的这个课题涉及到很多Linux C编程的知识,因此我选择了这个课题。
所谓简单命令,实际上是一个能完成某种功能的目标程序的名字。
命令可带有参数表,用于给出执行命令时的附加信息。
2.实验内容编写一个简单的命令解释器,模拟shell功能。
要求: 1、可打开提示符,并获取用户输入的指令;2、可解析指令;3、可寻找命令文件;4、可执行基本的命令。
3.实验目的利用Linux下编程知识,编写命令解释器,完成模拟Shell功能。
命令解释器可以执行如cd、pwd、ls、exit等命令。
4.实验环境1、PC机一台2、Ubuntu Linux操作系统5.设计流程图6.程序分析设计命令解释执行是shell最基本的功能,实现的方法很简单:从标准输入流中读入命令,然后解析命令。
在整个程序中所有可能出现错误的地方应该加入检查代码,为了方便捕获错误信息,定义了一个宏CHKERR来完成了检查功能。
计算机操作系统毕业论文(2)

计算机操作系统毕业论文(2)计算机操作系统毕业论文篇2浅析计算机操作系统中死锁问题摘要:死锁问题是计算机操作系统故障中一个十分重要的组成部分,其在对计算机资源使用最优化的实现面前无疑是个亟待解决的问题,当然,就这种计算机操作系统中的死锁问题而言,其绝不是凭空产生的,相反的,其有着自身的一系列必要条件,而这些必要条件和产生原因实际上又可以为相应应对措施的采取指明突破口。
本文主要围绕着计算机操作系统中的死锁问题这一中心主题,从死锁问题的具体内涵出发,通过对其产生原因、必要条件的论述和揭示,最后给出可行的死锁解决策略。
关键词:计算机操作系统;死锁问题;原因;对策死锁,顾名思义,就是一个不通的状态,而当期具体到计算机操作系统之中时,其则表示在一把包括多个进程在内的进程集合体中,每个进程都在等待相应事件的促发,而这些事件却又在等待另一类进程的完成,因此,这样一来进程之间一直处于一种等待的状态之中,无法得到顺利地执行。
当然,这种不同的状态也就必然导致了资源空间的极大浪费,不需要占用的资源无法放出,需要的资源又无法得到利用,这对于计算机操作系统的运行来说,无疑是个不好的消息。
因此,我们在进行实际的计算机操作系统设计和运行时,总是需要将其产生原因及形成机制有一个完整的认识,并及时地采用相关措施加以应对。
1 计算机操作系统死锁问题我们知道,操作系统是一台计算机的灵魂,没有操作系统计算机只能是一副空壳,什么功能也无法实现。
然而,也正是在这种操作系统重要性的要求之下,人们已经对其越来越为依赖了。
当然,这种依赖性如果碰到计算机运行不畅或者死机的情况,用户则会变得异常烦躁,而这种死机以及卡壳现象的发生实际上在很大层面上都是死锁问题导致的。
我们都可以清晰认识到的是,就一个计算机系统而言,其所具有的系统资源是相对有限的,而这种资源在多数情况下又表现出一种独占性的特点,即许多资源无论在什么时刻都只能供一个进程使用,而这一个进程所占用的系统资源又是多方面的。
有关计算机操作系统及应用的参考论文(2)

有关计算机操作系统及应用的参考论文(2)有关计算机操作系统及应用的参考论文篇二《计算机操作系统探讨》摘要:21世纪是信息化时代,计算机的应用将更加广泛,为了更好的使用计算机,应该对操作系统基本了解,因此本文主要对操作系统的概念和发展史进行探讨,并对Windows,UNIX和Linux操作系统做了简单的介绍,使广大读者加深对计算机操作系统的理解。
关键词:计算机操作系统;Windows;UNIX;Linux中图分类号:TP316 文献标识码:A 文章编号:1674-7712 (2014) 04-0000-01当今现代,人们学习、生活等都已经不能离开计算机,计算机由硬件和软件组成,在计算机系统软件中最重要的软件就是操作系统。
操作系统如同指挥官一样,指挥着计算机里的所有部件,并指挥它们按照某个计划协同工作。
计算机系统越复杂,操作系统的作用和地位就越重要。
一、操作系统概述操作系统,负责管理计算机硬件资源和软件资源,并通过这种管理为用户提供服务,成为计算机和用户之间的接口。
操作系统的主要功能是:(1)处理机管理;(2)存储器管理;(3)文件管理;(4)设备管理;(5)用户接口。
基本上所有的操作系统都具有如下的特征:(1)并发性;(2)共享性;(3)虚拟性;(5)不确定性。
二、操作系统发展史操作系统的产生迄今已有70年的时间,最早期的操作系统诞生于20世纪50年代中期,只是简单的单道批处理操作系统;接着演变成了多道程序批处理系统,与此同时,实时操作系统也应运而生;最后伴随着微型机、多处理机和计算机网络的发展,与之相对应的微机OS、多处理机OS和网络OS也随之迅速发展。
(一)串行处理系统世界上最早的计算机诞生之时,并没有操作系统,当时程序员直接和硬件打交道,具体流程是:首先程序员将已经穿孔的纸带(或卡片)装入内存,接着通过控制台或开关启动程序运行,最后当程序全部运行完毕,取出纸带(或卡片)和运算结果。
该系统严重地降低了计算机资源的利用率,形成了所谓的人机矛盾。
计算机操作系统论文

计算机操作系统论文计算机操作系统课程是计算机科学与技术专业的一门基础核心课程。
本课程从操作系统实现资源管理的管理的观点出发,阐述如何对计算机系统中的硬、软件资源进行管理。
下面是店铺给大家推荐的计算机操作系统论文,希望大家喜欢!计算机操作系统论文篇一《计算机操作系统课程教学改革探讨》摘要: 针对计算机操作系统课程在教学过程中学生总觉得抽象、难懂的问题,结合自己的教学经验,在教学内容方面提出了一些改进措施,并给出切实可行的、具体的实施办法。
Abstract: The author made some improvements and gave practical and concrete measures for the problems that students always feel abstract and difficult to understand in the teaching of computer operating system course, combining with his teaching experience in teaching.关键词: 计算机操作系统;教学改革;教学内容;教学方法Key words: computer operating system;teaching reform;teaching content;teaching methods0引言操作系统课程是计算机科学与技术专业的一门基础核心课程。
本课程从操作系统实现资源管理的管理的观点出发,阐述如何对计算机系统中的硬、软件资源进行管理,使计算机系统协调一致地、有效地为用户服务,充分发挥资源的使用效率,提高计算机系统的服务质量。
通过本课程的学习使学生掌握计算机操作系统的控制计算机硬件的基本原理以及设计方法和实现技术。
但该课程教学过程中普遍重点偏向操作系统原理的理论教学,而学生在没有学习该课程前对操作系统的认识只是在使用层面,使得学生在学习的过程中总觉得本课程所学内容与实际所用操作系统的偏差很大。
浅谈操作系统(操作系统论文)

浅谈操作系统(操作系统论文) 浅谈操作系统(操作系统论文)1:引言1.1 研究背景1.2 研究目的1.3 研究意义2:操作系统的定义与发展2.1 操作系统的定义2.2 操作系统的发展历程2.3 操作系统的分类3:操作系统的基本功能3.1 进程管理3.1.1 进程的创建与销毁3.1.2 进程调度3.2 内存管理3.2.1 内存分配与回收3.2.2 虚拟内存管理3.3 文件系统3.3.1 文件的创建与删除 3.3.2 文件的读写与修改 3.4 设备管理3.4.1 设备的分配与释放 3.4.2 设备的驱动与控制4:操作系统的关键技术4.1 进程间通信4.2 同步与互斥4.3 死锁的预防与避免 4.4 中断与异常处理4.5 虚拟化技术4.6 分布式操作系统5:操作系统的应用领域5.1 桌面操作系统5.2 服务器操作系统5.3 嵌入式操作系统5.4 移动操作系统5.5 实时操作系统6:操作系统的优缺点分析6.1 优点6.2 缺点6.3 改进方向7:操作系统与其他相关技术的关系 7.1 编程语言7.2 数据库管理系统7.3 网络通信技术7.4 人机交互技术8:操作系统的未来发展趋势8.1 云操作系统8.2 大数据与的融合8.3 安全与隐私保护8.4 自动化与智能化9:结论附件:1:操作系统原始代码示例2:操作系统相关实验数据3:相关调研问卷回收数据法律名词及注释:1:版权法:保护原创作品的权益,禁止未经授权的复制和使用。
2:商标法:保护商号和商标的专有权,禁止未经授权的商标使用和侵权行为。
3:隐私保护法:保护个人隐私信息的泄露和滥用。
操作系统实践范文

操作系统实践范文操作系统实践是计算机科学与技术专业的一门重要课程,通过操作系统实践,学生可以加深对操作系统的理论知识的理解,并掌握实际应用中的操作系统相关技术和方法。
本文将重点介绍操作系统实践的内容和意义,并分享一些实践经验。
1.操作系统的安装与配置:学生需要学会操作系统的安装与配置,包括选择适合的操作系统版本、安装操作系统、进行基本配置等。
这个实践环节可以加深学生对操作系统的认识,并让他们从实际操作中体会到操作系统的重要性和作用。
2.进程管理:进程是操作系统中最基本的概念之一,学生需要学会如何创建、终止、管理进程。
通过这个实践环节,学生可以加深对进程管理的理解,并掌握进程管理的一些基本技术和方法,如进程调度、进程同步等。
3.文件系统管理:文件系统是操作系统中用于管理计算机硬盘上的文件和目录的一种机制。
学生需要学会如何创建、删除、修改文件和目录,以及如何进行文件系统的管理和维护。
这个实践环节可以让学生体会到文件系统的重要性,并掌握文件系统管理的基本技术和方法。
4.设备管理:设备管理是操作系统中用于管理计算机硬件设备的一种机制。
学生需要学会如何进行设备的初始化、配置和管理,如何处理设备的中断和异常等。
这个实践环节可以让学生了解设备管理的基本原理和方法,并掌握设备管理的实际应用技巧。
1.增强实践能力:通过操作系统实践,学生可以锻炼自己的动手能力和实践能力。
在实践中,他们需要亲自操作计算机软硬件,并解决实际问题。
这种实践过程可以让学生更深入地了解和掌握操作系统相关知识和技术。
2.提升问题解决能力:在操作系统实践中,学生会面临各种各样的问题和挑战,如系统崩溃、进程死锁、文件系统损坏等。
通过解决这些问题,学生可以提升自己的问题解决能力和技巧,培养对问题的敏感性和独立思考能力。
3.加深对操作系统理论的理解:操作系统实践是操作系统理论的实际应用过程,在实践中,学生可以通过实际操作来加深对操作系统理论的理解,将理论知识与实际应用相结合,提高自己的学习效果。
计算机操作系统论文.

操作系统发展过程论文操作系统的发展摘要:现在社会,操作系统进入了社会生活的各个方面, 涉及大型计算机、个人计算机、移动便携设备、其他自动化设备等各个层次的应用领域。
操作系统(Operating System,简称OS是计算机系统的重要组成部分,是一个重要的系统软件,它负责管理计算机系统的硬、软件资源和整个计算机的工作流程,协调系统部件之间, 系统与用户之间、用户与用户之间的关系。
电子计算机诞生以来, 计算机操作系统的研究取得了长足进展。
在几十年的发展历程中, 各种操作系统应运而生, 面对外国商业软件在中国的事实垄断, 重新审视中国基础软件发展战略、配套政策和实施方法已经到了刻不容缓的地步。
本文主要以计算机操作系统的发展过程为核心地位同时对它的技术变革作出了分析,同时对算机操作系统的功能, 发展和分类做了简单的分析和阐述。
关键词:操作系统发展现状问题新技术引言操作系统是控制其他程序运行,管理系统资源并为用户提供操作界面的系统软件的集合。
操作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。
操作系统是管理计算机系统的全部硬件资源包括软件资源及数据资源;控制程序运行; 改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。
操作系统是管理计算机系统的全部硬件资源包括软件资源及数据资源;控制程序运行;改善人机界面;为其它应用软件提供支持等,使计算机系统所有资源最大限度地发挥作用,为用户提供方便的、有效的、友善的服务界面。
操作系统是一管理电脑硬件与软件资源的程序,同时也是计算机系统的内核与基石。
操作系统身负诸如管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系统等基本事务。
目录(一)、操作系统的简单介绍(二)、操作系统的发展(三)、操作系统新技术(四)、操作系统发展现状(五)、结语(一)、操作系统的基本介绍操作系统的功能:1、管理计算机系统的硬件、软件、数据等各种资源, 尽可能减少人工分配资源的工作以及人对机器的干预, 发挥计算机的自动工作效率。
浅谈操作系统(操作系统论文)

浅谈操作系统(操作系统论文)浅谈操作系统操作系统(Operating System)是一种控制计算机硬件和软件资源,并为用户提供服务的基本软件。
它扮演着计算机系统的核心和桥梁角色,可以管理计算机的各种硬件设备、协调软件资源、提供用户界面、调度任务等。
本文将对操作系统这一重要主题进行一番探讨。
一、操作系统的定义和作用操作系统是一种系统软件,是计算机系统中最核心的组成部分。
它的主要作用有以下几个方面:1.资源管理:操作系统能够有效地管理计算机的硬件资源,包括处理器、内存、IO设备等。
通过合理地分配这些资源,操作系统可以实现对系统性能的优化,提高计算机系统的整体效率。
2.任务调度:操作系统可以根据不同的任务优先级,合理地调度任务的执行顺序。
通过任务调度算法的选择和优化,操作系统可以实现高效的并发和并行处理,提高计算机系统的响应速度和吞吐量。
3.文件管理:操作系统提供了文件系统的支持,可以对文件进行创建、读取、写入、删除等操作。
通过文件管理,操作系统可以为用户提供方便的文件访问方式,提高用户的工作效率。
4.用户界面:操作系统为用户提供了图形界面和命令行界面等多种交互方式,使用户可以方便地操作计算机系统。
用户界面的设计和实现直接影响用户的体验,好的用户界面可以提高用户的满意度和使用效率。
二、操作系统的分类根据不同的标准,操作系统可以分为多种不同的类型。
根据应用领域的不同,可以将操作系统分为通用操作系统和嵌入式操作系统;根据用户界面的不同,可以将操作系统分为命令行操作系统和图形界面操作系统;根据处理器体系结构的不同,可以将操作系统分为单处理器操作系统和多处理器操作系统等。
三、操作系统的发展历程操作系统作为计算机系统的关键组成部分,经历了漫长而辛苦的发展过程。
自计算机诞生以来,操作系统的发展经历了几个主要的阶段:1.批处理系统阶段:早期的计算机操作系统主要是批处理系统,用户通过提交批处理作业的方式进行计算。
这种操作系统的特点是任务按顺序执行,没有交互性,主要用于科学计算和大规模数据处理。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
-齐齐哈尔大学操作系统课程综合实践题目:段页式存储算法班级:计本131:学号:指导教师:2016年6月段页式存储算法摘要:分页和分段存储管理方式都各有其优缺点,分页系统能有效地提高内存利用率,而分段系统则能很好滴满足用户需要。
对两种存储管理方式“各取所长”,则可以将两者结合成一种新的存储管理方式系统。
这种新系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,又能像分页系统那样很好地解决内存的外部碎片问题,以及可为各个分段离散的分配内存等问题。
把这种结合起来形成的新系统称为“段页是系统”。
关键字:存储分配;内存块;进程一、实训内容与目的1、内容编写程序完成段页式虚拟存储管理存储分配、地址重定位和缺页中断处理。
(1)为一个进程的内存申请(多少个段,每个段多大)分配内存,当一个进程(完成)结束时回收内存;(2)对一个给定逻辑地址,判断其是否缺段、缺页,若不缺段、不缺页,则映射出其物理地址;(3)若缺段则进行缺段中断处理,若缺页则进行缺页中断处理。
假定内存64K,内存块(页框)大小为1K,进程逻辑地址空间最多4个段,每个段最大16K,进程驻留集大小为8页。
假设进程运行前未预先装入任何地址空间,页面淘汰策略采用局部(驻留集内)置换策略。
输出每次存储分配/回收时,内存自由块分布情况、相关进程的段表和页表信息。
2.目的(1)加深理解段页式虚拟存储管理的概念和原理。
(2)掌握段页式存储管理中存储分配(和回收)方法;(3)深入了解段页式虚拟存储管理中地址重定位(即地址映射)方法。
(4)深入理解段页式虚拟存储管理中缺段、缺页中断处理方法。
二、主要设计思路和流程图1、设计思路(1)内存大小为64K,页框大小为1K,驻留集最多放8个页,在初始时所有块都空闲,并输出空闲状态和所有可用的空闲块。
(2)进程、段表和页表均用结构体数组存储,其中每个进程对应一个段表,每个段表可以有一个或多个页表。
每次查询一个页时,要通过进程号找相应的段,通过段号找到该页。
(3)给出一个功能菜单,用户可以选择“创建进程”、“结束进程”、“查看内存”或地址映射。
(4)当用户选择“创建进程”时,现输入此次内存的总需求,即段号和相应的页数,并保存在一个全局的二维数组中,用于后面每个进程空间申请的数量的检查。
用户分别输入进程号,每个进程需要的段数,段号和相应的页号,并标记好是否要调入驻留集。
输入完成后,系统进行内存空间和驻留集空间的检查,若均未满,则分配成功;如果内存已满,则此次分配失败;如果驻留集已满,则修改溢出部分的标志位(即P位)。
(5)分配好空间后,将输出每个进程相应的段表和页表项。
(6)当用户选择“结束进程”时,清空该进程的段表和页表,修改标志位,释放掉在内存中的空间。
(7)当用户选择“查看内存”时,输出当前在内存中的进程个数、已用的内存块数和空闲的内存块数,并显示所用可用的空闲块。
(8)当用户选择“地址映射”时,先输入想查找的进程号,在检验正确的情况下,输入段号和段内偏移量,判断段的标志位,若该段不在驻留集中,则为虚段,进行缺段中断处理;若在驻留集中,检验偏移量是否越界,在不越界的前提下,根据偏移量计算页号并判断页的标志位,若该页不在驻留集中,则为虚页,进行缺页中断处理,若在驻留集中,则计算出相应的物理地址并输出。
2.程序流程图(1)总体流程图(2)进程创建流程图Input seg_sum_numInput seg_sum[i][0],seg_sum[i][0] 输入段号和相应的页数i = 0 , i < pro_numInput Processes[i].pro_id; Input Processes[i].Snum; i++;pro_num >= 0 && pro_num < Pro_sum_sizeInt j = 0 , j < Processes[i].SnumInput Processes[i].Segments[j].seg_id; Input Processes[i].Segments[j].is_p; J++;(3)地址映射流程图Int k = 0 ; k < Processes[i].Segments[j].Pnum ;k++ Input Processes[i].Segments[j].Pages[k].page_id;Input Processes[i].Segments[j].Pages[k].is_p;Int k = 0 ; k < Processes[i].Segments[j].Pnum ;k++ Input Processes[i].Segments[j].Pages[k].page_id; Input Processes[i].Segments[j].Pages[k].is_p;Print_Table()Input pro_id 输入映射的进程号Input s_id , offset 输入段号和段内偏移量该段为实段 根据段表查页表,找到页框号三、主要数据结构及其说明1、进程、段表及页表的存储(使用结构体数组) //自定义页表 struct Page {int block;int is_p; //记录是否想调入内存 int page_id ; //记录页号 int frame_id ; //记录页框号int p_p ; //修改位,表示对应的页是否在内存中,0表示不在,1表示在int p_m ; //修改位,表示对应的页的内容从上一次装入到内存中到现在是否改变,0表示没有改变,1表示有 };//自定义段表 struct Segment {int Pnum; //记录页数 Page Pages[Mem_Size];int is_p; //记录是否想调入内存 int seg_id ; //记录段号int p ;//页表指针,指向相应页的起始地址int s_p ; //修改位,表示对应的段是否在内存中,0表示不在,计算出物理地址 输出物理地址1表示在int s_m ; //修改位,表示对应的段的内容从上一次装入到内存中到现在是否改变,0表示没有改变,1表示有};//自定义进程结构体struct Process{int pro_id ;//记录进程号int IsInMem;//记录进程是否在内存int Total;//记录某进程所需的总页数int Snum; //记录该进程的段数Segment Segments[10];};//进程数组的定义Process Processes[Pro_sum_size];Segment Segments[Seg_sum_size];Page Pages[Mem_Size];2、使用一维数组存储驻留集int Res_Set [Res_Set_Size];3、函数介绍Init(); //最初的内存初始化Apply_Mem();//手工输入进程个数、段数以及段内地址的赋值函数Alloc_Mem(); //系统分配内存Check_Mem(); //查看内存Finish_Pro(); //手动结束进程,释放相应空间Print_Table();//段表和页表的打印Addr_Exchange(); //地址转换函数FIFO_Strategy(); //先进先出策略处理中断Menu();//一个功能菜单函数一、程序运行时的初值和运行结果1、输入:(1)创建进程:1.共三个段,其中1号段8个页,2号段8个页,3号段8个页。
2.创建两个进程:P1:2个段,1号段,调入内存,共5个页,1、2、4、5页调入驻留集,3号页不调入;2号段,不调入,两个页,分别为2号页和6号页。
P2:1个段,3号段,调入内存,共5个页,1、2、3、4、5,全部调入驻留集。
(2)地址映射:P2:3 123P1:1 2050P1: 2 2562、运行结果输入进程号和相应的内存需求后,显示每个进程的段表和页表:(此时驻留集已满!)查看内存,结果如下:进行地址映射:结束进程,释放空间:四、结束语经过了两周的学习和实验,我终于完成了《段页式存储算法》,从开始做到系统实现,再到论文的完成,每一步对我来说都是新的尝试与挑战。
在这段时间,我学到了很多知识也有很多感受,查看相关的资料和书籍,让自己头脑中段页是存储管理的概念逐渐清晰,了解了段式存储、页式存储以及段页式存储的的优缺点。
使自己非常稚嫩作品一步步完善起来,每一次改进都是我学习的收获,每一次试验的成功都会让我兴奋好一段时间。
这次做论文的经历也会使我终身受益,我感受到做论文是要真真正正用心去做的一件事情,是真正的自己学习的过程和研究的过程,没有学习就不可能有研究的能力,没有自己的研究,就不会有所突破,那也就不叫论文了。
希望这次的经历能让我在以后学习中激励我继续进步。
参考文献[1] 计算机操作系统(实验指导书),滕艳平等编,哈尔滨工业大学出版社,2008年9月[2]操作系统习题解答与实验指导(第二版),张明等编,中国铁道出版社,2007年12月[3]操作系统实验教程,张丽芬等编,清华大学出版社,2006年[4]操作系统学习辅导,张献忠编,清华大学出版社,2004年五、源程序#define _CRT_SECURE_NO_DEPRECATE#include <stdio.h>#include <stdlib.h>#include <stdbool.h>#define Mem_Size 64#define Block_Size 1#define Res_Set_Size 8 //驻留集空间为8个页#define Pro_sum_size 5//定义全局变量int block[Mem_Size]; // 内存块状态标志数组,0:空闲,1:使用int seg_sum[Mem_Size][2]; //建立总的段数的二维数组int processCount = 0; // 记录当前进程数int pageTotal; //总页数int count = 0; //记录进程已经占用的内存块数int in_mem_seg = 0;//记录调入内存的段数int in_mem_page = 0;//记录调入内存的段数int seg_sum_num = 0 ;//需要的总段数int seg_Pnum = 0; //记录每个段需要的内存int i_min , j_min ,k_min , t_min;//在LRU算法中记录使用时间最久的进程号、段号、页号和该//页在驻留集中的位置bool flag = true ;int pro_num = 0;//每一次进行进程申请的进程数量//自定义页表struct Page{int block;int is_p; //记录是否想调入内存int page_id ; //记录页号int frame_id ; //记录页框号int p_p ; //修改位,表示对应的页是否在内存中,0表示不在,1表示在int p_m ; //修改位,表示对应的页的内容从上一次装入到内存中到现在是否改变,0表示没//有改变,1表示有};//自定义段表struct Segment{int Pnum; //记录页数struct Page Pages[Mem_Size];int is_p; //记录是否想调入内存int seg_id ; //记录段号int p ;//页表指针,指向相应页的起始地址int s_p ; //修改位,表示对应的段是否在内存中,0表示不在,1表示在int s_m ; //修改位,表示对应的段的内容从上一次装入到内存中到现在是否改变,0 表//示没有改变,1表示有};//自定义进程结构体struct Process{int pro_id ;//记录进程号int IsInMem;//记录进程是否在内存int Total;//记录某进程所需的总页数int Snum; //记录该进程的段数struct Segment Segments[10];};//进程数组的定义struct Process Processes[5];struct Segment Segments[10];struct Page Pages[Mem_Size];int Res_Set [Res_Set_Size];//内存空间使用输出void Menu();void FIFO_Strategy(); //先进先出策略void Check_Mem(); //查看内存void Init(); //进行初始化void Alloc_Mem(); //分配内存void Apply_Mem();// 进程个数、段数以及段内地址的赋值函数void Addr_Exchange(); //地址转换函数void Finish_Pro(); //手动结束进程,释放相应空间void Print_Table();//段表和页表的dayinvoid FIFO_Strategy(){int p_id , s_id ,pa_id;int t , i , j , k;int temp1 = 0 , temp2 = 0 ;if(in_mem_page == Res_Set_Size){for(i = 0 ; i < processCount ; i++){for(j = 0 ; j < Processes[i].Snum ;j++){for(k = 0 ; k < Processes[i].Segments[j].Pnum ; k++){if(Processes[i].Segments[j].Pages[k].frame_id == Res_Set[0])Processes[i].Segments[j].Pages[k].p_p = 0;else{if(Processes[i].Segments[j].Pages[k].p_p = 1)temp1++;}}if(temp1 == 0){Processes[i].Segments[j].s_p = 0;printf("段S%d已经被调出内存!\n",Processes[i].Segments[j].seg_id);in_mem_seg--;temp2--;}else{if(Processes[i].Segments[j].s_p == 1)temp2++;}}if(temp2 == 0){Processes[i].IsInMem = 0;printf("进程%d已经被调出内存!\n",Processes[i].pro_id);}}printf("被淘汰的页框号为:%d\n",Res_Set[0]);for(t = 1 ; t < Res_Set_Size ; t++)Res_Set[t-1] = Res_Set[t];for(i = 0 ; i < processCount ; i++){for(j = 0 ; j < Processes[i].Snum ; j++){for(k = 0 ; k < Processes[i].Segments[j].Pnum ; k++){if(Processes[i].Segments[j].Pages[k].frame_id == Res_Set[0] ||Processes[i].Segments[j].Pages[k].frame_id == Res_Set[1]||Processes[i].Segments[j].Pages[k].frame_id == Res_Set[2]||Processes[i].Segments[j].Pages[k].frame_id == Res_Set[3]||Processes[i].Segments[j].Pages[k].frame_id == Res_Set[4]||Processes[i].Segments[j].Pages[k].frame_id == Res_Set[5]||Processes[i].Segments[j].Pages[k].frame_id == Res_Set[6]){Processes[i].Segments[j].Pages[k].p_p = 1;}elseProcesses[i].Segments[j].Pages[k].p_p = 0;}}}Res_Set[Res_Set_Size-1] = -1;in_mem_page--;}printf("请输入您想要调入内存的进程号和相应的段号、页号,中间用空格隔开:\n"); scanf("%d %d %d", &p_id , &s_id , &pa_id);for(i = 0 ; i < processCount ; i++){if(Processes[i].pro_id == p_id){for(j = 0 ; j < Processes[i].Snum ; j++){if(Processes[i].Segments[j].seg_id == s_id){for(k = 0 ; k < Processes[i].Segments[j].Pnum ; k++){if(Processes[i].Segments[j].Pages[k].page_id == pa_id){if(Processes[i].Segments[j].Pages[k].p_p == 0){printf("页%d已经成功调入内存!\n", Processes[i].Segments[j].Pages[k].page_id);Processes[i].Segments[j].Pages[k].p_p = 1;in_mem_page++;Res_Set[in_mem_page-1] = Processes[i].Segments[j].Pages[k].frame_id;Print_Table();}elseprintf("页%d已经在内存中了!\n",Processes[i].Segments[j].Pages[k].page_id);}}}}}}Menu();}void Check_Mem(){int k,i;printf("\n内存总量:%d 块\n已用空间:%d 块\n剩余空间:%d 块\n进程总数:%d 个\n",Mem_Size, count, Mem_Size-count, processCount);if (flag && count < Mem_Size){printf("下面是可用的空闲块:\n");for (k = 0 , i = 0 ; k < Mem_Size ; k++){if (block[k] == 0)printf("%2d ", k, ++i);if (i == 10){putchar('\n');i = 0;}}putchar('\n');}Menu();}void Init(){int i;// 初始化内存状态标志数组for (i = 0 ; i < Mem_Size ; i++)block[i] = 0;// 初始化驻留集for (i = 0 ; i < 30 ; i++){Res_Set[i] = -1;}printf("---------------------------------------\n");printf("初始化结果如下:\n");Check_Mem();flag = false;}void Print_Table(){int i,j,k;for(i = 0 ; i < processCount ; i++){printf("进程p%d已经分配好内存!\n",Processes[i].pro_id);Processes[i].IsInMem = 1;printf("该进程的段表内容如下:\n");for(j = 0 ; j < Processes[i].Snum ; j++){printf("段号:段的长度:页的起始地址:P位:M位:\n");printf("%d\t%d\t\t%d\t\t%d\t%d\n",Processes[i].Segments[j].seg_id,Processes[i].Segments[j].Pnum,Processes[i].Segments[j].p,Processes[i].Segments[j].s_p,Processes[i].Segments[j].s_m);printf("该段的页表内容如下:\n");printf("页号:页框号:P位:M位:\n");for(k = 0 ; k < Processes[i].Segments[j].Pnum ; k++){printf("%d\t%d\t%d\t%d\t\n",Processes[i].Segments[j].Pages[k].page_id,Processes[i].Segments[j].Pages[k].frame_id,Processes[i].Segments[j].Pages[k].p_p,Processes[i].Segments[j].Pages[k].p_m);}}}}void Alloc_Mem(){int i,j,k,t;printf("\n\n*******************************\n");for(i = 0 ; i < pro_num ; i++){Processes[i].Total = 0;if(count+Processes[i].Total > Mem_Size){for(j = 0 ; j < Processes[i].Snum ; j++){Processes[i].Total += Processes[i].Segments[j].Pnum;printf("内存空间不足,进程p%d及以后的内存分配失败!",i+1);break;}break;}else{for(j = 0 ; j < Processes[i].Snum ; j++){Processes[i].Segments[j].p = count ;if( Processes[i].Segments[j].is_p == 1)Processes[i].Segments[j].s_p = 1;elseProcesses[i].Segments[j].s_p = 0;for(k = 0 ; k < Processes[i].Segments[j].Pnum ; k++){Processes[i].Segments[j].Pages[k].frame_id = count;block[count] = 1;if(Processes[i].Segments[j].Pages[k].is_p == 1){Processes[i].Segments[j].Pages[k].p_p = 1;Res_Set[in_mem_page] =Processes[i].Segments[j].Pages[k].frame_id;in_mem_page++;}elseProcesses[i].Segments[j].Pages[k].p_p = 0;count++;}}if(in_mem_page > Res_Set_Size){printf("驻留集已满!页框号为%d以后的页没能进入驻留集。