设为首页 收藏本站
查看: 4087|回复: 0

《Windows核心编程》学习笔记(7)– 详解线程

[复制链接]

尚未签到

发表于 2015-5-11 12:50:00 | 显示全部楼层 |阅读模式
线程的挂起和恢复
  DWORDSuspendThread ( HANDLE hThread );   //挂起线程
  DWORDResumeThread ( HANDLE hThread );   //恢复线程
  SuspendThread ResumeThread 都返回之前的挂起计数。
  一个线程最多可以挂起MAXIMUM_SUSPEND_COUNT (WinNT.h中定义为127次)。
  
进程的挂起和恢复
  对于Windows来说,不存在暂停或恢复进程的概念,因为进程从来不会被安排获得cpu时间。
  但是我们可以创建一个函数,用来挂起或者恢复进程中的全部线程,这样就能挂起或者恢复一个进程了。
  参考代码如下:
  #include
  #include
  #include
  //dwProcessID参数为需要挂起或者恢复的进程ID
  // bSuspend参数如果为TRUE就挂起进程,否则恢复进程
  voidSuspendProcess(DWORD dwProcessID, BOOL bSuspend)
  {
           HANDLE hSnapshot =CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID);                    //获得系统内所以线程
           if (hSnapshot != INVALID_HANDLE_VALUE)
           {
                     THREADENTRY32 te;
                     ZeroMemory(&te,sizeof(te));
                     te.dwSize = sizeof(te);
  
                     BOOL bOK =Thread32First(hSnapshot, &te);  

                     for (; bOK; bOK =Thread32Next(hSnapshot, &te))
                     {
                              if(te.th32OwnerProcessID == dwProcessID)          //必须制定,否则程序会尝试挂起系统内所有的线程,就会导致死机
                              {
                                       HANDLEhThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te.th32ThreadID);
                                       if (hThread!= NULL)
                                       {
                                                 if(bSuspend)
                                                 {
                                                          SuspendThread(hThread);
                                                 }
                                                 else
                                                          ResumeThread(hThread);
                                       }
                                       CloseHandle(hThread);
                              }
                     }
           }
           CloseHandle(hSnapshot);
  }
  intmain(void)
  {
           SuspendProcess(9636, FALSE);
           return 0;
  }
  
睡眠
  VOIDSleep (DWORD dwMilliseconds);
  这个函数将使线程自己挂起dwMilliseconds 长的时间。
  1.      调用Sleep,可使线程自愿放弃它剩余的时间片。
  2. 系统将在大约的指定毫秒数内使线程不可调度。不错,如果告诉系统,想睡眠 100ms,那么可以睡眠大约这么长时间,但是也可能睡眠数秒钟或者数分钟。记住,Windows不是个实时操作系统。虽然线程可能在规定的时间被唤醒,但是它能否做到,取决于系统中还有什么操作正在进行。
  3.可以调用Sleep,并且为dwMilliseconds参数传递INFINITE。这将告诉系统永远不要调度该线程。这不是一件值得去做的事情。最好是让线程退出,并还原它的堆栈和内核对象。
  4. 可以将0传递给Sleep。这将告诉系统,调用线程将释放剩余的时间片,并迫使系统调度另一个线程。但是,系统可以对刚刚调用 Sleep的线程重新调度。Sleep(0)是指CPU交出当前线程的执行权,让CPU去执行其他线程。也就是放弃当前线程的时间片,转而执行其他线程
  
切换到另一个线程
  BOOLSwitchToThread (void);
  当调用这个函数的时候,系统要查看是否存在一个迫切需要CPU时间的线程。如果没有线程迫切需要CPU时间,SwitchToThread就会立即返回。如果存在一个迫切需要 CPU时间的线程,SwitchToThread就对该线程进行调度(该线程的优先级可能低于调用 SwitchToThread的线程)。
  这个迫切需要CPU时间的线程可以运行一个时间段,然后系统调度程序照常运行。该函数允许一个需要资源的线程强制另一个优先级较低、而目前却拥有该资源的线程放弃该资源。如果调用SwitchToThread函数时没有其他线程能够运行,那么该函数返回 FALSE,否则返回一个非0值。
  Sleep():时间片只能让给优先级相同或更高的线程;
  SwitchToThread():只要有可调度线程,即便优先级较低,也会让其调度。
  
