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

(1)阻塞情况下

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

(2)非阻塞情况下

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-10 03:58:19

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

Linux下阻塞与非阻塞IO

阻塞:顾名思义,就是指在执行设备操作时若不能获得资源则挂起操作,直到满足可操作的条件后再进行操作,被挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件满足. 非阻塞:就是反过来,进程在不能进行设备操作时并不挂起,它或者放弃,或者不停的查询,直到可以进行位置. Socket编程中,阻塞与非阻塞的区别: 阻塞:一般的I/O操作可以在新建的流中运用.在服务器回应前它等待客户端发送一个空白的行.当会话结束时,服务器关闭流和客户端socket. 如果在队列中没有请示将会出现什么情况呢?那个方

Linux设备驱动中的阻塞和非阻塞I/O

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到条件满足. 2.非阻塞 非阻塞操作是指在进行设备操作是,若操作条件不满足并不会挂起,而是直接返回或重新查询(一直占用CPU资源)直到操作条件满足为止. 当用户空间的应用程序调用read(),write()等方法时,若设备的资源不能被获取,而用户又希望以阻塞的方式来访问设备,驱动程序应当在设备驱动层的

Linux设备驱动中的IO模型---阻塞和非阻塞IO【转】

在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: a -- 阻塞I/Ob -- 非阻塞I/Oc -- I/O复用(select和poll)d -- 信号驱动I/O(SIGIO)e -- 异步I/O(Posix.1的aio_系列函数) 下面我们先学习阻塞I/O.非阻塞I/O .I/O复用(select和poll),先学习一下基础概念 a -- 阻塞 

linux阻塞与非阻塞,同步与异步、I/O模型

1. 概念理解      在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步: 所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步: 异步的概念和同步相对.当一个异步过程调用发出后,调用者不能立刻得到结果.实际处理这个调用的部件

深入浅出~Linux设备驱动中的阻塞和非阻塞I/O

今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合起来写的,,总之这又给了额外的动力,让自己继续前进,,希望和大家能够分享一些自己的经验,,在最需要奋斗的年级以及在技术的领域踽踽独行的过程中有共同的伙伴继续前进~ 今天写的是Linux设备驱动中的阻塞和非阻塞I/0,何谓阻塞与非阻塞I/O?简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的

简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分别是什么含义. 同步:所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回.也就是必须一件一件事做,等前一件做完了才能做下一件事. 例如普通B/S模式(同步):提交请求->等待服务器处理->处理完毕返回 这个期间客户端浏览器不能干任何事 异步:异步的概念和同步相对.当一个异步过程

linux网络IO模型——阻塞、非阻塞和同步、异步

最近几天在学习nginx的时候了解了一下linux网络IO模型,在此谈谈我自己的理解,如有错误请多多指教.本文参考书籍Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models ”. Linux网络IO请求数据分为两段: 1.数据准备 2.将数据从内核拷贝到进程空间 其实,阻塞.非阻塞和同步.异步的不同就在于这两个阶段的不同. 同步和异步关

《linux设备驱动开发详解》笔记——8阻塞与非阻塞IO

8.1 阻塞与非阻塞IO 8.1.0 概述 阻塞:访问设备时,若不能获取资源,则进程挂起,进入睡眠状态:也就是进入等待队列 非阻塞:不能获取资源时,不睡眠,要么退出.要么一直查询:直接退出且无资源时,返回-EAGAIN 阻塞进程的唤醒:必须有地方能够唤醒处于睡眠状态的阻塞进程,否则就真睡不醒了.一般是在中断中. 阻塞与非阻塞可以在open时设置,也可以通过fcntl和ioctl重新设置 8.1.1 等待队列 linux驱动中,可以用等待队列wait queue实现阻塞.等待队列与linux进程调

Hasen的linux设备驱动开发学习之旅--阻塞与非阻塞I/O

/** * Author:hasen * 参考 :<linux设备驱动开发详解> * 简介:android小菜鸟的linux * 设备驱动开发学习之旅 * 主题:阻塞与非阻塞I/O * Date:2014-11-05 */ 阻塞操作是指在执行设备操作时,若不能获得资源,则挂起进程直到满足可操作的条件后再进行操作.被 挂起的进程进入休眠状态,被从调度器的运行队列移走,直到等待的条件被满足.而非阻塞操作的进程在不能 进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直到条件满足以进行操作为止.