体系架构

架构这个词,以前上学的时候总是不太明白。现在多少有了点粗浅的理解。
所谓架构就是设计系统的组织关系。这种组织在软件设计中,宏观有一种流行的表现就是分层。
所谓分层就是某一层对其上层提供封装好的功能,这一类功能的集合(API),逻辑上可以抽象成一层,所以在实现上也就可以人为的组织起来,比如一层就是一个库或者包这样组织。
分层设计的核心就是抽象出上下层次间的依赖关系。这样的组织下实现的功能可以做到结构清晰,耦合度低。

下图就是Linux的内核架构(宏内核):
image.png
从分层设计的角度来讲,整个内核其实就是底部的一个大层,内核对上面应用层提供了各种能力:比如I/O操作,进程管理,内存管理等等。
当然,这个内核的大层中也是有层级关系的,上图中Components、Functionality、Software Support、Hardware Support等。

概念解释

系统调用

内核中设置了一组用于实现各种系统功能的子程序(过程),并将它们提供给应用程序调用。
这些所谓的系统功能本质上不能被用户的应用程序使用,需要使用相关功能必须通过系统调用的方式。可以理解成有些功能必须委托给内核来做,这个发起委托的过程就是系统调用。
image.png

用户态和内核态

这两个是指CPU的状态,可以简单粗浅的理解为,CPU在执行什么级别的程序
比如在执行的是操作系统内核,那么CPU的状态就是内核态。如果执行非内核程序,那就是用户态。

这两者主要差别在:
处于用户态,进程所能访问的内存空间和对象受到限制,CPU资源可以被抢占;
处于内核态,则能访问所有的内存空间和对象,CPU不能被抢占;

CPU的状态当然是可以切换的,通常有三种情况可以从用户态切到内核态:系统调用、 异常、外围设备中断。其中,系统调用(上文提到的)是一种用户态主动要求切到内核态的方式。

宏内核和微内核

上述主要介绍的就是宏内核,除了宏内核外,还存在一种相对的微内核(当然还有混合型的)
Linus的老师,Modern Operating System的作者安德鲁,最初用于教学的Minix就是基于微内核设计的。

宏内核就是单内核,这样好理解点。

  • 宏内核:

简单来说,就是把很多东西都集成进内核,例如linux内核,除了最基本的进程、线程管理、内存管理外,文件系统,驱动,网络协议等等都在内核里面。优点是效率高。缺点是稳定性差,开发过程中的bug经常会导致整个系统挂掉。做驱动开发的应该经常有按电源键强行关机的经历。

  • 微内核:

内核中只有最基本的调度、内存管理。驱动、文件系统等都是用户态的守护进程去实现的。优点是超级稳定,驱动等的错误只会导致相应进程死掉,不会导致整个系统都崩溃,做驱动开发时,发现错误,只需要kill掉进程,修正后重启进程就行了,比较方便。
缺点是效率低。典型代表QNX,QNX的文件系统是跑在用户态的进程,称为resmgr的东西,是订阅发布机制,文件系统的错误只会导致这个守护进程挂掉。不过数据吞吐量就比较不乐观了

补充理解:
CSDN:宏内核和微内核区别
知乎:宏内核和微内核区别