操作系统实习
更新时间:2023-12-30 03:47:01 阅读量:1 教育文库 文档下载
- 操作系统推荐度:
- 相关推荐
Windows环境下计算机操作系统 ——分析实习
实 习 报 告
专业: 计算机科学与技术教育 年级: 商学院 09级 2班 姓名: 岳小琳 学号: 20098744 提交日期: 2011.11.17
1.1 Windows 2000 系统管理 实验内容与步骤
1、 计算机管理 2、 事件查看器 3、 性能监视 4、 服务
5、 数据库(ODBC)
为了帮助用户管理和监视系统,Windows 2000提供了多种系统管理工具,其中最主要的有计算机管理、事件查看器和性能监视等。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“设置”-“控制面板”命令,双击“管理工具”图标。 在本地计算机“管理工具”组中,有哪些系统管理工具,基本功能是什么:
1) Internet信息服务(IIS)管理器:配置和控制IIS及ASP.NET,并解决所遇到的问题。 2)高级安全 Windows 防火墙:配置为 Windows 计算机提供增强网络安全的策略。 3)数据源(ODBC) :维护 ODBC 数据源和驱动程序。 4)性能监视器:诊断性能问题并收集性能数据。 5)系统配置:执行高级疑难解答和系统配置。 6)计算机管理:管理磁盘以及使用其他系统工具来管理本地或远程计算机。 7)本地安全策略:查看和修改本地安全策略,如用户权限和审核策略。 8)服务:启动、终止并设置 Windows 服务。 9)事件查看器:从窗口和其他程序中查看监视和疑难解答消息。 10)任务计划程序:安排自动运行的任务。 1. 计算机管理
使用“计算机管理”可通过一个合并的桌面工具来管理本地或远程计算机,它将几个Windows 2000管理实用程序合并到一个控制台目录树中,使管理员可以轻松地访问特定计算机的管理属性和工具。
步骤3:在“管理工具”窗口中,双击“计算机管理”图标。
“计算机管理”使用的窗口与“Windows资源管理器”相似。在用于导航和工具选择的控制台目录树中有“系统工具”、“存储”及“服务和应用程序”等节点,窗口右侧“名称”窗格中显示了工具的名称、类型或可用的子工具等。它们是:
1) 系统工具,填入表2-3中。
表2-3 实验记录
名称 类型 描述
任务计划程序 事件查看器 共享文件夹 本地用户和组 系统工具 系统工具 系统工具 系统工具 创建和管理计算机将在所指定的时间自动运行的常见任务。 查看已在计算机上出现的事件。 查看共享的文件夹及会话与打开的文件。 查看和管理使用计算机的用户和组 实时查看性能数据。创建数据收集器集以配置和 性能 系统工具 计划性能计数器、事件跟踪和配置数据收集,以便分析结果和查看报告 设备管理器 系统工具 可以安装和更新硬件设备的驱动程序、更改这些设备的硬件设置以及解决问题。
2) 存储,填入表2-4中。
表2-4 实验记录
名称 类型 描述 可使用此版本的 Windows 中的磁盘管理来执行与磁盘相关的任务,如创建及格式化分区和卷, 磁盘管理 存储 以及分配驱动器号。此外,还可以使用 DiskPart 命令和其他命令行工具执行磁盘管理任务。
3) 服务和应用程序,填入表2-5中。
表2-5 实验记录
名称 Internet信息服务(IIS)管理器 类型 服务和应用程序 描述 Internet 信息服务(IIS)管理器使您可以配置和控制 IIS 及 ASP.NET,并解决所遇到的问题。 可以使用服务 Microsoft 管理控制台 (MMC) 服务 服务和应用程序 管理单元管理在本地或远程计算机上运行的服务,例如,停止或启动服务。也可以使用 sc config 命令管理服务 WMI控件 服务和应用程序 配置和控制Windows Management Instrumentation (WMI)服务
2. 事件查看器
事件查看器不但可以记录各种应用程序错误、损坏的文件、丢失的数据以及其他问题,
而且还可以把系统和网络的问题作为事件记录下来。管理员通过查看在事件查看器中显示的系统信息,可以迅速诊断和纠正可能发生的错误和问题。
步骤4:在“管理工具”窗口中,双击“事件查看器”图标。
在Windows 2000事件查看器中,管理员可以查看到三种类型的本地事件日志,请填入表2-6中。
表2-6 实验记录 名称 应用程序日志 类型 事件查看器 描述 包含由应用程序或程序记录的事件。 包含诸如有效和无效的登录尝试等事件,以及与资源使用相安全性 事件查看器 关的事件,如创建、打开或删除文件或其他对象。管理员可以指定在安全日志中记录什么事件。 系统 事件查看器 包含 Windows 系统组件记录的事件。 512.0KB 64.0KB 当前大小 512.0KB
步骤5:在事件查看器中观察“应用程序日志”:
本地计算机中,共有 15273 个应用程序日志事件。
步骤6:单击“查看”菜单中的“筛选”命令,系统日志包括的事件类型有: 1) 信息 2) 错误 3) 警告 4) 成功审核 5) 失败审核 3. 性能监视
“性能”监视工具通过图表、日志和报告,使管理员可以看到特定的组件和应用进程的资源使用情况。利用性能监视器,可以测量计算机的性能,识别以及诊断计算机可能发生的错误,并且可以为某应用程序或者附加硬件制作计划。另外,当资源使用达到某一限定值时,也可以使用警报来通知管理员。
步骤7:在“管理工具”窗口中,双击“性能”图标。 “性能”窗口的控制台目录树中包括的节点有:
1) 系统监视器 2) 性能日志和警报 ,其中的子节点填入表2-7中。
表2-7 实验记录
名称 计数器日志 跟踪日志 警报 提供有关系统性能的度量数据 提供有关活动和系统事件的信息 警报信息 描述
4. 服务
步骤8:在“管理工具”窗口中,双击“服务”图标。
在你的本地计算机中,管理着 166 个系统服务项目。
通过观察,重点描述你所感兴趣的5个系统服务项目: 1) IP Helper:使用 IPv6 转换技术(6to4、ISATAP、端口代理和 Teredo)和 IP-HTTPS 提供隧道连接。如果停止该服务,则计算机将不具备这些技术提供的增强连接优势。
2) World Wide Web Publishing Service:通过 Internet 信息服务管理器提供 Web 连接和管理。
3) Encrypting File System (EFS):提供用于在 NTFS 文件系统卷上存储加密文件的核心文件加密技术。如果停止或禁用此服务,则应用程序将无法访问加密的文件。
4) COM+ System Application:管理基于组件对象模型 (COM+) 的组件的配置和跟踪。如果停止该服务,则大多数基于 COM+ 的组件将不能正常工作。如果禁用该服务,则任何明确依赖它的服务都将无法启动。
5) Portable Device Enumerator Service:强制可移动大容量存储设备的组策略。使应用程序(如 Windows Media Player 和图像导入向导)能够使用可移动大容量存储设备传输和同步内容。 5. 数据源 (ODBC)
ODBC,即开放数据库连接。通过ODBC可以访问来自多种数据库管理系统的数据。例如,ODBC数据源会允许一个访问SQL数据库中数据的程序,同时访问Visual FoxPro数据库中的数据。为此,必须为系统添加称为“驱动程序”软件组件。
步骤9:在“管理工具”窗口中,双击“数据源 (ODBC) ”图标,打开“ODBC数据源管理器”对话框,请描述其中各选项卡的功能,填入表2-8中。
表2-8 实验记录
选项卡 用户DSN 功能描述 添加、删除或设置带有用户数据源名称 (DSN) 的数据源。这些数据源是计算机的本地数据源,只能由当前用户访问。 可以添加、删除或设置带有系统数据源名称 (DSN) 的数据源。这些数据源 系统DSN 是计算机的本地数据源,但不是用户专有数据源。任何具有正确权限的用户都可以访问系统 DSN。 可以添加、删除或设置基于文件的数据源,这些数据源可以在安装了相同驱 文件DSN 动程序的所有用户间共享。这些数据源不必是用户专有的数据源或计算机的本地数据源。 驱动程序 显示有关计算机上安装的 ODBC 驱动程序的信息。不能从此选项卡执行任何操作。必须使用特定的驱动程序设置程序以添加或删除 ODBC 驱动程序。 指定 ODBC 驱动程序管理器跟踪对 ODBC 函数的调用的方式。跟踪由跟踪 跟踪 DLL 执行,它捕获驱动程序管理器和应用程序或驱动程序间的调用,然后将它们记录在日志文件中。 连接池允许 ODBC 应用程序重复使用连接池的连接。使用此选项卡可以在使 连接池 用连接池时更改选定驱动程序的连接重试等待时间和超时期限(以秒为单位)。还可以启用和禁用记录了很多连接统计信息的性能监视。
2.1 Windows 2000编程 实验内容与步骤
1、 简单的控制台应用程序 2、 GUI应用程序 3、 进程对象
1. 简单的控制台应用程序
创建一个名为“Hello,World”的应用程序。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将清单3-l中的程序键入记事本中,并把代码保存为Hello.cpp。
清单3-1 一个简单的Windows 2000控制台应用程序
# include
void main() {
std::cout << “Hello, Windows 2000” << std :: endl ; }
步骤3:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入Windows“命令提示符”窗口,并利用简单的标准命令行:
C:\\> CL Hello.cpp
来创建可执行的Hello.EXE。
操作能否正常进行?如果不行,则可能的原因是什么? 能够正常执行。应该在命令行中首先运行VCVARS32.BAT 命令如下: C:\\Program Files\\Microsoft Visual Studio\\VC98\\Bin>VCVARS32.BAT
然后运行命令成功,成功生成Hello.exe
步骤4:运行Hello.EXE程序,产生用户键入的一行文字。 运行结果 (如果运行不成功,则可能的原因是什么?) :
运行命令成功 输出结果:hello,windows 2000 2. GUI应用程序
在下面的实验中,C++ 编译器创建一个GUI应用程序,代码中包括了WinMain() 方法,这是GUI类型的应用程序的标准入口点。
步骤5:在“开始”菜单中单击“程序”-“附件”-“记事本”命令,将清单3-2中的程序键入记事本中,并把代码保存为3-2.cpp。
清单3-2 Windows 2000的GUI应用程序
步骤6:在“命令提示符”窗口运行CL.EXE,产生3-2.EXE文件: C:\\> CL 3-2.cpp
在清单3-2的GUI应用程序中,首先需要Windows.h头文件,以便获得传送给WinMain() 和MessageBox() API函数的数据类型定义。
接着的pragma指令指示编译器/连接器找到User32.LIB库文件并将其与产生的EXE文件连接起来。这样就可以运行简单的命令行命令CL MsgBox.CPP来创建这一应用程序,如果没有pragma指令,则MessageBox() API函数就成为未定义的了。
这一指令是Visual Studio C++ 编译器特有的。
接下来是WinMain() 方法。其中有四个由实际的低级入口点传递来的参数。hInstance参数用来装入与代码相连的图标或位图一类的资源,无论何时,都可用GetModuleHandle() API函数将这些资源提取出来。系统利用实例句柄来指明代码和初始的数据装在内存的何处。句柄的数值实际上是EXE文件映像的基地址,通常为0x00400000。下一个参数hPrevInstance是为向后兼容而设的,现在系统将其设为NULL。应用程序的命令行 (不包括程序的名称) 是lpCmdLine参数。另外,系统利用nCmdShow参数告诉应用程序如何显示它的主窗口 (选项包括最小化、最大化和正常) 。
最后,程序调用MessageBox() API函数并退出。如果在进入消息循环之前就结束运行的话,最后必须返回0。
运行结果 (试将其中的信息与清单3-1程序的运行结果进行比较) : 运行结果如下: C:\\Program Files\\Microsoft Visual Studio\\VC98\\Bin>CL 1-2.cpp Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. 3-2.cpp
Microsoft (R) Incremental Linker Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved . /out:3-2.exe
3-2.obj 运行3-2.exe 3. 进程对象
操作系统将当前运行的应用程序看作是进程对象。利用系统提供的惟一的称为句柄 (HANDLE) 的号码,就可与进程对象交互。这一号码只对当前进程有效。
本实验表示了一个简单的进程句柄的应用。在系统中运行的任何进程都可调用GetCurrentProcess() API函数,此函数可返回标识进程本身的句柄。
然后就可在Windows需要该进程的有关情况时,利用这一句柄来提供。
步骤7:将清单3-3.cpp程序键入记事本中,并把代码保存为3-3.cpp。
清单3-3中列出的是一种获得进程句柄的方法。对于进程句柄可进行的惟一有用的操作是在API调用时,将其作为参数传送给系统,正如清单3-3中对GetPriorityClass() API函数的调用那样。在这种情况下,系统向进程对象内“窥视”,以决定其优先级,然后将此优先级返回给应用程序。
OpenProcess() 和CreateProcess() API函数也可以用于提取进程句柄。前者提取的是已经存在的进程的句柄,而后者创建一个新进程,并将其句柄提供出来。
步骤8:在“命令提示符”窗口运行CL.EXE,产生3-3.EXE文件:
C:\\> CL 3-3.cpp
输出结果: Current process priority:normal
步骤9:将清单3-4.cpp程序键入记事本中,并把代码保存为3-4.cpp。
清单3-4显示如何找出系统中正在运行的所有进程,如何利用OpenProcess() API函数来获得每一个访问进程的进一步信息。
清单3-4 利用句柄查出进程的详细信息
清单3-4程序首先利用Windows 2000的新特性,即工具帮助库来获得当前运行的所有进程的快照。然后应用程序进入快照中的每一个进程,得到其以PROCESSENTRY32结构表示的属性。这一结构用来向OpenProcess() API函数提供进程的ID。Windows跟踪每一进程的有关时间,示例中是通过打开的进程句柄和GetProcessTimes() API来直询得到有关时间的。接下来,一个定制的帮助函数取得了几个返回的数值,然后计算进程在内核模式下消耗的时间占总时间的百分比。程序的其余部分比较简单,只是将有关信息显示给用户,清除进程句柄,然后继续循环,直到所有进程都计算过为止。
步骤10:在“命令提示符”窗口运行CL.EXE,产生3-4.EXE文件: C:\\> CL 3-4.cpp
运行结果:
C:\\Program Files\\Microsoft Visual Studio\\VC98\\Bin>CL 3-4.cpp Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved. 3-4.cpp Microsoft (R) Incremental Linker Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. /out:3-4.exe 3-4.obj
Windows 2000进程的“一生”
实验内容与步骤:
1、创建进程
2、正在运行的进程 3、终止进程
1. 创建进程
本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程ID和它在进程列表中的位置。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-5.cpp。
清单3-5 创建子进程
步骤4:单击“Build”菜单中的“Compile 3-5.cpp”命令,系统显示: This build command requires an active project workspace. Would you like to create a default project workspace ? ( build命令需要一个活动的项目工作空间。你是否希望建立一个缺省的项目工作空间?)
单击“是”按钮确认。系统对3-5.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build 3-5.exe”命令,建立3-5.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
不能正常运行:屏幕一直在闪烁。 原因:在错误的情况下,闪屏的ID一直是0,也就是说 if (nClone < c_nCloneMax) { // 发送新进程的命令行和克隆号 StartClone(++nClone) ; } 中的nClone一直为0,导致类似死循环的窗口闪烁。 解决方案: 语句: sprintf(szCmdLine,\有语法错误,将其该为%d
步骤6:在工具栏单击“Execute Program”(执行程序) 按钮,或者按Ctrl + F5键,或者单击“Build”菜单中的“Execute 3-5.exe”命令,执行3-5.exe程序。
步骤7:按Ctrl + S键可暂停程序的执行,按Ctrl + Pause (Break) 键可终止程序的执行。
清单3-5展示的是一个简单的使用CreateProcess() API函数的例子。首先形成简单的命令行,提供当前的EXE文件的指定文件名和代表生成克隆进程的号码。大多数参数都可取缺省值,但是创建标志参数使用了:
________________________________________________________________________ 标志,指示新进程分配它自己的控制台,这使得运行示例程序时,在任务栏上产生许多活动标记。然后该克隆进程的创建方法关闭传递过来的句柄并返回main() 函数。在关闭程序之前,每一进程的执行主线程暂停一下,以便让用户看到其中的至少一个窗口。
CreateProcess() 函数有 10 个核心参数?本实验程序中设置的各个参数的值是: a. LPCTSTR lpApplivationNAME ____________________ b. LPCTSTR lpCommandLine ___________________________ c. LPSECURIITY_ATTRIBUTES lpProcessAttributes _________________ d. LPSECURIITY_ATTRIBUTESlpThreadAttributes ___________________ e. BOOL bInheritHandle __________________ f. DWORD dwCreationFlage ________________________________ g. LPVOID lpEnvironment ________________________________ h. LPCTSTR lpCurrentDirectory _________________________________ i. STARTUPINFO lpStartupInfo j. LPPROCESS_INFORMATION lpProcessInformation
程序运行时屏幕显示的信息是:
Process ID:4944,Clone ID:0_____ __
提示:部分程序在Visual C++环境完成编译、链接之后,还可以在Windows 2000的“命令提示符”状态下尝试执行该程序,看看与在可视化界面下运行的结果有没有不同?为什么?
2. 正在运行的进程
本实验的程序中列出了用于进程信息查询的API函数GetProcessVersion() 与GetVersionEx() 的共同作用,可确定运行进程的操作系统的版本号。
步骤8:在Visual C++ 窗口的工具栏中单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-6.cpp。
清单3-6 使用进程和操作系统的版本信息
步骤9:单击“Build”菜单中的“Compile 3-6.cpp”命令,再单击“是”按钮确认。系统对3-6.cpp进行编译。
步骤10:编译完成后,单击“Build”菜单中的“Build 3-6.exe”命令,建立3-6.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
程序能够正确执行__________________________________________________________ ________________________________________________________________________ 步骤11:在工具栏单击“Execute Program” (执行程序) 按钮,执行3-6.exe程序。
运行结果:
当前PID信息:1104,requires OS:10
当前操作系统版本:Microsoft Windwows XP Professional 5.1.2600 Serivece Pack 3 系统提示信息:Task Manager should now indicate this process is high priority.
清单3-6中的程序向读者表明了如何获得当前的PID和所需的进程版本信息。为了运行这一程序,系统处理了所有的版本不兼容问题。
接着,程序演示了如何使用GetVersionEx() API函数来提取OSVERSIONINFOEX结构。这一数据块中包括了操作系统的版本信息。其中,“OS : 5.0”表示当前运行的操作系统是:
Microsoft Windwows 2000 Professional 清单3-6的最后一段程序利用了操作系统的版本信息,以确认运行的是Windows 2000。代码接着将当前进程的优先级提高到比正常级别高。
步骤12:单击Ctrl + Alt + Del键,进入“Windows任务管理器”,在“应用程序”选项卡中右键单击“3-6”任务,在快捷菜单中选择“转到进程”命令。
在“Windows任务管理器”的“进程”选项卡中,与“3-6”任务对应的进程映像名称是 (为什么?) :
3-6.exe__________________________________________________________________
右键单击该进程名,在快捷菜单中选择“设置优先级”命令,可以调整该进程的优先级,如设置为“高”后重新运行3-6.exe程序,屏幕显示有变化吗?为什么?
有____________________________________________________________________ ________________________________________________________________________
除了改变进程的优先级以外,还可以对正在运行的进程执行几项其他的操作,只要获得其进程句柄即可。SetProcessAffinityMask() API函数允许开发人员将线程映射到处理器上;SetProcessPriorityBoost() API可关闭前台应用程序优先级的提升;而 SetProcessWorkingSet() API可调节进程可用的非页面RAM的容量;还有一个只对当前进程可用的API函数,即SetProcessShutdownParameters() ,可告诉系统如何终止该进程。 3. 终止进程
在清单3-7列出的程序中,先创建一个子进程,然后指令它发出“自杀弹”互斥体去终止自身的运行。
步骤13:在Visual C++ 窗口的工具栏中单击“打开”按钮,在“打开”对话框中找到并打开实验源程序3-7.cpp。
清单3-7 指令其子进程来“杀掉”自己的父进程
清单3-7中的程序说明了一个进程从“生”到“死”的整个一生。第一次执行时,它创建一个子进程,其行为如同“父亲”。在创建子进程之前,先创建一个互斥的内核对象,其行为对于子进程来说,如同一个“自杀弹”。当创建子进程时,就打开了互斥体并在其他线
程中进行别的处理工作,同时等待着父进程使用ReleaseMutex() API发出“死亡”信号。然后用Sleep() API调用来模拟父进程处理其他工作,等完成时,指令子进程终止。
当调用ExitProcess() 时要小心,进程中的所有线程都被立刻通知停止。在设计应用程序时,必须让主线程在正常的C++ 运行期关闭 (这是由编译器提供的缺省行为) 之后来调用这一函数。当它转向受信状态时,通常可创建一个每个活动线程都可等待和停止的终止事件。
在正常的终止操作中,进程的每个工作线程都要终止,由主线程调用ExitProcess()。接着,管理层对进程增加的所有对象释放引用,并将用 GetExitCodeProcess() 建立的退出代码从STILL_ACTIVE改变为在ExitProcess() 调用中返回的值。最后,主线程对象也如同进程对象一样转变为受信状态。
等到所有打开的句柄都关闭之后,管理层的对象管理器才销毁进程对象本身。还没有一种函数可取得终止后的进程对象为其参数,从而使其“复活”。当进程对象引用一个终止了的对象时,有好几个API函数仍然是有用的。进程可使用退出代码将终止方式通知给调用GetExitCodeProcess() 的其他进程。同时,GetProcessTimes() API函数可向主调者显示进程的终止时间。
步骤14:单击“Build”菜单中的“Compile 3-7.cpp”命令,再单击“是”按钮确认。系统对3-7.cpp进行编译。
步骤15:编译完成后,单击“Build”菜单中的“Build 3-7.exe”命令,建立3-7.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
能正确执行________________________________________________
步骤16:在工具栏单击“Execute Program”按钮,执行3-7.exe程序。 运行结果:
1) Create the child process Child waiting for suicide instruction 表示:显示两个窗口:父窗口和子窗口 _________________________________ 2) Telling the child process to quit_________________________________ 表示:等待一段时间之后子进程杀死自身进程_____________________________
步骤17:在熟悉清单3-7源代码的基础上,利用本实验介绍的API函数来尝试改进本程序 (例如使用GetProcessTimes() API函数) 并运行。请描述你所做的工作:
std :: cout << \ :: StartClone() ; :: Sleep(5000) ; std :: cout << \ :: Sleep(5000) ; :: ReleaseMutex(hMutexSuicide) ;
在杀死子进程之前等待一段时间,可以清楚的查看到屏幕显示的信息,即输出Telling the child process to quit.等待一段时间之后杀死子进程。
Windows 2000线程同步 实验内容与步骤
1、 事件对象 2、 互斥体对象 1. 事件对象
清单4-1程序展示了如何在进程间使用事件。父进程启动时,利用CreateEvent() API创建一个命名的、可共享的事件和子进程,然后等待子进程向事件发出信号并终止父进程。在创建时,子进程通过OpenEvent() API打开事件对象,调用SetEvent() API使其转化为已接受信号状态。两个进程在发出信号之后几乎立即终止。
步骤1:登录进入Windows 2000 Professional。
步骤2:在“开始”菜单中单击“程序”-“Microsoft Visual Studio 6.0”–“Microsoft Visual C++ 6.0”命令,进入Visual C++窗口。
步骤3:在工具栏单击“打开”按钮,在“打开”对话框中找到并打开实验源程序4-1.cpp。
清单4-1 创建和打开事件对象在进程间传送信号
步骤4:单击“Build”菜单中的“Compile 4-1.cpp”命令,并单击“是”按钮确认。系统对4-1.cpp进行编译。
步骤5:编译完成后,单击“Build”菜单中的“Build 4-1.exe”命令,建立4-1.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
程序能够正常执行_____________________________________________ ________________________________________________________________________
步骤6:在工具栏单击“Execute Program” (执行程序) 按钮,执行4-1.exe程序。 运行结果 (分行书写。如果运行不成功,则可能的原因是什么?) : 1) event created 2) chlid created
3) Parent waitingc on chhiildl. 4) d process begining...... 5) eparvent erentceived the ensivegnt nsiganlalinge frdom child
6) Parent released.
这个结果与你期望的一致吗?(从进程并发的角度对结果进行分析)
分析可知:在有Sleep(1500);时,主程序会等待子程序1.5s,这样的话子程序先输出,然后主程序再输出。这样的话就不会出现错误。而当去掉:: Sleep(1500);语句之后主程序和字程序同时输出就会出现输出结果重叠的情况,变现为输出结果错误。
阅读和分析程序4-1,请回答:
1) 程序中,创建一个事件使用了哪一个系统函数?创建时设置的初始信号状态是什么?
a)创建事件用CreateEvent()函数
b)CreateEvent( NULL, // 缺省的安全性,子进程将具有访问权限
TRUE,// 手工重置事件,必须用ResetEvent函数来手工将事件的状态复原到无信号状态 FALSE, // 初始时是非接受信号状态,为TRUE,初始状态为有信号状态
g_szContinueEvent); //事件名称,事件的对象的名称,是一个以0结束的字符串指针
2) 创建一个进程 (子进程) 使用了哪一个系统函数?
CreateProcess()_____________ WIN32API函数CreateProcess用来创建一个新的进程和它的主线程,这个新进程运行指定的可执行文件。
3) 从步骤6的输出结果,对照分析4-1程序,可以看出程序运行的流程吗?请简单描述:
2. 互斥体对象
清单4-2的程序中显示的类CCountUpDown使用了一个互斥体来保证对两个线程间单一数值的访问。每个线程都企图获得控制权来改变该数值,然后将该数值写入输出流中。创建者实际上创建的是互斥体对象,计数方法执行等待并释放,为的是共同使用互斥体所需的资源 (因而也就是共享资源) 。
步骤7:在Visual C++ 窗口的工具栏中单击“打开”按钮,在“打开”对话框中找到并打开实验源程序4-2.cpp。
清单4-2 利用互斥体保护共享资源
步骤8:单击“Build”菜单中的“Compile 4-2.cpp”命令,并单击“是”按钮确认。系统对4-2.cpp进行编译。
步骤9:编译完成后,单击“Build”菜单中的“Build 4-2.exe”命令,建立4-2.exe可执行文件。
操作能否正常进行?如果不行,则可能的原因是什么?
程序能够正常执行________________________________________________
步骤10:在工具栏单击“Execute Program”按钮,执行4-2.exe程序。
分析程序4-2的运行结果,可以看到线程 (加和减线程) 的交替执行 (因为Sleep() API允许Windows切换线程) 。在每次运行之后,数值应该返回初始值 (0) ,因为在每次运行之后写入线程在等待队列中变成最后一个,内核保证它在其他线程工作时不会再运行。
1) 请描述运行结果 (如果运行不成功,则可能的原因是什么?) :
程序主要是在互斥信号量的保证下限制两个线程之间对单一数值的访问。程序中用的信号量是m_nAccess,实现对m_nValue的递减。当信号量是1时实现第一个进程对数据的访问,这时候进程无法访问数据,在第一个进程访问结束之后,释放信号量,这样进
程2就可以实现对数据的访问,而进程1则不能继续访问。 2) 根据运行输出结果,对照分析4-2程序,可以看出程序运行的流程吗?请简单描述: thread:2068value:1access:50 thread:2320value:0access:49 thread:2068value:1access:48 thread:2320value:0access:47 thread:2068value:1access:46 thread:2320value:0access:45 thread:2068value:1access:44 thread:2320value:0access:43 thread:2068value:1access:42 thread:2320value:0access:41 thread:2068value:1access:40 ……………. thread:2320value:0access:1 thread:2068value:1access:0






