操作系统实验五

合集下载

计算机操作系统实验报告

计算机操作系统实验报告

中南大学计算机操作系统实验报告................................................................................................................................................................................................................1、增强学生对计算机操作系统基本原理、基本理论、基本算法的理解;2、提高和培养学生的动手能力。

1、每人至少选作1 题,多做不限;2、每人单独完成,可以讨论,但每人的设计内容不得彻底相同,抄袭或者有2 人/多人设计彻底一样者,不能通过;3、设计完成后,应上交课程设计文档,文档格式应是学校课程设计的标准格式,所有学生的封面大小、格式也必须一样;4、同时上交设计的软盘(或者以班刻录光盘)。

调度算法的摹拟:摹拟各种调度算法,并进行调度性能分析。

摹拟了一个作业调度算法,其中用到了先来先服务算法(FCFS)、短作业优先算法(SJF)、最高响应比优先算法(HRN)三种算法。

如下,分别为三种算法的程序流程图。

图1 - 开始界面图 2 –输入作业的信息(名字、提交时间、运行时间) 图3 –选择算法(FCFS 、SJF、HRN)图4、5 –选择FCFS 算法后输出结果图6、7 –选择SJF 算法后输出结果图8、9 –选择HRN 算法后输出结果能体现公平性;一旦一个较长的作业进入系统后就会长期的占用系统的资源,这样如果有优先级较高的短作业需要执行的话需要等待很长期。

比前者改善了平均周转时间和平均带权周转时间,缩短作业的等待时间,提高系统的吞吐量;对长作业非常不利,可能长期得不到执行,未能一句作业的紧迫程度来划分执行的优先级,难以准确估计作业的执行时间,从而影响调度性能。

这种算法是对FCFS 方式和SJF 方式的一种综合平衡。

操作系统实践报告模板

操作系统实践报告模板

操作系统实践报告模板一、实践概述本次实践主要是对操作系统的基本原理和功能进行了解和实际操作。

通过搭建实验环境、学习和调试代码,加深对操作系统的理解和掌握。

本报告将从实践目的、实验环境搭建、实验过程和实验结果等方面进行详细介绍。

二、实践目的1. 理解操作系统的基本概念和原理2. 学习操作系统的实际应用和调试技术3. 掌握操作系统的基本功能和操作方法三、实验环境搭建1. 硬件环境:Intel处理器的PC机2. 软件环境:Linux操作系统、GNU编译器、调试器等四、实验过程1. 熟悉操作系统的基本原理和功能通过阅读相关的教材和资料,对操作系统的基本概念和原理进行了解和学习,包括进程管理、内存管理、文件系统等内容。

2. 搭建实验环境在实验室环境中搭建了Linux操作系统的实验环境,安装了必要的软件和工具,准备好进行实际操作。

3. 编写和调试实验代码编写了一些简单的操作系统代码,进行了编译和调试,通过调试器对代码进行了逐步调试,查看代码执行过程和结果,加深了对操作系统的理解。

4. 实际操作和测试运行编写的操作系统代码,测试各个功能的正常性,包括进程的创建和调度、内存的分配和释放、文件的读写等操作,对实验结果进行了记录和分析。

五、实验结果1. 成功搭建了实验环境,完成了对操作系统的编写和调试2. 实现了基本的操作系统功能,操作系统能够进行进程管理、内存管理和文件系统的操作3. 通过实际操作,加深了对操作系统的理解和掌握六、实践反思1. 实践中遇到了一些问题,如代码的调试和错误处理等,通过查阅资料和请教老师解决了这些问题,提高了解决问题和自学能力2. 实践让我更加深入地了解了操作系统的运行原理和机制,对操作系统的重要性和应用价值有了更清晰的认识3. 实践的过程中锻炼了动手能力和团队合作意识,对操作系统的实际应用能力有了更强的提升七、总结通过本次操作系统实践,我对操作系统的理论知识和实际应用有了更深入的了解和掌握,对操作系统的重要性和功能有了更清晰的认识。

操作系统实践实验报告模板

操作系统实践实验报告模板

郑州轻工业学院实践报告姓名:院(系):专业:班级:学号:指导教师:成绩:时间:2014 年2 月至2014 年5 月目录一、实践目的 .............................................. 错误!未定义书签。

