操作系统如何实现:什么是宏内核、微内核

8fb8c50a485f9abff41b7b3f60de4ef2.gif

作者 | 陆小凤

来源 | 码农的荒岛求生

操作系统和普通的大型应用程序项目类似,都涉及代码组织方式的问题,但操作系统的独特之处在于其核心部分必须运行在内核态,kernel model,所谓内核态严格讲是指在该状态下程序拥有对硬件(hardware)的所有控制权,运行在用户态的程序做不到这一点。

有的同学可能会有疑问,操作系统(或者说内核)不都是核心部分吗?严格来讲像进程管理调度、内存管理等就是核心部分,但像驱动等就不是那么核心了,那么这一部分也需要放在内核态吗?

围绕这一划分,出现了两种操作系统的设计方式,关于这两种设计方法的争论就和复杂指令集(CISC)与精简指令集(RISC)哪个更好一样至今没有非常明确的定论

da826c4e35c4619d3a973528e8a50a29.png

大一统,全部运行在内核态

最简单的划分就是没有划分,我们可以把所有内核代码放在内核态,内核中的任何代码都拥有控制硬件的全部特权,显然这种设计方法非常简单,因为操作系统设计者不用费心去想哪一部分该放在内核态。

由于全部内核程序都运行在内核态,编译好的内核程序就是一个单独的二进制可执行文件,这时的操作系统运行起来后就是一个大进程,所有内核代码运行在一个单独的地址空间中,这和我们实现的稍微复杂的单进程应用程序类似,这种大一统的设计就是所谓的宏内核,monolithic kernel,个人认为叫“一体化内核”更形象些。

74aa26229f58f791657e5c76da9dd00c.png

这种组织方式和TCP/IP协议栈的分层实现有点类似。

现在内核代码已经组织好了,毕竟内核是为上层应用提供服务的,那么上层应用该怎样调用内核代码呢?这就是系统调用的作用,system call。

40f7d32bd73c1988a78f37c8d30110cc.png

上层应用程序通过系统调用与内核进行交互。

由于内核代码唯一同一个地址空间中,因此内核中各部分的交互极为简单,就是普通的函数调用,文件系统中的某块cache可以非常容易的被虚拟内存系统共享使用。

但宏内核也是有缺点的,由于内核代码位于同一个地址空间,代码趋于复杂化,复杂就容易出错,但内核和普通程序不同,一旦内核中某一模块出现bug将导致整个内核崩溃,底层的内核崩溃后上层的应用程序就无法继续正常推进,整个系统就下图一样。。crash

c24e6eef0b6793e22e454d8d6fdeb5d9.gif

当然也有人不在乎在这一点,Linus认为内核中有bug正常,有bug就找到它、修复它而不是用某种机制试图忽略它,没错,C++中的异常就是试图忽略bug的机制,这就是为什么很多公司的规范中禁止使用异常的原因。

总之,内核崩溃后就必须重启计算机。

保留核心,非必要不留在内核

为减少内核崩溃的风险,一个简单的办法就是让内核尽量精简,只保留核心部分运行在内核态,其它代码以用户态进程的形式运行。

运行在用户态的操作系统程序被称为server,像负责文件操作的File Server等,此时用户进程想要使用操作系统提供的服务的话就必须借助进程间通信,inter-process communication,即IPC,借助内核,消息从一个进程发送到另一个进程然后等待返回。

这样,内核只需要对上层应用提供一些简单的接口即可,像创建进程、发送消息等,这种实现方式可以让内核尽可能简单,因为大部分内核程序都运行在用户态,且运行在不同的地址空间中,此时设备驱动中的bug不会影响到内核,这种操作系统的实现方式就被称为微内核, micro kernel。

就像宏内核那样,微内核也有自己的缺点,那就是性能。由于宏内核的代码都在同一个地址空间中,因此模块间的交互可以非常简单,简单的函数调用即可,但模块间交互对微内核来说则可能涉及进程间通信,看上图,如果某个应用程序需要请求使用File Server,这条链路涉及到:

请求:应用程序 -> 内核 -> File server
返回:Filer server -> 内核 -> 应用程序

每一个"->"都涉及上下文切换,而这对宏内核来说则简单很多。

现实中是什么样子?

现实的操作系统中两种实现方式都很常见,Linux以及许多Unix就是典型的宏内核,而Mac OS X 以及 Windows NT则一般认为是微内核,华为的鸿蒙Harmony OS则宣传是微内核。