正在阅读:
操作系统实习12-30
装配式建筑监理控制要点06-05
第三届中国黄山七夕情人节活动总体方案01-10
重大不安全事件分析报告制度01-31
建立良好的师幼关系对策研究03-24
贫困生补助申请书(优秀4篇)04-03
计算机组成原理期末考试总复习09-26
2016乡镇意识形态工作情况汇报03-08
QUALITY MANUAL质量手册10-08
让爱与信任创造奇迹07-21
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 实习
- 操作系统
- 规范津补贴自查报告
- XX年小学学校教学管理工作计划
- 常见的二十种植物的养护方法 - 图文
- 人教部编版新起点小学英语六年级上册Unit5-6单元测试及答案
- 冷库制冷系统安装施工方案
- 安全组织设计
- 高中世界地理考试题及参考答案
- 《数字逻辑实验指导书》(2011春修改)
- UPS不间断电源输入输出配电规格表 - 图文
- 120例急诊内科昏迷患者临床分析
- 2019年最新天顿电算化操作步骤精心整理
- 2014年节能减排总结分析报告
- 计算机组成原理复习资料+试题
- 2019年124法制宣传日简报-推荐word版(2页)
- 全国各地高考作文题汇总 - 图文
- 基础会计 期末考试试卷B卷(包括答案)
- 2019最新版医务科个人年度工作总结1
- 公告书之湖南公务员考试公告
- 中央电大机械设计制造及其自动化专业(专升本)毕业设计(论文)大纲
- 2013高考物理鲁科版一轮复习单元测试-能的转化与守恒