Linux IO模型漫谈(1)

基础知识

Linux将所有外部设备都看做一个文件来进行操作。因此,linux对所有外部设备的操作都可以看做是文件的操作。文件的操作当然需要有个标示描述它,这就是文件描述符(file descriptor)。

linux的IO操作如何形象理解呢?

我们说网络socket的read()是一个IO操作命令,具体流程是这样的:

应用程序调用read命令,通知内核需要做读取数据操作

内核创建一个文件描述符

内核从物理层收到读数据的命令,从网络中获取数据包

数据包传递到TCP/IP层,解析数据包的头

内核将数据包缓存在文件描述符的读缓存区(接受缓存区)中,注意这里的读缓存区是在内核中的

当文件描述符读缓存区数据字节数大于应用程序定义的低水位的时候(read的一个参数),此时文件描述符处于读就绪的状态

将读缓存区中的数据复制到应用程序(用户区)返回

这里需要说明的是

1 每个文件描述符都有自己的读缓冲区和写缓冲区,读缓冲区对应的是read操作,写缓冲区对应的就是write操作了

2 读缓冲区和写缓冲区都是在内核区中

IO模型

现有的linux IO模型有5种:

阻塞式IO模型,非阻塞式IO模型,IO复用模型,信号驱动式IO模型,异步IO模型

经常弄不清楚的就是阻塞,非阻塞,异步,同步

说明一下

上图给出的同步异步标准是:数据描述符缓存是由谁来进行读取的?由用户程序读取,则判断为同步;由内核推送,判断为异步

上图给出的阻塞非阻塞标准是:调用的用户进程是否是阻塞的状态

这里关于这五种IO模型的阻塞同步状态有很多种说法,比较有争议的是IO复用模型和信号驱动IO模型的判断分类上,推荐这一种判断:

关于IO的同步、异步、阻塞、非阻塞

时间: 2024-09-13 11:53:27

Linux IO模型漫谈(1)的相关文章

Linux IO模型漫谈(2)

不管Linux的IO模型的阻塞同步分类是如何分类,几种IO模型的具体实现是确定的.这里借用<Unix 网络编程:卷一>的图片说明. 1 阻塞式IO模型 这个模型也是最容易理解的 程序调用和我们基本的程序编写是一致的: fd = connect() write(fd) read(fd) close(fd) 程序的read必须在write之后执行,当write阻塞住了,read就不能执行下去 2 非阻塞IO模型 从图中可以看出来,这是一个轮询的过程 每次用户询问内核是否有数据报准备好(文件描述符缓

Linux IO模型漫谈(6)- 信号驱动IO模型

Unix上有定义了许多信号.源自Berkeley的实现使用的是SIGIO信号来支持套接字和终端设备上的信号驱动IO. 信号驱动IO模型主要是在UDP套接字上使用,在TCP套接字上几乎是没有什么使用的. 在UDP上,SIGIO信号会在下面两个事件的时候产生: 1 数据报到达套接字 2 套接字上发上一部错误 因此我们很容易判断SIGIO出现的时候,如果不是发生错误,那么就是有数据报到达了. 而在TCP上,由于TCP是双工的,它的信号产生过于平凡,并且信号的出现几乎没有告诉我们发生了什么事情.因此对于

Linux IO模型漫谈(3) -- 阻塞式IO实现

在理解代码前有几个函数先说一下: 1 sockaddr_in 套接字地址结构 1 2 3 4 5 6 7 8 9 10 struct sockaddr_in {     uint8_t         sin_len;        //长度字段,这个sockaddr_in结构的长度,一般不用设置和检查它     sa_family_t     sin_family;     //协议族,TCP,UDP等协议族就设置为AF_INET      in_port_t       sin_port; 

Linux IO模型漫谈(5)- IO复用模型之select

首先需要了解的是select函数: select函数 #include<sys/select.h> #include<sys/time.h> int select (int maxfd , fd_set *readset ,fd_set *writeset, fd_set *exceptionset , const struct timeval * timeout); 返回:就绪描述字的正数目,0--超时,-1--出错   参数解释: maxfd: 最大的文件描述符(其值应该为最大

Linux五种IO模型性能分析

socket阻塞与非阻塞,同步与异步 1. 概念理解      在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式:同步:       所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:       异步的概念和同步相对.当一个异步过

Linux的Socket IO模型趣解_Linux

前言  之前有看到用很幽默的方式讲解Windows的socket IO模型,借用这个故事,讲解下linux的socket IO模型:  老陈有一个在外地工作的女儿,不能经常回来,老陈和她通过信件联系. 他们的信会被邮递员投递到他们小区门口的收发室里.这和Socket模型非常类似.  下面就以老陈接收信件为例讲解linux的 Socket I/O模型.  一.同步阻塞模型  老陈的女儿第一次去外地工作,送走她之后,老陈非常的挂心她安全到达没有: 于是老陈什么也不干,一直在小区门口收发室里等着她女儿

Linux 下的五种 IO 模型详细介绍_Linux

概念说明 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可以访问受保护的内存空间,也有访问底层硬件设备的所有权限.为了保证用户进程不能直接操作内核(kernel),保证内核的安全,操作系统将虚拟空间划分为两部分,一部分为内核空间,一部分为用户空间.针对linux操作系统而言,将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为内核空

[转]高性能IO模型浅析

高性能IO模型浅析 转自:http://www.cnblogs.com/fanzhidongyzby/p/4098546.html 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO并非Java的NIO(New IO)库. (3)IO多路复用(IO Mul

高性能IO模型浅析

高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的socket都是阻塞的,非阻塞IO要求socket被设置为NONBLOCK.注意这里所说的NIO并非Java的NIO(New IO)库. (3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Li