操作系统实验报告3
操作系统实验实验报告

操作系统实验实验报告一、实验目的操作系统是计算机系统中最为关键的核心软件,它管理着计算机的硬件资源和软件资源,为用户提供了一个方便、高效、稳定的工作环境。
本次操作系统实验的目的在于通过实际操作和实践,深入理解操作系统的基本原理和核心概念,掌握操作系统的基本功能和操作方法,提高对操作系统的认识和应用能力。
二、实验环境本次实验使用的操作系统为 Windows 10 专业版,开发工具为Visual Studio 2019,编程语言为 C 和 C++。
实验硬件环境为一台配备Intel Core i7 处理器、16GB 内存、512GB SSD 硬盘的个人计算机。
三、实验内容(一)进程管理实验1、进程创建与终止通过编程实现创建新的进程,并在完成任务后终止进程。
在实验中,我们使用了 Windows API 函数 CreateProcess 和 TerminateProcess 来完成进程的创建和终止操作。
通过观察进程的创建和终止过程,深入理解了进程的生命周期和状态转换。
2、进程同步与互斥为了实现进程之间的同步与互斥,我们使用了信号量、互斥量等同步对象。
通过编写多线程程序,模拟了多个进程对共享资源的访问,实现了对共享资源的互斥访问和同步操作。
在实验中,我们深刻体会到了进程同步与互斥的重要性,以及不正确的同步操作可能导致的死锁等问题。
(二)内存管理实验1、内存分配与释放使用 Windows API 函数 VirtualAlloc 和 VirtualFree 进行内存的分配和释放操作。
通过实验,了解了内存分配的不同方式(如堆分配、栈分配等)以及内存释放的时机和方法,掌握了内存管理的基本原理和操作技巧。
2、内存分页与分段通过编程模拟内存的分页和分段管理机制,了解了内存分页和分段的基本原理和实现方法。
在实验中,我们实现了简单的内存分页和分段算法,对内存的地址转换和页面置换等过程有了更深入的理解。
(三)文件系统实验1、文件操作使用 Windows API 函数 CreateFile、ReadFile、WriteFile 等进行文件的创建、读取和写入操作。
操作系统实验报告

篇一:操作系统实验报告完全版《计算机操作系统》实验报告班级:姓名:学号:实验一进程控制与描述一、实验目的通过对windows 2000编程,进一步熟悉操作系统的基本概念,较好地理解windows 2000的结构。
通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解windows 2000中进程的“一生”。
二、实验环境硬件环境:计算机一台,局域网环境;软件环境:windows 2000 professional、visual c++6.0企业版。
三、实验内容和步骤第一部分:程序1-1windows 2000 的gui 应用程序windows 2000 professional下的gui应用程序,使用visual c++编译器创建一个gui应用程序,代码中包括了winmain()方法,该方法gui类型的应用程序的标准入口点。
:: messagebox( null, “hello, windows 2000” , “greetings”,mb_ok) ;/* hinstance */ , /* hprevinstance */, /* lpcmdline */, /* ncmdshow */ )return(0) ; }在程序1-1的gui应用程序中,首先需要windows.h头文件,以便获得传送给winmain() 和messagebox() api函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到user32.lib库文件并将其与产生的exe文件连接起来。
这样就可以运行简单的命令行命令cl msgbox.cpp来创建这一应用程序,如果没有pragma指令,则messagebox() api函数就成为未定义的了。
这一指令是visual studio c++ 编译器特有的。
接下来是winmain() 方法。
其中有四个由实际的低级入口点传递来的参数。
《操作系统》实验报告

