北京工业大学 操作系统课设 报告
操作系统课程设计实验报告(以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、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间: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设计目的:主存是中央处理器能直接存取指令和数据的存储器,能否合理地利用主存,在很大程度上将影响到整个计算机系统的性能。