句柄的意义和作用以及句柄和指针的区别
今天学习了句柄和指针的概念,做个学习笔记。
句柄
什么是句柄?首先这个单词听起来就有点怪,只知道有把柄,句柄对应单词是handle,把手,一个门把手可以打开一扇房间的门,句柄是一个特殊的代号,windonw系统可以通过一个特定的句柄打开一个特定的对象,所以这个句柄就是一个特殊作用的代号编码。
为什么有句柄?句柄的作用是什么?
程序的运行需要使用内存来存储数据和指令,cpu根据内存的地址来取对应的数据,然而物理内存的大小空间在安装好后是固定不变的,在程序运行中可能出现物理内存不够的情况,这个时候windows系统开发者就想出一个虚拟内存机制,通过该机制cpu不再直接用物理内存地址来访问内存数据,而是经过虚拟内存里逻辑地址来访问内存数据,虚拟内存里有一张映射关系表,存储了每个逻辑地址和物理地址的相应关系,有了这个映射表,就可以不再拘泥于物理内存的一些不足,例如空间不足,物理内存碎片不能连续分配地址等,用逻辑地址先找到对应物理地址后就能找到数据。
但是,虚拟内存机制虽然解决了内存的上述问题,却在后续的使用中还是有新的问题出现,这就是为什么又会出现句柄,下面来看一下原因。
如下图所示,物理地址灰色部分1,3,4,5,6等已经存上了数据,白色背景代表的2,7,9,10,15可以存数据但是已经被打断,如果借用虚拟内存就可以用连续不打断的一套逻辑地址来分配地址,这样就有了windows下的虚拟内存机制,但是虚拟内存管理灵活变动的优点,也就意味着里面的地址对应关系会经常发生变动,像之前的逻辑地址1->物理地址2的关系 如果变成了 逻辑地址8->物理地址2的话,cpu如果不知道这个变动,还拿着之前的 逻辑地址1->物理地址2的关系 来找的话就会出错,所以虚拟内存机制还是不完善,这种映射关系的变动如果做个管理登记的话这个问题就好办了,句柄就有这样的作用。
假如之前cpu 是通过 句柄1 -> 逻辑地址1 -> 物理地址2 这个关系一路找到数据,当逻辑地址1->物理地址2这个关系变成 逻辑地址8->物理地址2的时候, 系统在 句柄1的关系那也修改成 句柄1->逻辑地址8->物理地址2.
--------------------------------------------------------------------------------
变动对比如下:
句柄1 -> 逻辑地址1 -> 物理地址2
变成
句柄1 -> 逻辑地址8 -> 物理地址2,
--------------------------------------------------------------------------------
这个也有点像日常生活中的户口登记一样,关系的变动都要在户口上进行相应的操作才行。
这样不管虚拟内存的逻辑地址和物理地址对应关系怎么变化,只要每次变化通知相应的句柄做个记录,cpu通过同一个句柄就总能找到要找的数据。
所以这个句柄就是像一个指向指针的指针。
这里说的是windows系统下句柄的作用,在liunx下用文件描述符,具体还要进一步学习一下