Windows核心编程 (1)

来源:互联网 发布:淘宝上两个号会黑吗? 编辑:程序博客网 时间:2024/06/14 16:06
1.通过调用使用CREATE_SUSPENDED标志的CreateProcess或CreateThread函数,可以创建一个暂停的线程。
2.调用ResumeThread函数可以恢复一个线程的运行。
3.任何线程都可以调用SuspendThread函数用来暂停另一个线程的运行(只要拥有线程的句柄)。在实际环境中,调用
SuspendThread时必须小心,因为不知道暂停线程运行时它在进行什么操作。如果线程试图从堆栈中分配内存,那么该线程将在
该堆栈上设置一个锁。当其他线程试图访问该堆栈时,这些线程的访问就被停止,直到第一个线程恢复运行。只有确切知道目标
线程是什么(或者目标线程正在做什么),并且采取强有力的措施来避免因暂停线程的运行而带来的问题或死锁状态,
SuspendThread才是安全的。
4.对于Windows来说,不存在暂停或恢复进程的概念,因为进程从来不会被安排获得CPU时间。为了暂停一个进程,可以采用以下
方法:调用CreateToolhelp32Snapshot函数取得系统的线程的列表,用Thread32First和Thread32Next函数来浏览列表中的线程
,判断线程所在的进程ID是否是要暂停进程的ID,暂停所有属于该进程的线程。然而这方法不能总是运行,原因是当枚举线程组
时,新线程可以被创建和撤消。因此,当我调用CreateToolhelp32Snapshot后,一个新线程可能会出现在目标进程中,我的函数
将无法暂停这个新线程。过了一些时候,当调用SuspendProcess函数来恢复线程的运行时,它将恢复它从未暂停的一个线程的运
行。更糟糕的是,当枚举线程ID时,一个现有的线程可能被撤消,一个新线程可能被创建,这两个线程可能拥有相同的ID。
5.睡眠方式Sleep(DWORD dwMillisenconds);dwMillosconds参数为INFINITE时候表示永远不调度该线程。将0传递给Sleep,调
用线程将释放剩余的时间片,并迫使系统调用另一个线程。
6.BOOL SwitchToThread();当调用这个函数的时候,如果没有线程迫切需要CPU时间,SwitchToThread就会立即返回。如果存
在一个迫切需要CPU时间的线程,SwitchToThread就对该线程进行调度(该线程的优先级可能低于调用SwitchToThread的线程)
。调用SwitchToThread函数与调用Sleep是相似的,并且传递给它一个0ms的超时。差别是SwitchToThread允许优先级较低的线程
运行。即使低优先级线程迫切需要CPU时间,Sleep也能够立即对调用线程重新进行调度。
7.线程的运行时间,可以采用调用两次GetThreadTimes函数两次,求出差值的方法求运行时间间隔。Int64ShllMod32()用来左
移数据位。GetProcessTimes类似GetThreadTimes函数,适用于进程中的所有线程。
然而对于高分辨率来说这两个函数并不完美,windows确实提供了高分辨率性能的函数BOOL QueryPerformanceFrequency
(LARGE_INTEGER* pliFrequency)和BOOL QueryPerformanceCounter(LARGE_INTEGER* pliCount)
8.CONTEXT结构包含了特定处理器的寄存器数据。系统使用CONTEXT结构执行各种内部操作。Windows实际上允许查看线程内核对
象的内部情况,以便抓取它当前的一组CPU寄存器。若要进行这项操作,只需要调用GetThreadContext函数。在调用
GetThreadContext函数之前,应该调用SuspendThread,否则,线程可能被调度,而且线程的环境可能与你收回的不同。一个线
程实际上有两个环境。一个是用户方式,一个是内核方式。GetThreadContext只能返回线程的用户方式环境。如果调用
SuspendThread来停止线程的运行,但是该线程目前正在用内核方式运行,那么,即使SuspendThread实际上尚未暂停该线程的运
行,它的用户方式仍然处于稳定状态。线程在恢复用户方式之前,它无法执行更多的用户方式代码,因此可以放心地将线程视为
处于暂停状态, GetThreadContext函数将能正常运行。同样SetThreadContext用来修改线程的环境。
9.线程的优先级别:每个线程都会被赋予一个从0(最低)到31(最高)的优先级号码。只要优先级为31的线程是可调度的,系
统就绝对不会将优先级为0到30的线程分配给CPU。这种情况称为渴求调度(starvation)。当高优先级线程使用大量的CPU时间
,从而使得低优先级线程无法运行时,便会出现渴求情况。高优先级线程将抢在低优先级线程之前运行,不管低优先级线程正
在运行什么。当系统引导时,它会创建一个特殊的线程,称为0页线程。该线程被赋予优先级0,它是整个系统中唯一的一个在优
先级0上运行的线程。当系统中没有任何线程需要执行操作时,0页线程负责将系统中的所有空闲RAM页面置0。
10.当Microsoft的开发人员设计线程调度程序时,他们发现该调度程序无法在所有时间适应所有人的需要。他们还发现,计算机
的“作用”是不断变化的,随着系统的用途的变化,他们必须不断修改调度算法。但是,软件开发人员需要在今天编写软件,而
Microsoft则要保证软件能够在将来的系统版本上运行。那么Microsoft如何改变系统工作的方式并仍然保证软件能够运行呢?下
面是解决这个问题的一些办法:
• Microsoft没有将调度程序的行为特性完全固定下来。
• Microsoft没有让应用程序充分利用调度程序的特性。
• Microsoft声称调度程序的算法是变化的,在编写代码时应有所准备。
Windows API展示了系统的调度程序上的一个抽象层,这样就永远不会直接与调度程序进行通信。
11.注意,0优先级保留供零页线程使用,系统不允许任何其他线程拥有0优先级。另外,下列优先级等级是无法使用的:17、18
、19、20、21、27、28、29和30。如果编写一个以内核方式运行的设备驱动程序,可以获得这些优先级等级,而用户方式的应用
程序则不能。
12.进程可以调用SetPriorityClass和GetPriorityClass来设置和获得进程的优先级类型,线程可以调用SetThreadPriority和
GetThreadPriority函数来设置和查询线程的相对优先级。
13.当使用命令外壳启动一个程序时,该程序的起始优先级是正常优先级。但是,如果使用Start命令来启动该程序,可以使用一
个开关来设定应用程序的起始优先级。例如,在命令外壳输入下面的命令可使系统启动Calculator,并在开始时按空闲优先级来
运行它:C:/>START /LOW CALC.EXE
14.通过将线程的相对优先级与线程的进程优先级类综合起来考虑,系统就可以确定线程的优先级等级。有时这称为线程的基本
优先级等级。系统常常要提高线程的优先级等级,以便对窗口消息或读取磁盘等I/O事件作出响应。
15.系统只能为基本优先级等级在1至15之间的线程提高其优先级等级。实际上这是因为这个范围称为动态优先级范围。此外,系
统决不会将线程的优先级等级提高到实时范围(高于15)。
16.SetProcessPriorityBoost负责告诉系统激活或停用进行中的所有线程的优先级提高功能,而SetThreadPriorityBoost则让你
激活或停用各个线程的优先级提高功能。
17.另一种情况也会导致系统动态地提高线程的优先级等级。比如有一个优先级为4的线程准备运行但是却不能运行,因为一个优
先级为8的线程正连续被调度。在这种情况下,优先级为4的线程就非常渴望得到CPU时间。当系统发现一个线程在大约3至4s内一
直渴望得到CPU时间,它就将这个渴望得到CPU时间的线程的优先级动态提高到15,并让该线程运行两倍于它的时间量。当到了两
倍时间量的时候,该线程的优先级立即返回到它的基本优先级。
18.The EnableWindow() function enables or disables mouse and keyboard input to the specified window or control.
19.The FindWindow() function retrieves a handle to the top-level window whose class name and window name match
the specified strings.
20.The GetDlgItem() function retrieves the handle of a control in the specified dialog box.
21.The CreateDialog() macro creates a modeless dialog box from a dialog box template resource.
22.The MSG structure contains message information from a thread's message queue.
23.The PeekMessage() function checks a thread message queue for a message and places the message (if any) in the
specified structure.
24.The IsDialogMessage() function determines whether a message is intended for the specified dialog box and, if
it is, processes the message.
25.The wsprintf function formats and stores a series of characters and values in a buffer.
26.TEXT
A Win32 macro that exists so that code can be compiled either as American National Standards Institute (ANSI)
text or as Unicode. For Windows CE, which supports only Unicode, the macro forces the compiler to convert ANSI
characters to Unicode characters.
27.The SetProcessAffinityMask function sets a processor affinity mask for the threads of a specified process.
28.The SetThreadAffinityMask function sets a processor affinity mask for a specified thread.
29.The SetThreadIdealProcessor function is used to specify a preferred processor for a thread. The system
schedules threads on their preferred processors whenever possible.
原创粉丝点击