二、实践内容及步骤 .................................. 错误!未定义书签。

三、实践效果分析 ...................................... 错误!未定义书签。

四、小节(结合实际,谈谈认识)........... 错误!未定义书签。

一、实践目的为了增强我们队脚本语言的认识和了解。

熟练掌握脚本语言的特点和应用。

熟练掌握Dreamweaver编写代码的技巧,提高学生的动手能力。

二、实践内容及步骤1、内容:利用Dreamweaver平台编写js代码,制作一个简单的用户注册表单页。

2、步骤:根据需要设计表单,三、实验结果分析1、表单图例2、页面代码外链式js,调用函数邮箱js代码:输入邮箱时自动填充邮箱后缀,(如@)<script type="text/javascript"src="js/autoMail.js"></scrip> 地址js代码:<script type="text/javascript"src="js/Area.js"></script> 日期js代码:点击日期栏,会自动弹出日历表<script type="text/javascript"src="js/Calendar.js"></scrip>3、<html>4、<body>5、<h1align="center">请填写您的个人信息</h1>6、<div align="center"class="main">7、<form action="Student_register"method="post">8、<table class="table"cellspacing="8"9、<td>账户名称:</td>10、<td><input type="text"name="userName"style="height: 25"></input>11、</td>12、</tr>13、<tr>14、<td>用户密码:</td>15、<td><input type="password"name="userPassword"style="height: 25"></input></td>16、</tr><tr>17、<td>确认密码:</td><td><inputtype="password"name="userPasswordAgain"style="height: 25"></input>18、</td><td></td></tr><tr>19、<td>联系电话:</td>20、<td><input type="text"name="userPhone"style="height: 25"></input>21、</td></tr><tr>22、<td>用户年龄:</td>23、<td><input type="text"name="userAge"style="height: 25"></input>24、</td></tr><tr>25、<td>用户Email:</td>26、<td><input id="email"type="text"name="userEmail"style="height: 25"></input></td>27、</tr><tr>28、<td>用户性别:</td>29、<td>&nbsp;&nbsp;<input type="radio"name="userSex"30、id="userSex"value=""checked="checked"style="height: 25"/>&nbsp;&nbsp;男31、&nbsp;&nbsp;<input type="radio"name="userSex"id="userSex"32、value=""style="height: 25"/>女33、<td></td></tr><tr>34、<td>用户生日:</td>35、<td><input name="userBirthday"type="text"id="control_date"36、maxlength="10"onclick="newCalendar().show(this);"37、readonly="readonly"style="height:25"/>38、</td>39、</tr>40、<td>用户地址:</td>41、<td><div>42、<select id="s_province"name="s_province"charset="UTF-8"></select>&nbsp;&nbsp;43、<select id="s_city"name="s_city"charset="UTF-8"></select>&nbsp;&nbsp;44、<select id="s_county"name="s_county"charset="UTF-8"></select>45、<script class="resources library"src="js/area.js"type="text/javascript"></script><script type="text/javascript">_init_area();</script>46、</div></td>47、</tr>48、</table>49、<br></div>50、<div class="Button"align="center">51、<input style="font-size:20px" type="reset"value="清空">52、<input style="font-size:20px" type="submit"value="提交">53、</div>54、</form>55、<br></br>56、<div class="time"align="right">//获取当前时间57、<jsp:include page="Clock.jsp"></jsp:include>58、</div>59、</body>60、</html>四、小节通过这次独立完成作业,我对js有了更深的理解,明白的它对一个程序员来说是多么重要的,它能代表一个人外表和内心深处,js主要是给用户体现一个更清新、更美观的界面和更流畅的浏览效果。

操作系统实验报告哈工大

操作系统实验报告哈工大

计算机操作系统课程实验报告专业信息管理与信息系统班级 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,不管虚拟磁盘空间是否被全部使用。

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

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

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

实验报告五用户与组群管理

实验报告五用户与组群管理

实验五用户与组群管理实验环境:Linux操作系统实验目的:(1)熟练掌握手工启动前后台作业的方法。

(2)熟练掌握进程与作业管理的相关 Shell 命令。

(3)掌握 at 调度和 cron 调度的设置方法。

(4)了解进行系统性能监视的基本方法。

