IO概念


一、什么是IO?

IO有三种、通常我们说的IO指的是后两者

  • 内存IO
  • 网络IO
  • 磁盘IO

我们都知道linux世界里、一切皆文件、而文件是什么呢?文件就是一串二进制流而已、不管socket、还是FIFO、管道、终端、对我们来说、一切都是文件、一切都是流、在信息交换的过程中、我们都是对这些流进行数据的收发操作、简称为I/O操作(input and output)、往流中读出数据、系统调用read、写入数据、系统调用write、不过话说回来了、计算机里有这么多的流、我怎么知道要操作哪个流呢?做到这个的就是文件描述符、即通常所说的fd、一个fd就是一个整数、所以对这个整数的操作、就是对这个文件(流)的操作、我们创建一个socket、通过系统调用会返回一个文件描述符、那么剩下对socket的操作就会转化为对这个描述符的操作、不能不说这又是一种分层和抽象的思想。
在这里插入图片描述

二、IO交互

为了保护计算机,设备空间不允许用户空间直接访问,需要通过内核空间对用户和设备之间搭建一个桥梁。因此产生如下交互过程:
通常用户进程中的一个完整IO分为两阶段:
用户空间 <-----> 内核空间
内核空间 <-----> 设备空间
在这里插入图片描述

  1. 内核空间中存放的是内核代码和数据、而进程的用户空间中存放的是用户程序的代码和数据、不管是内核空间还是用户空间、它们都处于虚拟空间中、Linux使用两级保护机制:0级供内核使用、3级供用户程序使用
  2. 操作系统和驱动程序运行在内核空间、应用程序运行在用户空间、两者不能简单地使用指针传递数据、因为Linux使用的虚拟内存机制、其必须通过系统调用请求kernel来协助完成IO动作、内核会为每个IO设备维护一个缓冲区、用户空间的数据可能被换出、当内核空间使用用户空间指针时、对应的数据可能不在内存中
  3. 对于一个输入操作来说、进程IO系统调用后、内核会先看缓冲区中有没有相应的缓存数据、没有的话再到设备中读取、因为设备IO一般速度较慢、需要等待、内核缓冲区有数据则直接复制到进程空间、

所以、对于一个网络输入操作通常包括两个不同阶段:

(1)等待网络数据到达网卡 –> 读取到内核缓冲区

(2)从内核缓冲区复制数据 –> 用户空间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux系统中,文件I/O(Input/Output)的是程序和操作系统之间进行数据读写操作的过程,它是操作系统的核心功能之一。理解文件I/O概念对于编写高效并发程序至关重要。 1. 文件描述符(File Descriptors, FDs):每个进程都有一个或多个文件描述符,用于引用打开的文件或设备。这些描述符是程序和内核之间进行I/O请求的桥梁。 2. 打开文件(Opening a File):应用程序使用`open()`函数打开一个文件,返回对应的文件描述符。这个过程创建了一个文件句柄,可以被后续的操作所引用。 3. 读写操作(Reading and Writing):一旦获得文件描述符,就可以使用如`read()`、`write()`等函数从磁盘读取数据到内存或将内存中的数据写入文件。它们接受文件描述符作为参数,并定要读写的字节数。 4. 原地修改(In-Place Modification):通过文件描述符进行的读写通常是顺序执行的,如果需要随机访问或修改文件内容,可能需要先读取整个块,修改后重新写回。 5. 缓存机制(Buffering):为了提高性能,Linux内核通常会对文件I/O进行缓存。这包括读取时的预读取和写入时的缓冲,直到达到一定的大小或满足特定条件才会提交到磁盘。 6. 锁定和同步(Locking and Synchronization):为避免多线程环境下对同一文件的并发读写冲突,会用到文件锁(flock)或其他同步机制。 7. 异步IO(Asynchronous I/O):使用异步I/O可以在等待I/O操作完成的同时继续执行其他任务,提高了程序的响应速度。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值