6.6 线程的一些性质 到现在为止,讲述了如何实现线程函数和如何让系统创建线程以便执行该函数.本节将要介绍系统如何使这些操作获得成功. 图6 - 1显示了系统在创建线程和对线程进行初始化时必须做些什么工作.让我们仔细看一看这个图,以便确切地了解发生的具体情况.调用 C r e a t e T h r e a d可使系统创建一个线程内核对象.该对象的初始使用计数是2(在线程停止运行和从C r e a t e T h r e a d返回的句柄关闭之前,线程内核对象不会被撤消) .线程的内核对象的其他…
第11章 线程池的使用 第8章讲述了如何使用让线程保持用户方式的机制来实现线程同步的方法.用户方式的同步机制的出色之处在于它的同步速度很快.如果关心线程的运行速度,那么应该了解一下用户方式的同步机制是否适用. 到目前为止,已经知道创建多线程应用程序是非常困难的.需要会面临两个大问题.一个是要对线程的创建和撤消进行管理,另一个是要对线程对资源的访问实施同步.为了对资源访问实施同步,Wi n d o w s提供了许多基本要素来帮助进行操作,如事件.信标.互斥对象和关键代码段等.这些基本要素的使用都非…
7.6 运用结构环境 现在应该懂得环境结构在线程调度中所起的重要作用了.环境结构使得系统能够记住线程的状态,这样,当下次线程拥有可以运行的C P U时,它就能够找到它上次中断运行的地方. 知道这样低层的数据结构也会完整地记录在 Platform SDK文档中确实使人吃惊.不过如果查看该文档中的C O N T E X T结构,会看到下面这段文字: "C O N T E X T结构包含了特定处理器的寄存器数据.系统使用 C O N T E X T结构执行各种内部操作.目前,已经存在为 I n t e…
第7章 线程的调度.优先级和亲缘性 抢占式操作系统必须使用某种算法来确定哪些线程应该在何时调度和运行多长时间.本章将要介绍Microsoft Windows 98和Windows 2000使用的一些算法. 上一章介绍了每个线程是如何拥有一个上下文结构的, 这个结构维护在线程的内核对象中.这个上下文结构反映了线程上次运行时该线程的 C P U寄存器的状态.每隔2 0 m s左右,Wi n d o w s要查看当前存在的所有线程内核对象.在这些对象中,只有某些对象被视为可以调度的对象.Wi n d…
第27章 硬件输入模型和局部输入状态 这章说的是按键和鼠标事件是如何进入系统并发送给适当的窗口过程的.微软设计输入模型的一个主要目标就是为了保证一个线程的动作不要对其他线程的动作产生不好的影响. 27.1 原始输入线程 当系统初始化时,要建立一个特殊的线程,即原始输入线程(raw input thread,R I T).此外,系统还要建立一个队列,称为系统硬件输入队列(System hardware input queue, SHIQ).R I T和S H I Q构成系统硬件输入模型的核心. R…
第1 7章 内存映射文件 对文件进行操作几乎是所有应用程序都必须进行的,并且这常常是人们争论的一个问题.应用程序究竟是应该打开文件,读取文件并关闭文件,还是打开文件,然后使用一种缓冲算法,从文件的各个不同部分进行读取和写入呢?M i c r o s o f t提供了一种两全其美的方法,那就是内存映射文件. 与虚拟内存一样,内存映射文件可以用来保留一个地址空间的区域,并将物理存储器提交给该区域.它们之间的差别是,物理存储器来自一个已经位于磁盘上的文件,而不是系统的页文件.一旦该文件被映射,就可以访…
第3章内核对象 在介绍Windows API的时候,首先要讲述内核对象以及它们的句柄.本章将要介绍一些比较抽象的概念,在此并不讨论某个特定内核对象的特性,相反只是介绍适用于所有内核对象的特性. 首先介绍一个比较具体的问题,准确地理解内核对象对于想要成为一名 Wi n d o w s软件开发能手的人来说是至关重要的.内核对象可以供系统和应用程序使用来管理各种各样的资源,比如进程.线程和文件等.本章讲述的概念也会出现在本书的其他各章之中.但是,在你开始使用实际的函数来操作内核对象之前,是无法深刻理解…
第5章 作 业 通常,必须将一组进程当作单个实体来处理.例如,当让 Microsoft Developer Studio为你创建一个应用程序项目时,它会生成 C l . e x e,C l . e x e则必须生成其他的进程(比如编译器的各个函数传递) .如果用户想要永远停止该应用程序的创建,那么 Developer Studio必须能够终止C l . e x e和它的所有子进程的运行.在 Wi n d o w s中解决这个简单(和常见的)的问题是极其困难的,因为Wi n d o w s并不维护…
4.3 终止进程的运行 若要终止进程的运行,可以使用下面四种方法: • 主线程的进入点函数返回(最好使用这个方法) . • 进程中的一个线程调用E x i t P r o c e s s函数(应该避免使用这种方法) . • 另一个进程中的线程调用Te r m i n a t e P r o c e s s函数(应该避免使用这种方法) . • 进程中的所有线程自行终止运行(这种情况几乎从未发生) . 这一节将介绍所有这四种方法,并且说明进程结束时将会发生什么情况. 4.3.1 主线程的进入点函数返…
4.2 CreateProcess函数 可以用C r e a t e P r o c e s s函数创建一个进程: BOOL CreateProcessW( _In_opt_ LPCWSTR lpApplicationName, _Inout_opt_ LPWSTR lpCommandLine, _In_opt_ LPSECURITY_ATTRIBUTES lpProcessAttributes, _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes…
窗 口 消 息 Wi n d o w s允许一个进程至多建立10 000个不同类型的用户对象(User object):图符.光标.窗口类.菜单.加速键表等等.当一个线程调用一个函数来建立某个对象时,则该对象就归这个线程的进程所拥有.这样,当进程结束时,如果没有明确删除这个对象,则操作系统会自动删除这个对象.对窗口和挂钩( h o o k )这两种U s e r对象,它们分别由建立窗口和安装挂钩的线程所拥有.如果一个线程建立一个窗口或安装一个挂钩,然后线程结束,操作系统会自动删除窗口或卸载挂钩.…
这一节东西比较少,本应该归并在上一节里,但是昨天太晚了.就先把那些东西分为上了.这节里面就一个问题,C++异常与结构性异常的对比(try和__try的区别): C++异常与结构性异常的对比 S E H是可用于任何编程语言的操作系统设施,而异常处理只能用于编写 C + +代码.如果你在编写C + +程序,你应该使用C + +异常处理而不是结构化异常处理.理由是C + +异常处理是语言的一部分,编译器知道 C + +类对象是什么.也就是说编译器能够自动生成代码来调用C + +对象析构函数,保证对象的…
第2 3章 结束处理程序 SEH(结构化异常处理) 使用 S E H的好处就是当你编写程序时,只需要关注程序要完成的任务. 如果在运行时发生什么错误,系统会发现并将发生的问题通知你.利用S E H,你可以完全不用考虑代码里是不是有错误,这样就把主要的工作同错误处理分离开来.这样的分离,可以使你集中精力处理眼前的工作,而将可能发生的错误放在后面处理. S E H实际包含两个主要功能:结束处理( termination handling)和异常处理( e x c e p t i o nh a n d…
5.4 查询作业统计信息 前面已经介绍了如何使用 Q u e r y I n f o r m a t i o n J o b O b j e c t函数来获取对作业的当前限制信息.也可以使用它来获取关于作业的统计信息.例如,若要获取基本的统计信息,可以调用Q u e r y I n f o r m a t i o n J o b O b j e c t,为第二个参数传递J o b O b j e c t B a s i c A c c o u n t i n g I n f o r m a t…