一、概念

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

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

从以上的表述我们可以看出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. Docker学习(10) Docker的远程访问

    Docker的远程访问 只需配置

  2. 中国摄像头CMOS需求潜力旺盛

    中国摄像头CMOS需求潜力旺盛 CMOS是Complementary Metal Oxide Semiconductor(互补金属氧化物半导体)的缩写.它是指制造大规模集成电路芯片用的一种技术或用这种 ...

  3. MPC算法

    MPC算法 一.    引言 在工程技术方面,MPC全称可指Model Predictive Control模型预测控制(又称RHC, Receding Horizon  ). 模型预测控制算法 一种 ...

  4. Java基础知识之this关键字知识讲解

    this关键字这里对java中this关键字的基础知识进行讲解,希望对热爱java的小伙伴有帮助!! /* this关键字代表了所属函数的调用者对象. this关键字的作用: 1. 如果存在同名成员变 ...

  5. NOIP2018初赛普及组原题&题解

    NOIP2018初赛普及组原题&题解 目录 NOIP2018初赛普及组原题&题解 原题&答案 题解 单项选择题 第$1$题 第$2$题 第$3$题 第$4$题 第$5$题 第$ ...

  6. mysqldump 使用规范

    数据库很重要,没有备份,数据丢失只能跑路.所以还是做好备份吧! 目录 一.工具介绍 二.工具特点 三.备份权限 四.工具使用限制 五.已知BUG 六.备份前注意事项 6.1 需要长时间备份或导入时,请 ...

  7. 深入Netty逻辑架构,从Reactor线程模型开始

    本文是Netty系列第6篇 上一篇文章我们从一个Netty的使用Demo,了解了用Netty构建一个Server服务端应用的基本方式.并且从这个Demo出发,简述了Netty的逻辑架构,并对Chann ...

  8. 基于Android平台的图书管理系统的制作(3)

    前两篇介绍了主页面和Student,这一篇来讲Book类和工作人员. Book是图书管理系统的核心,查书,借书,还书,增加书都与Book类息息相关.Book类的设计很简单:包含信息:名称.作者.页数. ...

  9. 【NX二次开发】Block UI 曲线收集器

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

  10. 使用charles抓取https的方法

    自己整理的步骤做个记录 1.下载证书,官方地址:http://www.charlesproxy.com/ssl.zip 可直接点击链接下载:http://charlesproxy.com/getssl ...