《[其它]操作系统大作业终极版.doc》由会员分享,可在线阅读,更多相关《[其它]操作系统大作业终极版.doc(31页珍藏版)》请在三一办公上搜索。
1、 班 级 021031 操作系统大作业设计报告 题 目 操作系统大作业设计报告 学 院 电子工程学院 专 业 信息对抗技术 学生姓名 兰童玲(02103062) 导师姓名 汤建龙老师 实验二:进程压力测试1.实验要求(1)用循环的办法产生所要求的进程(线程),循环的退出条件是不能产生进程时,即CreateProcess()返回0时,统计产生的进程(线程)数目;(2)子进程的运行方式分别考虑:子进程挂起或睡眠,挂起操作在父进程通过CREATE_SUSPENDED选项完成;子进程死循环,即父进程产生子进程后子进程立即执行,并且执行一个死循环(3)在进程被赋予不同的优先级情况下的结果2.实验环境 W
2、indows 7 Dev c+ 6.03.程序代码 / proccreate项目# include # include # include / 创建传递过来的进程的克隆过程并赋于其ID值void StartClone(int nCloneID)/ 提取用于当前可执行文件的文件名TCHAR szFilenameMAX_PATH ;: GetModuleFileName(NULL, szFilename, MAX_PATH) ;/ 格式化用于子进程的命令行并通知其EXE文件名和克隆IDTCHAR szCmdLineMAX_PATH ;: sprintf(szCmdLine, %s %d, szFi
3、lename, nCloneID) ;/ 用于子进程的STARTUPINFO结构STARTUPINFO si;: ZeroMemory(reinterpret_cast (&si) , sizeof(si) ) ;si.cb = sizeof(si) ;/ 必须是本结构的大小/ 返回的用于子进程的进程信息PROCESS_INFORMATION pi;/ 利用同样的可执行文件和命令行创建进程,并赋于其子进程的性质BOOL bCreateOK = : CreateProcess(szFilename,/ 产生这个EXE的应用程序的名称szCmdLine,/ 告诉其行为像一个子进程的标志NULL,/
4、 缺省的进程安全性NULL,/ 缺省的线程安全性FALSE,/ 不继承句柄CREATE_NEW_CONSOLE,/ 使用新的控制台NULL,/ 新的环境NULL,/ 当前目录&si,/ 启动信息&pi) ;/ 返回的进程信息 / 对子进程释放引用if (bCreateOK): CloseHandle(pi.hProcess) ;: CloseHandle(pi.hThread) ;int main(int argc, char* argv )/ 确定进程在列表中的位置int nClone(0) ;if (argc 1)/ 从第二个参数中提取克隆ID: sscanf(argv1 , %d , &
5、nClone) ;/ 显示进程位置std : cout Process ID: : GetCurrentProcessId() , Clone ID: nClone std : endl;/ 检查是否有创建子进程的需要const int c_nCloneMax = 25;if (nClone c_nCloneMax)/ 发送新进程的命令行和克隆号StartClone(+nClone); / 在终止之0前暂停一下 (l/2秒): Sleep(5000000) ; return 0;4.实验截图:运行窗口截图死循环截图 死循环前后系统资源使用变化5.实验结果分析 有截图知压力测试程序前后CPU使用
6、率变化很大,而PF变化很小,说明进程的创建在一定程度讲对CPU的消耗高于PF。实验三:使用互斥对象实现线程同步1.实验要求(1)两个线程对同一个变量进行访问,其中一个线程对变量做加1操作,一个线程对其做减1操作。改变其数值后将该数值写入输出流中。(2)分析:不作同步操作和采用同步操作将分别出现什么现象。2.实验环境 Windows 7 Dev c+ 6.03.程序代码 / mappings项目# include # include / 仲裁访问的互斥体static HANDLE g_hMutexMapping = INVALID_HANDLE_VALUE; / 增加共享内存中的数值的简单线程s
7、tatic DWORD WINAPI ThreadProc(LPVOID lpParam)/ 将参数看作句柄HANDLE hMapping = reinterpret_cast (lpParam) ; / 等待对文件的访问: WaitForSingleObject(g_hMutexMapping, INFINITE) ; / 映射视图LPVOID pFile = : MapViewOfFile(hMapping,/ 保存文件的对象FILE_MAP_ALL_ACCESS,/ 获得读写权限0,/ 在文件的开头处 (高32位) 开始0,/ . (低32位)0) ;/ 映射整个文件if (pFile
8、!= NULL)/ 将数据看作长整数LONG * pnData = reinterpret_cast (pFile) ;/ 改动数据+(* pnData) ;/ 显示新数值std : cout 线程: : GetCurrentThreadId() 数值: (* pnData) 0 ; - nTotal)/ 启动线程HANDLE hThread = : CreateThread(NULL,/ 缺省的安全性0,/ 缺省堆栈ThreadProc,/ 线程函数reinterpret_cast (hMapping) ,/ 增量0,/ 无特殊的创建标志NULL) ;/ 忽略线程id / 等待最后的线程释放
9、if (nTotal = 1)std : cout all threads created, waiting. std : endl;: WaitForSingleObject(hThread, INFINITE) ;: Sleep(500) ;/ 释放指向线程的句柄: CloseHandle(hThread) ;hThread = INVALID_HANDLE_VALUE;/ 关闭对象: CloseHandle(hMapping) ;hMapping = INVALID_HANDLE_VALUE;: CloseHandle(g_hMutexMapping) ;g_hMutexMapping
10、= INVALID_HANDLE_VALUE;4.实验截图:5.结果分析: (1).不同步可能会产生同一时间data的不一致; (2).同步可能会导致死锁。实验五:了解Windows2000内存结构1. 实验要求(1)分析th9.cpp代码,给出实验结果(2)利用GetSystemInfo() API函数还可获得什么信息,请在th9.cpp基础上编程获得2. 实验环境: Windows 7 Dev c+ 6.03.程序代码(1)th9.cpp代码/ 工程vmeminfo# include # include # include # include # pragma comment(lib, s
11、hlwapi.lib) void main()/ 首先获得系统信息SYSTEM_INFO si;: ZeroMemory(&si, sizeof(si) ) ;: GetSystemInfo(&si) ;/ 使用外壳辅助程序对一些尺寸进行格式化TCHAR szPageSize MAX_PATH ;: StrFormatByteSize(si.dwPageSize, szPageSize, MAX_PATH) ;DWORD dwMemSize = (DWORD) si.lpMaximumApplicationAddress -(DWORD) si.lpMinimumApplicationAddr
12、ess;TCHAR szMemSize MAX_PATH ;: StrFormatByteSize(dwMemSize, szMemSize, MAX_PATH) ;/ 将内存信息显示出来std : cout Virtual memory page size: szPageSize std : endl;std : cout.fill (0) ;std : cout Minimum application address: 0x std : hex std : setw(8) (DWORD) si.lpMinimumApplicationAddress std : endl;std : cou
13、t Maximum application address: 0x std : hex std : setw(8) (DWORD) si.lpMaximumApplicationAddress std : endl;std : cout Total available virtual memory: szMemSize std : endl ;4.实验截图:(2)利用GetSystemInfo() API函数还可获得什么信息, 在th9.cpp 基础上编程获得。 1.程序std : cout 处理器体系结构:;switch(si.wProcessorArchitecture)case 9:st
14、d:coutx64 (AMD or Intel)std:endl;break;case 6:std:coutIntel Itanium Processor Family (IPF)std:endl;break;case 0:std:coutx86std:endl;break;case 0xffff:std:coutunknowstd:endl;break;default:std:couterrorstd:endl;std :cout处理器掩码:si.dwActiveProcessorMaskstd:endl;std :cout处理器数目:si.dwNumberOfProcessorsstd:e
15、ndl;std :cout处理器类型:si.dwProcessorTypestd:endl;std :cout虚拟内存空间的粒度:si.dwAllocationGranularitystd:endl;std :cout处理器等级:si.wProcessorLevelstd:endl;std:cout处理器版本:si.wProcessorRevisionstd:endl;2.程序截图:实验六: Windows2000虚拟内存1.实验要求(1)分析th10.cpp,按committed、reserved、free等三种虚拟地址空间分别记录实验数据(2)分析th11.cpp,分析代码中四种分配1G内
16、存的方法2.实验环境 Windows 7 Dev c+ 6.03.实验程序代码/ 工程vmwalker# include # include # include # include # pragma comment(lib, Shlwapi.lib) / 以可读方式对用户显示保护的辅助方法。/ 保护标记表示允许应用程序对内存进行访问的类型/ 以及操作系统强制访问的类型inline bool TestSet(DWORD dwTarget, DWORD dwMask) return (dwTarget & dwMask) = dwMask) ;# define SHOWMASK(dwTarget,
17、 type) if (TestSet(dwTarget, PAGE_#type) ) std : cout , #type; void ShowProtection(DWORD dwTarget) SHOWMASK(dwTarget, READONLY) ; SHOWMASK(dwTarget, GUARD) ; SHOWMASK(dwTarget, NOCACHE) ; SHOWMASK(dwTarget, READWRITE) ; SHOWMASK(dwTarget, WRITECOPY) ; SHOWMASK(dwTarget, EXECUTE) ; SHOWMASK(dwTarget,
18、 EXECUTE_READ) ; SHOWMASK(dwTarget, EXECUTE_READWRITE) ; SHOWMASK(dwTarget, EXECUTE_WRITECOPY) ; SHOWMASK(dwTarget, NOACCESS) ; / 遍历整个虚拟内存并对用户显示其属性的工作程序的方法void WalkVM(HANDLE hProcess) / 首先,获得系统信息 SYSTEM_INFO si; : ZeroMemory(&si, sizeof(si) ) ; : GetSystemInfo(&si) ; / 分配要存放信息的缓冲区 MEMORY_BASIC_INFOR
19、MATION mbi; : ZeroMemory(&mbi, sizeof(mbi) ) ; / 循环整个应用程序地址空间 LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress; while (pBlock si.lpMaximumApplicationAddress) / 获得下一个虚拟内存块的信息 if (: VirtualQueryEx( hProcess,/ 相关的进程 pBlock, / 开始位置&mbi, / 缓冲区 sizeof(mbi)=sizeof(mbi) )/ 大小的确认 / 计算块的结尾及其大小 LPCVOID
20、 pEnd = (PBYTE) pBlock + mbi.RegionSize;TCHAR szSizeMAX_PATH; : StrFormatByteSize(mbi.RegionSize, szSize, MAX_PATH) ;/ 显示块地址和大小 std : cout.fill (0) ; std : cout std : hex std : setw(8) (DWORD) pBlock - std : hex std : setw(8) (DWORD) pEnd (: strlen(szSize)=7? ( : () szSize ) ;/显示块的状态 switch(mbi.Stat
21、e)case MEM_COMMIT:std : cout Committed ;break;case MEM_FREE:std : cout Free ;break;case MEM_RESERVE:std : cout Reserved ;break;/ 显示保护if (mbi.Protect=0 & mbi.State!=MEM_FREE) mbi.Protect=PAGE_READONLY; ShowProtection(mbi.Protect);/ 显示类型 switch (mbi.Type)case MEM_IMAGE:std : cout , Image ;break;case M
22、EM_MAPPED:std : cout , Mapped ;break;case MEM_PRIVATE:std : cout 0) / 实际使用的缓冲区大小 / 除去路径并显示 : PathStripPath(szFilename) ; std : cout , Module: szFilename; std : cout std : endl;/ 移动块指针以获得下一下个块pBlock = pEnd; void main()/ 遍历当前进程的虚拟内存:WalkVM(:GetCurrentProcess();(2)/ 工程largealloc# include # include / 尝试
23、以指定长度的零数字填充内存块的简便方法void FillZero(LPVOID pBlock, DWORD dwSize)_tryBYTE* arFill = (BYTE *) pBlock;for (DWORD dwFill = 0; dwFill dwSize; +dwFill)arFill dwFill = 0; std : cout Memory zeroed. std : endl;_except(EXCEPTION_EXECUTE_HANDLER)std : cout Could not zero memory. std : endl;void main()/ 简单的常数DWORD
24、 c_dwGigabyte = 1 30;DWORD c_dwMegabyte = 1 20;/ 使用内存分配来获得1GB块LPVOID pBlock = : malloc(c_dwGigabyte) ;: FillZero (pBlock, c_dwMegabyte) ;: free(pBlock) ;/ 使用虚拟分配以获得物理1GB块LPVOID pBlock = : VirtualAlloc(NULL,/ 不指定起始地址c_dwGigabyte,/ 要求1GBMEM_COMMIT, / 调配物理存储PAGE_READWRITE) ;/ 对此的读写操作: FillZero(pBlock,
25、c_dwMegabyte) ;: VirtualFree(pBlock, 0, MEM_RELEASE) ;/ 使用虚拟分配以获得虚拟1GB块LPVOID pBlock = : VirtualAlloc(NULL,/ 不指定起始地址c_dwGigabyte,/ 要求1GBMEM_RESERVE,/ 不调配物理存储PAGE_READWRITE) ;/ 对此的读写操作: FillZero(pBlock, c_dwMegabyte) ;: VirtualFree(pBlock, 0, MEM_RELEASE) ;/ 使用虚拟分配调配获得虚拟1GB块,再为其调配1MB物理存储LPVOID pBlock = : VirtualAlloc(NULL,/ 不指定起始地址c_dwGigabyte,/ 要求1GBMEM_RESERVE,/ 不调配物理存储 PAGE_READWRITE) ;/ 对此的读写操作: VirtualAlloc(pBlock,c_dwMegabyte,MEM_COMMIT,PAGE_READWRITE) ;: FillZero(pBlock, c_dwMegabyte) ;: VirtualFree(pBlock, 0, MEM_RELEASE) ;4.实验截图: 直接内存分配时系统的负荷 31 / 31