网络模型——用户空间,内存空间详解

📅 2026/7/14 7:33:00
网络模型——用户空间,内存空间详解
目录一. 拆解 Linux 系统并认识各个模块二. 示例认识用户空间与内核空间一. 拆解 Linux 系统并认识各个模块众所周知服务器大多采用 Linux 操作系统本篇我们也以 Linux 操作系统为例简单了解操作系统的用户空间和内存空间如下图所示ubuntuCentOS 都是 Linux 操作系统的发行版但他们的系统内核本质都是 Linux我们再了解以下三者的概念1用户应用即我们常见使用的各种软件。如 RabbitMQMySQLNode.js2内核内核可以直接操作计算机硬件但需要有各种不同的设备驱动。操作内存需要使用到内存管理(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指令风险等级较高所以将很多指令划分了不同的等级Ring0Ring1Ring2Ring3其中Ring0权限最高Ring3权限最低用户控件只能执行受限的Ring3命令不能直接调用系统资源需要通过内核提供的接口进行访问内核空间则可以执行Ring0调用一切系统资源用户空间负责用户应用与内核进行交互内核空间负责内核与计算机硬件进行交互二者相互独立。而我们的进程在执行的过程中可能会因为业务比较多既会执行一些简单命令也可能需要去执行一些特权命令所以进行有可能会在用户控件与内核空间来回切换。当进程运行在用户空间时常称之为用户态当进程运行在内核空间时常称之为内核态二. 示例认识用户空间与内核空间通过上面的讲述我们简单认识了用户控件与内核空间下面我们通过 Linux 操作系统的IO示例详细认识它是如何在用户空间内存空间进行操作的。为了提高系统IO效率Linux 系统常常会在用户空间与内核空间都加入缓冲区如下所示第一步我们执行一个读操作第二步内核分析用户读取的数据做出不同的操作第三步假设第二步是读取网卡数据此时网卡已收到数据再读取到内核空间缓冲区第四步将内核空间缓冲区数据返回读取到用户空间缓冲区即可交由用户进行数据操作到此为止一个相对完整的数据读取操作就算完成了此时数据已经返回至用户空间交由用户操作再到下面用户据处理完毕数据之后可能会将数据再次写入磁盘或者网卡传输给对方就会进行一个类似的操作第一步将数据写入用户空间缓冲区准备好数据第二步将用户空间缓冲区数据拷贝到内核空间缓冲区第三步数据从内核缓冲区写入到网卡第四步发送数据传输给对方不难发现无论是读取数据操作或者是写入数据操作总体思路并不复杂但是都比较耗费时间其原因主要就是因为等到数据和拷贝数据。读数据的时候进程需要在内核空间进行等待以及还需要将数据从内核拷贝到用户控件这两步都是比较耗时的操作写数据的时候数据需要从用户空间拷贝到内核也是比较耗时的操作因此如何提高IO性能效率就是围绕如何降低数据等待事件数据拷贝时间来实现的从而衍生出了5种不同的 Linux 系统的IO模型都是针对以上两点去进行优化的这一点我们留到下一篇再详细了解