实验内容及步骤:1.桌面环境下管理用户与组群操作要求1:新建两个用户帐号,其用户名为 xuser1 和 xuser2,口令为“e12ut59er”和“wfu1t28er”。

操作步骤及结果截图:(1)以超级用户身份登录X Window 图形化用户界面,依次单击「系统」菜单=>「管理」=>「用户和组群」,启动「用户管理者」窗口。

(2)单击工具栏上的「添加用户」按钮,出现「创建新用户」窗口。

在「用户名」文本框中输入用户名“xuser1”,在「口令」文本框中输入口令“e12ut59er”,在「确认口令」文本框中再次输入口令“e12ut59er”,如图5-2 所示,然后单击「确定」按钮,返回「用户管理者」窗口。

(3)用同样的方法新建用户xuser2。

(4)依次单击顶部面板的「应用程序」=>「附件」=>「文本编辑器」,启动 gedit 文本编辑器,打开/etc/passwd 和/etc/shadow 文件将发现文件的末尾出现表示 xuser1 和xuser2用户帐号的信息。

打开/etc/group 和/etc/gshadow 文件将发现文件末尾出现表示xuser1和 xuser2 私人组群的信息。

(5)按下CTRL+ALT+F2 组合键切换到第2 个虚拟终端,输入用户名xuser2 和相应的口令可登录Linux 系统,说明新建用户操作已成功。

(6)输入“pwd”命令,屏幕显示用户登录后进入用户主目录“/home/xuser2”。

(7)输入“exit”命令,xuser2 用户退出登录。

(8)按下ALT+F7 组合键返回GNOME 桌面环境。

操作要求2:锁定xuser2 用户帐号操作步骤及结果截图:(1)在「用户管理者」窗口选中xuser2 用户帐号,单击工具栏上的「属性」按钮,打开「用户属性」窗口。

操作系统存储管理实验报告

操作系统存储管理实验报告
4 / 37
操作系统实验·报告
typedef struct pfc_struct pfc_type; (2)模块结构 (伙伴系统) # define Inital 1024 //初始时的总内存
NODE root=(memory_node *)malloc(1*sizeof(memory_node));//根节点 int chip=0; // 记录总的碎片大小
total = 256 use =127 remain_max = 0 flag = 0 pid =0
total = 256 use = 0 remain_max = 256 flag = 0 pid =-1
total = 1024 use = 0 remain_max = 512 flag = 1 pid =-1
total = 512 use = 0 remain_max = 512 flag = 0 pid =-1
total = 512 use = 267 remain_max = 0 flag = 0 pid = -1
6 / 37
操作系统实验·报告
三、实验理论分析
7 / 37
操作系统实验·报告
(伙伴算法) Buddy System 是一种经典的内存管理算法。在 Unix 和 Linux 操作系统中都有用到。其 作用是减少存储空间中的空洞、减少碎片、增加利用率。避免外碎片的方法有两种: a.利用分页单元把一组非连续的空闲页框映射到非连续的线性地址区间。 b.开发适当的技术来记录现存的空闲连续页框块的情况,以尽量避免为满足对小块的 请 求而把大块的空闲块进行分割。 基于下面三种原因,内核选择第二种避免方法: a.在某些情况下,连续的页框确实必要。 b.即使连续页框的分配不是很必要,它在保持内核页表不变方面所起的作用也是不容 忽视的。假如修改页表,则导致平均访存次数增加,从而频繁刷新 TLB。 c.通过 4M 的页可以访问大块连续的物理内存,相对于 4K 页的使用,TLB 未命中率降 低,加快平均访存速度。 Buddy 算法将所有空闲页框分组为 10 个块链表,每个块链表分别包含 1,2,4,8,16,32,64,128,256,512 个连续的页框,每个块的第一个页框的物理地址是该块 大小的整数倍。如,大小为 16 个页框的块,其起始地址是 16*2^12 的倍数。 例,假设要请求一个 128 个页框的块,算法先检查 128 个页框的链表是否有空闲块, 如果没有则查 256 个页框的链表,有则将 256 个页框的块分裂两份,一 份使用,一份 插入 128 个页框的链表。如果还没有,就查 512 个页框的链表,有的话就分裂为 128, 128,256,一个 128 使用,剩余两个插入对应链 表。如果在 512 还没查到,则返回 出错信号。 回收过程相反,内核试图把大小为 b 的空闲伙伴合并为一个大小为 2b 的单独块,满足 以下条件的两个块称为伙伴: a.两个块具有相同的大小,记做 b。 b.它们的物理地址是连续的。 c.第一个块的第一个页框的物理地址是 2*b*2^12 的倍数。 该算法迭代,如果成功合并所释放的块,会试图合并 2b 的块来形成更大的块。 为了模拟 Buddy System 算法,我采用了数的数据结构,并使用了结构体,来记录各项 数据与标记,虽然不是真正的操作系统使用的方法,但成功模拟了插入和回收的过程。 在回收时我采用物理上的合并——即删除实际的物理节点,释放空间。然而实际中可 能根据需要仅仅是删除了标记项,使之标记成没用过的,从而避免了合并,会提高下 一次的插入操作。 碎片百分比 = 碎片总大小/总内存大小 (置换算法)

