大家已经知道,在QNX这样的客户端服务器系统里,服务器(资源管理器)是通过注册一个路径名字来提供服务的。那么,当客户端给出一个名字,操作系统是怎样找到相对应的服务器的?这后面的水其实很深,让我们来一探究竟。
路径名管理器(pathmgr)
首先,所有名字的注册,搜索,注销都不是由内核管理的。是的,你没有看错,不在内核当中。而是由一个叫pathmgr的资源管理器来管理的。pathmgr管理的是“路径名空间”这个资源,通俗点说就是根目录 "/"。
确实pathmgr是procnto进程的一部份,但它并不是在内核态运行的。
pronto是QNX的第一个进程,但并不意味着它就是微内核。procnto进程其实是微内核+内存管理器+进程管理器+路径名管理器的组合。这几个核外的管理器,虽然是普通QNX系统一定会用到的。但是在极端的情况下,QNX也可以做到完全不用这些管理器,只用微内核+定制的进程来实现一个系统,就像早期的VxWorks那样。只是那样的系统,等于完全取消了QNX的优势,所以虽然技术上可行,但并不流行。
好了,讲回我们的路径名搜索。最简单的就是资源管理器注册"/dev/md5",然后客户端程序open("/dev/md5")就好了。你或许会奇怪这有什么复杂的?
可是资源管理器,不光可以注册一个文件,也是可以注册目录的。最容易想到的是文件系统,当你“把某某硬盘分区 mount 到 /home”时,文件系统资源管理器就会注册 "/home/",意思是说“/home/ 以及至它下面所有的路径名,从此以后都归我管了”。如果你接下来 ls -l /home/user/.bashrc 的话,其实是把整个路径名都发给注册了 /home 的文件管理器,文件管理器就会去实际硬盘分区里找有没有/user/.bashrc这个文件,然后返回状态。
如果资源管理器可以注册另一个资源管理器注册目录的子目录,事情突然变得有趣起来。比如,资源管理器A注册了/home/abc,资源管理器B注册了/home/abc/utils,然后客户端open("/home/abc/utils/readme")时,又是哪一个资源管理器来为客户端服务呢?
这个根据客户端要求的路径名寻找对应的资源管理器的过程,就叫做路径名搜索。基本上就是让客户端跟各个可能的管理器联系,由管理器回复客户端。
我们来看一下时序图
- 客户端open("/home/abc/utils/readme"),在libc的open函数里,首先开始的就是路径