操作系统课设详细解答(一)

简介: 操作系统课设详细解答

一、题目一

实验一 Windows 进程管理

二、实验目的

(1)学会使用 VC 编写基本的 Win32 Consol Application(控制台应用程序)。

(2)通过创建进程、观察正在运行的进程和终止进程的程序设计和调试操作,进一步熟悉操作系统的进程概念,理解 Windows 进程的“一生”。

(3)通过阅读和分析实验程序,学习创建进程、观察进程、终止进程以及父子进程同步的基本程序设计方法。

三、总体设计

1.背景知识

Windows 所创建的每个进程都从调用 CreateProcess() API 函数开始,该函数的任务是在对象管理器子系统内初始化进程对象。每一进程都以调用 ExitProcess() 或 TerminateProcess() API 函数终止。通常应用程序的框架负责调用 ExitProcess() 函数。对于 C++ 运行库来说,这一调用发生在应用程序的 main() 函数返回之后。

2.模块介绍

创建进程子进程startClone( )模块,主函数模块,互斥信号量的创建与释放。

3.设计步骤

(1)编写基本的 Win32 Consol Application

步骤 1:登录进入 Windows 系统,启动 VC++ 6.0。

步骤 2:在“FILE”菜单中单击“NEW”子菜单,在“projects”选项卡中选择“Win32 ConsolApplication”,然后在“Project name”处输入工程名,在“Location” 处输入工程目录。创建一个新的控制台应用程序工程。

步骤 3:在“FILE”菜单中单击“NEW”子菜单,在“Files”选项卡中选择“C++ Source File”,然后在“File” 处输入 C/C++源程序的文件名。

步骤 4:将清单 1-1 所示的程序清单复制到新创建的 C/C++源程序中。编译成可执行文件。