操作系统实验指导书

操作系统实验指导书一、实验说明1、实验目的实验是操作系统原理课程中不可缺少的重要教学环节,实验目的是使学生理论联系实际,使学生在实践探索中去发现问题、去解决问题,提高了学生获取知识和应用技术的能力,培养了学生分析和解决问题的能力。

《操作系统原理》要求理论与实践相结合,本门实验课程是对《操作系统原理》课堂教学的一个重要补充,与理论学习起着相辅相成的作用,是实施《操作系统原理》教学的一个重要组成部分。

通过本实验课的实践学习,可以增强本专业的学生对系统实现的认识。

对加深理解和掌握操作系统相关原理有重要帮助。

2、实验要求进一步了解和掌握操作系统原理,提高系统设计的能力。

对每一实验题目,应独立完成,并要求:·上机前,学生必须做好充分的实验准备工作,掌握与实验相关的背景知识,用任一种高级语言编写程序。

·上机时,认真调试,并观察、记录程序运行过程中出现的现象和问题。

·上机后,分析实验结果并写出实验报告。

3、实验报告要求每个实验(包括选做的)均应编写实验报告,学生实验后要写出严谨的、实事求是的、文字通顺的、字迹公整的实验报告。

实验报告应包括以下内容:(1)实验题目(2)实验目的(3)实验内容●程序中使用的数据结构及符号说明●流程图●源程序清单并附上注释(4)实验结果及分析●运行结果(必须是上面程序清单所对应输出的结果)●对运行情况所作的分析以及本次调试程序所取得的经验。

如果程序未能通过,应分析其原因。

二、实验内容实验一熟悉使用计算机系统一、实验名称:熟悉使用计算机系统二、实验目的与要求通过对Windows操作系统的使用,熟悉Windows操作系统中的基本概念,如单用户、多任务、进程和文件等,熟悉Windows中命令行方式下常用命令的使用方法;进一步熟悉TC语言与开发环境,为以后的实验打好基础。

三、实验内容1.开机后,熟悉Windows的界面(桌面、任务栏、开始按钮<点击后出现“开始”菜单>、我的电脑图标、回收站、我的文档)。

操作系统教学实践(3篇)

第1篇一、引言操作系统是计算机科学与技术领域的重要基础课程,它涉及计算机系统的资源管理、进程管理、存储管理、文件系统等多个方面。

为了提高学生对操作系统的理解和掌握程度,本文将从教学实践的角度,探讨如何进行操作系统教学。

二、教学目标1. 使学生掌握操作系统的基本概念、原理和关键技术;2. 培养学生分析和解决实际问题的能力;3. 增强学生的团队协作和创新能力;4. 提高学生的编程能力和动手能力。

三、教学内容1. 操作系统概述:介绍操作系统的定义、发展历程、分类和特点;2. 进程管理:讲解进程的概念、进程状态、进程调度算法和进程同步与互斥;3. 存储管理:分析内存分配策略、页面置换算法和虚拟内存技术;4. 文件系统:探讨文件系统的概念、目录结构、文件操作和存储设备管理;5. 设备管理:介绍设备的分类、驱动程序、I/O控制方式和中断处理;6. 网络操作系统:讲解网络操作系统的基本概念、网络协议、网络设备管理和网络安全。

四、教学实践1. 案例教学:通过实际案例,引导学生分析操作系统的原理和应用。

