我们知道计算机中同时运行着多个应用程序(进程),这些进程都由操作系统进行统一管理。这么做一是为了安全,而是便于管理。
为什么会出现描述符这个东西?
我们知道描述符的作用就像是身份证,它唯一标识着某个实体。我们在编程中会经常出现描述符这个概念,比如文件描述符fd,socket描述符等等。
为什么会有这些描述符呢?其实这是因为所有进程都是由操作系统管理的,操作系统维护着一系列的数据结构,其中包括很多数组结构,而描述符其实就是某个数组的索引。内核的大部分信息都是驻留在内存中的,任何时候只有一个副本。应用程序运行时,要执行某种对硬件的操作时,如打开文件(对磁盘操作)、发送数据(对网卡操作)时,由于应用程序时不能直接操作硬件的,于是乎它委托操作系统帮他完成,操作系统也是一个程序,而且加载后就放在内存中,因此操作系统程序的代码逻辑也是不会变的,如何区分对的不同文件操作(打开文件A还是B?)?其实不难,应用程序委托操作系统打开文件后,操作系统代码在内核中创建一些数据结构(数组)保存该文件的位置(即数组中存放指针),并把这个保存了该文件的数组索引返回(索引是唯一的,因为内核是唯一的)。再打开一个文件,操作系统也是按照刚才的方法,即打开一个文件,记录文件的位置,将该地址放入数组,返回该地址所在数组的索引(同一套逻辑应对所有的情况)。于是乎后面应用程序要操作对应文件,就可以使用对应的文件描述符来操作了。
总结
所以,描述符就是内核数据结构中的索引,因为应用程序无权操作硬件,于是它通过描述符告知内核它想要对谁进行操作,内核根据该描述符完成操作。
(文章其实就是感叹计算机分层的魅力,内容描述不够准确,真是印证了一句话:计算机所有的问题都可以通过增加一个层来解决,而这里这个层就是操作系统,其次也体现了计算机复用和分用的精妙。)