高级IO
1.关于IO
IO的基本类型:
I代表输入(Input):
- 从外部设备或来源(如键盘、鼠标、文件、网络)读取数据到计算机中。
- 示例:用户键入的文本、从文件读取的数据、从网络接收到的数据包。
O代表输出(Output):
- 将计算机处理后的数据发送到外部设备或目的地(如显示器、打印机、文件、网络)。
- 示例:屏幕上显示的文本、写入文件的数据、发送到网络的消息。
2.IO模型
①.阻塞IO
在进行IO操作时,当前进程或者线程会被阻塞,直到IO操作完成。
例如scanf,在你没有输入任何内容时,他会卡在那里,直到等到你输入内容回车后,菜继续执行。那么在没有输入任何内容时,进程就进入到了阻塞态,等待你输入内容,然后进入到就绪队列,然后被CPU调度变为运行态,最终执行完成。
②.非阻塞IO
- 轮询:比如你又一个快递,你会去查看,但是查看之后你不会一直去等待这个快递在这个过程中什么事你都不去干。正常来说,你会看一下快递到了吗,然后就去干别的事,然后过一段时间又看一下到了吗,直到你的快递到达。这个过程就叫做轮询
- 信号机制:等待一个信号的发生,然后做出对应的操作
- 通信机制:计算机网络
- 非阻塞IO适用于IO多路复用
③.缓存IO
- 缓存:当你寄快递,快递公司不可能只为了
一个快递发一个车,他会等到一定数量才发车。这就叫做缓存。#include <sys/select.h> int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
- 行缓冲机制:C语言中的3个标准流
④.直接IO
- 直接写入到硬盘,没有任何缓存。
⑤.同步IO
- 当你通过IO进行写入时,他会写入到缓存,然后当你保存时写入到磁盘上,最后完全写入到磁盘后才进行返回,保存成功。
3.IO多路复用
为什么要引入IO多路复用?
为了是一个程序能够同时监听多个文件描述符(文件、套接字等)以等待事件(如数据到达、IO写入等等)。这样通过这样就可以更方便的去管理阻塞的问题。
IO多路复用相应函数:
select
函