linux文件打开模式
2023-09-14 09:08:01 时间
文件打开
int open(const char *pathname, int flags, mode_t mode);
普通方式(Canonical mode)
flags中没有设置O_SYNC and O_DIRECT。
这样的方式中read是堵塞调用(blocking call),等到磁盘数据读取完成后返回;write也是堵塞调用,只是write将数据写入到page cache后。就返回,没有写入磁盘的动作。内核会依据一定的策略将page cache中的数据写回到磁盘。
同步模式(Synchronous mode )
设置O_SYNC。
read操作和普通方式一样,write操作有所不同。
write操作等待数据全然写入磁盘后在返回。该模式下的write操作会有较大的性能减少。可是提高了系统的可靠性,不会产生数据丢失。
Direct I/O mode
设置O_DIRECT 。
这样的方式下,read和write操作不再经过page cache,而是直接读写磁盘。有些应用程序须要自己维护缓存,能够使用该模式,如数据库系统。
非堵塞模式(Nonblocking I/O)
设置O_NONBLOCK。该模式下。read和write都是非堵塞(nonblocking)模式。
假设系统中没有可用数据,read立马返回,而不是等待;write也是如此。假设数据不能立即发送出去,也立马返回。
该模式一般要结合某种 I/O event notification机制使用,如select, poll, epoll等。
内存映射模式(Memory mapping mode )
通过void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset)打开。
异步模式(Asynchronous mode)
POSIX标准中定义了文件异步訪问模式的接口(aio_read,aio_write等)。
异步方式中。read/write将要将所需信息(如文件。内存地址等)记录下来,就立马返回,不须要等待实际IO操作。实际IO完毕后。会有事件通知。这个模式和硬件设备的DMA比較类似。仅仅要发出IO指令就可以,实际的IO操作会在后面异步完毕。
socket的读和写
堵塞模式
send:假设网络缓冲区有足够空间,send将数据复制到缓冲区后返回。假设没有足够空间(如网络拥塞控制,对方没有确认之前的消息等),堵塞。
send:假设网络缓冲区有足够空间。send将数据复制到缓冲区后返回。假设没有足够空间。返回
非堵塞模式
recv: 假设网络缓冲区中有数据收到,立马返回。返回值EAGAIN or EWOULDBLOCK。
EAGAIN or EWOULDBLOCK 。
send操作成功。不代表数据已经发送到了接收方,仅仅代表数据已经放入网络缓冲区中。
不同的打开方式有不同的适用场景。在选择的时候一定要依据实际需求来确定。如支持高并发的WEBserver都会选用非堵塞模式处理socket。
linux最開始仅仅有普通方式,其它的方式一定为了处理各种使用场景而逐渐添加的。
当然不排除某位大牛拍脑袋想出来的。
相关文章
- 混杂模式下Linux网卡性能优化(网卡混杂模式linux)
- Linux下实现用户权限管理的指南(linux给用户设置权限)
- Linux下执行Python程序的方法(linux执行py文件)
- Linux高薪运维28期:拓展技能,轻松拿薪酬超乎想象!(linux高薪运维28期)
- 快速删除Linux文件:多文件一次性删除(linux删除多个文件)
- 文件Linux下压缩处理文件的方法(linux打包压缩)
- Linux下定时执行任务的最佳实践(linux定时执行任务)
- Linux软件源:快速安装你所需要的软件(linux软件源添加)
- 命令使用Linux的mv命令移动文件(linux的mv)
- 深入Linux:查看文件信息(linux查看文件信息)
- Linux下文件赋予权限的完美技巧(linux文件赋权限)
- ~让我们一起学习Linux吧~(怎么自学linux)
- Linux下打包文件的技巧(linux怎么打包文件)
- Linux下快速批量重命名文件的方法(批量重命名linux)
- Linux系统下的红帽传奇(红帽和linux啥关系)
- Linux系统声卡设备操作手册(linux声卡设备文件)
- 如何在Linux下使用SMB共享文件?(linux下smb)
- Linux平台如何高效搜索PHP文件(linux搜索php)
- Linux PTX:开启高效率工作模式(linux ptx)
- Linux下查看大文件的简便方法(linux 大文件 查看)
- 文件Linux系统如何重命名文件(linux如何重命名)