zoukankan      html  css  js  c++  java
  • 1.内核对象之<什么是内核对象,使用计数及安全性>

    会不会很奇怪,说多线程的故事,为什么会说内核对象.因为说到线程就要说进程,说到进程呢,又要说内核对象,并且解决多线程的同步问题,多要用内核对象.所以,先废话一下内核对象.

    什么是内核对象?
    简单的说,就是只有windows内核才能直接访问的对象(内存区域),就是内核对象(进程中的访问是通过句柄).比如:存取符号对象,事件对象,文件对象,文件映射对象,I/O完成端口对象,作业对象,信箱对象,互斥对象,管道对象,进程对象,信标对象,线程对象和等待计时器对象等等.


    这些对象由一些名为CreateXXXX函数创建,并返回一个内核对象的句柄,由CloseHandle关闭,因为内核对象是使用计数器管理生命周期,所以,调用CloseHandle并不一定能成功释放(关闭)内核对象,但是可以成功的放弃当前进程对该内核对象的所有权,是否能释放该对象,这取决于内核对象被调用(使用)的次数.如果没有调用CloseHandle,当进程释放的时候,内核对象会自动被清除.

    如果想使用这些内核对象,不同的内核对象,Windows都提供了相应的一组操作函数来操作.但是不能直接去访问这个内核对象的内存区域.内核对象都会有使用计数,安全性描述符等一些相同的数据成员.

    使用计数是内核对象的数据成员,每当一个进程使用一次该内核对象,该内核对象的使用计数加1.不是进程所有,所以调用CloseHandle,只能关闭当前进程的使用,只有当计数器为0,内核才会释放该内核对象.同样的,内核对象的生命周期可能要比创建它的进程的生命周期还要长.

    内核对象句柄在进程内是公开的,在该进程的任何线程内都是可以使用的.句柄值只在该进程内有效,跨进程时,需要一定的手段进行共享.

    可以通过安全描述符这个数据成员来保护内核对象.用于描述:谁创建了该对象,谁能够访问或使用该对象,谁无权访问该对象.一般来说,安全描述符用于编写服务器应用程序时使用,如果编写客户端应用程序,可以忽略该特性.如果你无法区别用户对象,图形设备接口(GDI)对象,内核对象,那你只要查看CreateXXX函数,是否有安全描述符参数,创建内核对象的所有函数几乎都有这个参数.

    貌似写的有点乱,凑合看吧.我喜欢写短章节...好吧..我承认..我在骗点击..

  • 相关阅读:
    Redis中统计各种数据大小的方法
    Redis配置文件详解
    Redis服务器的启动过程分析
    在Mac OS上安装Vagrant和Docker的教程
    使用Redis实现用户积分排行榜的教程
    Redis教程(一):Redis简介
    Redis教程(二):String数据类型
    Redis教程(四):Hashes数据类型
    Redis教程(六):Sorted-Sets数据类型
    Redis教程(八):事务详解
  • 原文地址:https://www.cnblogs.com/solokey/p/2126604.html
Copyright © 2011-2022 走看看