playerken

博客园 首页 新随笔 联系 订阅 管理

随笔分类 -  Windows

摘要:线程需要在下面两种情况下互相进行通信:• 当有多个线程访问共享资源而不使资源被破坏时。• 当一个线程需要将某个任务已经完成的情况通知另外一个或多个线程时。原子访问:互锁的函数家族所谓原子访问,是指线程在访问资源时能够确保所有其他线程都不在同一时间内访问相同的资源。编译器生成代码的方法,哪个CPU在执行这个代码,以及主计算机中安装了多少个CPU等因素,决定了产生的结果可能是不同的。InterlockedExchangeAdd函数能够保证值的递增以原子操作方式来完成。所有线程都应该设法通过调用这些函数来修改共享的长变量,任何线程都不应该通过调用简单的C语句来修改共享的变量。还必须保证传递给这些函数 阅读全文
posted @ 2011-10-26 22:03 playerken 阅读(301) 评论(0) 推荐(0)

摘要:每隔20ms左右,Windows要查看当前存在的所有线程内核对象。在这些对象中,只有某些对象被视为可以调度的对象。Windows选择可调度的线程内核对象中的一个,将它加载到CPU的寄存器中,它的值是上次保存在线程的环境中的值。这项操作称为上下文转换。Windows被称为抢占式多线程操作系统,因为一个线程可以随时停止运行,随后另一个线程可进行调度。暂停和恢复线程的运行在线程内核对象的内部有一个值,用于指明线程的暂停计数。当调用CreateProcess或CreateThread函数时,就创建了线程的内核对象,并且它的暂停计数被初始化为1。这可以防止线程被调度到CPU中。当线程完全初始化好了之后, 阅读全文
posted @ 2011-10-20 22:00 playerken 阅读(1348) 评论(0) 推荐(1)

摘要:线程是由两个部分组成的:一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。进程是不活泼的。进程从来不执行任何东西,它只是线程的容器。线程总是在某个进程环境中创建的,而且它的整个寿命期都在该进程中。这意味着线程在它的进程地址空间中执行代码,并且在进程的地址空间中对数据进行操作。进程使用的系统资源比线程多得多,原因是它需要更多的地址空间。而线程使用的系统资源要少得多。实际上,线程只有一个内核对象和一个堆栈,保留的记录很少,因此需要很少的内存。线程用于描述进程中的运行路径。每当进程 阅读全文
posted @ 2011-08-28 18:05 playerken 阅读(284) 评论(0) 推荐(0)

摘要:将进程组合在一起,并且创建一个“沙框”,以便限制进程能够进行的操作。最好将作业对象视为一个进程的容器。CreateJobObject可以创建一个作业内核对象。OpenJobObject可以根据名字访问一个已经创建好的作业内核对象。CloseHandle可以关闭作业内核对象。关闭作业对象并不会迫使作业中的所有进程终止运行。该作业对象实际上做上了删除标记,只有当作业中的所有进程全部终止运行之后,该作业对象才被自动撤消。关闭作业的句柄后,尽管该作业仍然存在,但是该作业将无法被所有进程访问。对作业进程的限制SetInformationJobObject可以给一个作业加上若干不同类型的限制:基本限制和扩 阅读全文
posted @ 2011-08-28 16:33 playerken 阅读(195) 评论(0) 推荐(0)

摘要:进程通常被定义为一个正在运行的程序的实例,它由两个部分组成:一个是操作系统用来管理进程的内核对象。内核对象也是系统用来存放关于进程的统计信息的地方。另一个是地址空间,它包含所有可执行模块或DLL模块的代码和数据。它还包含动态内存分配的空间。如线程堆栈和堆分配空间。Windows支持两种类型的应用程序。一种是基于图形用户界面(GUI)的应用程序,另一种是基于控制台用户界面(CUI)的应用程序。启动函数的功能:检索指向新进程的完整命令行的指针。检索指向新进程的环境变量的指针。对C/C++运行期的全局变量进行初始化。如果包含了stdlib.h文件,代码就能访问这些变量。对C运行期内存单元分配函数(m 阅读全文
posted @ 2011-08-28 14:20 playerken 阅读(401) 评论(0) 推荐(0)

摘要:每个内核对象只是内核分配的一个内存块,并且只能由该内核访问。当调用一个用于创建内核对象的函数时,该函数就返回一个用于标识该对象的句柄。该句柄可以被视为一个不透明值,你的进程中的任何线程都可以使用这个值。为了使操作系统变得更加健壮,这些句柄值是与进程密切相关的。因此,如果将该句柄值传递给另一个进程中的一个线程(使用某种形式的进程间的通信)那么这另一个进程使用你的进程的句柄值所作的调用就会失败。内核对象的使用计数内核对象由内核所拥有,而不是由进程所拥有。每个对象包含一个使用计数。当一个对象刚刚创建时,它的使用计数被置为1。然后,当另一个进程访问一个现有的内核对象时,使用计数就递增1。当进程终止运行 阅读全文
posted @ 2011-08-23 22:22 playerken 阅读(307) 评论(0) 推荐(0)