例如,以Linux系统为例,讲解进程调度、内存管理和文件系统等知识点。

2. 实验教学:设计实验项目,让学生动手实践操作系统的相关知识。

实验项目包括:(1)进程调度实验:让学生编写进程调度算法,实现进程的创建、调度和同步。

(2)内存管理实验:让学生实现内存分配、页面置换和虚拟内存等技术。

(3)文件系统实验:让学生实现文件系统的目录结构、文件操作和存储设备管理。

(4)设备管理实验:让学生编写设备驱动程序,实现设备的控制和管理。

3. 项目教学:以实际项目为背景,让学生分组完成项目开发。

项目可以包括:(1)操作系统模拟器:让学生模拟操作系统的运行过程,加深对操作系统原理的理解。

(2)嵌入式操作系统开发:让学生了解嵌入式操作系统的特点,掌握嵌入式开发技能。

(3)分布式操作系统开发:让学生了解分布式系统的原理,掌握分布式操作系统的开发方法。

(完整版)Windows网络操作系统配置与管理单元五任务1:网络共享文件夹的访问管理实验报告

2. 创建“C:\Public\HR”文件夹
(3)配置NTFS访问权限
删除表1中所列举文件夹的所有继承的权限,只对相应的文件夹设置权限,不要让子文件夹继承权限。
表1
文件夹

NTFS权限
C:\Public
Authenticated Users
遍历文件夹/运行文件
列出文件夹/读取数据
读取权限
Administrators
3)按照“共享文件夹向导”中的步骤在C:盘新建共享文件夹SVR_share1.
(2)在SH-SVR1计算机中通过Windows资源管理器创建共享文件夹
1)选择SH-SVR1计算机,双击“我的电脑”,进入“Windows资源管理器”
2)在“Windows资源管理器”中在C:盘创建文件夹SVR_share2。.
1)选择SH-SVR1计算机,在“Windows资源管理器”中在C:盘创建文件夹SVR_share3
2)在“开始”菜单,点击“运行”,在对话框中输入“cmd”。
3)在命令提示符符下,输入“net shareSVR_share3=c:\SVR_share3
(4)在SH-SVR1计算机中通过Windows资源管理器创建隐藏共享文件夹
(2)测试共享文件夹的“读取”权限
1)选择SH-Cli1计算机,以“DL Accounting Managers Read”组成员AccountingManager用户登录。
2)连接到共享文件夹:\\SH-SVR1\HR Reports。
3)试图在“HR Reports”文件夹中创建一个文本文件。是否能够创建?为什么?
(3)测试共享文件夹的“完全控制”权限
1)选择SH-Cli1计算机,以“DL HR Personnel Full Control”组成员HRUser用户登录。

操作系统实验报告

操作系统实验报告实验项⽬⼆进程管理⼀、实验⽬的1.理解进程的概念,掌握⽗、⼦进程创建的⽅法。

2.认识和了解并发执⾏的实质,掌握进程的并发及同步操作。

⼆、实验内容1.编写⼀C语⾔程序,实现在程序运⾏时通过系统调⽤fork( )创建两个⼦进程,使⽗、⼦三进程并发执⾏,⽗亲进程执⾏时屏幕显⽰“I am father”,⼉⼦进程执⾏时屏幕显⽰“I am son”,⼥⼉进程执⾏时屏幕显⽰“I am daughter”。

2.多次连续反复运⾏这个程序,观察屏幕显⽰结果的顺序,直⾄出现不⼀样的情况为⽌。

记下这种情况,试简单分析其原因。

3.修改程序,在⽗、⼦进程中分别使⽤wait()、exit()等系统调⽤“实现”其同步推进,并获取⼦进程的ID号及结束状态值。

多次反复运⾏改进后的程序,观察并记录运⾏结果。

三、源程序及运⾏结果源程序1:#include#include#includeint main(int argc, char ** argv ){int pid=fork();if(pid < 0)printf("error!");else if( pid == 0 ){printf("I am son!\n");}else{int pid=fork();if (pid < 0)printf("error!");else if( pid == 0 ){printf(“I am daughter! \n");}elseprintf("I am father!\n");}sleep(1);return 0;}运⾏结果:源程序2:#include#include#includeint main(int argc, char ** argv ) {char *message;int n;int pid=fork();if(pid < 0)printf("error!");else if( pid == 0 ){message="I am daughter!"; pid=getpid();n=3;}else{int pid=fork();if (pid < 0)printf("error!");else if( pid == 0 ){message="I am son!";pid=getpid();n=3;}elsemessage="I am father!";n=3;}for(;n>0;n--){puts(message);sleep(1);}return 0;}运⾏结果:四、实验分析与总结1.实验内容1运⾏结果为什么⽆固定顺序,fork()函数创建进程是如何并发执⾏的。

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

