正在阅读:《编程高手箴言》读后感(3)《编程高手箴言》读后感(3)

2004-04-07 10:02 出处:CSDN 作者:seacloud 责任编辑:sdq

  注:这一部分涉及《箴言》第三章。

  所有的消息队列看上去是放在USER32的模块内,但是每个应用程序自己有一个USER32,因为每个应用程序的内存都是从4000000B开始的,这样,每个GetMessage和PeekMessage都在处理事件。实际上,每个GetMessage都会成为一个WaitsingleMessage,当有事件来后,就直接进行处理,也不用做什么调度。
===================================================
  是不是每个程序都有一个USER32,我觉得有可能不是这样,因为我用win32Dasm反汇编了一个Win32 Console程序,并没有发现从USER32.dll里引入任何函数调用。当然,是不是在运行期系统把USER32.dll映射进了程序的地址空间,我不是很有把握。至于《箴言》的说法是每个程序的内存都是从400000B开始所以就都有USER32,我也想不出是什么因果关系。事实上,GetMessage或者PeekMessage并不是在处理消息,而是负责将消息从当前线程的消息队列里取出消息,调用TranslateMessage处理后,再调用DispatchMessage将消息发送到相应的窗口处理程序。之所以不需要应用程序做消息的调度不是因为消息不需要调度,而是系统在内部做了诸如同步、调度等操作。举个例子,当你调用SendMessage的时候,如果当前线程就是创建窗口的线程,那么SendMessage就会直接调用窗口函数来处理消息,如果不属于同一个线程,那么系统就会挂起当前线程,知道目标线程处理完被发送的消息后,当前线程的SendMessage调用才会返回。
  由此看出,系统在幕后为了支撑消息系统做了很多努力,从而简化了应用程序的编写。并且,窗口处理函数是可重入的,在文章的最后部分,我会举个典型的Win32程序来说明这些问题。

  应为自己完成自己的消息处理,每个程序都是独立的,所以要用底层内核来实现页面的切换。
===================================================
  呵呵,我怎么都看不出这其中有什么因果关系。程序的独立性是必然的,这也是现代操作系统的基本特点之一。至于这种独立性是不是要通过CPU分页机制来实现,这也未必。只启用CPU的分段功能,应该也可以实现进程的独立性了。
  页面切换是不是要在内核实现呢,这也是不需要解释的事情,页面切换涉及的指令大多是一些特权指令,如果在应用程序里可以执行这些指令的话,那么操作系统和应用程序相比就没有特权了,应用程序想要整垮操作系统就轻而易举了,就像昔日的DOS那样。

察看评论详细内容 我要发表评论
作者笔名简短内容 发表时间
:

键盘也能翻页,试试“← →”键

相关文章

关注我们

最新资讯离线随时看 聊天吐槽赢奖品