e00ef45795afdb9276bdd789d717a4bf.png

有趣的是,对Linus创建Linux影响极大的MINIX操作系统也是微内核,而Linux则是宏内核,难怪MINIX的作者——也是操作系统这门课的教授说过,如果Linus是他的学生的话那么操作系统系统这门课的期末考试Linus可能很难通过,哈哈,因为MINX的作者认为在Linux被创造出来的上世纪90年代竟然还有人以宏内核的方式来编写操作系统,这简直不可思议,而Linus则不以为意,并进行了火爆的回击,关于这一段的八卦后续有机会和大家聊聊,非常有趣。

可以看到操作系统的设计方式就和CPU关于复杂指令集与精简指令集的设计一样分成了两派,关于宏内核与微内核孰优孰劣争论至今依然没有定论

b524f52a66c2885361c8fafb53d751c8.gif

往期推荐

高并发下的 HashMap 为什么会死循环‍

Docker:从入门到实战过程全记录

Redis 内存满了怎么办?这样置才正确!

如何在 Kubernetes Pod 内进行网络抓包

b6ca3ff377918e1e36bb205b2c092959.gif

点分享

3ea59d45f27a86c8e37959c0f6615d92.gif

点收藏

aefb7b97aa1b3e3d8487cc7d204fa0fb.gif

点点赞

0435cd78461bd70331a83f063b24ad2f.gif

点在看

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/511831.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

雷神开机logo更改_九代酷睿i9加持的性能怪兽 雷神911黑武士Ⅱ评测

随着英特尔9代酷睿CPU的到来,品牌台式机也逐渐迎来了全新的升级,各大厂商也竞相抢占台式整机市场。而对于DIY组装机来说,相对于玩家门槛和售价又相对较高。国产台式机品牌雷神也抓住了这次契机,推出了“911黑武士”的第二代“911黑…

阿里云高级技术专家周晶:基于融合与协同的边缘云原生体系实践

简介:2020年 5G 商用元年以来,各种边缘场景开始火热起来,边缘计算又重回人们视野,这次的回归还伴随着云计算的普及与通信技术的颠覆式发展。边缘云作为 5G 与中心云计算的中继节点,处于云网融合、承上启下的关键位置。…

进程调度:我太难了!

作者 | 轩辕之风O来源 | 编程技术宇宙1、任务切换现在有一块CPU,但是有两个程序都想来执行,我们需要开发一个任务调度程序。只有两个程序,so easy啦!让它们交替执行就行了。为了实现切换,我们提供一个API,这…

阿里千万实例可观测采集器-iLogtail正式开源

简介:11月23日,阿里正式开源可观测数据采集器iLogtail。作为阿里内部可观测数据采集的基础设施,iLogtail承载了阿里巴巴集团、蚂蚁的日志、监控、Trace、事件等多种可观测数据的采集工作。iLogtail运行在服务器、容器、K8s、嵌入式等多种环境…

重启报错_Win10蓝屏,提示收集错误信息,反复重启报错

操作步骤:电脑为Win10系统,偶尔遇到微软Win10检测机制收集错误信息的提示,需要重启,重启之后恢复正常,但是在使用过程中收到此报错之后机器会反复的重启蓝屏提示。您可参考以下方式调试:方案一:1、按下“Wi…

一款跑在云上的定制容器专属 OS 来了——LifseaOS | 龙蜥技术

简介:如果可以把运维 API 化,那我们是不是可以把 OS 也作为一个 K8S 可以管理的资源,让 K8S 像管理容器一样管理OS? 引言 在 2021 年 10 月的云栖大会上,为云原生而生的 OS Lifsea 正式对外发布,并集成进入…

使用云效Codeup10分钟紧急修复Apache Log4j2漏洞

简介:2021年12月10日,国家信息安全漏洞共享平台(CNVD)收录了Apache Log4j2远程代码执行漏洞(CNVD-2021-95914),此漏洞是一个基于Java的日志记录工具,为Log4j的升级。作为目前最优秀的…

mysql时间相减得到天数保留两位_【敲黑板!】分布式事务数据库 —-MySQL 数据库开发规范(第四节)...

今天Amy着重为大家讲解一下关于函数的一些硬核知识,也是本文中非常重要的一个章节,记得认真看(dianzan)哦~第四节、函数4.1 字符串连接函数MySQL 数据库中字符串连接方法,需使用 CONCAT() 或 CONCAT_ WS()函数&#xf…

3类代码安全风险如何避免?

