《windows核心编程》读书笔记

一、内核对象由内核所拥有,而不是由进程所拥有。换句话说,如果你的进程调用了一个创建内核对象的函数,然后你的进程终止运行,那么内核对象不一定被撤消。在大多数情况下,对象将被撤消,但是如果另一个进程正在使用你的进程创建的内核对象,那么该内核知道,在另一个进程停止使用该对象前不要撤消该对象,必须记        住的是,内核对象的存在时间可以比创建该对象的进程长。
 
二、若要确定一个对象是否属于内核对象,最容易的方法是观察创建该对象所用的函数。创建内核对象的所有函数几乎都有一个参数,你可以用来设定安全属性的信息。
 
三、进程共享内核对象的三中不同机制:1、对象句柄的继承性; 2、给对象命名; 3、复制对象句柄。
 
四、线程由两个部分组成的:一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。
 
1、进程有两部分组成:进程内核对象和进程地址空间
2、进程是不活泼的,进程从来都不执行任何东西,只是线程的一个容器。
3、线程有两部分组成:线程的内核对象,操作系统用它来对线程实施管理,内核对象也是系统用来存放线程统计信息的地方。
                     线程的堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量。
4、线程的退出,最好的方式是让它自己自行结束。
5、终止线程运行的最佳方法是让它的线程函数返回。但是,如果使用本节介绍的方法,应该知道ExitThread函数是Windows用来撤消线程的函数。如果编写C/C++代码,那么决不应该调用ExitThread。应该使用Visual C++运行期库函数_endthreadex。如果不使用Microsoft的Visual C++编译器,你的编译器供应商有它自己的ExitThread的替代函数。不管这个替代函数是什么,都必须使用。
6、当使用返回或调用ExitThread的方法撤消线程时,该线程的内存堆栈也被撤消。但是,如果使用TerminateThread,那么在拥有线程的进程终止运行之前,系统不撤消该线程的堆栈。Microsoft故意用这种方法来实现TerminateThread。如果其他仍然正在执行的线程要引用强制撤消的线程堆栈上的值,那么其他的线程就会出现访问违规的问题。如果将已经撤消的线程的堆栈留在内存中,那么其他线程就可以继续很好地运行。此外,当线程终止运行时, DLL通常接收通知。如果使用Terminate Thread 强迫线程终止,DLL就不接收通知,这能阻止适当的清除。
7、Sleep(0)告诉系统,调用线程将释放剩余的时间片,并迫使系统调度拥有相同优先级的可调度线程,如果不存在多个拥有相同优先级的可调度线程,则系统将重新调度该线程,不会调度低优先级的线程。
   SwitchToThread()与Sleep(0)类似,只是它允许优先级较低的线程运行。
8、事件对象设置为人工重置事件时,当事件处于有信号状态时,等待改事件的所有线程均被处于可调度状态,当该事件为自动重置事件时,则当该事件处于有信号状态时,等待该事件的线程只有一个处于可调度状态。
9、windows实现线程同步的内核对象有事件,等待定时器,信标,互斥量。用户对象有锁和关键性代码(临界区资源)。
10、线程池的原理:预先创建一组的线程,在需要进行线程调用时,则从线程组中唤醒一个等待任务的线程,省去了创建线程和销毁线程所需要的时间,使应用程序运行效率更高,但是线程的数量并不是越多越好,太多的线程会使CPU在不同的线程之间切换浪费更多的时间,因此线程池中的线程数量应该有个度,一般为CPU数量的2倍。
11、Windows提供了3种进行内存管理的方法:虚拟内存,最适合用来管理大型对象或结构数组。内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。内存堆栈,最适合用来管理大量的小对象。
原文地址:https://www.cnblogs.com/ourroad/p/3078909.html