内核对象

来源:互联网 发布:tp5.0 项目源码 编辑:程序博客网 时间:2024/06/15 12:20

原文地址>>

1. 什么是内核对象

内核对象是操作系统为一些系统级的对象(像进程,线程,信号量)维护的一些数据结构。这些数据构保存了与系统级对象相关的系统级信息。

例如:所有内核对象都会保存该对象的引用计数。进程对象会保存进程ID。文件对象会保存当前字节偏移量,共享模式,打开模式等。

操作系统中所有内核对象对是保存在一块内存空间中,系统上所有的进程都共享这一块内存空间。

 

2.内核对象的访问方式

这些内核对象不能被应用程序直接访问,应用程序只能通过操作系统提供的API对他们进行操作。而对操作系统API的访问过程中,操作系统会对访问的安全性进行保证。这样避免应用程序对内核对象进行操作而导致系统出现错误。

多个进程可以共享访问同一个内核对象。

当应用程序创建或打开一个内核对象时,系统API会返回给应用程序一个句柄(该句柄是进程级别的)。在应用程序中之后便可以使用该句柄来指定对该内核对象进行操作。

该句柄是进程级别的,因此同一个内核对象在两个进程中的句柄不会一样。进程如果使用内核对象在其他进程中的句柄来访问内核对象时会出错。

 

3. 内核对象的生命周期

每个内核对象都会有一个引用计数的概念,内核对象被创建的时候,该值是1。之后每一个新的进程获得对该内核对象访问(我理解为获得一个代表该内核对象的句柄),则引用计数加1.当每已获得访问的进程释放访问权利后(进程关闭内核对象的句柄),引用计数会被减1. 当引用计数减少至0后,操作系统将会把该内核对象销毁掉。(这个机制有点像COM的生命周期机制)

既然句柄是进程级的,那如果在同一进程中多个地方打开同一个内核对象。那获得的句柄应该是同一个,引用计数应该只会加1?(有待验证TODO)

 

4.内核对象的共享

通过给内存对象命名即可以实现内核对象在多个进程中共享。

具体实现方式是,在创建内核对象时提供一个名字。然后在其他进程中访问(创建或打开)这个内核对象是仍然使用这个名字。

当用一个特定的名称去创建一个内核对象时,如果该特定名称的内核对象已经存在,则系统会返回一个句柄指向已经存在的这个内核对象。并将其引用计数加1.

如果实现了内核对象的共享,其实就面临着一个问题。系统中仍何进程都可以访问该内核对象,这样有可能会为应用程序的正常工作带来麻烦。

0 0
原创粉丝点击