简介:企业和开发者在解决开源依赖包漏洞问题的同时,还需要考虑如何更全面地保障自己的代码数据安全。那么有哪些安全问题值得我们关注呢? 编者按:本次 Apache Log4j2 开源依赖包漏洞为所有人敲响警钟,企业的代码作为最…

手工模拟实现 Docker 容器网络!

作者 | 张彦飞allen来源 | 开发内功修炼如今服务器虚拟化技术已经发展到了深水区。现在业界已经有很多公司都迁移到容器上了。我们的开发写出来的代码大概率是要运行在容器上的。因此深刻理解容器网络的工作原理非常的重要。只有这样将来遇到问题的时候才知道该如何下手处理。网…

技术分享 | 使用 mPaaS 配置 SM2 国密加密指南

简介:随着移动智能终端的广泛应用,敏感信息极易被监控或盗取,给国家、企事业及个人带来极大政治、经济损失。金融和重要领域的各个企业正在逐步落实并完成国产密码改造工作。为解决客户侧因更换加密算法造成的种种不便,mPaaS 现已…

我的世界1.8.9无需正版的服务器,我的世界1period;8period;9服务器纯洁服地址 | 手游网游页游攻略大全...

发布时间:2015-09-26怎么创建属于自己的服务器那?开服教程为大家准备好了.如果我们想和小伙伴们联机进行玩耍的话就必须要建立一个服务器,要不然就是加入别人的服务器,那么服务器的建立方法是什么呢?我 ...标签:我的世界攻略 我的世界 我的世界开服发布…

报表功能升级|新增的这4项图表组件太好用了吧

简介:你们要的交叉透视表、词云、日历热力图、雷达图安排上啦~ 宜搭3.0上线已满一月,大家体验如何呢? 为了让大家更好地实现一站式数据加工处理及展示,我们近期针对报表板块做了升级 我们新上线了4项大家在社区呼声…

进程切换的本质是什么?

作者 | 陆小凤来源 | 码农的荒岛求生我们都知道操作系统最重要的功能之一是多任务能力,也就是可以运行超过CPU数量的程序——即进程,要想实现这一功能就必须具备将有限的CPU资源在多个进程之间分配的能力,在程序员看来,我们的程序…

lol1.7更新服务器维护,lol今天停机维护到几点11日7.1版本停机更新公告

lol今天停机维护到几点,lol1月11日停机维护更新公告,lol今天怎么进不去2017?下面小编将英雄联盟发布的停机公告详细给大家介绍。lol今天停机维护到几点1月11日早7点30分全区停机维护,预计停机时间为07:30-12:0011日7.1版本停机更…

Log4j漏洞不仅仅是修复,更需要构建有效预警机制

简介:软件的漏洞有时不可避免,根据Gartner的相关统计,到 2025 年,30% 的关键信息基础设施组织将遇到安全漏洞。日志服务SLS,可帮助快速部署一个预警机制,使得漏洞被利用时可以快速发现并及时响应。通过使用…

太强了!这款开源终端工具可查询 IP 信息~

作者 | JackTian来源 | 杰哥的IT之旅在 Linux 下,有dig、nslookup、traceroute等多种非常实用的网络调试工具。dig:是常用的域名查询工具,可以用来测试域名是否正常。nslookup:是常用的域名查询工具,也就是查 DNS 信息…

顺序写磁盘比随机写内存_深入理解 linux磁盘顺序写、随机写

一、前言随机写会导致磁头不停地换道,造成效率的极大降低;顺序写磁头几乎不用换道,或者换道的时间很短。本文来讨论一下两者具体的差别以及相应的内核调用。二、环境准备三、fio介绍通过fio测试,能够反映在读写中的状态&#xff0…

为余势负天工背,云原生内存数据库Tair助力用户体验优化

简介:作为双11大促承载流量洪峰的利器,Tair支撑了电商交易核心体验场景。不仅在数十亿QPS的峰值下保持着亚毫秒级别的顺滑延迟,同时在电商交易核心体验场景上也做出了技术创新。 作者 | 漠冰 来源 | 阿里技术公众号 作为双11大促承载流量洪峰…

【视频特辑】数据分析师必备,快速制作一张强大好用的大宽表

简介:随着企业数字化进程的逐步推进,在日常经营过程当中会沉淀下越来越多的数据信息。 每当想做数据分析的时候,就会发现想要的指标分散在不同的数据源、数据集、数据表当中。 Quick BI的数据关联功能,可以帮助数据分析师快速将指…