步骤 5:在“开始”菜单中单击“程序”-“附件”-“命令提示符”命令,进入 Windows“命令提示符”窗口,然后进入工程目录中的 debug 子目录,执行编译好的可执行程序,列出运行结果(如果运行不成功,则可能的原因是什么?

答:路径不对或者没有编译文件等。

图1-1 一个简单的 Windows 控制台应用程序输出结果

(2)创建进程

本实验显示了创建子进程的基本框架。该程序只是再一次地启动自身,显示它的系统进程 ID和它在进程列表中的位置。

步骤 1:创建一个“Win32 Consol Application”工程,然后拷贝清单 1-2 中的程序,编译成可执行文件。

步骤 2:在“命令提示符”窗口运行步骤 1 中生成的可执行文件,列出运行结果。按下ctrl+alt+del,调用 windows 的任务管理器,记录进程相关的行为属性。

步骤 3:在“命令提示符”窗口加入参数重新运行生成的可执行文件,列出运行结果。按下ctrl+alt+del,调用 windows 的任务管理器,记录进程相关的行为属性。

步骤 4:修改清单 1-2 中的程序,将 nClone 的定义和初始化方法按程序注释中的修改方法进行

修改,编译成可执行文件(执行前请先保存已经完成的工作)。再按步骤 2 中的方式运行,看看结果会有什么不一样。列出行结果。从中你可以得出什么结论?说明 nClone 的作用。 变量的定义和初始化方法(位置)对程序的执行结果有影响吗?为什么?

答:控制程序执行过程,当nClone>5时跳出循环,创建子进程结束;有,在第二次更改中,由于nClone每次都初始化为0,会陷入死循环,不断创建子进程。

图1-2 创建子进程(1)

图1-3 创建子进程(2)

(3)父子进程的简单通信及终止进程

步骤 1:创建一个“Win32 Consol Application”工程,然后拷贝清单 1-3 中的程序,编译成

可执行文件。

步骤 2:在 VC 的工具栏单击“Execute Program”(执行程序) 按钮,或者按 Ctrl + F5 键,或者

在“命令提示符”窗口运行步骤 1 中生成的可执行文件,列出运行结果。

步骤 3:按源程序中注释中的提示,修改源程序 1-3,编译执行(执行前请先保存已经完成的

工作),列出运行结果。在程序中加入跟踪语句,或调试运行程序,同时参考 MSDN 中的帮助文件

CreateProcess()的使用方法,理解父子进程如何传递参数。给出程序执行过程的大概描述。

步骤 4:按源程序中注释中的提示,修改源程序 1-3,编译执行,列出运行结果。

步骤 5:参考 MSDN 中的帮助文件 CreateMutex() 、 OpenMutex() 、 ReleaseMutex() 和WaitForSingleObject()的使用方法,理解父子进程如何利用互斥体进行同步的。给出父子进程同步过程的一个大概描述。

答:CreateMutex() 创建互斥体hMutexSuicide信号、 OpenMutex()打开互斥体、 ReleaseMutex()释放互斥体、WaitForSingleObject()检测Hhandle信号状态,通过这些只允许有一个状态被创建或者使用也就是信号量唯一,实现进程同步。

图1-4父子进程的简单通信及终止进程的示例程序

四、详细设计

  1. 数据结构
    数组、函数调用,父子进程参数的传递、父子进程利用互斥信号进行同步、互斥体的创建、获得、检测与释放、API接口等。
  2. 程序流程图

图1-5 一个简单的 Windows 控制台应用程序流程图

图1-6 创建子进程流程图

图1-7父子进程的简单通信及终止进程的示例程序流程图

3. 关键代码

1-1 一个简单的 Windows 控制台应用程序

#include <windows.h> 
#include <iostream> 
#include <stdio.h>
// hello 项目
# include <iostream> 
void main() 
{ 
 std::cout << “Hello, Win32 Consol Application” << std :: endl ; 
}

1-2 创建子进程

// 创建传递过来的进程的克隆过程并赋于其 ID 值
void StartClone(int nCloneID) 
{ 
 // 提取用于当前可执行文件的文件名
 TCHAR szFilename[MAX_PATH] ; 
 GetModuleFileName(NULL, szFilename, MAX_PATH) ; 
 // 格式化用于子进程的命令行并通知其 EXE 文件名和克隆 ID 
 TCHAR szCmdLine[MAX_PATH]; 
 sprintf(szCmdLine,"\"%s\" %d",szFilename,nCloneID); 
 // 用于子进程的 STARTUPINFO 结构
 STARTUPINFO si; 
 ZeroMemory(&si , sizeof(si) ) ; 
 si.cb = sizeof(si) ; // 必须是本结构的大小
 // 返回的用于子进程的进程信息
 PROCESS_INFORMATION pi; 
 // 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质
 BOOL bCreateOK=::CreateProcess( 
 szFilename, // 产生这个 EXE 的应用程序的名称
 szCmdLine, // 告诉其行为像一个子进程的标志
 NULL, // 缺省的进程安全性
 NULL, // 缺省的线程安全性
 FALSE, // 不继承句柄
 CREATE_NEW_CONSOLE, // 使用新的控制台
 NULL, // 新的环境
 NULL, // 当前目录
 &si, // 启动信息
 &pi) ; // 返回的进程信息
 // 对子进程释放引用
 if (bCreateOK) 
 { 
 CloseHandle(pi.hProcess) ; 
 CloseHandle(pi.hThread) ; 
 } 
} 

1-3 父子进程的简单通信及终止进程的示例程序

// procterm 项目
static LPCTSTR g_szMutexName = "w2kdg.ProcTerm.mutex.Suicide" ; 
// 创建当前进程的克隆进程的简单方法
void StartClone() 
{ 
 // 提取当前可执行文件的文件名
 TCHAR szFilename[MAX_PATH] ; 
 GetModuleFileName(NULL, szFilename, MAX_PATH) ; 
 // 格式化用于子进程的命令行,字符串“child”将作为形参传递给子进程的 main 函数
 TCHAR szCmdLine[MAX_PATH] ; 
//实验 1-3 步骤 3:将下句中的字符串 child 改为别的字符串,重新编译执行,执行前请先保存已经
完成的工作
 sprintf(szCmdLine, "\"%s\"child" , szFilename) ; 
 // 子进程的启动信息结构
 STARTUPINFO si; 
 ZeroMemory(&si,sizeof(si)) ; 
 si.cb = sizeof(si) ; // 应当是此结构的大小
 // 返回的用于子进程的进程信息
 PROCESS_INFORMATION pi; 
 // 用同样的可执行文件名和命令行创建进程,并指明它是一个子进程
 BOOL bCreateOK=CreateProcess( 
 szFilename, // 产生的应用程序的名称 (本 EXE 文件) 
 szCmdLine, // 告诉我们这是一个子进程的标志
 NULL, // 用于进程的缺省的安全性
 NULL, // 用于线程的缺省安全性
 FALSE, // 不继承句柄
 CREATE_NEW_CONSOLE, //创建新窗口
 NULL, // 新环境
 NULL, // 当前目录
 &si, // 启动信息结构
 &pi ) ; // 返回的进程信息
 // 释放指向子进程的引用
 if (bCreateOK) 
 { 
 CloseHandle(pi.hProcess) ; 
 CloseHandle(pi.hThread) ; 
 } 
} 
void Parent() 
{ 
 // 创建“自杀”互斥程序体
 HANDLE hMutexSuicide=CreateMutex(  
 NULL, // 缺省的安全性
 TRUE, // 最初拥有的
 g_szMutexName) ; // 互斥体名称
 if (hMutexSuicide != NULL) 
 { 
 // 创建子进程
 std :: cout << "Creating the child process." << std :: endl; 
 StartClone() ; 
 // 指令子进程“杀”掉自身
 std :: cout << "Telling the child process to quit. "<< std :: endl; 
 //等待父进程的键盘响应
 getchar() ; 
 //释放互斥体的所有权,这个信号会发送给子进程的 WaitForSingleObject 过程
 ReleaseMutex(hMutexSuicide) ; 
 // 消除句柄
 CloseHandle(hMutexSuicide) ; 
 } 
} 

五、实验结果与分析

实验1-1结果分析:修改void成int,然后加上return 0,从main()函数开始,运行输出Hello, Win32 Consol Application。

实验1-2结果分析:从main()函数开始,首先判断argc的值(argc初始值默认为1)因为argc不满足大于1,所以不能将argv[1]赋值给nClone;然后nClone < c_nCloneMax ,则调用StartClone (++nClone)函数,创建子进程;创建子进程后,argc的值变为2,然后将自增的nClone赋值argv[1],然后将继续执行main()函数,直到(nClone >c_nCloneMax),跳出,结束创建新进程。

实验1-3结果分析:从main()函数开始,首先判断argc的值(argc初始值默认为1),决定进行父进程还是子进程,因为argc不满足大于1,所以调用parent()函数,在执行parent()函数过程中调用StartClone() ;然后通过sprintf(szCmdLine, “”%s"child" , szFilename)将argv[1]赋值child,后面满足条件后调用child()函数;由于设置了互斥信号,则只允许一个进程进行,所以只有当父进程释放互斥信号hMutexSuicide时,子进程检测获得才结束进程。

六、小结与心得体会

通过这个实验加深了我对操作系统的进程概念的了解,理解 Windows 进程的“一生”所有进程都是以调用CreateProcess()API函数开始的ExitProcess函数结束的。利用 CreateMutex() API 可创建互斥体,创建时还可以指定一个初始的拥有权标志,通过使用这个标志,只有当线程完成了资源的所有的初始化工作时,才允许创建线程释放互斥体,放弃共享资源时需要在该对象上调用 ReleaseMute() API函数等。


相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
安全 算法 Unix
操作系统课设详细解答(二)
操作系统课设详细解答
28398 0
操作系统课设详细解答(二)
燕山大学操作系统课设:多道程序缓冲区协同操作
燕山大学操作系统课设:多道程序缓冲区协同操作
218 0
燕山大学操作系统课设:多道程序缓冲区协同操作
|
16天前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
38 0
Vanilla OS:下一代安全 Linux 发行版
|
19天前
|
人工智能 安全 Linux
|
4月前
|
安全 Linux 网络安全
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
部署07--远程连接Linux系统,利用FinalShell可以远程连接到我们的操作系统上
|
4月前
|
Linux 虚拟化 数据安全/隐私保护
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
部署05-VMwareWorkstation中安装CentOS7 Linux操作系统, VMware部署CentOS系统第一步,下载Linux系统,/不要忘, CentOS -7-x86_64-DVD
|
1月前
|
Unix 物联网 大数据
操作系统的演化与比较:从Unix到Linux
本文将探讨操作系统的历史发展,重点关注Unix和Linux两个主要的操作系统分支。通过分析它们的起源、设计哲学、技术特点以及在现代计算中的影响,我们可以更好地理解操作系统在计算机科学中的核心地位及其未来发展趋势。
|
3月前
|
编解码 安全 Linux
基于arm64架构国产操作系统|Linux下的RTMP|RTSP低延时直播播放器开发探究
这段内容讲述了国产操作系统背景下,大牛直播SDK针对国产操作系统与Linux平台发布的RTMP/RTSP直播播放SDK。此SDK支持arm64架构,基于X协议输出视频,采用PulseAudio和Alsa Lib处理音频,具备实时静音、快照、缓冲时间设定等功能,并支持H.265编码格式。此外,提供了示例代码展示如何实现多实例播放器的创建与管理,包括窗口布局调整、事件监听、视频分辨率变化和实时快照回调等关键功能。这一技术实现有助于提高直播服务的稳定性和响应速度,适应国产操作系统在各行业中的应用需求。
113 3
|
4月前
|
Linux 测试技术 数据安全/隐私保护
阿里云Linux os copilot 运维助手初体验
阿里云Linux os copilot 初体验
409 1
阿里云Linux os copilot 运维助手初体验
|
4月前
|
弹性计算 运维 自然语言处理
阿里云OS Copilot测评:重塑Linux运维与开发体验的智能革命
阿里云OS Copilot巧妙地将大语言模型的自然语言处理能力与操作系统团队的深厚经验相结合,支持自然语言问答、辅助命令执行等功能,为Linux用户带来了前所未有的智能运维与开发体验。

热门文章

最新文章