- IO分类
- 标准IO(缓存IO)
在linux的缓存IO中,数据先从磁盘拷贝到内核空间的缓冲区(内核线程会定时写回磁盘),然后再从内核空间拷贝到用户空间.
优点:
减少磁盘读写次数,(内核空间缓冲区有的话,直接从内核空间拿),提高效率
一定程度上分离用户空间和内核空间,保护系统安全
缺点:
来回拷贝,增大cpu以及内存的开销 - 直接IO
跳过内核空间缓冲区,直接去磁盘中寻找数据
优点:
可以解决缓存IO的缺点,无需在用户空间和内核空间来回拷贝数据
缺点:
无法利用到内核空间缓冲区,每次IO都要读磁盘,效率低
需要在应用层自己实现缓存 - mmap(内存映射)
一个可以让用户直接访问内存空间的机制.
优点:
减少拷贝次数.只需从磁盘拷贝一次,不用从内核空间拷贝到用户空间
缺点:
虚拟内存增大. 超大文件时可能出现OOM
多个进程同时修改文件可以吗?
可以.
当我们vim demo.txt时,实际上会在其同级目录下生成一个demo.txt.swp文件,直至我们保存时,才会将demo.txt.swp的内容拷贝到demo.txt中,删除demo.txt.swp.
如果用户a正在修改demo.txt,然后用户b也来修改,用户读到的还是demo.txt的内容,如果用户b没保存就看不到用户b的修改(隔离),同时用户b也会生成一个demo.txt.swo文件..
对,后面的用户依次会是.swo, .swn, .swm, .swl等..
对了,如果用户b开始修改后,用户a保存了自己的修改,用户b再保存时,会提示不一样了,是否还要保存,如果保存,则会直接覆盖了用户a的保存讲一讲各种IO模型
- 阻塞IO:
当应用请求接收数据时,会阻塞等待,知道数据到达内核空间中,然后将数据拷贝到用户空间缓冲区使用 - 非阻塞IO:
当应用请求接收数据时,如果内核空间中还没有数据,不会等待,会返回错误码.否则将数据拷贝到用户空间使用 - IO多路复用
以上两种对于每一个fd都是由一个线程去监听,而多路复用IO则使用一个线程去监听多个文件描述符,节省了资源 - 异步IO
在应用请求接收数据后,直到数据被拷贝到内核空间后又被拷贝到用户空间后才会通知应用IO完成