操作系统基本概念

首先来来说下操作系统,嗯,操作系统是计算机硬件的管理软件,是对计算机硬件的抽象,操作系统将应用程序分为用户态和内核态,例如驱动程序就位于内核态,而我们写的一般程序都是用户态,包括web服务器这些,应用程序无法直接操控硬件,只能通过系统调用,通过操作系统驱动io硬件,通过操作系统管理进程。

接下来说下文件的概念,在操作系统中,文件是对i/o的一种抽象,文件大体包括三类

普通的文件:包括二进制文件和文本文件

目录:就是普通文件的一组链表

套接字文件:用来与另一个进程进行跨网络通信的文件

套接字文件就是通常说的socket,还有值得注意的是无论打开什么文件,内核都会返回给应用程序一个文件描述符。当关闭文件后,内核释放资源,同时回收文件描述符。

进程的内存模型

每个进程都有独立的上下文,它拥有完整的虚拟内存空间。

CPU执行进程,总是在不断对进程的切换中,这种叫时分复用,而且时间很快,从而让人有一种进程并行的感觉,即单个cpu在一个时刻只能做一件事

I/O流程

说下应用程序读文件的大致流程(写文件也差不多),当一个进程想要向磁盘或者接受网络数据时,它会先发起系统调用(可以通过异常等方式),然后将程序控制权交给操作系统,

操作系统向指定的文件发起读的操作,返回给程序一个文件操作符,然后接下来就是比较有意思的地方了,因为文件读出来是需要时间的,文件读出来后会存到内核的缓冲区中(DMA),然后中断提醒CPU,CPU再由内核缓冲区读取到用户进程中,在这个过程中,这段时间里,用户进程可以有阻塞,非阻塞,同步,异步各种状态

linux的I/O模型

网络IO的本质是socket的读取,socket在linux系统被抽象为流,IO可以理解为对流的操作。对于一次IO访问(以read举例),数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。所以说,当一个read操作发生时,它会经历两个阶段:

第一阶段:等待数据准备 (Waiting for the data to be ready)。 第二阶段:将数据从内核拷贝到进程中 (Copying the data from the kernel to the process)。

对于socket流而言,

第一步:通常涉及等待网络上的数据分组到达,然后被复制到内核的某个缓冲区。 第二步:把数据从内核缓冲区复制到应用进程缓冲区。

linux的五种网络i/o模型

同步的概念就是在数据复制到用户进程的这段时间内,用户进程是不干活

异步是在这段时间内,用户进程会继续执行它后续的工作

先在同步异步的基础上进行简单的分类

同步模型(synchronous IO)

  • 阻塞IO(bloking IO)
  • 非阻塞IO(non-blocking IO)
  • 多路复用IO(multiplexing IO)
  • 信号驱动式IO(signal-driven IO)

异步IO(asynchronous IO)

接下来进行分类的介绍

阻塞I/O

阻塞i/o就是整个过程用户进程都是阻塞,它发起系统调用后就被挂起了,直到数据被搬运到缓冲区中,然后数据从缓冲区读进用户进程,它才被唤醒,真个过程它都处于挂起状态(什么都不干)

非阻塞i/o

用户进程发起系统调用后,它没有被挂起,而是继续执行,但它要不断轮询看数据是否运到内核了,数据到了内核后,用户进程将数据从内核读取到用户进程

多路复用I/O

多路复用I/O比较复杂,它整个过程也是阻塞的,但不同的是它可以阻塞多个i/o,同时阻塞多个socket连接,有epoll,,poll,select等,epoll是linux最高效的,多路复用的特点是通过一种机制一个进程能同时等待多个IO文件描述符,内核监视这些文件描述符(套接字描述符),其中的任意一个进入读就绪状态,select, poll,epoll函数就可以返回。

select,poll,epoll都是内核状态的函数调用

用户进程发起系统调用后,处于挂起状态,同时监听多个socket连接,只要有其中有一个数据到达内核,用户进程就被唤醒工作,然后将数据从内核读取到用户进程,其实就是由epoll,select同时监听多个io对象,当io对象发生变化的时候,就通知用户进程读写数据,进行操作

即多个io对象复用一个进程,这样可以很充分的利用阻塞的这段时间

IO多路复用是同步阻塞模式

异步驱动I/O

这个理论上是最好的,但在linux系统中很难实现

信号驱动i/o

这个很少使用到

异步IO

异步io在linux中很难实现,但也有一种模拟异步io的方法即多线程和同步阻塞io进行模拟,设置一个主线程,用其它线程进行同步io操作,当io完成时通知主线程去读取进程中的数据,进行后续操作,因为是同一个进程,所以可以共享内存资源。进而实现类似异步io的效果,在linux中有libev,libeio这样的异步io实现库,而在windows,则使用了iocp,可以说异步io的核心就是在子线程上执行io操作,在执行完毕后通知调用者提取相关数据。只不过linux是用户层的线程池,而iocp是内核的线程池。

