【发布时间】:2011-05-08 07:23:34
【问题描述】:
有个问题困扰了我很久。
短版:
Windows 消息循环的工作模式是什么?
详细版本:
当我们启动一个 Windows 应用程序(不是控制台应用程序)时,我们可以通过鼠标或键盘与它进行交互。应用程序从它的消息队列中检索代表我们运动的各种消息。 Windows 负责收集我们的操作并将消息正确地输入此队列。但这种情况不是意味着 Windows 必须无限式地运行吗?
我认为 Windows 调度程序 应该一直在运行。它可能会在预定义的时间间隔被时间中断调用。当调度器被时间中断触发时,它将当前线程切换到下一个待处理线程。单个线程只有在计划运行时才能通过GetMessage() 获取其消息。
我想知道如果只有一个 Windows 应用程序在运行,这个应用程序会不会有更多机会收到它的消息?
更新 - 1(2010 年 11 月 22 日上午 9:59)
这是我的最新发现:
根据
...例如,如果您的进程' 主线程调用 GetMessage() 和 系统发现没有消息 待定,系统暂停您的 porcess 的线程,放弃 线程时间片的剩余部分, 并立即将 CPU 分配给 另一个等待线程。
如果 GetMessage 没有消息显示 检索,进程的主要 线程保持挂起,永远不会 分配给一个 CPU。然而,当一个 消息被放置在线程的 排队,系统知道 线程不应再被挂起 如果没有,则将线程分配给 CPU 更高优先级的线程需要 执行。
我目前的理解是:
为了让系统知道何时将消息放入线程的队列中,我可以想到两种可能的方法:
1 - 集中式方法:系统负责始终检查每个线程的队列。甚至该线程也因缺少消息而被阻止。如果有任何消息可用,系统会将该线程的状态更改为可调度。但在我看来,这种检查可能会给系统带来真正的负担。
2 - 分布式方法:系统不会检查每个线程的队列。当线程调用GetMessage,发现没有消息可用时,系统只会将该线程的状态改为阻塞状态,不再可调度。并且将来无论谁将消息放入阻塞线程的队列中,都是这个“谁”(不是系统)负责将线程的状态从阻塞 到 ready (或任何状态)。 所以这个线程被系统取消了调度的资格,并被其他人重新获得了GetMessage的资格。系统关心的只是调度 runable 线程。系统并不关心这些可调度线程来自哪里。这种方法将避免方法一的负担,从而避免可能的瓶颈。
其实这里的重点是,线程的状态是怎么变化的?我不确定它是否真的是一个 分布式范式,如方法 2 所示,但它会是一个不错的选择吗?
【问题讨论】:
-
我想开始赏金,但我还看不到开始赏金按钮。
-
如果有版主可以帮助我开始赏金,请这样做。谢谢。
-
您看不到“开始赏金”按钮,因为您已经打开了赏金。 (见这里:meta.stackexchange.com/questions/56703/…)
标签: windows multithreading operating-system