efogbAAA操作系统实验五
- 格式:doc
- 大小:2.05 MB
- 文档页数:27
实验名称:操作系统进程管理实验实验目的:1. 理解操作系统进程管理的概念和原理。
2. 掌握进程的创建、调度、同步和通信机制。
3. 通过实验加深对进程管理算法的理解和应用。
实验环境:1. 操作系统:Windows 102. 编程语言:C/C++3. 开发环境:Visual Studio实验内容:一、实验一:进程的创建与终止1. 实验目的了解进程的创建和终止机制,掌握进程控制块(PCB)的结构和功能。
2. 实验步骤(1)创建一个进程,使用系统调用创建子进程;(2)设置子进程的属性,如优先级、名字等;(3)终止子进程,释放资源;(4)查看进程信息,确认进程创建和终止过程。
3. 实验代码```c#include <stdio.h>#include <sys/types.h>#include <unistd.h>int main() {pid_t pid;printf("Parent process: %d\n", getpid());pid = fork(); // 创建子进程if (pid == 0) {printf("Child process: %d\n", getpid());printf("Child process is running...\n");sleep(5); // 子进程延时5秒exit(0);} else {printf("Child process created: %d\n", pid);wait(NULL); // 等待子进程结束printf("Child process terminated.\n");}return 0;}```4. 实验结果在运行实验代码后,首先输出父进程的进程号,然后输出子进程的进程号,子进程运行5秒后结束,父进程输出子进程终止信息。
操作系统实验报告5用户与组群管理一、实验目的1 理解/etc/passwd和/etc/group文件的含义。
2 掌握桌面环境下管理用户与组群的方法。
3 掌握利用Shell命令管理用户与组群的方法。
4 掌握批量新建用户账号的步骤和方法。
二、实验任务(-)桌面环境下管理用户与组群1 新建两个账户,其用户名为user1和user2,口令自己设定。
(1)以超级用户登录图形界面,“桌面”-“管理”-“用户和组群”。
(2)单击工具栏上“添加用户”,分别输入用户名user1和口令,“确认”。
(3)用同样的方法新建用户user2。
(4)“应用程序”-“附件”-“文本编辑器”,打开/etc/passwd/和/etc/shadow,发现文件末尾出现user1和user2的用户账号信息;打开/etc/group和/etc/gshadow文件,发现在文件末尾出现user1和user2的私人组群信息。
(5)按下Ctrl+Alt+F1,切换到第1个虚拟终端。
输入用户名user1或user2,和相应口令,可登录Linux系统,说明新建用户操作成功。
(6)输入pwd,显示用户目录:/home/user1(7)输入exit,用户退出。
(8)按下Ctrl+Alt+F7,进入图形化用户界面。
(二)锁定user2用户账号。
(1)在用户管理器选定user2,单击工具栏上的“属性”。
(2)打开“账号信息”,选中“本地口令被锁”,“确定”。
(3)进入虚拟终端,输入用户名user2和口令,发现无法登录系统。
说明user2账号已被锁定。
(4)按下Alt+F7返回图形化界面。
(三)删除user2用户。
(1)在用户管理器窗口中,“首选项”中选择“过滤系统用户和组群”,显示所有用户。
(2)在“搜索过滤器”中输入u* 回车,则显示以u为首字母的用户。
(3)选中user2用户,工具栏上的“删除”,在用户卡中发现用户user2已经删除。
(四)新建两个组群,分别是newgroup1和newgroup2。
《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。
在这个实验中,我们使用C++编写程序来创建和管理进程。
通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。
首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。
然后,使用等待函数来等待子进程的结束,并获取其返回值。
在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。
2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。
在这个实验中,我们研究了动态内存分配和释放的机制。
使用 C++中的 new 和 delete 操作符来分配和释放内存。
通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。
同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。
通过模拟内存访问过程,理解了页表的作用和地址转换的过程。
3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。
在这个实验中,我们对文件的创建、读写和删除进行了操作。
使用 C++的文件流操作来实现对文件的读写。
通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。
此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。
4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。
一、实验背景与目的随着计算机技术的飞速发展,操作系统作为计算机系统的核心,其重要性日益凸显。
为了更好地理解操作系统的工作原理和设计思想,我们选择了高级操作系统课程,并完成了以下实验:1. 实验背景本次实验基于Linux操作系统,通过对Linux系统内部结构和操作过程的研究,掌握Linux系统的基本操作、文件系统管理、进程管理、内存管理、设备管理等方面的知识。
2. 实验目的(1)熟悉Linux操作系统的基本操作,包括登录、退出、文件与目录操作等。
(2)掌握Linux系统下的进程管理,包括进程的创建、调度、同步、通信等。
(3)了解Linux系统下的内存管理,包括虚拟内存、页面置换算法等。
(4)学习Linux系统下的设备管理,包括设备驱动程序、I/O调度等。
二、实验内容与步骤1. 实验一:Linux基本操作(1)实验目的:熟悉Linux系统的基本操作。
(2)实验步骤:① 登录Linux系统。
② 使用命令行查看系统信息,如CPU型号、内存大小等。
③ 创建和删除文件与目录。
④ 查看文件内容。
2. 实验二:文件系统管理(1)实验目的:掌握Linux系统下的文件系统管理。
(2)实验步骤:① 使用命令行查看文件系统类型。
② 查看文件系统分区。
③ 使用命令行创建和删除文件系统。
④ 使用命令行挂载和卸载文件系统。
3. 实验三:进程管理(1)实验目的:掌握Linux系统下的进程管理。
(2)实验步骤:① 使用命令行查看系统进程。
② 创建和终止进程。
③ 调整进程优先级。
④ 实现进程同步与互斥。
4. 实验四:内存管理(1)实验目的:了解Linux系统下的内存管理。
(2)实验步骤:① 使用命令行查看内存信息。
② 查看内存分配情况。
③ 实现页面置换算法。
5. 实验五:设备管理(1)实验目的:学习Linux系统下的设备管理。
(2)实验步骤:① 使用命令行查看设备信息。
② 编写简单的设备驱动程序。
③ 实现I/O调度。
三、实验结果与分析1. 实验结果通过本次实验,我们成功完成了以下任务:(1)熟悉了Linux操作系统的基本操作。
操作系统实验报告模板一、实验目的本次操作系统实验的主要目的是通过实际操作和观察,深入理解操作系统的核心概念和功能,包括进程管理、内存管理、文件系统、设备管理等方面。
同时,培养学生的动手能力、问题解决能力和团队合作精神,提高对操作系统原理的掌握程度和实际应用能力。
二、实验环境1、操作系统:_____(具体操作系统名称及版本)2、开发工具:_____(如编译器、调试器等)3、硬件环境:_____(处理器型号、内存大小等)三、实验内容(一)进程管理实验1、进程创建与终止使用系统调用创建多个进程,并观察进程的创建过程和资源分配情况。
实现进程的正常终止和异常终止,观察终止时的系统行为。
2、进程调度研究不同的进程调度算法,如先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。
通过编程模拟实现这些调度算法,并比较它们的性能。
3、进程同步与互斥利用信号量、互斥锁等机制实现进程之间的同步与互斥。
编写多进程程序,模拟生产者消费者问题、读者写者问题等经典同步场景。
(二)内存管理实验1、内存分配与回收实现不同的内存分配算法,如首次适应算法、最佳适应算法、最坏适应算法等。
观察内存分配和回收的过程,分析算法的优缺点。
2、虚拟内存了解虚拟内存的概念和实现原理。
通过设置页表、进行页面置换等操作,模拟虚拟内存的管理过程。
(三)文件系统实验1、文件操作实现文件的创建、打开、读写、关闭等基本操作。
研究文件的属性(如权限、大小、创建时间等)的设置和获取。
2、目录管理创建、删除目录,遍历目录结构。
实现文件和目录的重命名、移动等操作。
(四)设备管理实验1、设备驱动程序了解设备驱动程序的结构和工作原理。
编写简单的设备驱动程序,实现对特定设备的控制和数据传输。
2、设备分配与回收研究设备分配的策略,如独占式分配、共享式分配等。
实现设备的分配和回收过程,观察系统的资源利用情况。
四、实验步骤(一)进程管理实验步骤1、进程创建与终止编写程序,使用系统调用创建指定数量的进程。
《操作系统原理》 实 验 报 告 书班级:学号:姓名:指导教师:2013-2014 学年第二学期实验名称: LINUX 用户界面 实验时间: 2014 年 4 月 2 日第 7 周星期三一、实验目的1,熟悉Linux字符操作界面,熟练掌握常用Shell命令。
2,熟悉Linux文本编辑方法,学会编辑软件VI的使用。
3,了解Linux编译器gcc的功能,掌握基于Linux 平台的C程序的开发二、实验预习(预备知识的问题及回答)1.为什么在Linux系统中,诸如光盘、U盘等要先挂载而后才能使用?如何获得U盘的设备名?装载点在文件系统中的位置是什么?由于文件系统的差异,Linux在默认情况下并不支持软盘,光盘,U盘,所以需要通过装在相应盘片才可以访问其中的数据装载点是挂载文件系统的目录位置2.从虚拟机界面退出进入Windows OS界面的操作是 Ctrl+Alt ,从Windows OS 界面进入虚拟机界面的方法是 鼠标点击虚拟机界面 。
3.权限的含义是什么?如何使用数字法设定文件的权限?Linux系统中的每个文件和目录都有相应的访问许可权限,访问权限分为只读(r),可写(w)和可执行三种,有三种不同类型的用户可以对文件或者目录进行访问,分别是文件所有者(u),同组用户(g)和其它用户(o)。
所有的文件和目录都被创建他们的人所拥有。
只要你是这个文件的所有者或者你登陆为用户,你就拥有了改变所有者,群组和其他人权限的权利。
使用数字法改变权限:命令格式chmod权限数值 文件名说明给指定文件赋予数值所规定的权限在数字设定法中,每种权限设置均可以用数值来代表,其中0表示没有权限,1表示可执行权限,2表示可写权限,4表示可读权限,这些值之和便可以用来设定特定权限。
4.什么过滤操作?在Linux中如何实现?过滤操作:将一个命令的输出作为一个命令的输入Linux实现的命令格式:命令|命令5.在Linux中挂载u盘并能显示其文档的中文信息,所使用的挂载命令是:Mount/dev/sdal/mnt/usb。
操作系统实验一、实验背景操作系统实验是计算机科学与技术专业中非常重要的一门实践课程,旨在帮助学生加深对操作系统原理的理解,并且通过实际操作,提高学生的实际动手能力。
本文将介绍我在操作系统实验中所进行的一项实验内容和实验结果。
二、实验目的本次实验的目的是通过模拟操作系统的一些核心功能和概念,加深对操作系统内部工作原理的理解,掌握操作系统的调度算法、程序设计和系统优化等技能。
三、实验步骤1. 实验环境准备为了进行本次实验,首先需要搭建相应的实验环境。
我选择使用Linux操作系统作为实验环境,并确保已经安装了必要的工具和软件,如gcc编译器和相关的调试工具。
2. 实验代码编写在实验开始之前,我阅读了相关的文档和教材,理解了实验的要求和任务。
然后,我按照要求开始编写实验所需的代码。
在代码编写过程中,我需要对操作系统内核进行修改和扩展,并且针对具体的实验要求,实现相关的功能和算法。
3. 实验测试与调试完成代码编写后,我进行了一系列的测试和调试工作。
通过编写测试用例,模拟各种场景和输入情况,验证代码的正确性和稳定性。
如果发现错误或问题,我会使用调试工具进行定位和修复。
4. 实验结果分析在完成测试和调试后,我对实验结果进行了详细的分析。
通过比较和统计实验数据,我得出了一些结论,并对实验结果进行了评估和总结。
四、实验结果与讨论通过实验,我成功完成了操作系统实验的任务,并获得了一些有价值的实验结果。
在实验过程中,我遇到了一些挑战和困难,但通过不断努力和学习,最终克服了这些困难,并获得了令人满意的成果。
五、实验心得体会通过参与操作系统实验,我深刻地认识到了操作系统在计算机系统中的重要性和作用。
实验过程中,我不仅学到了新的知识和技能,还提高了自己的动手能力和问题解决能力。
同时,我也感受到了团队合作的重要性,与同学们一起合作完成实验任务,互相学习和交流,共同进步。
六、实验结论通过本次操作系统实验,我对操作系统的工作原理和相关概念有了更深入的了解。
高级操作系统实验报告课程设计1. 简介本文档是高级操作系统实验报告课程设计的详细记录与分析。
本次课程设计旨在通过实际操作和实践,加深对高级操作系统相关概念的理解,并提升对操作系统原理的实际运用能力。
本次课程设计的主要内容包括了操作系统的进程管理、资源管理、内存管理和文件系统管理等方面的实验。
通过完成这些实验,能够加深对操作系统的理解,并掌握一些基本的高级操作系统管理技巧与策略。
2. 实验一:进程管理2.1 实验目的本实验旨在理解操作系统中进程的概念和原理,并通过编写进程管理相关的代码,加深对进程管理的理解。
2.2 实验过程在本次实验中,我们首先需要实现进程的创建和销毁功能。
通过调用操作系统提供的系统调用接口,我们可以创建新的进程,并为其分配资源。
同时,我们也需要实现进程的销毁功能,即在进程执行完毕或发生错误时,主动释放进程占用的资源。
2.3 实验结果在本次实验中,我们成功实现了进程的创建和销毁功能。
通过调用相应的系统调用接口,我们可以创建新的进程,并为其分配资源。
同时,我们也能够在进程执行完毕或发生错误时,主动释放进程占用的资源。
3. 实验二:资源管理3.1 实验目的本实验旨在理解操作系统中资源管理的概念和原理,并通过编写资源管理相关的代码,深入了解资源的分配和释放过程。
3.2 实验过程在本次实验中,我们首先需要实现资源的申请和释放功能。
通过调用操作系统提供的系统调用接口,我们可以向操作系统申请所需的资源,并在不再需要时,将其释放回系统。
3.3 实验结果在本次实验中,我们成功实现了资源的申请和释放功能。
通过调用相应的系统调用接口,我们可以向操作系统申请所需的资源,并在不再需要时,将其释放回系统。
4. 实验三:内存管理4.1 实验目的本实验旨在理解操作系统中内存管理的概念和原理,并通过编写内存管理相关的代码,加深对内存管理的理解。
4.2 实验过程在本次实验中,我们首先需要实现内存的分配和释放功能。
操作系统实验报告1. 实验目的本次实验的目的是通过设计一个简单的操作系统,深入理解操作系统的基本原理、结构和功能,并通过实践掌握操作系统的核心概念和实现方式。
2. 实验环境本次实验使用的实验环境如下:- 操作系统:Linux Ubuntu 18.04- 开发语言:C/C++- 开发工具:GCC编译器,GNU Make3. 实验内容及步骤本次实验包括以下几个主要内容和步骤:3.1 系统引导- 在操作系统启动时,首先执行系统引导程序,加载操作系统内核到内存中。
- 系统引导程序负责初始化硬件设备,建立起基本的运行环境,然后将控制权转交给操作系统内核。
3.2 内核初始化- 内核初始化过程包括初始化各种数据结构,建立进程控制块(PCB),初始化设备驱动程序等。
- 内核初始化完成后,操作系统进入空闲状态,等待用户的操作请求。
3.3 进程管理- 操作系统需要支持进程管理功能,包括进程的创建、销毁、调度和切换等。
- 进程管理模块负责分配和回收进程资源,根据调度算法决定进程的执行顺序,实现进程的并发执行。
3.4 内存管理- 操作系统需要支持内存管理功能,包括内存的分配和释放、内存的保护和共享等。
- 内存管理模块负责维护内存的使用情况,并根据进程的需求进行内存的分配和回收。
3.5 文件系统- 操作系统需要支持文件系统,提供对文件的创建、打开、读写和关闭等操作。
- 文件系统模块负责管理文件和目录的结构,以及实现对文件的存储和访问策略。
4. 实验结果与分析我们根据上述步骤,设计并实现了一个简单的操作系统。
通过测试和分析,得出以下实验结果和结论:4.1 系统启动与内核初始化- 当系统启动时,我们能够成功加载操作系统的内核,并初始化各种硬件设备。
- 内核初始化过程能够正确建立进程控制块(PCB),并初始化各个设备驱动程序。
4.2 进程管理- 我们能够成功创建和销毁进程,并按照设定的调度算法进行进程的切换。
- 进程间能够实现正确的互斥和同步操作,避免资源竞争和死锁等问题。
操作系统实验报告哈尔滨工程大学一、实验概述1. 实验名称进程的同步2. 实验目的1.使用EOS的信号量,编程解决生产者—消费者问题,理解进程同步的意义。
2.调试跟踪EOS信号量的工作过程,理解进程同步的原理。
3.修改EOS的信号量算法,使之支持等待超时唤醒功能(有限等待),加深理解进程同步的原理。
3. 实验类型验证二、实验环境OS Lab三、实验过程准备实验按照下面的步骤准备本次实验:1. 启动OS Lab。
2. 新建一个EOS Kernel项目。
3. 生成EOS Kernel项目,从而在该项目文件夹中生成SDK文件夹。
4. 新建一个EOS应用程序项目。
5. 使用在第3步生成的SDK文件夹覆盖EOS应用程序项目文件夹中的SDK文件夹。
使用EOS的信号量解决生产者-消费者问题按照下面的步骤查看生产者-消费者同步执行的过程:1. 使用文件中的源代码,替换之前创建的EOS应用程序项目中文件内的源代码。
2. 按F7生成修改后的EOS应用程序项目。
3. 按F5启动调试。
OS Lab会首先弹出一个调试异常对话框。
4. 在调试异常对话框中选择“否”,继续执行。
5. 立即激活虚拟机窗口查看生产者-消费者同步执行的过程。
6. 待应用程序执行完毕后,结束此次调试。
调试EOS信号量的工作过程创建信号量按照下面的步骤调试信号量创建的过程: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调试进入文件中的PsCreateSemaphoreObject函数。
在此函数中,会在EOS内核管理的内存中创建一个信号量对象(分配一块内存),而初始化信号量对象中各个成员的操作是在PsInitializeSemaphore函数中完成的。
7. 在文件的顶部查找到PsInitializeSemaphore函数的定义(第19行),在此函数的第一行(第39行)代码处添加一个断点。
8. 按F5继续调试,到断点处中断。
观察PsInitializeSemaphore函数中用来初始化信号量结构体成员的值,应该和传入CreateSemaphore 函数的参数值是一致的。
9. 按F10单步调试PsInitializeSemaphore函数执行的过程,查看信号量结构体被初始化的过程。
打开"调用堆栈"窗口,查看函数的调用层次。
等待、释放信号量等待信号量(不阻塞)生产者和消费者刚开始执行时,用来放产品的缓冲区都是空的,所以生产者在第一次调用WaitForSingleObject函数等待Empty信号量时,应该不需要阻塞就可以立即返回。
按照下面的步骤调试:1. 删除所有的断点(防止有些断点影响后面的调试)。
2. 在文件的Producer函数中,等待Empty信号量的代码行(144)WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 添加一个断点。
3. 按F5继续调试,到断点处中断。
4. WaitForSingleObject 函数最终会调用内核中的PsWaitForSemaphore函数完成等待操作。
所以,在文件中PsWaitForSemaphore函数的第一行(第68行)添加一个断点。
5. 按F5继续调试,到断点处中断。
6. 按F10单步调试,直到完成PsWaitForSemaphore函数中的所有操作。
可以看到此次执行并没有进行等待,只是将Empty信号量的计数减少了1(由10变为了9)就返回了。
如图所示,empty的初始值为10。
在完成PsWaitForSemaphore函数中的所有操作后empty的值变成了9。
释放信号量(不唤醒)1. 删除所有的断点(防止有些断点影响后面的调试)。
2. 在文件的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信号量初始值为0full信号量由0变为1生产者线程通过等待Empty信号量使空缓冲区数量减少了1,通过释放Full信号量使满缓冲区数量增加了1,这样就表示生产者线程生产了一个产品并占用了一个缓冲区。
等待信号量(阻塞)由于开始时生产者线程生产产品的速度较快,而消费者线程消费产品的速度较慢,所以当缓冲池中所有的缓冲区都被产品占用时,生产者在生产新的产品时就会被阻塞,下面调试这种情况。
1. 结束之前的调试。
2. 删除所有的断点。
3. 按F5重新启动调试。
OS Lab会首先弹出一个调试异常对话框。
4. 在调试异常对话框中选择“是”,调试会中断。
5. 在文件中的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个缓冲区就都被占用了,这与之前调试的结果是一致的。
释放信号量(唤醒)只有当消费者线程从缓冲池中消费了一个产品,从而产生一个空缓冲区后,生产者线程才会被唤醒并继续生产14号产品。
可以按照下面的步骤调试:1. 删除所有断点。
2. 在文件的Consumer函数中,释放Empty信号量的代码行(第180)ReleaseSemaphore (EmptySemaphoreHandle, 1, NULL); 添加一个断点。
3. 按F5继续调试,到断点处中断。
4. 查看Consumer函数中变量i的值为4,说明已经消费了4号产品。
5. 按照中的方法使用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. 在文件中PsWaitForSemaphore函数的最后一行(第83行)代码处添加一个断点。
2. 按F5继续调试,在断点处中断。
3. 查看PsWaitForSemaphore函数中Empty信号量计数(Semaphore->Count)的值为0,和生产者线程被唤醒时的值是一致的。
4. 在“调用堆栈”窗口中可以看到是由Producer函数进入的。
激活Producer函数的堆栈帧,查看Producer函数中变量i的值为14,表明之前被阻塞的、正在尝试生产14号产品的生产者线程已经从PspWait 函数返回并继续执行了。
5. 结束此次调试。
修改EOS的信号量算法修改处代码运行成功测试方法修改完毕后,可以按照下面的方法进行测试:1. 使用修改完毕的EOS Kernel项目生成完全版本的SDK文件夹,并覆盖之前的生产者-消费者应用程序项目的SDK文件夹。
2. 按F5调试执行原有的生产者-消费者应用程序项目,结果必须仍然与图13-2一致。
如果有错误,可以调试内核代码来查找错误,然后在内核项目中修改,并重复步骤1。
3. 将Producer函数中等待Empty信号量的代码行WaitForSingleObject(EmptySemaphoreHandle, INFINITE); 替换为while(WAIT_TIMEOUT ==WaitForSingleObject(EmptySemaphoreHandle,300)){ printf("Producer wait for empty semaphoretimeout\n"); }4. 将Consumer函数中等待Full信号量的代码行WaitForSingleObject(FullSemaphoreHandle, INFINITE); 替换为while(WAIT_TIMEOUT ==WaitForSingleObject(FullSemaphoreHandle,300)){ printf("Consumer wait for full semaphore timeout\n"); } 5. 启动调试新的生产者-消费者项目,查看在虚拟机中输出的结果,验证信号量超时等待功能是否能够正常执行。