在实际上下文中谈CONTEXT结构
  CONTEXT结构包括以下部分:
  CONTEXT_CONTROL:包含CPU的控制寄存器,比如指今指针,堆栈指针,标志和函数返回地址..AX, BX, CX, DX, SI, D
     CONTEXT_INTEGER:用于标识CPU的整数寄存器.DS, ES, FS, GS
  CONTEXT_FLOATING_POINT:用于标识CPU的浮点寄存器.
     CONTEXT_SEGMENTS:用于标识CPU的段寄存器.SS:SP, CS:IP, FLAGS, BP
  CONTEXT_DEBUG_REGISTER:用于标识CPU的调试寄存器.  
  CONTEXT_EXTENDED_REGISTERS:用于标识CPU的扩展寄存器I
  CONTEXT_FULL:相当于CONTEXT_CONTROL or CONTEXT_INTEGER or   CONTEXT_SEGMENTS,即这三个标志的组合
  
  
  我们可以使用GetThreadContext函数来查看线程内核对象的内部,并获取当前CPU寄存器状态的集合。
  BOOLGetThreadContext (
  HANDLE  hThread,
  PCONTEXT  pContext)
  若要调用该函数,只需指定一个CONTEXT结构,对某些标志(该结构的ContextFlags成员)进行初始化,指明想要收回哪些寄存器,并将该结构的地址传递给GetThreadContext 。然后该函数将数据填入你要求的成员。
  在调用GetThreadContext函数之前,应该调用SuspendThread,否则,线程可能刚好被调度,这样一来,线程的上下文就和所获取的信息不一致了。
  示例代码如下:  
           CONTEXTContext;                  //定义一个CONTEXT结构
  
           Context.ContextFlags= CONTEXT_CONTROL;    //告诉系统我们想获取线程控制寄存器的内容     
           GetThreadContext(hThread,&Context);      //调用GetThreadContext获取相关信息
  Ps:在调用GetThreadContext函数之前,必须首先初始化CONTEXT结构的ContextFlags成员。
  要获得线程的所有重要的寄存器(也就是微软认为最常用的寄存器),应该像下面一样初始化ContextFlags:
  Context.ContextFlags = CONTEXT_FULL;
  在WinNT. h头文件中,定义了CONTEXT_FULL为CONTEXT_CONTROL | CONTEXT_INTEGER |CONTEXT_SEGMENTS
  
  当然,我们还可以通过调用SetThreadContext函数来改变结构中的成员,并把新的寄存器值放回线程的内核对象中
  BOOLSetThreadContext (
  HANDLE  hThread,
  CONST CONTEXT  *pContext)
  同样,如果要改变哪个线程的上下文,应该先暂停该线程。        
           CONTEXTContext;      //定义一个CONTEXT结构      
           SuspendThread(hThread);  //挂起线程   
           Context.ContextFlags= CONTEXT_CONTROL;   //获取当前上下文的值
           GetThreadContext(hThread,&Context);
  
           Context.Eip= 0x00010000;      //Eip字段存储的是指令指针,现在让指令指针指向地址 0x00010000;
           Context.ContextFlags= CONTEXT_CONTROL;
  
           SetThreadContext(hThread,&Context);   //重新设置线程上下文
  
           ResumeThread(hThread);         //恢复线程,现在线程开始从0x00010000这个地方开始执行指令
  
线程的优先级
  优先级为0的线程:系统启动时,会创建一个优先级为0的“页面清零线程”,它只有在系统中没有其他可调度线程时,才能调度,用来清除内存中的闲置页面。
  优先级在1 ~ 15之间的线程:一般用户模式下,线程的优先级都在该范围。
  优先级在16 ~ 30之间的线程:一般是内核线程。
   http://www.iyunv.com/forlina/archive/2011/08/10/data:image/png;base64,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
  一旦进程运行,便可以通过调用SetPriorityClass来改变自己的优先级
  BOOL SetPriorityClass(
           HANDLE hProcess
           DWORD fdwPriority);
  用来获取进程优先级:
  DWORD GetPriorityClass( HANDLE  hProcess );
  
  设置和获取线程的相对优先级:
  BOOL SetThreadPriority (
           HANDLE hThread,
           Int nPriority);
  Int GetThreadPriority(HANDLE  hThread);
  
  允许或者禁止进程或者线程动态提升自己的优先级:
  BOOL SetProcessPriorityBoost(
           HANDLE  hProcess,
           BOOL  bDisablePriorityBoost);
   BOOLSetThreadPriorityBoost(
           HANDLE  hThread,
           BOOL  bDisablePriorityBoost);
  
  判断当前是不是启用优先级提升:
  BOOL GetProcessPriorityBoost(
           HANDLE  hProcess,
           PBOOL  pbDisablePriorityBoost);
   BOOLGetThreadPriorityBoost(
           HANDLE  hThread,
           PBOOL  pbDisablePriorityBoost);
  
  在多CPU的情况下,我们可以限制某些线程只在可用的cpu的一个子集上运行:
  BOOL SetProcessAffinityMask(
           HANDLE hProcess
           DWORD_PTR dwProcessAffinityMask);
  第一个参数hProcess代表要设置的进程。第二个参数dwProcessAffinityMask是一个位掩码,代表线程可以在哪些CPU上运行。例如,传入0x00000005意味着这个进程中的线程可以在CPU 0 和 CPU 2上运行,但是不能在CPU 1 和 CPU 3~31上运行。
  
  获取进程的关联性掩码:
  BOOL GetProcessAffinityMask(
           HANDLE hProcess
           PDWORD_PTR pdwProcessAffinityMask,
  PDWORD_PTR  pdwSystemAffinityMask);
  设置线程的关联性掩码:
  BOOL SetThreadAffinityMask(
           HANDLE hThread
           DWORD_PTR dwThreadAffinityMask);
  
  有时候强制一个线程只是用特定的某个CPU并不是什么好主意。例如,如果有三个线程都只能使用CPU0,而CPU1,CPU2和CPU3却无所事事。我们想让一个线程运行在一个CPU上,但是同时系统也允许他移到另一个空闲的CPU,那就更好了。要给线程设置一个理想的CPU,可以调用如下:
  DWORD SetThreadIdealProcessor(
           HANDLE  hThread,
           DWORD  dwIdealProcessor);
  hThread用于指明要为哪个线程设置首选CPU。
  dwIdealProcessor函数不是个位掩码,它是个从0到31/63,用于指明供线程希望使用的首选CPU 。可以传递一个MAXIMUM_PROCESSORS的值(在WinNT.h中定义,在32位操作系统中定义为32,64位操作系统中定义为64),表明线程没有理想的CPU。如果没有为该线程设置理想的CPU,那么该函数返回前一个理想的CPU或MAXIMUM_PROCESSORS。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-65849-1-1.html 上篇帖子: Windows Phone 7中Silverlight访问本地数据库的疑问 下篇帖子: Windows文件系统过滤驱动开发教程(7)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表