APC的执行及执行时机
2023-08-02
51
0
当线程中的ApcListHead链表中不为空时,就表示该线程拥有APC,线程应在合适的时机执行该APC。
每个线程都有自己的 APC 队列。如果线程进入警报状态,它将开始以先进先出 (FIFO) 的形式执行 APC 作业。线程可以通过使用SleepEx、SignalObjectAndWait、MsgWaitForMultipleObjectsEx、WaitForMultipleObjectsEx或WaitForSingleObjectEx函数进入警报状态。
警告状态即Alertable=1
APC执行时机
APC常见的执行时机:
- 线程切换:当当前线程处于阻塞状态,比如等待用户输入或者等待磁盘IO完成时,操作系统可以选择在这个时机执行排队中的 APC。这样可以充分利用线程的等待时间,提高系统的并发性。
- 定时器:操作系统可以设置定时器,在特定的时间间隔或者时间点触发执行 APC。这在处理一些定时任务或者周期性的操作非常有用,比如定时刷新界面、定时发送心跳包等。
- 异步IO完成:当一个异步IO操作完成时,操作系统可以执行与该操作关联的 APC。这样可以在IO操作完成后立即执行后续的处理逻辑,而不需要主动轮询IO状态。
- 信号量和事件:当某个信号量或者事件的状态发生改变时,操作系统可以执行与其关联的 APC。这在实现基于事件驱动的编程模型时非常有用,比如处理鼠标点击、键盘输入等。
- 系统调用返回。
nt!_KTHREAD
...
+0x072 Alerted : [2] UChar
...
+0x074 Alertable : Pos 4, 1 Bit
...
KTHREAD.Alerted表示状态,即如果在等待时被唤醒了,那么就把此位置1。这个位影响了APC是否可以在线程等待的时候执行,如果使用WaitForSingleObjectEx,最后一个参数就是用来填写是否可以被唤醒。
KTHREAD.Alertable表示是否能够唤醒,是否有唤醒的能力,在WaitForSingleObject中,是否可以被APC打断。