看这里!!!https://mp.weixin.qq.com/s?__biz=MzI0ODk2NDIyMQ==&mid=2247494048&idx=1&sn=cacfc6a48269418422966b8456e04038&chksm=e99a1cb2deed95a4862f1a086a6b27ef58318e67888785beb9ca16ed2e77e91d836916a8fad7&token=859167462&lang=zh_CN#rd

内核是操作系统非常重要的组成部分,同时也是操作系统的核心。内核管理着系统资源,内核向上连接着应用程序,向下连接着硬件,它是应用程序和硬件的桥梁。

内核可以进一步的划分,分为宏内核微内核

宏内核和微内核最大的区别就是,宏内核的用户服务和内核服务都保存在相同的地址空间中,它们都由内核进行统一管理,而微内核的用户服务和内核服务会保存在不同的地址空间中,下图可以很好的解释这一点。

其实这里的宏内核翻译过来有点牵强,其实应该叫单内核或者单核。在这种单核的设计中,内核是一个大的整体,可以说是一个大进程,在这个大进程中,所有内核服务都运行在一个地址空间中,函数之间的调用链路少,直接通信简单高效

而微内核的功能会划分为独立的进程,进程之间通过 IPC 进行通信,高度模块化,一个服务的故障不会影响另一个服务。不过由于模块化的影响,函数之间调用链路偏长,进程之间不会直接通信,而是通过内核服务相互通信。

内核大小上面来讲,微内核的尺寸更小,只包含用户进程相关的服务,而单核的尺寸要比微内核大的多,这点比较好理解,因为宏内核融入了太多服务和驱动。

执行效率上来说,微内核的执行效率相对较慢,因为涉及到跨模块调用,而宏内核执行效率高,因为函数之间会直接调用。

在微内核模块化之后,它很容易扩展,因为内核空间与用户空间相互隔离,在用户态下(运行在用户空间中的应用程序)应用程序崩溃后一般不会影响到内核中的数据。宏内核的可拓展性较差。

经过上面这些描述之后,我们很容易把宏内核和微内核的特征想象成软件开发中的单体架构和微服务架构

单体架构最大的特点就是函数调用方便,几乎不存在调用链路,一个项目解决所有问题,项目中包含数据库驱动、各种拦截器、控制器、权限控制,可拓展性非常差。

而微服务的架构之间的调用链路会比较长,模块之间的职责分离并且相互依赖,比如权限控制模块、路由模块、总线通信模块。可拓展性比较强。

这两种不同的内核结构有不同的支持者,就和有些人认为单体架构好,有些人认为微服务架构模式好。

这就像对编程语言的争论一样,你说 Python 、Go、Java 以及其他语言哪个好?管他哪个好,最终都会戏谑的称 PHP 是这个世界上最好的语言。所以,这些争论本没有意义,但是很有趣的是,这种争论常常让人想起前几年在 CPU 领域中 RISC 和 CISC 之间的斗争。

现代成功的 CPU 设计包括这两种技术中的任何一种,就像 Linux 内核是微内核和宏内核的混合产品一样。可能有些人认为 Linux 它不就是个宏内核结构么,但实际上 Linux 不单单只是一个纯碎的集成内核。

为什么 Linux 会使用单内核(此处叫单内核有点应景)结构呢?我猜有下面几个因素。

从 Linus 的角度来看,单内核的开发和选型更容易,因为避免了与消息传递架构、计算模块加载方法等相关的工作。而且 Linux 的诞生原因在于 Linus 对 MINIX(一种类 UNIX 操作系统)只允许在教育上使用很不满,再加上 Linus 本来对操作系统很感兴趣,于是他开始编写 Linux 操作系统,所以我认为当时的 Linus 开发 Linux 起源于兴趣,并未经过详细周到的设计,也并未考虑它的可拓展性。当然这只是鄙人粗浅的猜测。

这就和我们上大学的毕业设计一样,你毕业设计做的系统,你会考虑可拓展性吗?除非你想当产品来做,但是何必呢?

另一个原因是充足的开发时间。Linux 没有研发时间限制,也没有发布时间表。任何限制都只能单独修改和扩展内核。核心的单一设计内部完全模块化,在这种情况下修改或添加不是很困难。问题是没有必要为了追求未经证实的可维护性的小幅增加而重写 Linux 内核。Linus 一再强调以下观点:为了这个好处而损失速度是不值得的。

Linux 是一个借鉴了微内核精髓的宏内核结构,Linux 支持模块化的设计、抢占式内核、对内核线程的支持以及动态加载内核模块的能力。不仅如此,Linux 还避免了其微内核设计的性能损失,允许一切运行在内核模式下,直接调用函数,无需消息传递。

所以综合一点来讲,Linux 是一个模块化、多线程和内核可调度的操作系统。

模块化的设计:Linux 支持内核模块的动态加载,尽管 Linux 内核也是单核,但它允许在需要时动态删除和加载一些内核代码。

可抢占性:Linux 内核支持可抢占,与传统的 UNIX 不同,Linux 内核具有允许内核中运行的任务优先执行的能力。在各种 UNIX 产品中,只有 Solaris 和 IRIX 支持抢占,但大多数传统 UNIX 内核不支持抢占。

