操作系统基本概念

首先来来说下操作系统,嗯,操作系统是计算机硬件的管理软件,是对计算机硬件的抽象,操作系统将应用程序分为用户态和内核态,例如驱动程序就位于内核态,而我们写的一般程序都是用户态,包括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. 一点资讯 视频抓取 phantomjs

    # _*_ coding: utf- _*_ """ 思路: .列表页使用phantomjs模拟点击.每个链接只抓取第一页9-10条内容,按照标题去重 .布置定时任务,每 ...

  2. Wannafly挑战赛25 因子 [数论]

    一.题意 令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子 输入为两个数n, p (1e18>= n>= 10000 & ...

  3. Python之eval和exec

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

  4. java_学生成绩管理系统

    //信1805-2 20183670 王云鹏 package student; import java.util.Scanner; public class ScoreManagement { sta ...

  5. 【转载】你不知道的 console,让 JS 调试更简单

    对于前端工程师,肯定不会对console陌生,但是,又能深入了解多少呢? Chrome控制台-开发者工具 windows按F12, MAC按Command + Option + C或Command + ...

  6. 斜率优化入门题题单$QwQ$

    其实就是这一篇的那个例题帕的大部分题目的题解就写这儿辣,,, 因为都是些基础题不想专门给写题解,,,但是又掌握得差不得不写,,, 麻油办法就写一块儿好辣$QwQ$ 当然辣比较难的我就没放进来辣$QwQ ...

  7. 洛谷$P$2518 计数 $[HAOI2010]$ 数位$dp$

    正解:数位$dp$ 解题报告: 传送门$w$ 感觉省选的数位$dp$还是比较有质量的辣,,,至少有一定的思维难度是趴$QwQ$ 这题要考虑到一个,我认为比较关键的点,就,对于一个位数不满的数,可以理解 ...

  8. JAVA字节码文件之常量池

    一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符 ...

  9. 「Vijos 1282」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法照片

    佳佳的魔法照片 背景 佳佳的魔法照片(Magic Photo):如果你看过<哈利·波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为小魔法师佳佳长的太帅,很多人都找他要那种神奇的魔法 ...

  10. 08_jquery里面的$(this)和this都什么时候用,有什么区别

    当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! "); 这个里的html()是J ...