目录

一. 拆解 Linux 系统并认识各个模块

二. 示例认识用户空间与内核空间


一. 拆解 Linux 系统并认识各个模块

众所周知,服务器大多采用 Linux 操作系统,本篇我们也以 Linux 操作系统为例简单了解操作系统的用户空间和内存空间;

如下图所示,ubuntu,CentOS 都是 Linux 操作系统的发行版,但他们的系统内核本质都是 Linux;

我们再了解以下三者的概念

(1)用户应用:即我们常见使用的各种软件。如 RabbitMQ,MySQL,Node.js;

(2)内核:内核可以直接操作计算机硬件,但需要有各种不同的设备驱动。操作内存需要使用到内存管理(Meory Management),进程管理(Process Management),文件系统管理(Vitual File System), 网络管理(Network Stack)等...

(3)计算机硬件:CPU(处理器),RAM(内存),Network Adapter(网卡)等...

总的来说,当我们在计算机执行一个操作,电脑底层大致会分为上述三层去实现,即用户操作(用户层)——>内核层——>计算机硬件层;

因此,常常需要把用户的操作和内核的操作隔离开,避免用户应用冲突导致内核崩溃,为达到这一目的,通常会将进程的寻址空间划分为两部分,即用户空间,内核空间;

如以前的32位计算机,寻址空间就是0~2^32 - 1,现在的64位计算机,寻址空间就是 0~2^64 - 1,每个值都代表一个存储单元代表一个字节;寻址空间就会划分为用户空间、内存空间两部分;

除了寻址空间进行了划分,系统权限也进行了划分,因为有一些CPU指令风险等级较高,所以将很多指令划分了不同的等级,(Ring0,Ring1,Ring2,Ring3)其中Ring0权限最高,Ring3权限最低,用户控件只能执行受限的Ring3命令,不能直接调用系统资源,需要通过内核提供的接口进行访问,内核空间则可以执行Ring0,调用一切系统资源;

用户空间负责用户应用与内核进行交互,内核空间负责内核与计算机硬件进行交互,二者相互独立。

而我们的进程,在执行的过程中,可能会因为业务比较多,既会执行一些简单命令,也可能需要去执行一些特权命令,所以进行有可能会在用户控件与内核空间来回切换。当进程运行在用户空间时,常称之为"用户态",当进程运行在内核空间时,常称之为"内核态";

二. 示例认识用户空间与内核空间

通过上面的讲述,我们简单认识了用户控件与内核空间;下面我们通过 Linux 操作系统的IO示例,详细认识它是如何在用户空间,内存空间进行操作的。

为了提高系统IO效率,Linux 系统常常会在用户空间与内核空间都加入缓冲区,如下所示

第一步:我们执行一个读操作;

第二步:内核分析用户读取的数据做出不同的操作;

第三步:假设第二步是读取网卡数据,此时网卡已收到数据,再读取到内核空间缓冲区;

第四步:将内核空间缓冲区数据返回读取到用户空间缓冲区,即可交由用户进行数据操作;

到此为止,一个相对完整的数据读取操作就算完成了,此时数据已经返回至用户空间交由用户操作;

再到下面,用户据处理完毕数据之后,可能会将数据再次写入磁盘或者网卡传输给对方,就会进行一个类似的操作;

第一步:将数据写入用户空间缓冲区准备好数据;

第二步:将用户空间缓冲区数据拷贝到内核空间缓冲区;

第三步:数据从内核缓冲区写入到网卡;

第四步:发送数据传输给对方;

不难发现,无论是读取数据操作或者是写入数据操作,总体思路并不复杂,但是都比较耗费时间,其原因主要就是因为等到数据和拷贝数据。

读数据的时候,进程需要在内核空间进行等待,以及还需要将数据从内核拷贝到用户控件这两步都是比较耗时的操作;

写数据的时候,数据需要从用户空间拷贝到内核也是比较耗时的操作;

因此,如何提高IO性能效率,就是围绕如何降低数据等待事件,数据拷贝时间来实现的,从而衍生出了5种不同的 Linux 系统的IO模型,都是针对以上两点去进行优化的,这一点我们留到下一篇再详细了解;

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