zoukankan      html  css  js  c++  java
  • 《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种进行内存管理的方法:虚拟内存,最适合用来管理大型对象或结构数组。内存映射文件,最适合用来管理大型数据流(通常来自文件)以及在单个计算机上运行的多个进程之间共享数据。内存堆栈,最适合用来管理大量的小对象。
  • 相关阅读:
    C/C++字符串函数之复制函数
    tesseract api C++使用例子
    error C2275: “XXX”: 将此类型用作表达式非法
    Socket通信原理探讨(C++为例)
    模拟按键,点击,滑动,在光标处输出字符
    安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
    【 转】__try,__except,__finally,__leave异常模型机制
    提高VS2010运行速度的技巧
    解决VS2010子目录中的.cpp文件引用上一级目录的stdafx.h找不到定义的问题
    1009MySQL数据库InnoDB存储引擎Log漫游
  • 原文地址:https://www.cnblogs.com/ourroad/p/3078909.html
Copyright © 2011-2022 走看看