大三-下学期os实验windows_第1页
大三-下学期os实验windows_第2页
大三-下学期os实验windows_第3页
大三-下学期os实验windows_第4页
大三-下学期os实验windows_第5页
已阅读5页,还剩97页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Win32系统进程控线程控制与同器管文件系

实验二、三、实验实验实验五、实验1

进程地址空线线每个 创建一个主程主线程执行“main”函 线线程可以创建其他线系统范围地址空2支持多线程进程:创建一个应用程序,将其必须完成的工作划分为多个逻辑小块,由线程来完成。相关的系统调用比3多线程应在与用户交互的同时执 任Word 打印的同时我们仍可以编充分利用多处理在一个有n个处理器的系统中理论n个多线程增加了系统的复杂需在不同线程之间同系统的伸缩性也是一个问4进程的数进程的所有线程共享进程所拥有的数虚地址空页面工作权限控内核对象环境字符命令5线程的数每个线程拥有自己的数用户态堆态堆线程的局 调度状态和优先硬件上下程序计数器,栈指针,通用寄存权6一、进程控7进程控相关API说进程控制创建/结获得当前进程标识挂同步等88相关API函数说返回当前进程的句HANDLE获得进程的基准优先DWORD分 空间,并将其清VOIDZeroMemory(Destination,9获得系统中进程的快照,以枚举所有进CreateToolhelp32Snapshot(dwFlags, 获得快照中第一个进程的信息,存放LPPROCESSENTRY32结构中BOOLProcess32First(HANDLEhSnapshot,LPPROCESSENTRY32lppe)获得快照中下一个进程的信BOOLProcess32Next(HANDLEhSnapshot,LPPROCESSENTRY32lppe)获得一个已经存在的 象的句HANDLEOpenProcess(dwDesiredAccess,bInheritHandle,dwProce 象的 BOOLGetProcessTimes(hProcess,lpCreationTime,lpExitTime,lpKernelTime,lpUserTime);BOOLCloseHandle(HANDLE①一个对象的句柄数就是该对象的使用计数。o使指定的对象句柄无效,减少对象的句柄数。当一个对象的最后一个句柄被关闭后,就被删除掉。②每个进 的句柄表,由本进程内的所有线程使用{TH32CS_SNAPPROCESS,0);PROCESSENTRY32pe;ZeroMemory(&pe,sizeof(pe));bMore=Process32First(hSnapshot,&pe);{//利用句柄获得进程信息ORMATION,FALSE,pe.th32Proce GetProcessTimes bMore=Process32Next(hSnapshot,&pe);}}进程控制进程控制系统调用函数CreatProcess()创建进程TerminateProcess终止进程。通常应用BOOL

指定新进程将使的可执行文LPCSTR

进程、主 象句柄从此返DWORDDWORD一个调用实BOOL szCmdLine=“notepad” //默认的线程 CREAT_NEW_CONSOLE,//使用新的控制台 //当 //启动信息,P234有说明,指向新进程主窗口外&pi //返回进程和主线程句typedefstruct_PROCESS_INFORMATION{HANDLEhProcess; //新进程句柄HANDLEhThread; DWORDdwProce ;//新进程标识符DWORDdwThreadId;//新线程标识符在CreateProcess()返回之前,会将进 句柄说①创建一个新进程,系统会创建一个进程内核对象和一个线程内核对象,它们的初始使用计数为1②在CreateProcess()返回时,又将新进 hThread中,因此新对象的使用计数就为2③为了断绝与新进程的所有联系,接着调用 获得当前进程标识符的函DWORD VOIDSleep(DWORDdwMilliseconds);检索含有给定模块的可执行文件路径DWORDGetModuleFileName(HMODULEhModule,LPTSTRlpFilename,DWORDhModule为NULL时,则返回当前可执行文件的lpFilename返回给定模块的可执行路径和文件名;DWORDHANDLEhHandle, DWORDdwMilliseconds);//超时间隔当下列情况之一发生时该函数返(1)指定对象处于信号态;(2)超DWORDWaitForMultipleObjects( 变为有信号状态,否则,有一个变为有号状态就结束等待dwtimeout);//等待的时实例:创建进程实例:创建进程intmain(intargc,char*argv[ if(argc>1&&strcmp(argv[1Child”)==0 Child(主程序主程序代Parent(}voidParent()hchild=StartClone();//创建一个子进程WaitForSingleObject(hchild,INFINITE);}voidChild()printf(“Childisquiting.\n”); }voidStartClone(){//创建当前进程的克隆进程 LL,szFilename, STARTUPINFOsisi.cb=sizeof(si);//存子进程启sprintf(szCmdLine,“\”%s\”Child”,szFilename);szCmdLine,...,CREATE_NEW_CONSOLE,...,&si,&pi);CloseHandle(pi.hThread);returnpi.hProcess;}二、线程控制与同线程控创建线程的进程通过对象句柄 线程相关的HANDLECreateThread{ dwCreationFlags,lpThreadID);lpStartAddress:指定线程所执行函数的入口地址GetCurrentThreadId():获得当前线程的ExitThread():终止一个线程。当线程的最后一 TerminateThread:通常由父进程调用来终止获得指定线程的退出BOOLGetExitCodeThread(HANDLEhThread,LPWORDlpwdExitCode);SuspendThread(hTread):挂起线ResumeThread(hTread):恢复线系统为每个 建立一个挂起计数每挂起一次计数加,每恢复一次计数减当计数为时,挂起线程就变为就绪线程,准备运行。系统采用可变动态优先级线程调度策略线程优先级可由0~31的整数来表示,31示最高。共32个线程就绪队列获得指定线程的优先int设置指定线程的优先BOOLSetThreadPriority(hThread,实例:创建新线程classHANDLEm_hThread;//线 LPCTSTRm_szName;//显示此线程的名称CWorkerThread(m_szName){m_hThread=CreateThread(NULL,ThreadProc,this,0,}//把对象指针this作为参数传 pThis->DoStuff();return(0);}printf(m_szName,n);m_hThread,}//endclassCWorkerThreadwtA(“A创建线程 pletion();//暂停,直到A完}线程同同步对象主要有:进象、线象、事件对活动 CreateEvent():在内核中创建一个新事件对OpenEvent():打开事件对象并获得对象SetEvent():置人工重置事件为有信号状ResetEvent():置人工重置事件为无信号状PulseEvent():置自动重置事件为有信号状态//创建一个事件对HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,//安全属性,包 权和继承权BOOLbManualReset,//为TRUE表示创建人工重BOOLbInitialState, LPCTSTR //事件对象实例:实例:intmain(intargc,char*argv[if(argc>1&&strcmp(argv[1],//子进程将父进程创建的事件置为有信号状态SignalParent();}else//父进程创建一个事件并等待子进程发信号printf(“Parentprocessreleased.\n”);}//创建事 进程,等待子进程发信voidWaitForChild()

父进程代HANDLEhEventContinue=CreateEvent(NULL,TRUE,FALSE,//初始无信号CreateChild//创建子进WaitForSingleObject(hEventContinue,INFINITE);}BOOLCreateChild()

父进程代 LL,szFilename,MAX_PATH);//提取当前可执行文件名sprintf(szCmdLines\”childszFilename);BOOLbCreateOK=CreateProcess(szFilename,szCmdLine,,&pi);}//在子进程中被调用,向父进程发出终止信voidSignalParent()

子进程代HANDLEhEventContinue=OpenEvent( g_szContinueEvent);//事件名称SetEvent(hEventContinue);//置为有信号状printf(“Childprocessbegining...\n”);CloseHandle(hEventContinue);//清除句柄}线程同步主要目的:控制 临界资源的互拥有互 资源的线程创建互斥 结束时立即释放bInitialOwner,HANDLEOpenMutex(dwDesiredAccess,bInheritHandle,lpName)释放对资源的权,使互斥体变为有信实例:利用互斥体保main()CCountUpDownud(10);pletion();}classintm_nValue0;共享变//构造函数创建两 共享变量的线{//创建互斥体,初始时拥有无信号,IncThreadProc,this,0,NULL);DecThreadProc,this,0,NULL);ReleaseMutex(m_hMutexValue//释放互斥体}IncThreadProc(pThis){ }DecThreadProc(pThis){ DoCountnStep//改变共享资源的方while(m_nAccess>0){//等 共享资WaitForSingleObject(m_nValue+=nStep;--m_nAccess;Sleep(500);ReleaseMutex(m_hMutexValue);}}}~CCountUpDown({CloseHandle(m_hThreadInc);CloseHandle(m_hMutexValue);}pletion(){INFINITE);};//end线程同步 每当一个线程要 资源时,线程就调用数WaitorSingleObjet,信号量对象再次检查其计数,如果有空闲资源就处于有信号状态。HANDLECreateSemaphore(//创建信号量lpSemaphoreAttributes,//NULL表示默认属性 umCount,//信号量的最大值 信号量使用计数器实现同步。每次取信号量时,数器递减;每次释放信号量时,计数器递释放信号量,来增加信号BOOLReleaseSemaphore( lpPreviousCount);//返回信号量原来打开一个已经存 名信号量对HANDLEOpenSemaphore(dwDesiredAccess,bInheritHandle,lpName);实例:用信号量来void g_hSemThreads=CreateSemaphore(NULL,5,5, //创建100个线程,但仅允许5个线程同时活 otal=100;nTotal>0;--{//等待,直到有空位可以创建一个新线程WaitForSingleObject(g_hSemThreadsINFINITE);HANDLEhThread=CreateThread(NULL,0,ThreadProc,nTotal*5,0,NULL); }//endCloseHandle(g_hSemThreads);//关闭信号}//end//线程过程,可暂停,释放信号量并通知操作ThreadProc(lpParam){nPauseMs=lpParam;//新线程的暂停时间 LONG//信号量计数增加1&nPrevCt返回信号量原来的值ReleaseSemaphore(g_hSemThreads1return}三 器管获得系统与内存信息的获得系统与内存信息的获得系统相关信获得指定进程的虚拟地址获得系统性能信获得系统内存信VOIDGetSystemInfo(LPSYSTEM_INFO操作系统中有许多值是由系统所运行的主机决定的,如页面大小和分配粒度等。这些值不应在代码中被写死,可以动态获取。structSYSTEM_INFO{ 页面大

lpMinimumApplicationAddress;最小地址 dwActiveProcessorMask;系统配备的CPU掩码dwNumberOfProcessors;处理机数量 dwAllocationGranularity;分配粒度,如64KBwProcessorLevel;CPU级别,3代表80386 SYSTEM_INFO中字dgeSize:页面的大小。在x86中,该值为地址空间的最小内存地址。在WindowsNT下,检查进程虚存DWORDVirtualQueryEx( 检查指定进程的虚拟内存信息,填充由lpBuffer针指向的MEMORY_BASIC_INFORMATION结构struct{ 包 址的最小页AllocationBase;实际起始地

AllocationProtect;该区域初始设置的方RegionSize;虚存区的大 空闲、预留、提Protect;该区域设置的方式(读写执行)Type;页面类型:可执行映像、内存文实例:检测进程的虚拟地址空void{}WalkVM(hProcess){SYSTEM_INFOsi;ZeroMemory(&si,sizeof(si));MEMORY_BASIC_INFORMATIONZeroMemory(&mbi,sizeof(mbi)); //循环整个私有地址空szFilename,MAX_PATH); 虚存区模块获得系统性能获得系统性能信息DWORDstruct{ 当前线程 获得系统内获得系统内存信息MEMORYSTATUSEX结构体struct{DWORDdwLength; DWORDdwMemoryLoad; DWORDLONGullTotalPhys; DWORDLONG DWORDLONGullTotalPageFile;总页面大DWORDLONGullAvailPageFile;当前进程能获取的最大内存DWORDLONG 当前进程最大内存寻址地DWORDLONG DWORDLONG}VirtualQueryEx():检查进程VirtualAlloc():为进程分配虚VirtualFree():释放进程虚VirtualProtect():改变虚存区的保VirtualLock():将虚存区锁在主例例LPVOIDVirtualAlloc(lpAddress, flAllocationType,flProtect);//待分配区域的起始地址,通常为区域大小;保留或提交;保护属性,读//执例1:pBlock=VirtualAlloc(NULL,99*1024, pBlock=VirtualAlloc(NULL,c_dwGigabyte,MEM_RESERVE,VirtualAlloc(pBlock,c_dwMegabyte,FillZero(pBlock,VirtualFree(pBlock,0,创建或打开文HANDLECreateFile( 类型,如读/ lpSecurityAttributes,//安全属性dwCreationDisposition,//如何创建文件dwFlagsAndAttributes,//属性和标志 CREATE_NE:创建一个新文件,若文件存在则失败OPEN_EXISTING:打开一个已存在的文TRUNCATE_EXITING:用 来开文件,一旦打开文件,就使文件长度为0BReadFile(//从文件指针指示的位置读数据hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,//指向 量的指lpOverlapped); 属 WriteFile(hFile,lpBuffer,lpNumberOfBytesWriten,lpOverlapped);//设置读/写指针的位SetFilePointer(hFile,lDistanceToMove//移动距离的低32位lpDistanceToMoveHigh,//移动距离高32dwMoveMethod);//起始位置指实例:创建12个线程读写文main()for(nTotal=12;nTotal>0;-- ThreadProc10NULL);//创建线WaitForSingleObject(hThreadINFINITE);CloseHandle(hThread);//释放线程句柄}ThreadProc(lpParam){FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);ReadFile(hFile,&nValue,sizeof(nValue),&dwXfer,NULL);//&dwXfer nValue+=nAdd;//增加数据//写之前要重置文件指针,指向文件开头SetFilePointer(hFile,0,NULL,WriteFile(hFile,&nValue,sizeof(nValue),&dwXfer,NULL);} 文 操创 :CreateDirectory(lpszPath,删 获得当 GetCurrentDirectory(ccCurDir,改变当 SetCurrentDirectory获得系 GetSystemDirectory(lpszSysPath,HANDLEFindFirstFile(lpFileName,lpFindFileData); “..\\abc\\*.*”在abc 返回值:如果成功,则返回找到文件 的句柄 typedefstruct_WIN32_FIND_DATA{ FILETIMEftCreationTime;FILETIMEftLastAccessTime;FILETIMEftLastWriteTime; cFileName[MAX_PATH]; cAlternateFileName[14];}BOOLFindNextFile(hFindFile,//hFindFile为FindFirstFile函数返回的BOOLFindClose(hFindFile功能:关闭FindFirstFile创建的搜索句 操作的示利用文 对象实现通 。 实现文 的过用CreateFile()创建或打开一个磁盘文 就可以 主存一 文件完成,用UnMapViewOfFile()解 打开或创建一个文 对HANDLE 文对象的最大长都为0,就用磁盘文件的实际长HANDLEhFile, LPSECURITY_ATTRIBUTESlpAttributes,DWORDflProtect,//读/写保护参数DWORDdw umSizeHigh,文对象的最大长都为0,就用磁盘文件的实际长文件对象的另一个应用是请求系统创在CreateFileMap INVALID_HANDLE_VALUE来代替真的文件句柄,就可以创建一个临时的文打开一个文 对HANDLE DWORDdwDesiredAccess,//存取 BOOLbInheritHandle,//继承标记LPCTSTRlpName); 把文件 LPVOIDHANDLEhFileMap Object,//对象句柄DWORDdwDesiredAccess,//指定 DWORDdwFileOffsetHigh,//文件内 DWORDdwFileOffsetLow,//文件内 SIZE_TdwNumberOfBytesToMap);//文件中要的字节数。用 整个文 对返回值:文 的起始地在当前进程的地址空间中解除对一个文件BOOLLPCVOID返回值:成功返回非零实例:共享内存void{//线程间使用内 文件交换数 =MakeSharedFile();//创建共享内存文件 =CreateMutex(NULL,FALSE, otal=100;nTotal>0;-- //创建100个线程来读HANDLEhThread=CreateThread(NULL,0,ThreadProc,hMap ,0,NULL);if(nTotal==1){//等待最后的线程释放WaitForSingleObject(hThread,INFINITE);}CloseHandle(hThread);//释放线程的句柄}//end }//endHANDLEMakeSharedFile//创建共享内{//创建一个临时文 对HANDLE INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(LONG),NULL); LPVOIDpData=MapViewOfFile(hMap FILE_MAP_ALL_ACCESS,0,0,0); 整个文ZeroMemory(pData,sizeof(LONG));//初始化UnmapViewOfFile(pData); }ThreadProc(lpVOIDlpParam)//线程函{hMap =lpParam; ,INFINITE);//在文 上创建视LPVOIDpFile=MapViewOfFile(hMap FILE_MAP_ALL_ACCESS,0,0,0);LONG*pnData=++(*pnData);//对共享内存中的数增值UnmapViewOfFile(pFile);//释放视图 );//释放互斥}分运行时,程序先创建一个小型的文问权,在文 上创建视图,将其中异步读写文指定读操作完成时所执行的结束函数(线程的 LPOVERLAPPEDlpOverlapped,//指向 pletionRoutine回调函指定写操作完成时所执行的结束函WriteFileEx(hFile,lpBuffer,nNumberOfBytesToWrite,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论