1.操作系统的内核
内核是操作系统最基本、最核心的部分。实现操作系统内核功能的那些程序就是内核程序。操作系统内核结构如下:
时钟管理是指用时钟中断实现计时功能
原语是指原语是一种特殊的程序,具有原子性。也就是说这段程序的运行必须一气呵成,不可被“中断”。
针对时钟管理,中断处理以及原语,这些与硬件关联较紧密的模块,一定放在内核中,而对系统资源进行管理的功能,例如进程管理,存储器管理,设备管理,这些管理工作更多的是对数据结构的操作,不会直接涉及硬件。有的操作系统不会将他放到内核中。
注:若内核中包含对系统资源进行管理的功能,那么称为大内核,若不包含,则成为小内核(微内
核),操作系统内核需要运行在内核态,非内核功能运行在用户态
若采用大内核方式进行处理,处理过程只需要进行两次CPU状态的转换
若采用微内核方式,整个过程的处理需要6次CPU状态的转换
而CPU状态的转换是有成本的,需要消耗不少时间,频繁地转换会消耗系统性能
大内核:
优点:性能较高
缺点:内核代码庞大,结构混乱,难以维护。
典型的大内核/宏内核/单内核 操作系统: Linux、UNIX
小内核:
优点:内核功能少,结构清晰,方便维护,可靠性高
缺点:需要频繁地在核心态和用户态之间切换,性能低。
典型的微内核操作系统:windows NT
2.分层结构的操作系统
内核分多层,每层可单向调用相邻的,更低一层提供的接口
优点:
1.这样的分层结构便于调试和验证,自底向上逐层调试验证
2.易扩充和易维护,各层之间调用接口清晰固定
缺点:
1.仅可调用相邻低层,难以合理定义各层的边界
2.效率低,不可跨层调用,系统调用执行时间长
3.模块化的操作系统
将内核划分为多个模块,每个模块具有某方面的管理功能,并规定好各模块间的接口,使各模块之间能通过接口进行通信。还可以进一步将各模块细分为若干个具有一定功能的子模块,同样也规定好各子模块之间的接口。把这种设计方法称为模块-接口法,图 1.3 所示为由模块、子模块等组成的模块化操作系统结构。
内核=主模块+可加载内核模块
主模块:只负责核心功能,如进程调度、内存管理
可加载内核模块:可以动态加载新模块到内核而无需重新编译整个内核
优点:
1.模块间逻辑清晰易于维护确定模块间接口后即可多模块同时开发
2.支持动态加载新的内核模块 (如:安装设备驱动程序、安装新的文件系统模块到内核),增强OS适应性
3.任何模块都可以直接调用其他模块,无需采用消息传递进行通信,效率高
缺点:
1.模块间的接口定义未必合理,实用
2.模块间相互依赖,更难调试和验证
注:其实宏内核就是采用了模块化的思想,大内核中功能可以相互调用,但是对于微内核而言,进程管理与其他管理之间若要相互调用,必须通过消息传递的方式。所以大内核对于小内核而言性能更高,但是对于小内核而言,内核外的某个功能模块出错,不会导致整个系统崩溃。
4.外核操作系统
这样的操作系统由内核和外核组成,应用程序能通过库函数调用内核中的功能,也可以通过库函数,调用外核中的功能。内核负责进程调度、进程通信等功能,外核负责且由外核为用户进程分配未经抽象的硬件资源负责保证资源使用安全
抽象的意思大概为:用户看到的虚拟页面与操作系统分配的页框是不一样的,用户看到的虚拟页面是一整块的,而操作系统分配的页框是分散的。
未经抽象的硬件资源就是操作系统给用户分配的磁盘空间在外存中是集中的,那么用户进程在访问文件时,磁头不需要大幅度转,这样性能就提高了。若用户进程需要频繁访问文件资源,就可以向外存申请连续的磁盘块,用户进程将文件数据存入到这些磁盘块中,那么访问文件的性能就能提升。
优点:
1.外核可直接给用户进程分配“不虚拟、不抽象的硬件资源,使用户进程可以更灵活的使用硬件资源。
2.减少了虚拟硬件资源的“映射层",提升效率。
缺点:
1.会使系统变得更加复杂。