西电操作系统大作业
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统大作业
学院:电子工程学院
专业:
姓名:
学号:
指导老师:汤建龙
实验一
一、实验目的
获得当前系统中正在运行的所有进程的名称、ID 与优先级
二、设计思路和程序流程
设计思路:通过CreateToolhelp32Snapshot 函数获得系统中正在运行的进程的快照,再通过PROCESSENTRY32结构逐个获取并输出快照中进程的名称、ID 与优先级。
程序流程如下图所示:
N
Y
开始 获取进程快照 CreateToolhelp32Snapshot() 获取首个进程OpenProcess () 输出进程名称、ID 与优先级、内存占用
是否是最后的进
程?
结束
获
取下一个进程的句柄
三、API函数使用说明
CreateToolhelp32Snapshot():获得系统中正在运行的进程的快照
OpenProcess():提取已经存在进程的句柄
GetPriorityClass():获取进程的优先权
CloseHandle():消除句柄
四、程序设计及程序代码分析
//实验一
# include
# include
# include
# include
using namespace std;
// 当在用户模式机内核模式下都提供所耗时间时,在内核模式下进行所耗时间的64位计算的帮助方法
DWORD GetKernelModePercentage(const FILETIME & ftKernel, const FILETIME & ftUser)
{
//将FILETIME结构转化为64位整数
ULONGLONG qwKernel=(((ULONGLONG) ftKernel.dwHighDateTime)<< 32)+ftKernel.dwLowDateTime;
ULONGLONG qwUser=(((ULONGLONG) ftUser.dwHighDateTime)<<32)+ftUser.dwLowDateTime;
// 将消耗时间相加,然后计算消耗在内核模式下的时间百分比
ULONGLONG qwTotal = qwKernel + qwUser;
DWORD dwPct=(DWORD) (((ULONGLONG) 100*qwKernel)/qwTotal);
return(dwPct) ;
}
// 以下是将当前运行进程名和消耗在内核模式下的时间百分数都显示出来的应用程序void main()
{
// 对当前系统中运行的进程拍取"快照"
HANDLE hSnapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, // 提取当前进程
0); // 如果是当前进程,就将其忽略
//初始化进程入口
PROCESSENTRY32 pe;
:: ZeroMemory(&pe,sizeof(pe));
pe.dwSize=sizeof(pe);
// 按所有进程循环
BOOL bMore=::Process32First(hSnapshot, &pe);
while(bMore)
{
//打开用于读取的进程
HANDLE hProcess = :: OpenProcess(
PROCESS_QUERY_INFORMA TION, // 指明要得到的信息
FALSE, // 不必继承这一句柄
pe.th32ProcessID) ; // 要打开的进程
if (hProcess!=NULL)
{
DWORD dwPriority=::GetPriorityClass(hProcess);
// 消除句柄
:: CloseHandle(hProcess);
std::cout<< "\n进程名称:"< 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 << " break; } std::cout< } // 转向下一个进程 bMore=::Process32Next(hSnapshot, &pe); }