zoukankan      html  css  js  c++  java
  • Linux下文件的堵塞与非堵塞对部分系统调用的影响

    1.基本概念

    所谓的堵塞,即内核在对文件操作I/O系统调用时。假设条件不满足(可能须要产生I/O),则内核会将该进程挂起。非堵塞则是发现条件不满足就会马上返回。

    此外须要注意的是非堵塞并非轮询。不然就和堵塞没多大差别了,它仅仅是调用不成功就直接返回了,不会在去看啥时候会满足条件。而是有你自己去选择接下来该咋办,系统以不再负责

    2.read/write堵塞与非堵塞的理解

    read/write系统调用,并不会去直接读写文件。而仅仅是去操作文件所相应的内存页(此时的页为虚拟内存),对于read假设在页中找到了想要读写的数据,则直接从页中将数据copy到用户缓存就可以,假设要读的页没有找到,则仅仅能从磁盘读出该页内容缓存在内存中就可以。所谓的读过程,事实上文件系统所要做的仅仅是锁定页面,然后构造一个读请求,并将请求发给底层的IO子系统就可以。

    linux内核中read系统调用默认是堵塞的write调用是非堵塞的,由于write时仅仅是将用户态的数据写入缓存页面中就可以返回

    3.对于网络套接字堵塞/非堵塞对读数据的影响

    (1)在堵塞情况下

    在堵塞条件下,read/recv/msgrcv的行为
    1.假设没有发现数据在网络缓冲中会一直等
    2.当发现有数据时会把数据读到用户指定的缓存区中(假设读到的数据比指定的大小小,read此时并不会堵塞。而是会马上返回)

    应为read的原则是在不超过指定长度的时候有多少读多少。没有数据就返回。所以普通情况下。假设我们想要读取我们想要的字节量,就得循环read
    

    (2)在非堵塞情况下

    在非堵塞情况下read的行为
    1.假设发现没有数据就直接返回
    2.假设发现有数据,那么也是採用有多少就读多少,所以read完之后须要推断是否再次进行read操作。以读到我们想要的字节数

    对于读的堵塞与非堵塞差别就在于没有数据可读时,是否马上返回
    

    4.对于网络套接字堵塞/非堵塞对写数据的影响

    写的操作本质也不是进行发送操作。而是把用户态的数据copy到系统底层去,然后由系统帮忙发送。

    send,write返回成功,仅仅表明数据已经copy究竟层缓冲,而并不表明数据以发送出去。更不能表示对方port已经接收到数据

    (1)堵塞情况下

    write会将数据发完之后才返回。这里与读不同。当我们读数据的时候,我们并不知道发送端是否还有数据要发,假设一直等待就可能造成死循环,所以为了避免这类事情发生,我们把当前缓存中的内容读完,就返回了。并不关心是否读够了我们想要读的字节数。而write。由于须要写的长度是知道的。所以它会一直写够指定的字节才返回

    (2)非堵塞情况下

    非堵塞情况下,是採用能够写多少就写多少的策略。与读不一样的地方在于,有多少读多少是由网络发送端是否有传输数据到为标准。

    可是对于写多少是由本地网络堵塞情况为标准的,对于非堵塞的情况就是一次写多少算多少,有可能会造成部分写入

  • 相关阅读:
    golang 使用 iota
    Event Sourcing Pattern 事件源模式
    Win10桌面预览版14316更新内容大全
    腾信微信公众号初步开发应用
    微信支付:H5吊起支付API,不显示“确认支付、输入密码”界面
    开发者了解---微信公众号(服务号、订阅号、企业号)的区别
    X240 Win10企业版 14279版本 电池标尺白底问题
    Go项目的目录结构
    Command and Query Responsibility Segregation (CQRS) Pattern 命令和查询职责分离(CQRS)模式
    .NET环境下基于RBAC的访问控制
  • 原文地址:https://www.cnblogs.com/liguangsunls/p/7272318.html
Copyright © 2011-2022 走看看