《操作系统》实验报告一、实验目的操作系统是计算机系统中最为关键的组成部分之一,本次实验的主要目的是深入理解操作系统的基本原理和功能,通过实际操作和观察,熟悉操作系统的核心概念,包括进程管理、内存管理、文件系统和设备管理等,提高对操作系统的实际应用能力和问题解决能力。
二、实验环境本次实验在以下环境中进行:操作系统:Windows 10开发工具:Visual Studio 2019编程语言:C++三、实验内容1、进程管理实验进程是操作系统中最基本的执行单元。
在这个实验中,我们使用C++编写程序来创建和管理进程。
通过观察进程的创建、执行和结束过程,理解进程的状态转换和资源分配。
首先,我们编写了一个简单的程序,创建了多个子进程,并通过进程标识符(PID)来跟踪它们的运行状态。
然后,使用等待函数来等待子进程的结束,并获取其返回值。
在实验过程中,我们发现进程的创建和销毁需要消耗一定的系统资源,而且进程之间的同步和通信需要谨慎处理,以避免出现死锁和竞争条件等问题。
2、内存管理实验内存管理是操作系统的核心功能之一,它直接影响系统的性能和稳定性。
在这个实验中,我们研究了动态内存分配和释放的机制。
使用 C++中的 new 和 delete 操作符来分配和释放内存。
通过观察内存使用情况和内存泄漏检测工具,了解了内存分配的效率和可能出现的内存泄漏问题。
同时,我们还探讨了内存分页和分段的概念,以及虚拟内存的工作原理。
通过模拟内存访问过程,理解了页表的作用和地址转换的过程。
3、文件系统实验文件系统是操作系统用于管理文件和目录的机制。
在这个实验中,我们对文件的创建、读写和删除进行了操作。
使用 C++的文件流操作来实现对文件的读写。
通过创建不同类型的文件(文本文件和二进制文件),并对其进行读写操作,熟悉了文件的打开模式和读写方式。
此外,还研究了文件的权限设置和目录的管理,了解了如何保护文件的安全性和组织文件的结构。
4、设备管理实验设备管理是操作系统与外部设备进行交互的桥梁。
哈工大《操作系统》实验3

向kernel/printk.c中添加日志打印功能,将以下代码添加到原文件中:
在kernel/fork.c、kernel/sched.c和kernel/exit.c中,找到正确的状态转换点,并添加合适的状态信息,把它输出到log文件之中。
fork.c的修改如下:
exit.c的修改如下:
sched.c的修改如下:
在虚拟机上运行ls -l /var”或“ll /var”查看process.log是否建立,及它的属性和长度;
修改时间片
include/linux/sched.h宏INIT_TASK中定义的:
0,15,15, 分别对应state、counter和priority,将priority值修改,即可实现对时间片大小的调整。
0,15,15, 分别对应state、counter和priority,
priority值修改,即可实现对时间片大小的调整。
在修改时间片将priority由15改为150后,Process 9~20 中Turnaround, Waiting, CPU Burst, I/O Burst变化不大,原因可能是程序中I/O操作占用的时间对于总时间影响的权重过大,导致处理时间体现的并不明显。
或者变化不大的原因是,子进程连续占用cpu的时间要比时间片大很多。
操作系统 实验报告

操作系统实验报告操作系统是计算机硬件和应用软件之间的一个重要桥梁,它提供了对硬件资源的管理和调度,为应用程序提供了一个运行环境。
在操作系统的发展历史中,经历了批处理系统、分时系统、网络操作系统等不同的阶段和发展方向。
本次实验主要涉及操作系统的进程管理、文件系统以及内存管理。
首先是进程管理,进程是计算机中最基本的执行单元,负责处理用户的请求并执行相应的操作。
在实验中,我们使用了进程调度算法来调度不同的进程。
进程调度算法的选择会直接影响到系统的性能和响应时间。
最常见的进程调度算法有FCFS(先到先服务)、SJF(短作业优先)、RR(时间片轮转)等。
本次实验中,我们实现了一个简单的RR调度算法,按照时间片的顺序轮流使用CPU资源。
实验结果显示,RR调度算法能够有效地保证多个进程同时运行且公平地使用CPU。
其次是文件系统,文件系统是操作系统中管理文件和文件夹的机制。
在实验中,我们使用了文件管理的一些基本操作如创建文件、打开文件、写入文件和关闭文件等。
在文件的操作过程中,通过文件指针来记录当前的读写位置以便于下一次读写。
实验结果显示,文件管理功能能够很好地实现对文件的读写和管理。
最后是内存管理,内存是计算机中存储数据和程序的地方,对于操作系统来说管理和分配内存是一个非常重要的任务。
在实验中,我们主要学习了内存的分区管理和分页管理。
内存的分区管理将内存划分为若干个大小不等的区域,每个程序占用相应的内存空间。
而内存的分页管理则将程序划分为固定大小的页,同时也将内存划分为页框,通过页表来进行地址映射。
实验结果显示,分页管理可以有效地利用内存资源,提高系统的性能和可用性。
通过本次操作系统实验,我对操作系统的原理和实践有了更深入的理解。
在实验中,我了解了进程管理、文件系统和内存管理的基本概念和功能,并通过实验来掌握相关的操作和原理。
通过实验的过程,我深刻地认识到操作系统对计算机的重要性,以及良好的操作系统设计对系统性能的影响。
操作系统-实验三-进程管理-实验报告