Node模型

首先说下常见的模型要么是单进程多线程,要么是多进程单线程,node是属于后者

node中最重的就是包含了libuv这个,node的所有io操作都是通过它来实现的,libuv实现了异步IO,libuv中包含一个事件队列(可以理解为就是主线程),如果是网络io,它会使用epoll这种io多路复用的方式(在linux中)对io进行处理,而对于磁盘的io操作,它会采用多线程+阻塞io的方式进行io操作,它读写完数据后就将数据返回给js引擎。从而实现io操作。

最后提一点epoll这种io多路复用模型使用的很广,redis,nginx,都不同程度使用了它,它2者也可以归为多进程单线程这种模型。

网络io模型总结的更多相关文章

  1. [编织消息框架][网络IO模型]BIO

    既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...

  2. 5种网络IO模型

    5种网络IO模型(有图,很清楚)   同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...

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

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

  4. python网络编程——网络IO模型

    1 网络IO模型介绍 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种:    (1)同步阻塞IO(Blocking IO):即传统的IO模型.    (2)同步非阻塞IO(Non-bl ...

  5. 通过实例理解Java网络IO模型

    网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以 ...

  6. 【转】5种网络IO模型

    5种网络IO模型(有图,很清楚) IO多路复用—由Redis的IO多路复用yinch Linux中对文件描述符的操作(FD_ZERO.FD_SET.FD_CLR.FD_ISSET

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

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

  8. 五种网络IO模型以及多路复用IO中select/epoll对比

    下面都是以网络读数据为例 [2阶段网络IO] 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络 ...

  9.  打开APP  04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋

     打开APP  04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋

  10. Unix 网络IO模型介绍

    带着问题阅读 1.什么是同步异步.阻塞非阻塞 2.有几种IO模型,不同模型之间有什么区别 3.不同IO模型的应用场景都是什么 同步和异步.阻塞和非阻塞 同步和异步 广义上讲同步异步描述的是事件中发送方 ...

随机推荐

  1. Libra和中国央行数字货币(DCEP)的对比

    最近偶然和朋友讨论起Libra,对Libra和央行的数字货币方案很感兴趣.梳理了阅读资料(参考见文末)和自己的思考,发知乎留个记录. Libra 是什么? 无国界货币 + 为全球数十亿人服务的金融基础 ...

  2. QP移植

    以STM32平台为例,该单片机的ARM Cortex-M系列内核正是被QP长期支持,所以QP在ARM Cortex-M系列内核上已经有长时间的应用验证. 在配套书籍PSICC2中的例程为QP最原始的版 ...

  3. javascript 闭包的理解(二)

    // 定义一个User构造函数 function User(properties){ //遍历对象属性,确保它作用域正确 for(var i in properties){ (function(whi ...

  4. 从头学pytorch(六):权重衰减

    深度学习中常常会存在过拟合现象,比如当训练数据过少时,训练得到的模型很可能在训练集上表现非常好,但是在测试集上表现不好. 应对过拟合,可以通过数据增强,增大训练集数量.我们这里先不介绍数据增强,先从模 ...

  5. Python之eval和exec

    eval可以执行字符串形式的表达式 In [1]: eval("1 + 2 + 3") Out[1]: 6 In [2]: eval("a + 1", {&qu ...

  6. .NET ORM 开源项目 FreeSql 1.0 正式版发布

    一.简介 FreeSql 是 .NET 平台下的对象关系映射技术(O/RM),支持 .NetCore 2.1+ 或 .NetFramework 4.0+ 或 Xamarin. 从 0.0.1 发布,历 ...

  7. 常见的java异常——java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path

    此异常是由于你的controller中有两个名字与内容相同的方法: 出现此异常时去检查你的controller中是否有重复的名字的方法:

  8. 从零开始のcocos2dx生活(八)ParticleSystemQuad

    https://learnopengl-cn.github.io/01%20Getting%20started/04%20Hello%20Triangle/#_1 写的真的非常好-最近没时间拜读,只看 ...

  9. Tangram: Optimized Coarse-Grained Dataflow for Scalable NN Accelerators 阅读笔记

    目录 Tangram: Optimized Coarse-Grained Dataflow for Scalable NN Accelerators 1.Abstract 2.Introduction ...

  10. leetcode.1266访问所有点的最小时间

    平面上有 n 个点,点的位置用整数坐标表示 points[i] = [xi, yi].请你计算访问所有这些点需要的最小时间(以秒为单位). 你可以按照下面的规则在平面上移动: 每一秒沿水平或者竖直方向 ...