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…
第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并不维护…
与前面介绍的进程一样,线程也有两部分组成.一个是线程内核对象.它是一个数据结构,操作系统用它来管理线程以及用它来存储线程的一些统计信息.另一个是线程栈,用于维护线程执行时所需的所有函数参数和局部变量.位于同一个进程的线程共享进程的地址空间且它们共享进程句柄表.因为句柄表是针对进程的.进程需要很多的系统资源,而线程仅仅需要一个线程内核对象和线程栈就可以了,因此线程比进程的开销要小得多.采用多线程来处理问题也是理所当然的了. 采用多线程可以提高程序的执行效率,但是多线程也存在很多问题.在尝试使用多线…
看到windows核心编程 第5章的最后一节,发现job lab例子程序不能在我的系统(win8下)正常运行,总是提示“进程在一个作业里”         用process explorer程序查看 于是我找到   例子程序源码的这段判断程序,注释后编译运行   终于进了程序的界面   可是我认为这不是一个好的解决方案   于是去看书的123页下面到124页上的那段话   果然在程序已经关联了作业对象   但是最后,书上说到,一个简单的解决方案是从命令行而不是windows资源管理器中启动调试器…
// 全局变量,用于指示共享的资源是否在使用 BOOL g_fResourceInUse = FALSE; void Func1() { //等待访问资源 while(InterlockedExchange(&g_fResourceInUse, TRUE) == TRUE) Sleep(0); //访问刚占有的资源 //Access the resource. //我们不需要再访问的资源 InterlockedExchange(&g_fResourceInUse, FALSE); } 这是…
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…
用户模式下的线程同步 系统中的线程必须访问系统资源,如堆.串口.文件.窗口以及其他资源.如果一个线程独占了对某个资源的访问,其他线程就无法完成工作.我们也必须限制线程在任何时刻都能访问任何资源.比如在一个线程读内存时要限制其他线程对此块内存进行写入. 线程之间的通信很重要,尤其是在以下两种情况下: 1:需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性. 2:一个线程需要通知其他线程某项任务已经完成. 线程同步包括许多方面,windows提供了许多基础设施使线程同步变得容易. 用户模式…
17.3 使用内存映射文件 若要使用内存映射文件,必须执行下列操作步骤: 1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件. 2) 创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件. 3) 让系统将文件映射对象的全部或一部分映射到你的进程地址空间中. 当完成对内存映射文件的使用时,必须执行下面这些步骤将它清除: 1) 告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像. 2) 关闭文件映射内核对象. 3) 关闭文件内核对象. 下面将详细介…
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返回的句柄关闭之前,线程内核对象不会被撤消) .线程的内核对象的其他…
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 主线程的进入点函数返…