一、概念

首先我们先来复习一下操作系统的概念和作用

操作系统是用户和硬件之间的一层媒介程序,为上提供编程接口,为下调用资源,管理驱动,以使用硬件。

从以上的表述我们可以看出OS的两点作用,第一个是对下直接管理和使用硬件,第二个则是对上提供管理和使用硬件的接口。而在操作系统中,对下管理和使用硬件的那些程序,我们称之为内核程序,内核程序主要要做的一些事是

  1. 内存管理
  2. 文件管理(包括IO
  3. 进程调度和进程间通信
  4. 设备管理(设备分配、设备传输控制 、设备独立性)

而使用内核程序提供的那些接口我们则可以称之为用户程序。例如我们的一些网卡或者其他的驱动,也是属于内核程序对上提供的接口,用户可以通过这些驱动来管理网卡。因此我们可以规范一下内核程序和用户程序的概念,以下为我的个人理解

内核程序:操作系统中,可以访问所有硬件设备,如网卡、内存设备等的一些特殊的高权限的系统程序,

用户程序:只能有限的访问部分内存空间,对硬件设备没有访问权限的低权限的应用程序或系统程序

有人可能会问了,那我平常用一些自己写的应用程序,也可以访问硬盘里的东西,或者开启对摄像头的控制,这是不是说明我也能访问硬件设备呢?当然不是啦!我们平常写的程序,最后实际上可以看作,运行到了一定的阶段,就会托管给内核程序,由内核程序去完成的。

并且在操作系统中,内存空间也被划分成了内核空间和用户空间。内核程序会始终的占据着内存的一些空间,方便处理器去调用内核程序,而用户程序是自始至终接触不到这些内核空间的。

我们运行一个程序的整个流程是这样的,用户程序完成一定的事情,然后交由内核程序去处理,内核程序处理完毕之后,将处理的结果或者说处理完成的数据,再交由用户程序去执行,在整个过程中,用户程序是完全接触不到内核空间的。

二、问题

那么问题来了,操作系统为什么要这么大费周章的划分内核和用户之间的区别呢?我们从实际生活的一个例子出发去探讨这个问题。假设你去一家饭店吃饭,点好菜,由服务员通过餐口,转告给厨房的工作人员,等厨房的工作人员,比如厨师,切菜的人员,把菜做好了,再通过送餐口让服务员送到你的面前。

我们来分析一下这个过程,在这个过程中,你点菜这个操作,就相当于操作系统中的用户程序,而服务员和送餐口,就是厨房和外部连接的通道,服务员和送餐口都可以看作是操作系统中的驱动程序,你通过他们来告诉厨房你需要什么菜。然后厨房做菜的这个过程,就是相当于内核处理用户程序的请求,最后从送餐口送餐的这个过程,就等于是内核处理完之后,将处理完成的数据再转交给用户程序。而做菜的过程,对于顾客来说是完全的一个黑盒,用户不知道里面发生了什么,也无法参与做菜,用户能看到的,只有从餐口端出来的那盘菜。另外像厨房,仓库这些重要的地方,你作为一个顾客肯定是进不去的,这些地方只有饭店的核心人员,比如厨师,老板才能进入,你能活动的区域只能饭店的大厅这些公共的区域。这就相当于操作系统把内存的空间,划分为了用户空间和内存空间,并且强制规定用户不允许进入内存空间。

因此我们大致上可以得出几个概念对应例子中的等式,

内核程序 == 厨师 切菜人员,备菜人员,每种程序有不同的功能,同样的每类职业也有不同的职责,

用户程序 == 顾客 每个顾客想要的菜都不一样,对内核的请求也不一样

内核空间 == 厨房 厨房只允许厨师和备菜的进入,同样的内核空间也只允许内核程序进入

用户空间 == 大厅

到了这里,我们就可以来回答一下上面的问题了 “操作系统为什么要这么大费周章的划分内核和用户之间的区别呢” ,答案是首先操作系统的核心是内核,可以访问几乎底层的所有设备和空间,至关重要,为了保护内核的安全,因此操作系统会强制性的用户程序不允许访问内核空间,内核空间只有内核程序可以访问,用户程序只允许通过内核提供的接口来请求,这样划分对整个操作系统的稳定性和安全性是一种有力的保护。其实这样也很好理解,试想如果是一家饭店的厨房,不管是谁都可以随随便便的进出,毫无限制,那这家厨房的食品安全问题一定也得不到保障,你还会放心的去这家饭店吃饭吗?

我们通过上面举的例子,再来总结操作系统处理数据的整个过程就会显得好理解很多了。当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后再从内核空间拷贝到用户空间 注意加粗的部分,这两个阶段至关重要

第一阶段 :等待内核准备数据

第二阶段:数据从内核空间拷贝到用户空间

那么为什么我们明明是讲网络IO,却要大费周章的讲这么多操作系统的东西呢,因为本身IO操作就是由操作系统控制的,而我们发送一个IO请求,IO读写也是要经过以上的这些内核程序执行数据准备和拷贝过程的,如果不把这些讲明白了,那么后面我们要提到的,阻塞和读写过程必然将是一团雾水。而以上我们所重点强调的两个阶段,则是决定着各种IO模型的条件。包括后面要讲到的阻塞IO(BIO),非阻塞IO(NIO),IO多路复用,信号驱动IO,全异步IO(AIO),都是和上面两个阶段以及操作系统知识密切相关的。以上的两个过程和操作系统整个数据处理流程,务必要理解和记住,之后的文章,都是基于以上OS的整体流程,可以说是网络IO的基石中的基石

三、总结

  1. 操作系统为了安全性和稳定性考虑,因此将执行程序分为内核程序和用户程序,将内存空间分为内核空间和用户空间,内核程序对下直接对硬件进行使用和管理,对上提供接口给用户程序使用

  2. 用户程序不允许直接访问内核空间,而是转交给内核程序,由内核程序处理好,再拷贝到用户空间供用户程序使用

  3. 不管是对于IO还是其他数据处理的操作而言,有两个重点阶段,分别是,一、等待内核准备数据阶段,二、数据从内核空间拷贝至用户空间阶段,这两个阶段决定了IO的阻塞于否,非常重要

【网络IO系列】 预备知识 操作系统之内核程序和用户程序的更多相关文章

  1. 【网络IO系列】IO的五种模型,BIO、NIO、AIO、IO多路复用、 信号驱动IO

    前言 在上一篇文章中,我们了解了操作系统中内核程序和用户程序之间的区别和联系,还提到了内核空间和用户空间,当我们需要读取一条数据的时候,首先需要发请求告诉内核,我需要什么数据,等内核准备好数据之后 , ...

  2. Socket-IO 系列(一)Linux 网络 IO 模型

    Socket-IO 系列(一)Linux 网络 IO 模型 一.基本概念 在正式开始讲 Linux IO 模型前,先介绍 5 个基本概念. 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器, ...

  3. 从操作系统层面理解Linux下的网络IO模型

    I/O( INPUT OUTPUT),包括文件I/O.网络I/O. 计算机世界里的速度鄙视: 内存读数据:纳秒级别. 千兆网卡读数据:微妙级别.1微秒=1000纳秒,网卡比内存慢了千倍. 磁盘读数据: ...

  4. JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理

    相关 JEP: JEP 353 Reimplement the Legacy Socket API JEP 373 Reimplement the Legacy DatagramSocket API ...

  5. 【学习笔记】Linux基础(零):预备知识

    学习笔记(连载)之Linux系列 Note:本学习笔记源自<鸟哥的Linux私房菜(基础学习篇)>一书,为此书重要内容的摘要和总结,对于一些常识性的知识不再归纳 新型冠状病毒引发的肺炎战& ...

  6. 猫哥网络编程系列:详解 BAT 面试题

    从产品上线前的接口开发和调试,到上线后的 bug 定位.性能优化,网络编程知识贯穿着一个互联网产品的整个生命周期.不论你是前后端的开发岗位,还是 SQA.运维等其他技术岗位,掌握网络编程知识均是岗位的 ...

  7. java io系列06之 序列化总结(Serializable 和 Externalizable)

    本章,我们对序列化进行深入的学习和探讨.学习内容,包括序列化的作用.用途.用法,以及对实现序列化的2种方式Serializable和Externalizable的深入研究. 转载请注明出处:http: ...

  8. 完毕port(CompletionPort)具体解释 - 手把手教你玩转网络编程系列之三

       手把手叫你玩转网络编程系列之三    完毕port(Completion Port)具体解释                                                    ...

  9. 学习Identity Server 4的预备知识

    我要使用asp.net core 2.0 web api 搭建一个基础框架并立即应用于一个实际的项目中去. 这里需要使用identity server 4 做单点登陆. 下面就简单学习一下相关的预备知 ...

随机推荐

  1. python发送丁丁消息

    import requests import time import hashlib import hmac import base64 import re def SendMessage(messa ...

  2. Go语言网络通信---string与int互转,int64与[]byte互转,int直接互转,string与[]byte互转

    string与int互转 #string到int int,err:=strconv.Atoi(string) #string到int64 int64, err := strconv.ParseInt( ...

  3. TinyML-TVM是如何驯服Tiny的(上)

    TinyML-TVM是如何驯服Tiny的(上) 低成本.人工智能驱动的消费类设备的激增,导致了ML研究人员和从业者对"裸智能"(低功耗,通常没有操作系统)设备的广泛兴趣.虽然专家已 ...

  4. 视频系列:RTX实时射线追踪(上)

    视频系列:RTX实时射线追踪(上) Video Series: Practical Real-Time Ray Tracing With RTX RTX在游戏和应用程序中引入了一个令人兴奋的和根本性的 ...

  5. Timer定时器开发

    Timer定时器开发 定时器的作用是不占线程的等待一个确定时间,同样通过callback来通知定时器到期. 参考:https://github.com/sogou/workflow 定时器的创建 同样 ...

  6. Git操作_从github远程仓库克隆到本地仓库, 本地代码提交

    实现目的: 从github远程仓库克隆到本地仓库:本地代码提交到远程仓库. 一.从github远程仓库克隆到本地仓库: 命令行切换到指定的仓库想存放的目录,执行如下命令:git clone  远程仓库 ...

  7. Kubernetes 实战——配置应用(ConfigMap、Secret)

    配置容器化应用的方式:①命令行参数:②环境变量:③文件化配置 一.向容器传递命令行参数或环境变量 这两种方式在 Pod 创建后不可被修改 1. 在Docker中定义命令与参数 ENTRYPOINT:容 ...

  8. 类编程的WAF(上)

    一.复杂的需求 WAF (WEB 应用防火墙) 用来保护 WEB 应用免受来自应用层的攻击.作为防护对象的 WEB 应用,其功能和运行环境往往是复杂且千差万别的,这导致即便防御某个特定的攻击方式时,用 ...

  9. 一文彻底理解Apache Hudi的多版本清理服务

    Apache Hudi提供了MVCC并发模型,保证写入端和读取端之间快照级别隔离.在本篇博客中我们将介绍如何配置来管理多个文件版本,此外还将讨论用户可使用的清理机制,以了解如何维护所需数量的旧文件版本 ...

  10. 【NX二次开发】Block UI 选择单元

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...