Linux五种IO模型

简介: Linux五种IO模型

一、背景知识

UNIX网络编程》中讲了5中IO模型,分别是:阻塞IO模型和非阻塞IO模型、IO复用模型、信号驱动的IO模型和异步IO模型。注意:只有异步IO模型是异步IO操作,其余都是同步IO操作。

二、什么是IO

通常我们说的IO指的就是磁盘IO或者网络IO。IO操作分为两部分:

  • 第一部分:数据准备阶段,内核空间<–>IO设备(磁盘或者网卡)。
  • 第二部分:内核将数据拷贝到用户空间(用户空间<–>内核空间)。
2.1 什么是同步IO和异步IO?

同步IO 和 异步IO的区别在于:IO的第二个阶段是否阻塞,若是需要等待或者轮询内核,直至完成才能执行就是同步IO;异步是用户线程发起IO请求后继续执行,内核完成数据的准备工作,发信号给线程,线程响应处理。

2.2.1 阻塞IO

阻塞IO指的是进程发起系统调用后,进程被阻塞。转到内核空间处理,直到IO设备准备好数据,内核再将数据拷贝到用户空间,返回进程。

2.2.2 非阻塞IO

非阻塞IO是,进程发起系统调用,如果内核缓冲区没有数据,需要先到IO设备读取数据,此时,内核会给进程返回一个错误码,而不至于阻塞进程。进程会轮询多次调用系统调用,检查数据是否就绪,消耗CPU资源。

2.2.3 小结

阻塞IO 和 非阻塞IO 区别在与发起IO请求后第一步是否阻塞,而且非阻塞IO会一直轮询内核数据有没有准备好,浪费CPU资源,不建议用。

2.3 IO复用模型

多个进程的IO可以注册到一个复用器(select)上,然后让一个进程调用该select,select会监听所有注册进来的IO。如果select监听的所有IO都没有数据可读,调用select的进程就会一直阻塞在select。只要任意一个IO的内核缓冲区有数据可读,select就会返回。

除了selectIO复用外,Linux还提供了 poll 和 epoll 两种方案。

特点:

  1. 专一进程解决进程IO阻塞问题,Reactor模式。
  2. 适用于高性能服务器开发,一个进程或线程响应多个请求。
2.4 异步IO模型

进程发起IO操作,进程返回。内核拷贝完数据会以信号的方式,通知进程。进程在自己的信号处理函数中处理数据。

文章参考于<零声教育>的C/C++linux服务期高级架构

相关文章
|
4月前
|
Java Linux API
IO模型
BIO、NIO、AIO是Java中处理网络I/O的三种模型。BIO为阻塞式,每个连接需单独线程,高并发下性能受限;NIO通过非阻塞与多路复用提升并发能力,少量线程可处理大量请求;AIO进一步实现异步非阻塞,数据复制时线程可释放,由回调机制处理后续操作。三者适用于不同场景,BIO易用但低效,NIO高效但复杂,AIO理论性能更优但目前在Linux上仍依赖多路复用实现。Java 21引入虚拟线程后,BIO也可兼具高性能与易编写特性。
160 2
|
存储 Linux C语言
Linux C/C++之IO多路复用(aio)
这篇文章介绍了Linux中IO多路复用技术epoll和异步IO技术aio的区别、执行过程、编程模型以及具体的编程实现方式。
618 1
Linux C/C++之IO多路复用(aio)
|
5月前
|
Linux C语言 网络架构
Linux的基础IO内容补充-FILE
而当我们将运行结果重定向到log.txt文件时,数据的刷新策略就变为了全缓冲,此时我们使用printf和fwrite函数打印的数据都打印到了C语言自带的缓冲区当中,之后当我们使用fork函数创建子进程时,由于进程间具有独立性,而之后当父进程或是子进程对要刷新缓冲区内容时,本质就是对父子进程共享的数据进行了修改,此时就需要对数据进行写时拷贝,至此缓冲区当中的数据就变成了两份,一份父进程的,一份子进程的,所以重定向到log.txt文件当中printf和fwrite函数打印的数据就有两份。此时我们就可以知道,
102 0
|
5月前
|
存储 Linux Shell
Linux的基础IO
那么,这里我们温习一下操作系统的概念我们在Linux平台下运行C代码时,C库函数就是对Linux系统调用接口进行的封装,在Windows平台下运行C代码时,C库函数就是对Windows系统调用接口进行的封装,这样做使得语言有了跨平台性,也方便进行二次开发。这就是因为在根本上操作系统确实像银行一样,并不完全信任用户程序,因为直接开放底层资源(如内存、磁盘、硬件访问权限)给用户程序会带来巨大的风险。所以就向银行一样他的服务是由工作人员隔着一层玻璃,然后对顾客进行服务的。
80 0
|
9月前
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
408 34
|
11月前
|
Linux API C语言
Linux基础IO
Linux基础IO操作是系统管理和开发的基本技能。通过掌握文件描述符、重定向与管道、性能分析工具、文件系统操作以及网络IO命令等内容,可以更高效地进行系统操作和脚本编写。希望本文提供的知识和示例能帮助读者更深入地理解和运用Linux IO操作。
236 14
|
网络协议 前端开发 Java
网络协议与IO模型
网络协议与IO模型
445 4
网络协议与IO模型
|
开发者
什么是面向网络的IO模型?
【10月更文挑战第6天】什么是面向网络的IO模型?
119 3
|
数据挖掘 开发者
网络IO模型
【10月更文挑战第6天】网络IO模型
344 3
下一篇
oss云网关配置