西电操作系统大作业
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
DWORD dwPriority=::GetPriorityClass(hProcess);
// 消除句柄
:: CloseHandle(hProcess);
std::cout<< "\n进程名称:"<<left<<setw(20)<<pe.szExeFile<<"进程 ID:"<<left<<setw(10)<<pe.th32ProcessID<<"进程优先权:" <<left<<setw(10);//打印进程名称、ID及优先权
ULONGLONG qwUser=(((ULONGLONG) ftUser.dwHighDateTime)
<<32)+ftUser.dwLowDateTime;
// 将消耗时间相加,然后计算消耗在内核模式下的时间百分比
ULONGLONG qwTotal = qwKernel + qwUser;
DWORD
// 提取用于当前可执行文件的文件名 TCHAR szFilename[MAX_PATH] ; :: GetModuleFileName(NULL, szFilename, MAX_PATH) ;
// 格式化用于子进程的命令行并通知其EXE文件名和克隆ID TCHAR szCmdLine[MAX_PATH] ; :: sprintf(szCmdLine, "\"%s\" %d", szFilename, nCloneID) ;
// 解除程序释放对对象的引用 virtual ~CCountUpDown() {
:: CloseHandle(m_hThreadInc) ; :: CloseHandle(m_hThreadDec) ; :: CloseHandle(m_hMutexValue) ; }
switch(dwPriority) { case HIGH_PRIORITY_CLASS:
std :: cout << "High"; break; case NORMAL_PRIORITY_CLASS: std :: cout << "Normal"; break; case IDLE_PRIORITY_CLASS: std :: cout << "Idle"; break; case REALTIME_PRIORITY_CLASS: std :: cout << "Realtime"; break; default: std :: cout << "<unknown>"; break; } std::cout<<std::endl; }
<< ", Clone ID: " << nClone << std :: endl;
// 检查是否有创建子进程的需要 const int c_nCloneMax=50; if (nClone < c_nCloneMax) {
// 发送新进程的命令行和克隆号 StartClone(++nClone); } // 在终止之前暂停一下 (l/2秒) :: Sleep(500) ; return 0; }
NULL,
// 缺省的安全性
0,
// 缺省堆栈
IncThreadProc, // 类线程进程
reinterpret_cast <LPVOID> (this) , // 线程参数
0,
// 无特殊的标志
NULL) ;
// 忽略返回的id
m_hThreadDec = :: CreateThread(
NULL,
PROCESSENTRY Y
N
是否是最后 一个进程 获取快照句柄
开始 获取首个进程的
输出进程名称、ID与优先级
结束 获取下一进程的 PROCESSENTRY
3、 API函数使用说明
CreateToolhelp32Snapshot():获得系统中正在运行的进程的快照 OpenProcess():提取已经存在进程的句柄 GetPriorityClass():获取进程的优先权 CloseHandle():消除句柄
3、 API函数使用说明
GetModuleFileName():提取用于当前可执行文件的文件名 CloseHandle():消除句柄 GetCurrentProcessId():获取当前进程一个唯一的标识符
4、 程序设计及程序代码分析
// proccreate项目 # include <windows.h> # include <iostream> # include <stdio.h> // 创建传递过来的进程的克隆过程并赋于其ID值 void StartClone(int nCloneID) {
实验三
使用互斥对象实现线程同步
2、 设计思路和程序流程
设计思路:两个线程对同一个变量进行访问,其中一个线程对变量做加 1操作,一个线程对其做减1操作。改变其数值后将该数值写入输出流 中。通过CreateMutex创建互斥对象,然后利用同一互斥对象,在某一 时刻只能被一个线程所访问来实现线程之间的来自百度文库步性。
// 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质
BOOL bCreateOK = :: CreateProcess(
szFilename,
// 产生这个EXE的应用程序的名称
szCmdLine,
// 告诉其行为像一个子进程的标志
NULL,
// 缺省的进程安全性
NULL,
// 缺省的线程安全性
提取当前进程
0);
// 如果是当前进程,就将其忽略
//初始化进程入口
PROCESSENTRY32 pe;
:: ZeroMemory(&pe,sizeof(pe));
pe.dwSize=sizeof(pe);
// 按所有进程循环
BOOL bMore=::Process32First(hSnapshot, &pe);
// 用于子进程的STARTUPINFO结构
STARTUPINFO si;
:: ZeroMemory(reinterpret_cast <void*> (&si) , sizeof(si) ) ;
si.cb = sizeof(si) ;
// 必须是本结构的大小
// 返回的用于子进程的进程信息
PROCESS_INFORMATION pi;
5、 实验结果及结果分析
实验结果:
死循环进行中
死循环进行前后CPU使用情况
结果分析:由实验结果知,压力测试前后CPU使用情况变化很大,压力 测试过程中CPU的使用甚至达到峰值,说明大量进程的创建对CPU的消 耗很高。
附录
实验环境:windows7旗舰版Visual C++ 6.0环境
1、 实验目的
FALSE,
// 不继承句柄
CREATE_NEW_CONSOLE, // 使用新的控制台
NULL,
// 新的环境
NULL,
// 当前目录
&si,
// 启动信息
&pi) ;
// 返回的进程信息
// 对子进程释放引用 if (bCreateOK) {
:: CloseHandle(pi.hProcess) ; :: CloseHandle(pi.hThread) ; } }
4、 程序设计及程序代码分析
//实验一
# include <windows.h>
# include <tlhelp32.h>
# include <iostream>
# include <iomanip>
using namespace std;
// 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所
while(bMore)
{
//打开用于读取的进程
HANDLE hProcess = :: OpenProcess(
PROCESS_QUERY_INFORMATION, // 指明要得到的信息
FALSE,
// 不必继承这一句柄
pe.th32ProcessID) ;
// 要打开的进程
if (hProcess!=NULL)
int main(int argc, char* argv[] ) {
// 确定进程在列表中的位置 int nClone(0) ; if (argc > 1) {
// 从第二个参数中提取克隆ID :: sscanf(argv[1] , "%d" , &nClone) ; }
// 显示进程位置 std :: cout << "Process ID: " << :: GetCurrentProcessId()
操作系统大作业
姓名:XXX 学号:02113XXX
实验一
一、实验目的
获得当前系统中正在运行的所有进程的优先级。
2、 设计思路和程序流程
设计思路:通过CreateToolhelp32Snapshot函数获得系统中正在运行的进 程的快照,再通过PROCESSENTRY32结构逐个获取并输出快照中进程 的名称、ID与优先级。 程序流程如下图所示:
public: // 创建者创建两个线程来访问共享值 CCountUpDown(int nAccesses) {
/*
m_hThreadlnc(INVALID_HANDLE_VALUE) ,
m_hThreadDec(INVALID_HANDLE_VALUE) ,
m_hMutexValue(INVALID_HANDLE_VALUE) ,
耗时间的64位计算的帮助方法
DWORD GetKernelModePercentage(const FILETIME & ftKernel, const
FILETIME & ftUser)
{
//将FILETIME结构转化为64位整数
ULONGLONG
qwKernel=(((ULONGLONG)
ftKernel.dwHighDateTime)<< 32)+ftKernel.dwLowDateTime;
*/ m_nValue=0;
m_nAccess=nAccesses;
// 创建互斥体用于访问数值
m_hMutexValue = :: CreateMutex(
NULL,
// 缺省的安全性
TRUE,
// 初始时拥有,在所有的初始化结束时将释放
NULL) ;
// 匿名的
m_hThreadInc = :: CreateThread(
dwPct=(DWORD)
(((ULONGLONG)
100*qwKernel)/qwTotal);
return(dwPct) ;
}
// 以下是将当前运行进程名和消耗在内核模式下的时间百分数都显示出
来的应用程序
void main()
{
// 对当前系统中运行的进程拍取"快照"
HANDLE
hSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, //
// 缺省的安全性
0,
// 缺省堆栈
DecThreadProc, // 类线程进程
reinterpret_cast <LPVOID> (this) , // 线程参数
0,
// 无特殊的标志
NULL) ;
// 忽略返回的id
// 允许另一线程获得互斥体 :: ReleaseMutex(m_hMutexValue) ; }
// 转向下一个进程 bMore=::Process32Next(hSnapshot, &pe); } }
5、 实验结果及结果分析
实验结果如下图所示:
结果分析:实验结果符合实际情况,实验成功。
附录
实验环境:windows7旗舰版Visual C++ 6.0环境
实验二
1、 实验目的
进程压力测试
2、 设计思路和程序流程
设计思路: 1、用循环的办法产生所要求的进程(线程),循环的退出条件是不能
产生进程时,即CreateProcess()返回0时,统计产生的进程(线程)数 目; 2、子进程的运行方式分别考虑: ①子进程挂起或睡眠,挂起操作在父进程通过CREATE_SUSPENDED选 项完成; ②子进程死循环,即父进程产生子进程后子进程立即执行,并且执行一 个死循环; 3、在进程被赋予不同的优先级情况下的结果。
3、 API函数使用说明
ReleaseMutex():释放由线程拥有的一个互斥体 GetCurrentThreadId():获取当前线程一个唯一的线程标识符 WaitForSingleObject():使线程进入等待状态 CreateMutex():创建互斥对象
4、 程序设计及程序代码分析
// mutex项目 # include <windows.h> # include <iostream> # include <iomanip> using namespace std; // 利用互斥体来保护同时访问的共享资源 class CCountUpDown {