计算机与信息工程学院实验报告一、实验内容1.练习在shell环境下编译执行程序(注意:①在vi编辑器中编写名为sample.c的c语言源程序②用linux自带的编译器gcc编译程序,例如:gcc –o test sample.c③编译后生成名为test.out的可执行文件;④最后执行分析结果;命令为:./test)注意:linux自带的编译程序gcc的语法是:gcc –o 目标程序名源程序名,例如:gcc –o sample1 sample1.c,然后利用命令:./sample 来执行。
如果仅用“gcc 源程序名”,将会把任何名字的源程序都编译成名为a.out的目标程序,这样新编译的程序会覆盖原来的程序,所以最好给每个源程序都起个新目标程序名。
2.进程的创建仿照例子自己编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示“a”,子进程分别显示字符“b”和“c”。
观察记录屏幕上的显示结果,并分析原因。
3.分析程序实验内容要在给出的例子程序基础上,根据要求进行修改,对执行结果进行分析。
二、实验步骤1. 利用fork()创建一个小程序(1)编写程序#include <sys/types.h>main (){int i=5;pid_t pid;pid=fork();for(;i>0;i--){if (pid < 0)printf("error in fork!");else if (pid == 0)printf("i am the child process, my process id is %d and i=%d\n",getpid(),i);elseprintf("i am the parent process, my process id is %d and i=%d\n",getpid(),i);}for(i=5;i>0;i--){if (pid < 0)printf("error in fork!");else if (pid == 0)printf("the child process, my process id is %d and i=%d\n",getpid(),i);elseprintf("the parent process, my process id is %d andi=%d\n",getpid(),i);}}(2)运行程序(3)分析程序在这里,主程序先运行,在屏幕上输出一个a,之后两个子程序分别运行而输出c和b。
2023年最新的操作系统文件管理实验报告三篇
2023年最新的操作系统文件管理实验报告三篇操作系统文件管理实验报告一篇一、实训主要内容Word排版,表格制作与编辑。
Powerpoint的制作,初步认识计算机办公应用OFFICE。
二、实训过程第一天:初步熟悉计算机的性能和认识Word;第二天:练习Word题;第三天:认识Powerpoint并对昨天的Word练习予以测试;Excel实训作业第四天:将Word表格与Powerpoint的制作熟悉巩固;第五天:老师再次对我们Word与Powerpoint测验以及教我们一些有用的技能与方法,初步认识计算机办公应用。
OFFICE。
三、实训心得体会很快的,一个假期又过来了,面对本学期最后一次的校园生活实训,想着刚刚过去的最后一个周,紧张沉默之后更多的是感慨,印在脑海里的每一个足迹都是那么的深,真的说不出是什么感觉,伴着时间,就像是在和自己的影子赛跑,不可能从真实的两面去看清它,只是经意不经意的感受着有种东西在过去,也许更适合的只有那句话:时不待我,怎可驻足一周,短短的一周,我学到了很多不知道的东西,实在是感受颇深。
当今企业竞争范围的伴随社会市场经济的发展以及信息化程度的不断提高而日益扩大,这样就要求企业在各个方面加强管理,要求企业有更高的信息化集成来实现对企业的整体资源进行集成管理。
现代企业都意识到,企业之间的竞争是综合实力的竞争,要求企业有更强的资金实力,具备强有力的管理能力和更快的市场响应速度。
因此,引入计算机系统的意义是非常重大的。
在社会主义市场经济高速发展的今天,如果计算机的各项管理运做仍然停滞在以纸、笔为主要工具的阶段,就会因为信息量的快速增长而无法迅速、准确的运用计算机完成各项工作,这样,必将成为企业各方面发展的一个瓶颈。
而在当代这个以信息时代为主题的社会里,计算机技术高速发展,将信息技术应用于对现代企业的管理日益普及。
计算机技术不但可以提高信息的处理速度和提高信息处理的准确性,更重要的是,可以进一步的解放劳动力,将他们分配到更需要人力资源的岗位上去,从而加快社会工作的现代化、综合化的发展步伐。
windows操作实验报告
windows操作实验报告《Windows操作实验报告》在当今信息化时代,计算机已经成为了我们生活中不可或缺的一部分。
而作为最常用的操作系统之一,Windows系统更是被广泛应用于个人电脑、商业办公等各个领域。
为了更好地了解和掌握Windows操作系统的使用方法,我们进行了一系列的实验操作,并在此报告中进行总结和分析。
实验一:Windows系统的基本操作在本实验中,我们首先学习了Windows系统的基本操作,包括桌面的布局、文件和文件夹的管理、快捷键的使用等。
通过实际操作,我们掌握了Windows系统的基本界面,了解了如何打开和关闭程序、创建和管理文件夹、以及如何使用快捷键提高工作效率。
实验二:Windows系统的网络设置在本实验中,我们学习了Windows系统的网络设置,包括如何连接无线网络、设置网络共享、以及如何配置网络防火墙等。
通过实际操作,我们掌握了Windows系统在网络环境下的使用方法,了解了如何进行网络连接和共享文件,以及如何保护网络安全。
实验三:Windows系统的应用程序在本实验中,我们学习了Windows系统的常用应用程序,包括办公软件、娱乐软件、系统工具等。
通过实际操作,我们掌握了Windows系统中常用应用程序的使用方法,了解了如何使用Word进行文字处理、如何使用Excel进行数据分析、以及如何使用媒体播放器进行音乐和视频播放等。
通过以上实验操作,我们对Windows操作系统有了更深入的了解和掌握,不仅提高了我们的计算机技能,也为我们日常工作和生活带来了便利。
希望通过本报告的总结和分析,能够帮助更多的人更好地掌握Windows操作系统的使用方法,提高工作效率和生活质量。
《操作系统》课程实验报告
《操作系统》课程实验报告一、实验目的本次《操作系统》课程实验的主要目的是通过实际操作和观察,深入理解操作系统的工作原理、进程管理、内存管理、文件系统等核心概念,并掌握相关的操作技能和分析方法。
二、实验环境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)观察并分析在不同的并发情况下,系统的运行结果和资源竞争情况。
Linux网络操作系统课程实验报告3(Vi编辑器)学生
实验序号: 3 实验项目名称: Vi编辑器
学 号
姓 名
专业、班
实验地点
指导教师
实验时间
一、实验目的及要求
1.掌握Linux系统终端方式使用的编辑器vi;
2.学习vi的启动、存盘、文本输入、现有文件的打开;
3.学习使用vi编辑器建立、编辑、显示以及加工处理文本文件。
二、实验设备(环境)及要求
Redhat linux 9.0
三、实验内容与步骤
1.进入和退出vi
<1>进入vi在系统提示符($)下输入命令vi和想要编辑(建立)的文件名(如example),便可进入vi。
#vi example
<2>退出vi
在命令方式下可有几种方法退出vi编辑器:
:wq把编辑缓冲区的内容写到你编辑的文件中,退出编辑器,回到UNIX shell下。
main()
{
int i,sum=0;
for(i=0;i<=100;i++)
{ sum=sum+i; }
printf("\n1+2+3+...+99+100=%d\n",sum); }
[student@enjoy abc]$ gcc -o abc abc.c
[student@enjoy仅当作过修改时才将缓冲区内容写到文件上。
: x与: ZZ相同。
:q!强行退出vi。感叹号(!)告诉vi,无条件退出,丢弃缓冲区内容。这样,先前对该文件所做的修改或输入都被抛弃。
2.新建文件
<1>在LinuX提示符$之后,输入命令: vi myfile,然后按〈Enter〉键。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
步骤4:单击“Build”菜单中的“Compile 31.cpp”命令,并单击“是”按钮确认。系统对3-1.cpp 进行编译。 步骤5:编译完成后,单击“Build”菜单中 的“Build 3-1.exe”命令,建立3-1.exe可执行文件。 操作能否正常进行?如果不行,则可能的原因是 什么? 能 步骤6:在工具栏单击“Execute Program” (执行程 序) 按钮,执行3-1.exe程序。 运行结果 (分行书写。如果运行不成功,则可能的 原因是什么?) : 1) event created 2) child created 3) Parent waitichild processng on child. 4) beginning…… 5) event signaled
API名称 CreateEvent() OpenEvent() SetEvent() ResetEvent() PulseEvent() 表3-1 用于管理事件对象的API 描述 在内核中创建一个新的事件对象。此函数允许有安全性 设置、手工还是自动重置的标志以及初始时已接受还是未 接受信号状态的标志 创建对已经存在的事件对象的引用。此API函数需要名 称、继承标志和所需的访问级别 将手工重置事件转化为已接受信号状态 将手工重置事件转化为非接受信号状态 将自动重置事件对象转化为已接受信号状态。当系统释 放所有的等待它的线程时此种转化立即发生
源的线程应该在实际执行操作之前获得互斥体, 而在访问结束时立即释放互斥体,以允许下一个 等待线程获得互斥体,然后接着进行下去。 与事件对象类似,互斥体容易创建、打开、使用 并清除。利用CreateMutex() API可创建互斥体, 创建时还可以指定一个初始的拥有权标志,通过 使用这个标志,只有当线程完成了资源的所有的 初始化工作时,才允许创建线程释放互斥体。
在本实验中,通过对事件和互斥体对象的了 解,来加深对Windows 线程同步的理解。 1) 回顾系统进程、线程的有关概念,加深对 Windows 线程的理解。 2) 了解事件和互斥体对象。 3) 通过分析实验程序,了解管理事件对象的 API。 4) 了解在进程中如何使用事件对象。 5) 了解在进程中如何使用互斥体对象。 6) 了解父进程创建子进程的程序设计方法。 工具/准备工作 在开始本实验之前,请回顾教科书的相关内 容。 您需要做以下准备: 1) 一台运行Windows 操作系统的计算机。 2) 计算机中需安装Visual C++ 6.0专业版或企 业版。 实验内容与步骤 1. 事件对象 2. 互斥体对象 1. 事件对象 清单3-1程序展示了如何在进程间使用事件。 父进程启动时,利用CreateEvent() API创建一个命 名的、可共享的事件和子进程,然后等待子进程 向事件发出信号并终止父进程。在创建时,子进
// 向父进程创建的事件发出信号 :: SignalParent() ; } else { // 创建一个事件并等待子进程发出信号 :: WaitForChild() ; :: Sleep(1500) ; std :: cout << "Parent released." << std :: endl ; } return 0; }
// event项目 # include <windows.h> # include <iostream> // 以下是句柄事件。实际中很可能使用共享的包含文件来进行通讯 static LPCTSTR g_szContinueEvent = "w2kdg.EventDemo.event.Continue"; // 本方法只是创建了一个进程的副本,以子进程模式 (由命令行指定) 工作 BOOL CreateChild() { // 提取当前可执行文件的文件名 TCHAR szFilename[MAX_PATH] ; :: GetModuleFileName(NULL, szFilename, MAX_PATH) ; // 格式化用于子进程的命令行,指明它是一个EXE文件和子进程 TCHAR szCmdLine[MAX_PATH] ; :: sprintf(szCmdLine, "\"%s\"child" , szFilename) ; // 子进程的启动信息结构 STARTUPINFO si; :: ZeroMemory(reinterpret_cast<void*>(&si), sizeof(si)) ; si.cb = sizeof(si); // 必须是本结构的大小 // 返回的子进程的进程信息结构 PROCESS_INFORMATION pi;
为了获得互斥体,首先,想要访问调用的线 程可使用OpenMutex() API来获得指向对象的句 柄;然后,线程将这个句柄提供给一个等待函 数。当内核将互斥体对象发送给等待线程时,就 表明该线程获得了互斥体的拥有权。当线程获得 拥有权时,线程控制了对共享资源的访问——必 须设法尽快地放弃互斥体。放弃共享资源时需要 在该对象上调用ReleaseMute() API。然后系统负 责将互斥体拥有权传递给下一个等待着的线程 (由 到达时间决定顺序) 。 实验目的
// 使用同一可执行文件和告诉它是一个子进程的命令行创建进程 BOOL bCreateOK = :: CreateProcess( szFilename, // 生成的可执行文件名 szCmdLine, // 指示其行为与子进程一样的标志 NULL, // 子进程句柄的安全性 NULL, // 子线程句柄的安全性 FALSE, // 不继承句柄 0, // 特殊的创建标志 NULL, // 新环境 NULL, // 当前目录 &si, // 启动信息结构 &pi ) ; // 返回的进程信息结构 // 释放对子进程的引用 if (bCreateOK) { :: CloseHandle(pi.hProcess); :: CloseHandle(pi.hThread); } return(bCreateOK) ; } // 下面的方法创建一个事件和一个子进程,然后等待子进程在返回前 向事件发出信号 void WaitForChild() { // create a new event object for the child process // to use when releasing this process HANDLE hEventContinue = :: CreateEvent( NULL, // 缺省的安全性,子进程将具有访问权限 TRUE, // 手工重置事件 FALSE, // 初始时是非接受信号状态 g_szContinueEvent); // 事件名称 if (hEventContinue!=NULL) { std :: cout << "event created " << std :: endl; // 创建子进程 if (:: CreateChild(ed the envent signaling from child 7) Parent released. 这个结果与你期望的一致吗?(从进程并发的角度 对结果进行分析) 阅读和分析程序3-1,请回答: 1) 程序中,创建一个事件使用了哪一个系统函 数?创建时设置的初始信号状态是什么? a. CreateEvent()函数 b. FALSE代表无信号状态 2) 创建一个进程 (子进程) 使用了哪一个系统函 数? CreateChild()函数中的CreateProcess()API函数 3) 从步骤6的输出结果,对照分析3-1程序,可以 看出程序运行的流程吗?请简单描述: 1.Main()检查父进程或子进程是否启动,选择相应 入口. 2.进入waitforchild(),创建事件 3.创建进程CreateChild()并一直等待直到子进程发 出信号 4.子进程完成创建进入SingnalParent()函数,打开 句柄向父进程传出信号 5.清除句柄 2. 互斥体对象 清单3-2的程序中显示的类CCountUpDown使 用了一个互斥体来保证对两个线程间单一数值的 访问。每个线程都企图获得控制权来改变该数
程通过OpenEvent() API打开事件对象,调用 SetEvent() API使其转化为已接受信号状态。两个 进程在发出信号之后几乎立即终止。 步骤1:登录进入Windows 。 步骤2:在“开始”菜单中单击“程 序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。 步骤3:在工具栏单击“打开”按钮,在“打 开”对话框中找到并打开实验源程序3-1.cpp。 清单3-1 创建和打开事件对象在进程间传送信号
《操作系统》实验报告 实验序号:03 实验项目名称:并发 与调度 专 学 姓 1103软件工 11071xxx xxx 业、 号 名 程 班级 实验 指导教 时 计—502 徐冬 2013.10.12 地点 师 间 背景知识 Windows 提供的常用对象可分成三类:核心 应用服务、线程同步和线程间通讯。其中,开发 人员可以使用线程同步对象来协调线程和进程的 工作,以使其共享信息并执行任务。此类对象包 括互锁数据、临界段、事件、互斥体和信号等。 多线程编程中关键的一步是保护所有的共享 资源,工具主要有互锁函数、临界段和互斥体 等;另一个实质性部分是协调线程使其完成应用 程序的任务,为此,可利用内核中的事件对象和 信号。 在进程内或进程间实现线程同步的最方便的 方法是使用事件对象,这一组内核对象允许一个 线程对其受信状态进行直接控制 (见表3-1) 。 而互斥体则是另一个可命名且安全的内核对象, 其主要目的是引导对共享资源的访问。拥有单一 访问资源的线程创建互斥体,所有想要访问该资
std :: cout << " chlid created" << std :: endl; // 等待,直到子进程发出信号 std :: cout << "Parent waiting on child." << std :: endl; :: WaitForSingleObject(hEventContinue, INFINITE); :: Sleep(1500); // 删去这句试试 std :: cout << "parent received the envent signaling from child" << std :: endl; } // 清除句柄 :: CloseHandle(hEventContinue); hEventContinue = INVALID_HANDLE_VALUE; } } // 以下方法在子进程模式下被调用,其功能只是向父进程发出终止信 号 void SignalParent() { // 尝试打开句柄 std :: cout << "child process begining......" << std :: endl; HANDLE hEventContinue = :: OpenEvent( EVENT_MODIFY_STATE, // 所要求的最小访问权限 FALSE, // 不是可继承的句柄 g_szContinueEvent); // 事件名称 if (hEventContinue != NULL) { :: SetEvent(hEventContinue); std :: cout << "event signaled" << std :: endl; } // 清除句柄 :: CloseHandle(hEventContinue) ; hEventContinue = INVALID_HANDLE_VALUE; } int main(int argc, char* argv[] ) { // 检查父进程或是子进程是否启动 if (argc>1 && :: strcmp(argv[1] , "child" )== 0) {