GUI 剖析之 回顾操作系统

一)、回顾操作系统

Windows操作系统是基于时间片分配的分时操作系统,了解windows操作系统工作原理有利于我们编写更加完美的windows程序,在学习GUI程序之前,学好操作系统将有助于以后的学习,否则你将会很迷糊,因为我们以后所编写的程序都必须依赖于windows操作系统。在这里,我强烈建议大家先复习一下以前学过的操作系统知识,包括进程、线程、信号量机制、事件、互斥信号量等,在这里我介绍一本书《windows核心编程》。

操作系统工作原理:当我们用鼠标双击应用程序(可执行文件executable  file),操作系统将自主性的为程序创建一个进程(称为主进程),这个进程是通过createprocess(…)API创建的,这个API 返回的是一个句柄,所谓句柄,实际上是指系统存储区内的一段空间的地址标识,伴随着这个API 的调用,系统内核为进程分配一个内核对象,这个内核对象是系统为进程分配的一个静态存储区,用来管理进程,里面装载着进程代码区内的一些数据及资源,

进程创建完毕,操作系统会查看应用程序的链接属性,找到程序执行入口点,一般默认为main函数(CUI程序)或winmain函数(GUI程序),也就是说程序的入口点函数并不是必须为main或winmain函数,如果你愿意,只要在编译器的属性里设置自己想要的任何入口点函数都无妨,不过在你的程序里main函数也要相应修改。当进入main函数,系统会为程序创建一个主线程,通过createthread()函数或_beginthread()函数你也可以创建自己的线程,这里跟大家说一下为什么要用线程,也就是线程作用何在?当我们玩电脑的时候,你有没有遇到这种情况,当我们点击软件界面的时候有时它没反应,仅仅是没反应而已,并不是我们玩CF 时出现点击就弹出一个窗口“结束线程”,这只是系统崩溃而已,没反应的原因,如果这个软件是正常软件的话,我说的是不是软件设计者故意为之,那可能就是没有用到多线程,什么时候要用到多线程,这里有一个原则:用户所能看见的任何界面都用主线程去完成,用户看不见的,包括逻辑计算,数据库管理,网络链接等都建议创建额外的子线程去完成,强烈建议如果不是必要的情况下,尽量不要创建额外的进程,最好用线程去替代,这样系统的消耗会更小,同时线程间交流比进程更加方便。同时线程同步机制保证会给用户一个友好的界面。

现在回过头来再讲讲内核对象,因为这是很重要的,举个例子会让大家更加清楚什么是内核对象。eg:你有没有这种经验,当你将U盘插入电脑工作后准备弹出U盘,在大部分情况下U盘会正常退出,但也有一些情况下,系统会弹出一个窗口提示说有其他程序正在使用U盘资源,在这种情况下我们会打开资源管理器寻找,但最后还是找不到,原因何在?那么现在就来介绍下内核对象,上面说了,内核对象是 系统用来管理进程或其他资源的一个小型数据结构,特别重要的是,内核对象关联一个使用记数,使用createprocess,createmutex等API 都会使系统分配内核内核对象,内核对象是属于操作系统的,不隶属于哪个进程,每当内核对象创建,该对象的使用记数就增加1,当多个应用程序同时打开同一对象时,内核对象使用记数也会增加,上面U盘事件就是这个原因,我们试图通过资源管理器关闭程序,系统是通过TerminateProcess API 实现的,当你打开U盘内资源时,系统同样会分配内核对象去管理您的程序,但是由于某种原因巧合,通过该内核对象打开的程序句柄也被其他程序占用,也就是你U盘内的应用程序的主进程最终还是没有退出,尽管你貌似通过资源管理器杀死了那个进程,更加详细内容请参考《windows核心编程》。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值