zoukankan      html  css  js  c++  java
  • linux文件打开模式

    
    文件打开
    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的读和写
    堵塞模式
    recv: 堵塞,直到网络缓冲区中有数据收到。
    send:假设网络缓冲区有足够空间,send将数据复制到缓冲区后返回。假设没有足够空间(如网络拥塞控制,对方没有确认之前的消息等),堵塞。



    非堵塞模式
    recv: 假设网络缓冲区中有数据收到,立马返回。返回值EAGAIN or EWOULDBLOCK。

    send:假设网络缓冲区有足够空间。send将数据复制到缓冲区后返回。假设没有足够空间。返回
    EAGAIN or EWOULDBLOCK 。

    send操作成功。不代表数据已经发送到了接收方,仅仅代表数据已经放入网络缓冲区中。


    不同的打开方式有不同的适用场景。在选择的时候一定要依据实际需求来确定。如支持高并发的WEBserver都会选用非堵塞模式处理socket。

    linux最開始仅仅有普通方式,其它的方式一定为了处理各种使用场景而逐渐添加的。

    当然不排除某位大牛拍脑袋想出来的。

  • 相关阅读:
    【面积并】 Atlantis
    【动态前k大 贪心】 Gone Fishing
    【复杂枚举】 library
    【双端队列bfs 网格图建图】拯救大兵瑞恩
    【奇偶传递关系 边带权】 奇偶游戏
    【权值并查集】 supermarket
    CF w4d3 A. Pythagorean Theorem II
    CF w4d2 C. Purification
    CF w4d2 B. Road Construction
    CF w4d2 A. Cakeminator
  • 原文地址:https://www.cnblogs.com/bhlsheji/p/5062418.html
Copyright © 2011-2022 走看看