操作系统 实 验 报 告

课程名称 操作系统实验 实验项目名称 操作系统实验报告物理存储器与进程逻辑地址空间的管理 学号 2011 班级 姓名 型钢 专业 学生所在学院 指导教师 实验室名称地点

哈尔滨工程大学 一、实验概述 1. 实验名称 进程的同步 2. 实验目的

1.使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。 2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。 3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。

3. 实验类型 验证 二、实验环境 OS Lab 三、实验过程 3.1 准备实验 按照下面的步骤准备本次实验: 1. 启动OS Lab。

2. 新建一个EOS Kernel项目。 3. 生成EOS Kernel项目,从而在该项目文件夹中生成SDK文件夹。 4. 新建一个EOS应用程序项目。 5. 使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。 3.2 使用EOS的信号量解决生产者-消费者问题 按照下面的步骤查看生产者-消费者同步执行的过程: 1. 使用pc.c文件中的源代码,替换之前创建的EOS应用程序项目中EOSApp.c文件内的源代码。

2. 按F7生成修改后的EOS应用程序项目。 3. 按F5启动调试。OS Lab会首先弹出一个调试异常对话框。 4. 在调试异常对话框中选择“否”,继续执行。 5. 立即激活虚拟机窗口查看生产者-消费者同步执行的过程。

6. 待应用程序执行完毕后,结束此次调试。 3.3 调试EOS信号量的工作过程 3.3.1 创建信号量 按照下面的步骤调试信号量创建的过程: 1. 按F5启动调试EOS应用项目。OS Lab会首先弹出一个调试异常对话框。

2. 在调试异常对话框中选择"是",调试会中断。 3. 在main函数中创建Empty信号量的代码行(第77行) EmptySemaphoreHandle=CreateSemaphore(BUFFER_SIZE, BUFFER_SIZE, NULL); 添加一个断点。

4. 按F5继续调试,到此断点处中断。 5. 按F11调试进入CreateSemaphore函数。可以看到此API函数只是调用了EOS内核中的PsCreateSemaphoreObject函数来创建信号量对象。

6. 按F11调试进入semaphore.c文件中的PsCreateSemaphoreObject函数。在此函数中,会在EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个 成员的操作是在PsInitializeSemaphore函数中完成的。 7. 在semaphore.c文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。

8. 按F5继续调试,到断点处中断。观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore函数的参数值是一致的。

9. 按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。打开"调用堆栈"窗口,查看函数的调用层次。 3.3.2 等待、释放信号量 3.3.2.1 等待信号量(不阻塞) 生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。按照下面的步骤调试: 1. 删除所有的断点(防止有些断点影响后面的调试)。 2. 在eosapp.c文件的Producer函数中,等待Empty信号量的代码行(144)WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。 3. 按F5继续调试,到断点处中断。 4. WaitForSingleObject 函数最终会调用内核中的PsWaitForSemaphore函数完成等待操作。所以,在semaphore.c文件中PsWaitForSemaphore函数的第一行(第68行)添加一个断点。

5. 按F5继续调试,到断点处中断。 6. 按F10单步调试,直到完成PsWaitForSemaphore函数中的所有操作。可以看到此次执行并没有进行等待,只是将Empty信号量的计数减少了1(由10变为了9)就返回了。 如图所示,empty的初始值为10。

在完成PsWaitForSemaphore函数中的所有操作后empty的值变成了9。

3.3.2.2 释放信号量(不唤醒) 1. 删除所有的断点(防止有些断点影响后面的调试)。

2. 在eosapp.c文件的Producer函数中,释放Full信号量的代码行(第152行) ReleaseSemaphore(FullSemaphoreHandle, 1, NULL); 添加一个断点。 3. 按F5继续调试,到断点处中断。 4. 按F11调试进入ReleaseSemaphore函数。 5. 继续按F11调试进入PsReleaseSemaphoreObject函数。 6. 先使用F10单步调试,当黄色箭头指向第269行时使用F11单步调试,进入PsReleaseSemaphore函数。

