北京工业大学 操作系统课设 报告
操作系统课程设计实验报告(以Linux为例)
目录目录 0一、实验环境 (1)二、实验报告总体要求 (1)实验一编译L INUX内核 (2)实验二观察L INUX行为 (6)实验三进程间通信 (13)一、实验环境Linux平台◆硬件平台:普通PC机硬件环境。
◆操作系统:Linux环境,例如,红旗Linux或Red Hat Linux;启动管理器使用GRUB。
◆编译环境:伴随着操作系统的默认gcc环境。
◆工作源码环境:一个调试的内核源码,版本不低于2.4.20。
二、实验报告总体要求在2013年11月25日前提交实验报告。
实验报告至少要求包含以下内容:1.引言:概述本次实验所讨论的问题,工作步骤,结果,以及发现的意义。
2.问题提出:叙述本篇报告要解决什么问题。
注意不可以抄写实验要求中的表述,要用自己的话重新组织我们这里所提出的问题。
3.解决方案:叙述如何解决自己上面提出的问题,可以用小标题 3.1,3.2…等分开。
这是实验报告的关键部分,请尽量展开来写。
注意,这部分是最终课程设计的基本分的部分。
这部分不完成,本课程设计不会及格。
4.实验结果:按照自己的解决方案,有哪些结果。
结果有异常吗?能解释一下这些结果吗?同别人的结果比较过吗?注意,这部分是实验报告出彩的地方。
本课程设计要得高分,应该在这部分下功夫。
5.结束语:小结并叙述本次课程设计的经验、教训、体会、难点、收获、为解决的问题、新的疑惑等。
6.附录:加了注释的程序清单,注释行数目至少同源程序行数目比1:2,即10行源程序,至少要给出5行注释。
操作系统课程设计实验报告实验一编译Linux内核实验时间6小时实验目的认识Linux内核的组成,掌握配置、编译、安装Linux内核的步骤。
实验目标下载2.6.19或更新的Linux内核,配置该内核使其支持NTFS,并在新的内核中修改其版本为Linux NameTestKernel x.x.x,其中,Name是你的名字(汉语拼音);x.x.x是新内核的版本号,最后在你的机器上编译安装这个新内核。
操作系统课程设计报告
北华航天工业学院《操作系统》课程设计报告课设报告题目:进程调度算法、银行家算法、虚拟内存中的页面置换磁盘调度算法作者所在系部:计算机科学与工程系作者所在专业:计算机科学与技术作者所在班级:B09512作者姓名:丁小玲指导教师姓名:赵辉完成时间:2011.12.14北华航天工业学院教务处制随着科学技术的发展,计算机在人们的生活领域中占据了重要的地位。
计算机中最最关键的就是操作系统,它直接对计算机的硬件就行了管理,为人们提供了人机界面,使人们可以更方便高效的利用电脑。
我们应该掌握操作系统中进程调度,内存管理,设备管理以及文件管理中重要的过程,这样有利于我们以后更好的了解操作系统。
进程调度算法主要有三种算法,分别是先来先服务、短进程优先算法和高响应比优先算法;银行家算法主要是针对资源分配后,系统是否安全的判断;虚拟内存中的页面置换主要有三种算法,分别是先进先出算法、最近最久未使用算法和最佳置换算法;磁盘调度算法主要有三种算法,分别是先来先服务算法、最短寻道时间优先算法、扫描算法和循环扫描算法。
关键词:先进先出安全算法循环扫描最短寻道第一章绪论 (1)1.1 课程设计的背景和意义 (1)1.1.1 课程设计的理论研究基础 (1)1.1.2 课程设计的意义 (1)1.2 课程设计环境 (2)第二章需求分析 (3)2.1 功能要求 (3)2.1.1 进程调度算法 (3)2.1.2银行家算法 (3)2.1.3 虚拟内存中的页面置换 (3)2.1.4 磁盘调度算法 (3)2.2 问题的解决方案 (4)2.2.1 进程调度算法 (4)2.2.2银行家算法 (4)2.2.3 虚拟内存中的页面置换 (4)2.2.4 磁盘调度算法 (5)第三章系统设计 (6)3.1 数据设计 (6)3.1.1 结构体设计 (6)3.1.2 函数设计 (6)第四章系统实现 (9)4.1 结构体实现 (9)4.1.1 进程调度算法 (9)4.2 函数实现 (9)4.2.1进程调度算法 (9)4.2.2银行家算法 (12)4.2.3虚拟内存中的页面置换算法 (13)4.2.4磁盘调度算法 (17)4.3 主函数实现 (19)4.3.1 进程调度算法的运行界面 (19)4.3.2 银行家算法的运行界面 (19)4.3.3 虚拟内存中的页面置换的运行界面 (20)4.3.4磁盘调度算法的运行界面 (21)4.4 系统界面 (21)4.4.1 进程调度算法的运行界面 (21)4.4.2 银行家算法的运行界面 (22)4.4.3 虚拟内存中的页面置换算法的运行界面 (22)4.4.4 磁盘调度算法的运行界面 (22)第五章系统测试 (23)5.1 模块测试 (23)5.1.1 进程调度算法的模块测试 (23)5.1.2 银行家算法的模块测试 (23)5.1.3虚拟内存中的页面置换算法的模块测试 (24)5.1.4 磁盘调度算法的模块测试 (25)5.2 课程设计过程中遇到的问题 (26)总结 (27)致谢 (28)参考文献 (29)附录 (30)第一章绪论随着科学技术的发展,计算机在人们的生活领域中占据了重要的地位。
北京工业大学 操作系统软件课设 分析linux内存管理机制
任务2分析Linux内核—内存管理学号____________姓名____________指导教师____________2019年12月一、摘要本次系统软件课程设计,我们小组选择的题目是分析Linux内核-内存管理。
阅读该部分的代码、了解其运行机制,深入理解Linux内存管理的相关具体实现过程。
Linux中,内存管理主要由段页式来进行管理的,涉及虚拟内存技术。
这其中涉及到三个关键内容:①每个进程都有独立的虚拟地址空间,进程访问的虚拟地址并不是真正的物理地址。
②虚拟地址可通过每个进程上的页表与物理地址进行映射,获得真正的物理地址。
③如果虚拟地址对应的物理地址不在物理内存中,则产生缺页中断,真正分配物理地址,同时更新进程的页表;如果此时物理内存已经耗尽,则根据内存替换算法淘汰部分页面至物理磁盘中。
与虚拟内存相关的主要有:与进程相关的结构体、映射的形成等等。
与物理页面相关的主要有:内存的分配、页面的换入换出等等。
本文将尽可能通过对Linux内存管理的主要的代码函数、相关功能实现及结构区阐释Linux系统内存管理的实现方式。
二、关键词虚拟地址空间、用户空间、内核空间、物理内存、虚拟内存、内存分配、页分配与释放、页的换入和换出、内存块的分配与释放、栈的静态分配、缺页异常。
三、引言计算机中的存储器分为主存储器和辅助存储器。
因为实际主存储器的容量比较小而不能满足多道程序的要求,所以作为一种解决策略,采用将程序一部分装入主存,把当前不被执行的部分暂时存放在辅助存储器中,用到时再立即调入主存中。
Linux内存管理就使用了这种解决策略,也就是所谓的虚拟内存技术。
基于此,我们将在这里阐述Linux内存管理技术,包括它的内存管理策略、内存分配策略、内存映射技术、内存交换、页面失效处理等等。
我们小组一共两位成员:郑鑫(17071101)、侯宇(17071125)。
考虑到每个文件以及函数功能以及相关内容,所做详细分工如下:由小组成员郑鑫负责vmalloc.c文件、page_io.c文件、page_alloc.c文件和mmap.c文件的阅读和分析。
《操作系统》课内实验报告
《操作系统》课内实验报告一、实验目的本次《操作系统》课内实验的主要目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握常见操作系统命令的使用,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在计算机实验室进行,使用的操作系统为 Windows 10 和Linux(Ubuntu 发行版)。
实验所使用的计算机配置为:Intel Core i5 处理器,8GB 内存,500GB 硬盘。
三、实验内容1、进程管理在 Windows 系统中,通过任务管理器观察进程的状态、优先级、CPU 使用率等信息,并进行进程的结束和优先级调整操作。
在 Linux 系统中,使用命令行工具(如 ps、kill 等)实现相同的功能。
2、内存管理使用 Windows 系统的性能监视器和资源监视器,查看内存的使用情况,包括物理内存、虚拟内存的占用和分配情况。
在 Linux 系统中,通过命令(如 free、vmstat 等)获取类似的内存信息,并分析内存的使用效率。
3、文件系统管理在 Windows 系统中,对文件和文件夹进行创建、复制、移动、删除等操作,了解文件的属性设置和权限管理。
在 Linux 系统中,使用命令(如 mkdir、cp、mv、rm 等)完成相同的任务,并熟悉文件的所有者、所属组和权限设置。
4、设备管理在 Windows 系统中,查看设备管理器中的硬件设备信息,安装和卸载设备驱动程序。
在 Linux 系统中,使用命令(如 lspci、lsusb 等)查看硬件设备,并通过安装内核模块来支持特定设备。
四、实验步骤1、进程管理实验(1)打开 Windows 系统的任务管理器,切换到“进程”选项卡,可以看到当前系统中正在运行的进程列表。
(2)选择一个进程,右键点击可以查看其属性,包括进程 ID、CPU 使用率、内存使用情况等。
(3)通过“结束任务”按钮可以结束指定的进程,但要注意不要随意结束系统关键进程,以免导致系统不稳定。
操作系统课程设计实验报告(附思考题答案)
操作系统课程设计实验报告(附思考题答案)课程设计(综合实验)报告( 2015 -- 2016 年度第 1 学期)名称:操作系统综合实验题目:oslab综合实验院系:计算机系班级:学号:学生姓名:指导教师:设计周数:分散进行成绩:日期:2015 年10 月29 日一、综合实验的目的与要求1. 理解和掌握操作系统的基本概念、基本组成与工作原理;2. 理解和掌握操作系统中主要功能模块的工作原理及其实现算法;3. 掌握软件模块设计技能;熟悉并能较好地利用软件开发环境独立编程、调试和分析程序运行情况,逐渐形成创新思维和从事系统软件的研究和开发能力。
二、实验正文实验1:实验环境的使用1.1实验目的:1.熟悉操作系统集成实验环境OS Lab 的基本使用方法。
2.练习编译、调试EOS 操作系统内核以及EOS 应用程序。
1.2实验内容:1.启动OS Lab2.学习OS Lab 的基本用法● 新建 Windows 控制台应用程序项目(1)在“文件”菜单中选择“新建”,然后单击“项目”。
(2)在“新建项目”对话框中,选择项目模板“控制台应用程序(c)”。
(3)在“名称”中输入新项目使用的文件夹名称“oslab ”。
(4)在“位置”中输入新项目保存在磁盘上的位置“C:\test ”。
(5)点击“确定”按钮。
● 生成、执行项目●3.EOS 内核项目的生成和调试● 新建 EOS 内核项目并按F7生成项目● 调试项目● 查看软盘镜像文件中的内容、EOS SDK (Software Development Kit )文件夹4.EOS 应用程序项目的生成和调试● 新建 EOS 应用程序项目● 修改 EOS 应用程序项目名称使用断点中断执行查看变量的值5.退出OS Lab6.保存EOS内核项目1.3思考与练习●在实验1中,生成EOS SDK文件夹的目的和作用是什么?答:SDK文件夹中提供了开发EOS应用程序需要的所有文件。
debug文件夹是在使用debug配置生成项目时生成的,其中存放了调试版本的EOS二进制文件。
操作系统课程实验报告
操作系统课程实验报告一、实验目的操作系统是计算机系统中最核心的软件之一,它负责管理计算机的硬件资源和软件资源,为用户提供一个方便、高效、安全的工作环境。
本实验的目的是通过实际操作和观察,深入理解操作系统的基本原理和功能,掌握操作系统的常用命令和操作方法,提高解决实际问题的能力。
二、实验环境操作系统:Windows 10开发工具:Visual Studio Code三、实验内容1、进程管理观察进程的创建、终止和状态转换。
使用任务管理器查看系统中的进程信息,包括进程 ID、CPU 使用率、内存占用等。
通过编程实现创建和终止进程的功能。
2、内存管理了解内存的分配和回收机制。
使用 Windows 系统提供的性能监视器查看内存的使用情况。
编程实现简单的内存分配和释放算法。
3、文件系统管理熟悉文件和目录的操作,如创建、删除、复制、移动等。
研究文件的属性,如文件名、文件大小、创建时间等。
通过编程实现文件的读写操作。
4、设备管理认识设备的驱动程序和设备管理策略。
查看系统中的设备信息,如磁盘驱动器、打印机等。
模拟设备的中断处理过程。
四、实验步骤1、进程管理实验打开任务管理器,观察当前系统中正在运行的进程。
可以看到进程的名称、进程 ID、CPU 使用率、内存占用等信息。
使用 C++语言编写一个简单的程序,创建一个新的进程。
在程序中,使用`CreateProcess`函数来创建新进程,并设置进程的属性和参数。
编写另一个程序,用于终止指定的进程。
通过获取进程 ID,然后使用`TerminateProcess`函数来终止进程。
2、内存管理实验打开 Windows 性能监视器,选择“内存”选项卡,可以查看内存的使用情况,包括物理内存、虚拟内存、页面文件等的使用量和使用率。
编写一个 C 程序,使用动态内存分配函数(如`malloc`和`free`)来分配和释放内存。
在程序中,不断分配和释放一定大小的内存块,观察内存的使用情况和性能变化。
操作系统课程设计 Linux代码分析类 参考
北京工业大学计算机学院操作系统课程设计指导书2002 • 秋设计一 LINUX初起代码的分析1设计目的通过对Linux初起代码的分析了解一个操作系统的初起过程锻炼学生分析大型软件代码的能力通过与同组同学的合作锻炼学生的合作能力2设计内容根据本设计书所提供的基础知识分析init/main.c中关于系统初起的相关代码得到相关的框图写出设计报告3设计要求认真阅读代码与同组同学合作通过充分的讨论得到相关的结论4设计装置无5设计步骤1了解基础知识2与同组同学一起讨论出任务的分配方式3对自己的任务部分的代码充分阅读得到相应的框图4与同组同学讨论得到整体的框图5撰写报告6数据及处理分析系统源代码得到相关框图7报告及要求1设计题目2同组同学任务的分配方式3代码分析结果4体会8相关基础知识在最低的层次上启动系统的第一步是从硬件获得帮助然后由这个硬件去运行一些短小的程序再由他去引导系统PC机的引导过程如下1首先当机器开启的时候机器中的每个CPU都要初始化我们现在只考虑只有一个CPU的情况在系统开启之后这个CPU就开始进行自测试2CPU初始化后从0xfffffff0地址开始取指令执行执行的是固化在ROM中的指令这是一个跳转指令跳转到BIOS代码的开始位置3BIOS使用内部的规则来启动设备通常的选择顺序是软盘硬盘CDROM当然你也可以通过按健来手动选择当设备启动后BIOS读这个设备上的第一个扇区的信息即开始512个字节的内容称之为MBR主引导记录我们假设LINUX是采用LILO来引导的BIOS先读MBR上的关键字目的是确定这是BIOS然后检测引导扇区的位置它指明LILO的开始部分BIOS将LILO装入内存把控制转给LILO4LILO在把自己其余的部分装载进来以后从磁盘上找数据配置它们会指明从何处得到内核启动时要通过什么选项LILO然后装载非压缩形式存储的内核自解压可执行文件从而把控制交给内核5内核的大部分程序以压缩形式存储除了前面提到的自解压可执行文件它负责自解压内核映像文件解压缩完成后把控制转给已经解压的内核在这部分操作完成后执行main.c中的start_kernal函数产生一个init进程这个进程是LINUX中的第一个进程由init进程负责触发其他必须的进程来使系统作为一个整体进入可用的状态例如要设置getty进程来接受用户登录建立网络服务比如FTP和HTTP 守护进程等等的初始化对的系统不执行其他从的初始化初始化内核的部分组件command-line分析内核选项系统激活系统中其他设计二 LINUX的fork exec wait函数的分析1设计目的通过对Linux的fork exec wait代码的分析了解一个操作系统进程的创建执行等待退出的过程锻炼学生分析大型软件代码的能力通过与同组同学的合作锻炼学生的合作能力2设计内容根据本设计书所提供的基础知识分析相关代码得到相关的框图写出设计报告代码的位置/include/linux/shed.h包含了相应的数据结构kernel/fork.c包含了get_pid和do_forkfs/exec.c包含了do_execvekernel/exit.c包含了do_exit sys_wait43设计要求认真阅读代码与同组同学合作通过充分的讨论得到相关的结论4设计装置无5设计步骤1了解基础知识2与同组同学一起讨论出任务的分配方式3对自己的任务部分的代码充分阅读得到相应的框图4与同组同学讨论得到整体的框图5撰写报告6数据及处理分析系统源代码得到相关框图7报告及要求1设计题目2同组同学任务的分配方式3代码分析结果4体会8. 相关基础知识1进程ID每个进程都有一个唯一的标志称为进程标志或进程ID在LINUX中有可能两个任务共享同一个进程当一个进程产生多个线程的时候这个进程的所有线程都共享这个进程的进程ID进程ID的范围是从0到32767进程ID为0和1都是特殊的进程ID进程ID 是由get_pid来得到的2优先级进程有两种优先级静态优先级和动态优先级优先级由一些整数来表示静态优先级是指不随时间变化而变化的优先级动态优先级是指优先级随执行时间的加长而降低即进程占用处理器的时间越长优先级就越低3进程在内核中的表示方式内核中对任务的管理有以下的数据结构组成a. struct task_struct表示进程的内核数据结构是task_struct结构它使用两个指针next_task和prev_task来将各个进程连成一个循环双链表还有相应的指针p_opptr p_pptr p_cptr p_ysptr p_osptr 来表示进程之间的家族关系b. tasktask定义为指向struct task_struct结构的指针数组这个数组的每个项代表系统中的一个任务数组的大小是NR_TASKS它规定了系统中同时可以运行的任务的数量c. tarray_freelist自由时间片列表tarray_freelist拥有一个说明task数组中自由位置的列表即现在没有被使用的空位置d. pidhash这是一个普通的散列表有助于把PID映像到struct task_struct指针e. 进程状态进程的状态有6种TASK_RUNNING运行状态TASK_INTERRUPTIBLE等待状态可以让其他进程唤醒TASK_UNINTERRUPTIBLE等待状态但不让其他进程唤醒TASK_ZOMBIE进程已经结束执行但尚未消亡TASK_STOPPED 进程暂停用其他进程的信号才能唤醒 TASK_SWAPPING 被换出的进程 4fork 只是建立同一个进程的拷贝但是如果要执行另一程序就需要调用exec 将新程序的内容调入到进程空间中Exec 是一个家族函数有多个函数组成但是所有的执行都是通过do_execve 实现的do_execve 的工作分为将一些定义信息从文件读入内存准备新的参数和环境装载可执行文件的二进制处理程序 5exit 用来让进程结束它在内核中是通过sys_exit 实际是采用do_exit 实现的当进程退出的时候内和会释放所有相关资源内存文件等等并停止给它CPU 的机会但是这个时候进程并没有结束需要保留进程的task_struct 结构等待它的父进程调用wait 来查询子孙进程的退出状态所以内和必须保留子孙进程的PID 直到wait 发生为止这个时候的进程是僵进程 6wait 也是一个函数组但是wait 函数家族最终都是使用sys_wait4来实现的它会把一个僵进程最终结束 7简单框图do_fork:do_execve结构释放分配给它的内存释放分配给它的文件释放它的文件系统数据释放信号量处理程序表状态并记录它的退出代码sys_wait4的参数看是否有效如果无效则报错如果有效继续执行循环遍历这个进程的所有的直接子进程找到与参数相匹配的进程并更新子孙进程使用的进程的用户时间和系统时间搜集进程的资源使用信息子孙进程的退出状态被传特定的地址中如果这个僵进程的祖先不是这个进程就通知这个进程的祖先进程PCB设计三 LINUX的消息函数的分析1设计目的通过对Linux的消息传递代码的分析了解Linux操作系统中用于消息传递的msgget msgsnd msgrcv msgctl的执行过程锻炼学生分析大型软件代码的能力通过与同组同学的合作锻炼学生的合作能力2设计内容根据本设计书所提供的基础知识分析相关代码得到相关的框图写出设计报告代码的位置ipc/msg.c3设计要求认真阅读代码与同组同学合作通过充分的讨论得到相关的结论4设计装置无5设计步骤1了解基础知识2与同组同学一起讨论出任务的分配方式3对自己的任务部分的代码充分阅读得到相应的框图4与同组同学讨论得到整体的框图5撰写报告6数据及处理分析系统源代码得到相关框图7报告及要求1设计题目2同组同学任务的分配方式3代码分析结果4体会8. 相关基础知识1消息队列概述Linux采用消息队列的方式来实现消息传递这种消息的发送方式是发送方不必等待接收方检查它所收到的消息就可以继续工作下去而接收方如果没有收到消息也不需等待这种通信机制相对简单但是应用程序使用起来就需要使用相对复杂的方式来应付了新的消息总是放在队列的末尾接收的时候并不总是从头来接收可以从中间来接收2相关系统调用的功能简介与消息队列相关的系统调用有这样四个a Msgget调用者提供一个消息队列的键标用于表示一个消息队列的唯一的名字当这个队列存在的时候这个系统调用负责返回这个队列的标识号如果这个队列不存在就创立一个消息队列然后返回这个消息队列的标识号主要由sys_msgget执行b Msgsnd向一个消息队列发送一个消息主要由real_msgsnd执行c Msgrcv从一个消息队列中收到一个消息主要由real_msgrcv执行d Msgctl在消息队列上执行指定的操作根据参数的不同和权限的不同可以执行检索删除等操作主要由sys_msgctl执行3相关数据结构a Struct msg代表一个在队列中等待的一个消息它的成员如下msg_next指向队列中下一个消息的指针msg_type用户指定的消息类型编码msg_spot指向消息开头的指针msg_stime消息发送的时间msg_ts记录消息的大小b Struct msqid_ds代表一个消息队列它的成员如下msg_perm表明那个进程可以读写这个消息队列msg_first和msg_last指向队列中第一个和最后一个消息的指针msg_stime和msg_rtime分别记录消息被送入队列的最后时间和从队列中读出消息的最后时间msg_ctime上一次改变队列的时间可以是队列创立的时间或者是上一次用msgctl系统调用来设置参数的时间wwait等待进入消息队列的消息队列rwait如果在接收消息的时候没有可以接收的消息那么根据这个设置来看是返回一个错误代码表示读消息失败还是阻塞等待消息到来msg_cbytes当前队列中消息的总字节数msg_qnum队列中消息的总数msg_qbytes队列中允许存储的消息的最大字节数msg_lspid和msg_lrpid最后消息发送方和最后消息接收方的PIDc Msgque消息队列它由一个指向struct msqid_ds的指针数组4简单框图个新的队列就直接调列值中将这个序列号返回检查调用者是否有写消息队列的权限出错 唤醒等待这个消息队列的进程填写消息头将消息入队更新队列中的相应的统计值为消息体分配足够的空间并从用户空间复制消息体进程进入休眠状态直到信号到达或一条消息移出队列 检查如果把消息写入是否会超过队列所允许的最大容量的限制找到指定的消息队列队列作为消息队列 这个键值所指定的队列出错 吗信息 把选中的消息从队列中移出并更新队列的相应统计值的进程把消息复制到用户空间释放队列节点返回消息的容量 从消息队列中找到需要的消息 出错 检查参数 出错 限就删除列 信息 的参数 统计信息 数据 结构中找到相应的消息队列设计四 LINUX的调度和时钟中断处理代码的分析1设计目的通过对Linux的调度和时钟中断代码的分析了解一个LINUX操作系统的进程调度以及时钟中断的处理方式锻炼学生分析大型软件代码的能力通过与同组同学的合作锻炼学生的合作能力2设计内容根据本设计书所提供的基础知识分析相关代码得到相关的框图写出设计报告代码的位置kernel/sched.cinclude/asm-i386/spinlock.h3设计要求认真阅读代码与同组同学合作通过充分的讨论得到相关的结论4设计装置无5设计步骤1了解基础知识2与同组同学一起讨论出任务的分配方式3对自己的任务部分的代码充分阅读得到相应的框图4与同组同学讨论得到整体的框图5撰写报告6数据及处理分析系统源代码得到相关框图7报告及要求1设计题目2同组同学任务的分配方式3代码分析结果4体会8. 相关基础知识Linux 的调度是一种快餐式的调度即只是试图处理一些尽量简单的合理的工作然后就退出使得进程本身可以尽可能地多获得CPULinux采用的调度方法有三种SCHED_RR基于优先级的轮转实时调度方法SCHED_FIFO先进先出的实时调度方法SCHED_OTHER基于优先级的轮转实时调度方法这是普通进程的调度策略每个进程都可以规定自己的调度策略这可以在这个进程的task_struct的policy属性中进行设置在进行调度的时候调度程序会计算处于TASK_RUNNING状态的所有进程的godness 值并选择拥有最好的goodness值的进程到CPU来运行当进行进程调度的时候执行schedule 函数在这个函数中执行goodness函数进行goodness数值的计算在schedule 函数的末尾如果当前调度的进程不是以前运行的那个进程那么就执行swich_to函数来实现进程的上下文切换2中断处理中断分为系统调用中断和硬件中断在这里要讨论的是硬件中断硬件中断是由一个请求IRQ即从硬件设备法网CPU的信号而开始的用sti 开中断用cli屏蔽中断IRQ是从硬件设备发往CPU的中断信号CPU 收到后转到此IRQ所对应的某个中断服务例行程序ISR或称之为中断处理程序在中断处理程序执行完成之后返回中断前所执行的代码IRQ 是有编号的每一个硬件设备在系统中都对应一个IRQ号码中断处理程序可以分为上半部分和下半部分上半部分是中断发生时必须立即执行的部分下半部分是无需立即执行的部分Linux这样中的目的是要把中断的总延迟时间最小化时钟中断是一个特殊的硬件中断用IRQ0来表示在触发IRQ0的时候timer_interrupt 从CPU时间戳计数器读取一些属性值如果CPU 中有值就调用do_timer_interrupt出拉其他一些工作之外然后调用do_timer定时器的上半部分是do_timer定时器的下半部分是timer_bh(3)_switch_to如果要运行的进程是一个新的进程就调用把时间片已经耗尽的进程移动到队列的末尾标记下半部分让下半部分可以运行如果定时器队列中有任务在等待那么就执行下半部分 run_timer_list run_old_timers 用来支持原来的代码 update_times 用于计算系统的平均负载更新纪录当前时间的全局变量并更新内核的当前进程使用的时间的估计值 的值 jiffies 这里记录了机器启动以来系统时钟的大的次数Timer_bh。
操作系统课程设计报告
实践课设计报告课程名称操作系统课程设计模拟设计内存管理中的地址题目转换(动态分区、页式十进制)学院班级学号姓名指导教师年月日课程设计任务书学生姓名:专业班级:指导教师:工作单位:题目: 模拟设计内存管理中的地址转换(动态分区、页式十进制)初始条件:1.预备内容:阅读操作系统的内存管理章节内容,理解动态分区、页式、段式和段页式存储管理的思想及相应的分配主存的过程。
2.实践准备:掌握一种计算机高级语言的使用。
要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1.下列内部存储器管理中地址转换,在完成指定存储管理技术中的地址转换基础上还可以选择其它内部存储器管理中的地址转换进行模拟设计并实现:⑴动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址空间的某一逻辑地址转换成相应的物理地址。
能够处理以下的情形:输入某一逻辑地址,程序能判断地址的合法性,如果合法,计算并输出相应的物理地址。
如果不能计算出相应的物理地址,说明原因。
⑵页式存储管理中逻辑地址到物理地址的转换(十进制)。
能够处理以下的情形:输入某一十进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十进制表示。
⑶页式存储管理中逻辑地址到物理地址的转换(八进制)。
能够处理以下的情形:输入某一八进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用八进制表示。
⑷页式存储管理中逻辑地址到物理地址的转换(十六进制)。
能够处理以下的情形:输入某一十六进制逻辑地址,能检查地址的合法性,如果合法进行转换,否则显示“地址非法”;物理地址用十六进制表示。
⑸段式存储管理中逻辑地址到物理地址的转换。
能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小;能检查地址的合法性,如果合法进行转换,否则显示地址非法的原因。
⑹段页式存储管理中逻辑地址到物理地址的转换。
《操作系统》课内实验报告
《操作系统》课内实验报告一、实验目的操作系统是计算机系统的核心组成部分,本次《操作系统》课内实验旨在通过实际操作和观察,深入理解操作系统的基本原理、功能和运行机制。
具体目的包括:1、熟悉操作系统的常用命令和操作,如文件管理、进程管理、内存管理等。
2、掌握操作系统的资源分配和调度策略,观察其对系统性能的影响。
3、培养解决操作系统相关问题的能力,提高动手实践和分析问题的能力。
二、实验环境本次实验在以下环境中进行:1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code三、实验内容及步骤(一)文件管理实验1、创建、删除和重命名文件及文件夹打开文件资源管理器,在指定目录下创建新的文件夹和文本文件。
对创建的文件和文件夹进行重命名操作,观察文件名的变化。
选择部分文件和文件夹进行删除操作,验证是否成功删除。
2、文件复制、移动和属性设置选取一些文件,将其复制到其他目录,并观察复制过程和结果。
把特定文件移动到不同的位置,检查文件是否正确迁移。
设置文件的属性,如只读、隐藏等,查看属性设置后的效果。
(二)进程管理实验1、查看系统进程打开任务管理器,观察当前正在运行的进程列表。
了解进程的名称、PID(进程标识符)、CPU 使用率、内存占用等信息。
2、进程的终止和优先级设置选择一个非关键进程,尝试终止其运行,观察系统的反应。
调整某些进程的优先级,观察其对系统资源分配和运行效率的影响。
(三)内存管理实验1、查看内存使用情况通过系统性能监视器,查看物理内存和虚拟内存的使用情况。
观察内存使用量随时间的变化趋势。
2、内存优化操作关闭一些不必要的后台程序,释放占用的内存资源。
调整虚拟内存的大小,观察对系统性能的改善效果。
四、实验结果与分析(一)文件管理实验结果1、成功创建、删除和重命名文件及文件夹,系统能够准确响应操作,文件名和文件夹名的修改即时生效。
2、文件的复制和移动操作顺利完成,数据无丢失和损坏。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境1、操作系统:Windows 10 专业版2、开发工具:Visual Studio Code3、编程语言:C/C++三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新进程,并观察进程的创建过程和资源分配情况。
同时,实现进程的正常终止和异常终止,并分析其对系统的影响。
2、进程同步与互斥使用信号量、互斥锁等机制实现进程之间的同步与互斥。
通过模拟多个进程对共享资源的访问,观察并解决可能出现的竞争条件和死锁问题。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法和最坏适应算法。
观察在不同的内存请求序列下,内存的分配和回收情况,并分析算法的性能和优缺点。
2、虚拟内存管理研究虚拟内存的工作原理,通过设置页面大小、页表结构等参数,观察页面的换入换出过程,以及对系统性能的影响。
(三)文件系统实验1、文件操作实现文件的创建、打开、读取、写入、关闭等基本操作。
观察文件在磁盘上的存储方式和文件系统的目录结构。
2、文件系统性能优化研究文件系统的缓存机制、磁盘调度算法等,通过对大量文件的读写操作,评估不同优化策略对文件系统性能的提升效果。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止(1)使用 C/C++语言编写程序,调用系统函数创建新进程。
(2)在子进程中执行特定的任务,父进程等待子进程结束,并获取子进程的返回值。
(3)通过设置异常情况,模拟子进程的异常终止,观察父进程的处理方式。
2、进程同步与互斥(1)定义共享资源和相关的信号量或互斥锁。
(2)创建多个进程,模拟对共享资源的并发访问。
(3)在访问共享资源的关键代码段使用同步机制,确保进程之间的正确协作。
(4)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
《操作系统》课程设计报告.doc
《操作系统》课程设计报告(2006-2007年度第1学期)题目:进程通信与进程同步机制实践班级:计0401学号:3040602015姓名:陈前进教师:鞠时光2007-1-26一.课程设计内容进程通信与进程同步机制实践[问题描述]有三个进程R、M、P,分别负责从键盘读入数据、对读入的数据进行处理、将处理后的数据从屏幕输出,三个进程共享同一个缓冲区。
试用操作系统提供的进程通信和同步机制,使三个进程能够相互协作,正确的完成数据的读入、处理和输出。
[具体要求]1.可以选择Linux(gcc)或者Windows(VC 6.0)作为开发平台。
最终程序的运行界面可以是图形化窗口,也可以是命令行窗口。
2.三个进程通信采用共享缓冲区机制,缓冲区应至少能存放10组数据,每组数据是一个不超过31字节的字符串。
3.数据处理进程(M)的职责是:将读入的一组数据中的○1所有大写字母转换为小写字母(但每个句子的第一个字母应该大写),○2去掉单词与单词之间、句子与句子之间多余的空格,○3如果某个标点既不是句号,也不是逗号,则将其改为句号。
以上三个功能你可以只实现其中的一个、二个或者三个功能。
4.三个进程应该能够持续不断的运行,除非你要求它终止。
二.设计思路1.设计的基本思想:三个进程R、M、P,分别负责从键盘读入数据、对读入的数据进行处理、将处理后的数据从屏幕输出,三个进程共享同一个缓冲区。
定义缓冲区和信号量靠进程通信机制来实现。
进程通信机制,简单的说,就是进程交。
换信息的方式。
由于进程不能互相访问对方的资源,所以,它们要交换信息,只能借助操作系统这个桥梁。
操作系统提供了一种称之为“内核对象”的东西,这个内核对象,它属于操作系统拥有,而不是某一个特定的进程,所以理论上,操作系统中的所有进程都可以访问它们。
内部进程间通讯和数据交换有多种方式:消息、共享内存、匿名(命名)管道、邮槽、Windows套接字等多种技术。
在此次课程设计中,所采用的是共享内存的技术。
北方工业大学《计算机操作系统》实验报告——进程管理
实验报告书学生姓名学号班级2012 —2013 学年第一学期2020-2-20 第2页/共9页五、编译与执行过程截图1.进程的创建进程的创建:系统调用fork()创建两个子进程。
当程序运行时,系统中有一个父进程和两个子进程活动。
父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。
如图,有acb;abc两种情况出现了2.进程的控制子进程和父进程互相抢占处理机,导致输出“乱序”现象的出现,可以看到在“bbb”中出现了“aaa”。
因为加锁了,所以各子进程和父进程各自打印出各自的字符串,并没有出现穿插的现象。
2020-2-20 第3页/共9页3.进程的软中断通信使用系统调用fork()创建两个子进程,再用系统调用signal()让父进程捕捉键盘上来的中断信号(即按Del键);当捕捉到中断信号后,父进程用系统调用kill()向两个子进程发出信号,子进程捕捉到信号后分别输出:Child process 1 is killed by parent!Child process 2 is killed by parent!父进程等待两个子进程终止后输出:Parent process is killed!4.进程的管道通信使用系统调用pipe()建立一条管道线;两个子进程P1和P2分别向管道各写一句话:Child 1 is sending a message!Child 2 is sending a message!而父进程则从管道中读出来自于两个子进程的信息,先接收P1发来的消息,然后再接收P2发来的消息,显示在屏幕上。
六、实验结果与分析1.进程的创建运行结果:acb,abc,其实,从进程执行并发来看,输出abc的任何排列都是有可能的。
因为fork()创建进程所需的时间虽然可能多于输出一个字符的时间,但各个进程的时间片的获得却不是一定是顺序的,父进程与子进程的输出内容会叠加在一起,输出次序带有随机性。
2.进程的控制:<程序一>子进程和父进程输出字符串有相互嵌插的现象。
操作系统实验报告
操作系统实验报告操作系统是计算机科学中十分重要的一门课程,本次实验是关于操作系统的,通过实验,我们可以更深入地了解操作系统的相关知识和操作。
本篇文章将着重介绍本次操作系统实验的内容和实验过程中的收获。
一、实验内容本次实验内容主要涉及操作系统的进程、线程和进程同步三部分。
具体内容包括:1. 进程的创建和管理2. 线程的创建和管理3. 进程同步的实现在实验过程中,我们将分别使用C语言和Linux操作系统实现上述功能。
二、实验过程1. 进程的创建和管理在这一部分实验中,我们要创建多个进程,实现进程的调度和管理功能。
我们采用了Linux系统下的fork()函数,用于创建子进程。
在程序运行时,首先创建一个父进程,然后使用fork()函数创建四个子进程,每个子进程都有自己的进程号(pid),并在屏幕上输出该进程号以示区分。
为了实现进程的调度功能,我们在代码中加入了sleep()函数,用于将进程挂起一段时间,然后再轮流执行其他进程。
2. 线程的创建和管理在这一部分实验中,我们使用了C语言的POSIX线程库pthread.h,实现多线程的功能。
同样地,我们采用了Linux系统下的fork()函数来创建线程。
在代码运行时,我们创建了两个线程,并在屏幕上输出线程号(tid)以示区分。
为了实现线程的调度和管理功能,我们在代码中加入了pthread_join()函数,用于等待线程的执行完成。
3. 进程同步的实现在这一部分实验中,我们使用了Linux系统下的进程同步工具——信号量(semaphore)。
在代码中,我们使用sem_init()函数创建信号量,使用sem_wait()函数阻塞进程或线程,使用sem_post()函数释放进程或线程。
为了更好地理解信号量的工作原理,我们将代码分为生产者和消费者两部分,其中生产者用于向缓冲区添加数据,消费者则用于删除数据。
在这个过程中,我们需要使用信号量控制生产者和消费者的数量,避免出现生产过多或消费过多的情况。
操作系统课程实验报告
操作系统课程实验报告一、实验目的操作系统是计算机系统中最为关键的软件之一,它负责管理计算机的硬件资源和软件资源,为用户提供一个良好的工作环境。
通过操作系统课程实验,旨在深入理解操作系统的基本原理和功能,提高对操作系统的实际操作能力和问题解决能力。
二、实验环境本次实验使用的操作系统为Windows 10 和Linux(Ubuntu 1804),开发工具包括 Visual Studio Code、gcc 编译器等。
三、实验内容(一)进程管理1、进程创建与终止在 Windows 系统中,使用 C++语言创建多个进程,并通过进程句柄控制进程的终止。
在 Linux 系统中,使用 fork()系统调用创建子进程,并通过 exit()函数终止进程。
2、进程同步与互斥使用信号量实现进程之间的同步与互斥。
在 Windows 中,利用CreateSemaphore()和 WaitForSingleObject()等函数进行操作;在Linux 中,通过 sem_init()、sem_wait()和 sem_post()等函数实现。
(二)内存管理1、内存分配与释放在 Windows 中,使用 HeapAlloc()和 HeapFree()函数进行动态内存的分配与释放。
在 Linux 中,使用 malloc()和 free()函数完成相同的操作。
2、内存页面置换算法实现了几种常见的内存页面置换算法,如先进先出(FIFO)算法、最近最少使用(LRU)算法等,并比较它们的性能。
(三)文件系统管理1、文件创建与读写在 Windows 和 Linux 系统中,分别使用相应的 API 和系统调用创建文件,并进行读写操作。
2、目录操作实现了目录的创建、删除、遍历等功能。
四、实验步骤(一)进程管理实验1、进程创建与终止(1)在 Windows 系统中,编写 C++程序,使用 CreateProcess()函数创建新进程,并通过 TerminateProcess()函数终止指定进程。
(完整word版)北京工业大学操作系统实验报告0122
操作系统实验报告专业计算机科学与技术年级本科三年级学号12070131姓名樊文舟目录:一、实验一—-————--——-————-—-—----—--———--———--—-----—--31。
实验目的———————————--——---————----—-——-——-—-----—-———-——-—--——————-32。
实验内容-———-—-—-—-——---——---———----—-——----———--—-———-—---———---—-33.实验要求-----—-——————-—-——----——-—-———-—-—-—-——---———————-———--—---34.实验设计—--——-——-———--——-——----—--——-—-—--—------—----—--—--————-—-35。
实验程序----———-—-——-————-—-—-—————-——-—-——----—--—--—----—--———-—-36.实验结果——------———--—-—--————------—————-———--————-——-——-—-—--—--—47.实验感想-—--——---—---—-——--—--—--—-—---——--——--—-----—---——-—-—-—--4二、实验二---—--——----—---—-———---—-———-——----———--—--—41.实验目的—--——-——-—-—---——---—--—-——-———------—-—--——-————----——-———52。
实验内容—-—---———---—-—-—-—-———---—-—---—-——-----——————-————-—--—--53。
实验要求-———--——--————---------——-—-----———--—------------———-—----5 4。
实验设计———---———----——-——----————--——---—---——--—---—————-—-—-—--—55.实验程序—--————-——--—-—-———-—-—--—-———-——-——-———----————-—-----——-—66.实验结果—-—-—-——--—----—-—-—--———--——-——--—————--——-—-————-——--——-—77.实验感想———-—----—-—---—--————-—-——---——-—-------—--—----————-——--—7三、实验三-——---———-——-—--——------——--————-----—--—----81。
2018年北京工业大学操作系统实验报告0122 (6000字)-word范文模板 (22页)
本文部分内容来自网络整理,本司不为其真实性负责,如有异议或侵权请及时联系,本司将立即删除!== 本文为word格式,下载后可方便编辑和修改! ==北京工业大学操作系统实验报告0122 (6000字)操作系统实验报告专业计算机科学与技术年级本科三年级学号 12070131姓名樊文舟目录:一、实验一 ---------------------------------------------31.实验目的-----------------------------------------------------------32.实验内容-----------------------------------------------------------33.实验要求-----------------------------------------------------------34.实验设计-----------------------------------------------------------35.实验程序-----------------------------------------------------------36.实验结果-----------------------------------------------------------47.实验感想-----------------------------------------------------------4 1.实验目的-----------------------------------------------------------5 2.实验内容-----------------------------------------------------------5 3.实验要求-----------------------------------------------------------5 4.实验设计-----------------------------------------------------------5 5.实验程序-----------------------------------------------------------6 6.实验结果-----------------------------------------------------------7 7.实验感想-----------------------------------------------------------7 1.实验目的-----------------------------------------------------------8 2.实验内容-----------------------------------------------------------8 3.实验要求-----------------------------------------------------------8 4.实验设计-----------------------------------------------------------9 5.实验程序-----------------------------------------------------------10 6.实验结果-----------------------------------------------------------11 7.实验感想-----------------------------------------------------------11 1.实验目的-----------------------------------------------------------12 2.实验内容-----------------------------------------------------------12 3.实验要求-----------------------------------------------------------12 4.实验设计-----------------------------------------------------------12 5.实验结果-----------------------------------------------------------12 6.实验感想-----------------------------------------------------------12二、实验二 ---------------------------------------------4 三、实验三---------------------------------------------8 四、实验四 ---------------------------------------------12 个人总结---------------------------------------------12实验一 UNIX/LINUX入门一、实验目的了解UNIX/LINUX运行环境,熟悉UNIX/LINUX的常用基本命令,熟悉和掌握UNIX/LINUX下C语言程序的编写、编译、调试和运行方法。
北京工业大学-嵌入式操作系统的报告5000字
嵌入式操作系统课程报告(2021-2022第1学期)课程题目:__嵌入式操作系统______姓名:_______学号:______学院:____信息学部___专业:__班级:指导教师:_一、嵌入式操作系统1、嵌入式操作系统的概念嵌入式操作系统(Embedded Operating System,简称:EOS)是指用于嵌入式系统的操作系统。
嵌入式操作系统是一种用途广泛的系统软件,通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器等。
嵌入式操作系统负责嵌入式系统的全部软、硬件资源的分配、任务调度,控制、协调并发活动。
它必须体现其所在系统的特征,能够通过装卸某些模块来达到系统所要求的功能。
目前在嵌入式领域广泛使用的操作系统有:嵌入式实时操作系统µC/OS-II、嵌入式Linux、Windows Embedded、VxWorks 等,以及应用在智能手机和平板电脑的Android、iOS等。
2、嵌入式操作系统的特点1)系统内核小由于嵌入式系统一般是应用于小型电子装置的,系统资源相对有限,所以内核较之传统的操作系统要小得多。
比如Enea公司的OSE分布式系统,内核只有5K。
2)专用性强嵌入式系统的个性化很强,其中的软件系统和硬件的结合非常紧密,一般要针对硬件进行系统的移植,即使在同一品牌、同一系列的产品中也需要根据系统硬件的变化和增减不断进行修改。
同时针对不同的任务,往往需要对系统进行较大更改,程序的编译下载要和系统相结合,这种修改和通用软件的“升级”是完全两个概念。
3)系统精简嵌入式系统一般没有系统软件和应用软件的明显区分,不要求其功能设计及实现上过于复杂,这样一方面利于控制系统成本,同时也利于实现系统安全。
4)高实时性高实时性的系统软件(OS)是嵌入式软件的基本要求。
而且软件要求固态存储,以提高速度;软件代码要求高质量和高可靠性。
5)多任务的操作系统嵌入式软件开发要想走向标准化,就必须使用多任务的操作系统。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统课程设计学号 ******xx姓名 xxx指导教师金雪云2014年1月一、报告摘要报告实现了三次实验的全部要求,均以流程图和源代码的形式做了展示,并附上了实验结果图。
二、关键词进程调度,空间分配,磁盘调度,流程图。
三、引言本次实验我选择的是完成实验六、实验七和实验九三个任务。
四、实验六.进程调度4.1设计目的:(1)要求学生设计并实现一个模拟进程调度的算法(时间片轮转及先来先服务)。
(2)理解进程控制块的结构。
(3)理解进程运行的并发性。
(4)掌握进程调度算法。
4.2设计要求:(1)实现时间片轮转算法完成进程的调度。
(2)实现先来先服务算法完成进程的调度。
4.3详细设计:4.3.1数据结构设计及变量说明进程控制块:typedef struct node {char name[10];//进程标识符int round_num;//进程时间轮转时间片int cputime;//进程占用cpu时间int needtime;//还需的时间int count;//计数器char state;//进程状态struct node* next;//指向链表下一个节点}PCB;//进程控制块变量说明:PCB *ready_head, *finish_head, *ready_ptr, *finish_ptr, *ready_rear, *finish_rear;//就绪队列头指针,尾指针,操作指针和完结队列的头指针,尾指针,操作指针int process_num = 0;//进程数int reamin_num;//剩余进程数int choose;//算法选择 1 时间片轮转 2.先来先服务4.3.2时间片轮转算法结果演示:4.3.3先来先服务算法结果演示:4,3,4实验源码:#include <stdio.h> #include <malloc.h> #include<string.h>typedef struct node {char name[10];//进程标识符int prio;//进程优先数int round_num;//进程时间轮转时间片int cputime;//进程占用cpu时间int needtime;//还需的时间int count;//计数器char state;//进程状态struct node* next;}PCB;void InitPCB(PCB* pcb) {strcpy(pcb->name, "none");pcb->prio = 1000;pcb->round_num = 0;pcb->cputime = 0;pcb->needtime = 0;pcb->count = 0;pcb->state = 'W';pcb->next = NULL;}void main() {PCB *ready_head, *finish_head, *ready_ptr, *finish_ptr, *ready_rear,*finish_rear;//就绪队列头指针,尾指针,操作指针和完结队列的头指针,尾指针,操作指针int process_num = 0;//进程数int reamin_num;//剩余进程数int choose;//算法选择 1 时间片轮转 2.先来先服务while (1) {printf("请选择调度算法:\n");printf("1. 时间片轮转法 2.先来先服务算法 0.退出\n");scanf("%d", &choose);if (0 == choose) {return;}if (1 == choose) {printf("请输入进程数:\n");scanf("%d", &process_num);reamin_num = process_num;//初始化剩余进程数为进程数for (int i = 0; i < process_num; i++) {printf("请输入第%d个进程的标识符以及运行时间:\n", i + 1);if (0 == i) {ready_head = (PCB *)malloc(sizeof(PCB));ready_rear = ready_head;//构造头结点ready_rear->next = ready_head;//首尾相连InitPCB(ready_head);scanf("%s%d", ready_head->name, &ready_head->needtime);} else {ready_ptr = (PCB *)malloc(sizeof(PCB));InitPCB(ready_ptr);scanf("%s%d", ready_ptr->name, &ready_ptr->needtime);ready_rear->next = ready_ptr;ready_ptr->next = ready_head;ready_rear = ready_rear->next;}}finish_head = NULL;//初始化为空while (ready_head->needtime > 0) {printf("=================新一轮调度初态================\n");printf("进程名\tcpu时间\t所需时间\t状态\n");ready_ptr = ready_head;//ptr用来保留原有head信息,用于输出链表finish_ptr = finish_head;//ptr用来保留原有head信息,用于输出链表ready_head->state = 'R';//就绪队列头设置为运行for (int i = reamin_num; i > 0; i--) {//输出所有剩余节点信息printf("%s\t%d\t%d\t%c\n", ready_ptr->name, ready_ptr->cputime, ready_ptr->needtime, ready_ptr->state);ready_ptr = ready_ptr->next;}while (finish_ptr != NULL) {//输出调度结束节点的信息printf("%s\t%d\t%d\t%c\n", finish_ptr->name, finish_ptr->cputime, finish_ptr->needtime, finish_ptr->state);finish_ptr = finish_ptr->next;}//getch();ready_ptr = ready_head;//ptr用来保留原有head信息,用于释放空间ready_head->cputime++;//所用时间增加ready_head->needtime--;//需要时间减1ready_head->state = 'W';//调度结束,还原就绪态if (0 == ready_head->needtime) {//如果不再需要时间且为队头ready_head = ready_head->next;//循环链表的移动ready_rear->next = ready_head;ready_ptr->next = NULL;//断开连接ready_ptr->state = 'F';if (reamin_num == process_num) {//头一个进入finish队列的finish_rear = finish_head = ready_ptr;} else {finish_rear->next = ready_ptr;}reamin_num--;} else {//如果没有做完则移动到队尾,下一个作业变为队头ready_rear = ready_head;ready_head = ready_head->next;}}finish_ptr = finish_head;//ptr用来保留原有head信息,用于输出链表printf("=================调度结束================\n");while (finish_ptr != NULL) {//输出调度结束节点的信息printf("%s\t%d\t%d\t%c\n", finish_ptr->name, finish_ptr->cputime, finish_ptr->needtime, finish_ptr->state);finish_ptr = finish_ptr->next;}}if (2 == choose) {printf("请输入进程数:\n");scanf("%d", &process_num);reamin_num = process_num;//初始化剩余进程数为进程数for (int i = 0; i < process_num; i++) {printf("请输入第%d个进程的标识符以及运行时间:\n", i + 1);if (0 == i) {ready_head = (PCB *)malloc(sizeof(PCB));ready_rear = ready_head;//构造头结点InitPCB(ready_head);scanf("%s%d", ready_head->name, &ready_head->needtime);} else {ready_rear->next = (PCB *)malloc(sizeof(PCB));InitPCB(ready_rear->next);scanf("%s%d", ready_rear->next->name, &ready_rear->next->needtime); ready_rear = ready_rear->next;}}finish_head = NULL;//初始化为空while (reamin_num > 0) {printf("=================新一轮调度初态================\n");printf("进程名\tcpu时间\t所需时间\t状态\n");ready_ptr = ready_head;//ptr用来保留原有head信息,用于释放空间finish_ptr = finish_head;ready_head->state = 'R';//就绪队列头设置为运行for (int i = reamin_num; i > 0; i--) {//输出所有剩余节点信息printf("%s\t%d\t%d\t%c\n", ready_ptr->name, ready_ptr->cputime, ready_ptr->needtime, ready_ptr->state);}while (finish_ptr != NULL) {//输出调度结束节点的信息printf("%s\t%d\t%d\t%c\n", finish_ptr->name, finish_ptr->cputime, finish_ptr->needtime, finish_ptr->state);finish_ptr = finish_ptr->next;}ready_ptr = ready_head;//ptr用来保留原有head信息,用于释放空间ready_head->cputime++;//已用时间加1ready_head->needtime--;//需要时间减一//ready_head->state = 'W';//调度结束,还原就绪态if (0 == ready_head->needtime) {//如果不再需要时间ready_head = ready_head->next;ready_rear->next = ready_head;ready_ptr->next = NULL;//断开连接ready_ptr->state = 'F';if (reamin_num == process_num) {//头一个进入finish队列的finish_rear = finish_head = ready_ptr;} else {finish_rear->next = ready_ptr;finish_rear = ready_ptr;}reamin_num--;}}finish_ptr = finish_head;//ptr用来保留原有head信息,用于输出链表printf("=================调度结束================\n");while (finish_ptr != NULL) {//输出调度结束节点的信息printf("%s\t%d\t%d\t%c\n", finish_ptr->name, finish_ptr->cputime, finish_ptr->needtime, finish_ptr->state);finish_ptr = finish_ptr->next;}}}}五、实验七.主存空间的分配与回收5.1设计目的:主存是中央处理器能直接存取指令和数据的存储器,能否合理地利用主存,在很大程度上将影响到整个计算机系统的性能。