网络io模型总结
操作系统基本概念
首先来来说下操作系统,嗯,操作系统是计算机硬件的管理软件,是对计算机硬件的抽象,操作系统将应用程序分为用户态和内核态,例如驱动程序就位于内核态,而我们写的一般程序都是用户态,包括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模型总结的更多相关文章
- [编织消息框架][网络IO模型]BIO
既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...
- 5种网络IO模型
5种网络IO模型(有图,很清楚) 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到 ...
- Socket-IO 系列(一)Linux 网络 IO 模型
Socket-IO 系列(一)Linux 网络 IO 模型 一.基本概念 在正式开始讲 Linux IO 模型前,先介绍 5 个基本概念. 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器, ...
- python网络编程——网络IO模型
1 网络IO模型介绍 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-bl ...
- 通过实例理解Java网络IO模型
网络IO模型及分类 网络IO模型是一个经常被提到的问题,不同的书或者博客说法可能都不一样,所以没必要死抠字眼,关键在于理解. Socket连接 不管是什么模型,所使用的socket连接都是一样的. 以 ...
- 【转】5种网络IO模型
5种网络IO模型(有图,很清楚) IO多路复用—由Redis的IO多路复用yinch Linux中对文件描述符的操作(FD_ZERO.FD_SET.FD_CLR.FD_ISSET
- 从操作系统层面理解Linux下的网络IO模型
I/O( INPUT OUTPUT),包括文件I/O.网络I/O. 计算机世界里的速度鄙视: 内存读数据:纳秒级别. 千兆网卡读数据:微妙级别.1微秒=1000纳秒,网卡比内存慢了千倍. 磁盘读数据: ...
- 五种网络IO模型以及多路复用IO中select/epoll对比
下面都是以网络读数据为例 [2阶段网络IO] 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络 ...
- 打开APP 04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋
打开APP 04 | 网络通信:RPC框架在网络通信上更倾向于哪种网络IO模型? 2020-02-26 何小锋
- Unix 网络IO模型介绍
带着问题阅读 1.什么是同步异步.阻塞非阻塞 2.有几种IO模型,不同模型之间有什么区别 3.不同IO模型的应用场景都是什么 同步和异步.阻塞和非阻塞 同步和异步 广义上讲同步异步描述的是事件中发送方 ...
随机推荐
- 一点资讯 视频抓取 phantomjs
# _*_ coding: utf- _*_ """ 思路: .列表页使用phantomjs模拟点击.每个链接只抓取第一页9-10条内容,按照标题去重 .布置定时任务,每 ...
- Wannafly挑战赛25 因子 [数论]
一.题意 令 X = n!, 给定一大于1的正整数p 求一个k使得 p ^k | X 并且 p ^(k + 1) 不是X的因子 输入为两个数n, p (1e18>= n>= 10000 & ...
- Python之eval和exec
eval可以执行字符串形式的表达式 In [1]: eval("1 + 2 + 3") Out[1]: 6 In [2]: eval("a + 1", {&qu ...
- java_学生成绩管理系统
//信1805-2 20183670 王云鹏 package student; import java.util.Scanner; public class ScoreManagement { sta ...
- 【转载】你不知道的 console,让 JS 调试更简单
对于前端工程师,肯定不会对console陌生,但是,又能深入了解多少呢? Chrome控制台-开发者工具 windows按F12, MAC按Command + Option + C或Command + ...
- 斜率优化入门题题单$QwQ$
其实就是这一篇的那个例题帕的大部分题目的题解就写这儿辣,,, 因为都是些基础题不想专门给写题解,,,但是又掌握得差不得不写,,, 麻油办法就写一块儿好辣$QwQ$ 当然辣比较难的我就没放进来辣$QwQ ...
- 洛谷$P$2518 计数 $[HAOI2010]$ 数位$dp$
正解:数位$dp$ 解题报告: 传送门$w$ 感觉省选的数位$dp$还是比较有质量的辣,,,至少有一定的思维难度是趴$QwQ$ 这题要考虑到一个,我认为比较关键的点,就,对于一个位数不满的数,可以理解 ...
- JAVA字节码文件之常量池
一.常量池的内容 一个java类中定义的很多信息都是由常量池来维护和描述的,可以将常量池看作是class文件的资源仓库,比如java类中定义的方法与变量信息.常量池中主要存储两类常量:字面量(文本字符 ...
- 「Vijos 1282」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法照片
佳佳的魔法照片 背景 佳佳的魔法照片(Magic Photo):如果你看过<哈利·波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为小魔法师佳佳长的太帅,很多人都找他要那种神奇的魔法 ...
- 08_jquery里面的$(this)和this都什么时候用,有什么区别
当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! "); 这个里的html()是J ...