7. 按F10单步调试,直到完成PsReleaseSemaphore函数中的所有操作。可以看到此次执行没有唤醒其它线程(因为此时没有线程在Full信号量上被阻塞),只是将Full信号量的计数增加了1(由0变为了1)。 full信号量初始值为0

full信号量由0变为1 生产者线程通过等待Empty信号量使空缓冲区数量减少了1,通过释放Full信号量使满缓冲区数量增加了1,这样就表示生产者线程生产了一个产品并占用了一个缓冲区。 3.3.2.3 等待信号量(阻塞) 由于开始时生产者线程生产产品的速度较快,而消费者线程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产新的产品时就会被阻塞,下面调试这种情况。 1. 结束之前的调试。

2. 删除所有的断点。 3. 按F5重新启动调试。OS Lab会首先弹出一个调试异常对话框。 4. 在调试异常对话框中选择“是”,调试会中断。 5. 在semaphore.c文件中的PsWaitForSemaphore函数的 PspWait(&Semaphore->WaitListHead, INFINITE); 代码行(第78行)添加一个断点。

6. 按F5继续调试,并立即激活虚拟机窗口查看输出。开始时生产者、消费者都不会被信号量阻塞,同步执行一段时间后才在断点处中断。

7. 中断后,查看“调用堆栈”窗口,有Producer函数对应的堆栈帧,说明此次调用是从生产者线程函数进入的。

8. 在“调用堆栈”窗口中双击Producer函数所在的堆栈帧,绿色箭头指向等待Empty信号量的代码行,查看Producer函数中变量i的值为14,表示生产者线程正在尝试生产14号产品。 9. 在“调用堆栈”窗口中双击PsWaitForSemaphore函数的堆栈帧,查看Empty信号量计数(Semaphore->Count)的值为-1,所以会调用PspWait函数将生产者线程放入Empty信号量的等待队列中进行等待(让出CPU)。

10. 激活虚拟机窗口查看输出的结果。生产了从0到13的14个产品,但是只消费了从0到3的4个产品,所以缓冲池中的10个缓冲区就都被占用了,这与之前调试的结果是一致的。 3.3.2.4 释放信号量(唤醒) 只有当消费者线程从缓冲池中消费了一个产品,从而产生一个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品。可以按照下面的步骤调试: 1. 删除所有断点。 2. 在eosapp.c文件的Consumer函数中,释放Empty信号量的代码行(第180)ReleaseSemaphor

e (EmptySemaphoreHandle, 1, NULL); 添加一个断点。

3. 按F5继续调试,到断点处中断。 4. 查看Consumer函数中变量i的值为4,说明已经消费了4号产品。 5. 按照3.3.2.2中的方法使用F10和F11调试进入PsReleaseSemaphore函数。 6. 查看PsReleaseSemaphore函数中Empty信号量计数(Semaphore->Count)的值为-1,和生产者线程被阻塞时的值是一致的。 7. 按F10单步调试PsReleaseSemaphore函数,直到在代码行(第132行) PspWakeThread(&Semaphore->WaitListHead, STATUS_SUCCESS); 处中断。此时Empty信号量计数的值已经由-1增加为了0,需要调用PspWakeThread函数唤醒阻塞在Empty信号量等待队列中的生产者线程(放入就绪队列中),然后调用PspSchedule函数执行调度,这样生产者线程就得以继续执行。

按照下面的步骤验证生产者线程被唤醒后,是从之前被阻塞时的状态继续执行的: 1. 在semaphore.c文件中PsWaitForSemaphore函数的最后一行(第83行)代码处添加一个断点。

2. 按F5继续调试,在断点处中断。 3. 查看PsWaitForSemaphore函数中Empty信号量计数(Semaphore->Count)的值为0,和生产者线程被唤醒时的值是一致的。

4. 在“调用堆栈”窗口中可以看到是由Producer函数进入的。激活Producer函数的堆栈帧,查看Producer函数中变量i的值为14,表明之前被阻塞的、正在尝试生产14号产品的生产者

相关文档
最新文档