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到底层缓冲,而并不表明数据以发送出去,更不能表示对方端口已经接收到数据

(1)阻塞情况下

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

(2)非阻塞情况下

非阻塞情况下,是采用可以写多少就写多少的策略,与读不一样的地方在于,有多少读多少是由网络发送端是否有数据传输到为标准。但是对于写多少是由本地网络堵塞情况为标准的,对于非阻塞的情况就是一次写多少算多少,有可能会造成部分写入

linux下阻塞的系统调用,Linux下文件的阻塞与非阻塞对部分系统调用的影响相关推荐

  1. Redis 中的 持久化 RDB持久化 SAVE:阻塞服务器并创建RDB文件 BGSAVE:以非阻塞方式创建RDB文件 通过配置选项自动创建RDB文件

    这里写目录标题 15.1 RDB持久化 15.1.1 SAVE:阻塞服务器并创建RDB文件 其他信息 15.1.2 BGSAVE:以非阻塞方式创建RDB文件 其他信息 15.1.3 通过配置选项自动创 ...

  2. Linux C/C++网络编程实战-陈硕-笔记20-使用非阻塞IO

    基于IO复用(非阻塞IO)实现的 netcat 使用非阻塞IO可以有效避免上述情况的发生.但非阻塞IO在编程上要比阻塞IO更难,并且在程序的维护上比较痛苦.一般使用非阻塞IO编程时建议使用一些封装好的 ...

  3. Linux非阻塞IO(八)使用epoll重新实现非阻塞的回射服务器

    2019独角兽企业重金招聘Python工程师标准>>> 本文无太多内容,主要是几个前面提到过的注意点: 一是epoll的fd需要重新装填.我们将tcp_connection_t的指针 ...

  4. 为何epoll的ET模式文件要设置为非阻塞?

    是因为ET模式只在socket描述符状态发生变化时才触发事件,如果不一次把socket内核缓冲区的数据读完,会导致socket内核缓冲区中即使还有一部分数据,该socket的可读事件也不会被触发.因此 ...

  5. java网络编程阻塞_Java网络编程由浅入深三 一文了解非阻塞通信的图文代码示例详解...

    本文详细介绍组成非阻塞通信的几大类:Buffer.Channel.Selector.SelectionKey 非阻塞通信的流程ServerSocketChannel通过open方法获取ServerSo ...

  6. 网络编程06-服务器编程非阻塞IO、多路复用

    目录 一.服务器编程中四种高性能IO模型 1.阻塞IO 2.非阻塞 IO 3.多路复用 4.信号驱动 二.阻塞IO 三.非阻塞IO 1.阻塞IO与非阻塞IO之间的差异 2.如何给文件描述符设置非阻塞属 ...

  7. linux下网络编程设置非阻塞,UNIX网络编程 非阻塞connect的实现

    一.<UNIX网络编程>-非阻塞connect 在一个TCP套接口被设置为非阻塞之后调用connect,connect会立即返回EINPROGRESS错误,表示连接操作正在进行中,但是仍未 ...

  8. linux下串口的阻塞和非阻塞操作

    有两个可以进行控制串口阻塞性(同时控制read和write):一个是在打开串口的时候,open函数是否带O_NDELAY:第二个是可以在打开串口之后通过fcntl()函数进行控制. 阻塞的定义: 对于 ...

  9. Linux设备驱动中的阻塞与非阻塞I/O

    阻塞和非阻塞I/O是设备访问的两种不同模式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式 本例子讲述了这两者的区别 并实现I/O的等待队列机制, 并进行了用户空间的验证 基本概念: 1> ...

  10. Linux 设备驱动--- 阻塞型字符设备驱动 --- O_NONBLOCK --- 非阻塞标志【转】

    阅读目录 1,以阻塞方式运行: 2,以非阻塞方式运行: 转自:http://blog.csdn.net/yikai2009/article/details/8653697 版权声明:本文为博主原创文章 ...

最新文章

  1. Net设计模式实例之桥接模式( Bridge Pattern)(2)
  2. 用matlab解公式,怎么用matlab解这个公式A MATLAB script that solves the differential e
  3. python运行不了程序代码_python怎么运行代码程序
  4. 恒压板框过滤实验数据处理_高考化学实验中:那些不常见的【特殊仪器】与装置,难得的资料...
  5. 转:Discuz!NT负载均衡解决方案(HA)之---LVS(Linux Virtual Server)
  6. MySQL5.7默认打开ONLY_FULL_GROUP_BY模式问题与解决方案
  7. vCheck 5.0
  8. 43. 算法调用优先于手写的循环
  9. HTTP协议之Content-Encoding - 天下无贼 - 51CTO技术博客
  10. Python开发【第十八篇】Web框架之Django【基础篇】
  11. MTF直播整合导航网站源码
  12. vim - 之快速删除指定符号的内容
  13. 计算机分磁盘,磁盘分区怎么分
  14. Excel批量删除文本左侧n-m个空格的2种操作
  15. java模拟登录新版正方_java 模拟登陆正方教务系统
  16. 2.Elasticsearch-增删改
  17. BI神器Power Query(13)-- PQ制作时间维度表(2)
  18. 仅通过蓝牙HID将安卓手机模拟成鼠标和键盘
  19. 步进电机控制器设计 利用Quartus ii9.0设计一个具有四相单四拍
  20. FPGA数字信号处理(十三)锁相环位同步技术的实现

热门文章

  1. linux内核分为四个子系统,linux操作系统的内核有哪几个子系统构成,简要说明各子系统的作用...
  2. tomcat7 加载el表达式 报错 使用tomcat8得以解决
  3. 【Java 8 新特性】Java Stream.of()用法示例
  4. 学习vim的linux游戏,PacVim:一个学习 vim 命令的命令行游戏 | Linux 中国
  5. linux 远程调试文件夹,GDB远程调试开发板程序
  6. 不使用 + 和 - 运算符计算两整数之和
  7. android uboot log,RK3288 Android 8.1系统uboot logo过渡到kernel logo会花一下
  8. C语言中输入123求位权,数反转 - it610.com
  9. 输入引脚时钟约束_最强干货分享 | 时钟树例外(exclude pin、stop pin、non_stop pin、float pin)...
  10. python中不同类型的数据不能相互运算_Python第三课——数据类型与运算(2)