在 Linux 身上,完美体现了务实性。如果一项功能没有价值或创意不佳,则不会开始实施。相反,在 Linux 的发展过程中,形成了一种值得称道的务实态度:任何改变都必须针对现实中实际存在的问题,需要经过完整的设计和正确简洁的实现。

如果 Linux 是纯微内核设计,那么移植到其他架构会更容易。实际情况是,Linux 内核移植虽然不是很简单,但也绝非不可能完成的事情。

最后,给大家推荐一下我自己的 Github https://github.com/crisxuan/bestJavaer ,里面有非常多的硬核文章,绝对会对你有帮助。

聊了聊宏内核和微内核,并吹了一波 Linux的更多相关文章

  1. 微内核VS宏内核【转】

    本文转载自:https://segmentfault.com/a/1190000002711544 内核按照体系结构分为两类 : 微内核(microkernel)与宏内核(macrokernel). ...

  2. spring websocket 和socketjs实现单聊群聊,广播的消息推送详解

    spring websocket 和socketjs实现单聊群聊,广播的消息推送详解 WebSocket简单介绍 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随 ...

  3. Flask(4)- flask请求上下文源码解读、http聊天室单聊/群聊(基于gevent-websocket)

    一.flask请求上下文源码解读 通过上篇源码分析,我们知道了有请求发来的时候就执行了app(Flask的实例化对象)的__call__方法,而__call__方法返回了app的wsgi_app(en ...

  4. Linux内核分析第七周学习笔记——Linux内核如何装载和启动一个可执行程序

    Linux内核分析第七周学习笔记--Linux内核如何装载和启动一个可执行程序 zl + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study. ...

  5. websocket 实现单聊群聊 以及 握手原理+加密方式

    WebSocket 开始代码 服务端 群聊 # type:WebSocket 给变量标注类型 # websocket web + socket from geventwebsocket.server ...

  6. flask 第五章 WebSocket GeventWebsocket 单聊群聊 握手 解密 加密

    1.WebSocket 首先我们来回顾一下,我们之前用socket学习过的项目有: 1.django 2.flask 3.FTP - 文件服务 HTTP - TCP (特点): 1.一次请求,一次响应 ...

  7. websocket 群聊单聊

    websocket 介绍 介绍引自 https://segmentfault.com/a/1190000012709475 群聊 from flask import Flask, request, r ...

  8. websocket 群聊,单聊,加密,解密

    群聊 from flask import Flask, request, render_templatefrom geventwebsocket.handler import WebSocketHan ...

  9. Flask请求上下文源码讲解,简单的群聊单聊web

    请求上下文流程图 群聊html代码 <!DOCTYPE html> <html lang="en"> <head> <meta chars ...

随机推荐

  1. python IO流操作

    python IO流操作 学习完本篇,你将会独立完成 实现操作系统中文件及文件目录的拷贝功能. 将目标图片拷贝到指定的目录中 实现一个自动阅卷程序, Right.txt保存正确答案,xx(学生姓名). ...

  2. Jenkins 进阶篇 - 任务关联

    有时候我们的一个任务里面会进行很多的步骤,例如构建一个后端的 Java 服务,可能会有代码静态扫描,静态扫描通过后会打包成 jar 或者 war 文件,打包成功后可能还会对制品进行存档备份,然后可能会 ...

  3. PHP的加密伪随机数生成器的使用

    今天我们来介绍的是 PHP 中的加密伪随机数生成器(CSPRNG 扩展).随机数的生成其实非常简单,使用 rand() 或者 mt_rand() 函数就可以了,但是我们今天说的这个则是使用了更复杂算法 ...

  4. session入库

    #存储session的数据表示列结构,可作为参考#创建数据库(可选)CREATE DATABASE session;#使用创建的数据库(可选)USE session;#创建存储session的数据表( ...

  5. Chrome安装Postman以及启动的方式

    Postman一个web开发人员必不可少的接口调试神器 Chrome安装Postman的方法网上很多,就不一一列举了我个人使用的方式目前常用的两种方式 方式一:下载插件安装包使用开发者模式安装 推荐一 ...

  6. 程序员微机课系列—我的nodejs多版本管理方法

    nodejs的多版本配置对于我来说一直都是一个较为头疼的事情.本人的开发工作会涉及electron以及前端,对于工作中使用的npm包(点名node-sqlite3和node-sass)在某些情况下,会 ...

  7. ubuntu20.04安装网易云音乐

    Ubuntu20.04安装网易云 进入网易云音乐下载地址 下载对应客户端 进入终端,安装 sudo dpkg -i 软件名.deb

  8. 在Vue中使用JSX,很easy的

    摘要:JSX 是一种 Javascript 的语法扩展,JSX = Javascript + XML,即在 Javascript 里面写 XML,因为 JSX 的这个特性,所以他即具备了 Javasc ...

  9. vj-2021.6.5-补题

    B - B 内容: One day, as Sherlock Holmes was tracking down one very important criminal, he found a wond ...

  10. 掌握BeanShell,轻松处理jmeter中的数据

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15424558.html 博客主页:https://www.cnblogs.com/testero ...