layout | title | category | description | tags |
---|---|---|---|---|
post |
内核的体系结构 |
基础 |
内核的体系结构... |
进程 切换 调度 线程 命名空间 |
尽管Linux是整体式的宏内核,但其具有相当良好的结构,尽管如此,Linux内核各个组成部分之间的彼此交互是不可避免的。各部分会共享数据结构,而且与严格隔离的系统相比,各部分(因为性能原因)协同工作时需要更多的函数。
下面是一个粗略的草图,概述了组成完成Linux系统的各个层次,以及内核所包含的一些重要子系统。
传统上,UNIX操作系统下运行的应用程序、服务器以及其他程序都称为进程。每个进程都在CPU的虚拟内存中分配地址空间。各个进程的地址空间是完全独立的,因此进程并不会意识倒彼此的存在。对它们自己来说,它也会认为自己是系统中唯一的进程,如果进程想要彼此通信,就需要特定的内核机制。
Linux是多任务系统,虽然只是看上去并发的执行若干进程,但其实系统中同时真正在运行的进程数目不超过CPU的数目,因此内核会按照短的时间间隔在不同的进程之间切换,由于时间太快,用户是注意不到的,所以产生了并发的假象。
- 内核借助于CPU的帮助,负责进程切换的技术细节。给每个进程一种错觉,造成CPU总是可用的。
- 内核还必须确定如何在现存进程之间共享CPU时间,重要的获得的CPU时间多一些,次要的得到的少一点,确定哪个进程运行多长时间称为调度。
Linux对进程采用了一种层次系统,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程,这个进程负责进一步的系统初始化操作。
树型结构的扩展方式与新进程的创建方式密切相关,UNIX操作系统中创建进程有两种方式,一种是fork,一种是exec。
- fork可以创建当前进程的一个副本,父进程和子进程只有PID(进程ID)不同。从使用角度来说,父进程内存的内存将被复制,Linux使用了copy on write1来提高性能。
- exec将一个新程序加载到当前进程的内存中并执行,旧程序的内存页将刷出,内容被替换为新数据,并执行新程序。
当然系统除了进程以外,还提供了线程,有时也被成为轻量级进程。Linux使用clone方法创建线程。工作方式类似于fork,但启用了精确的检查,以确认哪些资源是和父进程共享,哪些资源为线程自己创建。在一定程度上,允许线程和进程之间的连续转换。
命名空间则是将不同的进程进行分组,将它们隔离起来。在每个组里,进程同样有一个类似init的进程,每个组的资源对外是隔离的,这样的技术使得很多虚拟化技术得以发展,因为计算机上只需要有一个内核管理所有容器。2