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

Linux fsync 系统调用 Linux 中,fsync 是一个关键的系统调用,用于确保文件数据的持久化存储。其核心原理是强制将文件在内存中的修改(即 页面缓存,Page Cache)同步到物理磁盘。 阅读详情

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驱动开发 阻塞和非阻塞IO详细介绍 Linux 驱动开发中,阻塞(blocking)和非阻塞(non-blocking)I/O 是非常重要的概念,它们直接影响设备的性能、响应速度和系统的并发处理能力。 阅读详情

相关推荐

Python自动化办公:5分钟搞定钉钉群文件自动发送(附完整代码)

本文详细介绍了如何利用Python实现钉钉群文件的自动化发送。通过结合钉钉企业内部应用与群机器人API,构建了包含智能令牌管理、文件上传与消息发送的完整工作流。文章提供了可直接复用的完整代码,并分享了定时任务、目录监听等进阶实战方案,帮助职场人士高效解决重复性文件发送难题,实现办公自动化。

7z8x2c4v6b9的博客 301

Linux学习日记10——阻塞和非阻塞

学习视频链接 黑马程序员-Linux系统编程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1KE411q7ee?p=55&spm_id_from=pageDriver 目录 一、阻塞、非阻塞概念 二、测试阻塞和非阻塞 2.1 研究设备的阻塞和非阻塞 2.2 第一段代码测试阻塞 2.3第二段代码测试非阻塞 2.4第二段代码的基础上增加超时解决非阻塞 三、总结 一、阻塞、非阻塞概念 1、读常规文件是不会阻塞的,不管读多少字节...

HuanBianCheng27的博客 1679

1-Spring Security OAuth2专栏介绍

我自己 我是码农小胖哥,一名后端软件工程师,有多年的后端开发经验,同时也是一名热衷于技术分享、拥抱开源的技术博主。我的技术栈主要是Java、Python、Kotlin,欢迎各位同行进行交流和分享。 个人技术公众号:码农小胖哥 个人博客:https://felord.cn Gitee: https://gitee.com/felord 你可以通过以上方式和我交流、解决学习中的疑难杂症。 2021年开源Spring Security 干货系列教程,2022年又开源Spring Security进阶版,帮

码农小胖哥 7895

linux文件描述符阻塞与非阻塞有什么区别

区别在于阻塞模式下,读写操作会一直等待,直到数据到达或操作超时,而非阻塞模式下,读写操作会立即返回,进程可以继续执行其他操作。阻塞模式下,进程的响应速度较慢,而非阻塞模式下,进程的响应速度较快,但需要不断地轮询文件描述符,以判断是否有数据可读或可写。文件描述符非阻塞是指进程在读写文件或网络连接时,如果没有数据可读或可写,进程会立即返回,而不是一直等待。文件描述符阻塞是指进程在读写文件或网络连接时,如果没有数据可读或可写,进程会一直等待,直到有数据可读或可写。

LLLLLiangCCCCChen的博客 1001

阻塞和非阻塞系统调用

文章目录操作系统I/O:阻塞和非阻塞调用阻塞I/O时,应用程序需等待I/O完成才返结果调用非阻塞I/O为调用之后立即返回,轮询技术主要有以下四种:selectpollepollkequeue参考链接阻塞和非阻塞系统调用阻塞阻塞参考链接 操作系统I/O:阻塞和非阻塞 OS内核对于I/O只有两方式:阻塞和非阻塞。 调用阻塞I/O时,应用程序需等待I/O完成才返结果 调用之后要等到系统内核层面完...

fgh123的博客 4240

阻塞和非阻塞

一、定义 阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态. 阻塞调用是指调用结果返回之前,当前线程会被挂起。调用线程只有在得到结果之后才会返回。 非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。 例子: 你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用,你不管老板有没有告诉你,你自己先一边去玩了, 当然你也要偶尔过几分钟check一下老板有没有返回结果。 Q:为什么塞..

382

阻塞与非阻塞系统调(如IO)的理解及二者中的假错

阻塞:没等到想要的结果,就一直等。 假错: ------- EINTR:是阻塞系统调用,非常的慢,这个过程被信号打断了,但并不是调用出错了,故是个假错。

modi000的博客 544

linux阻塞系统调用,Linux文件阻塞与非阻塞部分系统调用影响

1.基本概念所谓的阻塞,即内核在对文件操作I/O系统调用时,如果条件不满足(可能需要产生I/O),则内核会将该进程挂起。非阻塞则是发现条件不满足就会立即返回。此外需要注意的是非阻塞并不是轮询,不然就和阻塞没多大区别了,它只是调用不成功就直接返回了,不会在去看啥时候会满足条件,而是有你自己去选择接下来该咋办,系统以不再负责2.read/write阻塞与非阻塞的理解read/write系统调用,并不会...

weixin_34270668的博客 564

linux内核阻塞系统调用,Linux文件阻塞与非阻塞部分系统调用影响

1.基本概念所谓的阻塞,即内核在对文件操作I/O系统调用时,如果条件不满足(可能需要产生I/O),则内核会将该进程挂起。非阻塞则是发现条件不满足就会立即返回。此外需要注意的是非阻塞并不是轮询,不然就和阻塞没多大区别了,它只是调用不成功就直接返回了,不会在去看啥时候会满足条件,而是有你自己去选择接下来该咋办,系统以不再负责2.read/write阻塞与非阻塞的理解read/write系统调用,并不会...

weixin_39876650的博客 256

POSIX兼容系统上read和write系统调用的行为总结

关于UNIX和Linux的宣传语中,一切皆文件应该是最广为人知的一句。不管是普通文件,还是硬件设备、管道、网络套接字,在Linux甚至还有信号和定时器都共享一套相似的api,大家可以用类似的代码完成各种不同的任务,大大简化了代码复杂度和学习成本。

MtIK433Yr的博客 194

linux的硬盘满了会导致受影响系统调用

linux的硬盘满了会导致受影响系统调用creat()肯定要失败了,但open()已经存在的文件是可以的,write()覆盖一个文件已经存在的数据也是可以的,close()和fflush(),如果之前的open()和write()都成功的话,应该也能成功。其他的与文件相关的函数还包括:fflushdup(),fcntl(),link(),lseek(),mknod(),read(), s

236

android四大组件关系,Android开发四大组件与进程启动的关系

侃侃尔雅一、Android中的进程当一个程序第一次启动的时候,Android会启动一个LINUX进程和一个主线程。默认的情况下,所有该程序的组件都将在该进程和线程中运行。 同时,Android会为每个应用程序分配一个单独的LINUX用户。Android会尽量保留一个正在运行进程,只在内存资源出现不足时,Android会尝试停止一些进程从而释放足够的资源给其他新的进程使用, 也能保证用户正在访问的当...

weixin_31896061的博客 358

socket阻塞和非阻塞有哪些影响

socket阻塞和非阻塞有哪些不同

mayue_web的博客 3万+

线程系统调用阻塞是否导致进程阻塞的问题

问题: 如果一个进程中的某一个线程调用了一个阻塞系统调用函数后,那么该进程包括该进程中的其他所有线程也同时被阻塞 ? 关于这个问题。网上有些解答似乎比较混乱。回答这个问题,首先要简单了解一下线程模型。 线程模型(下述对应关系为 “线程”对“内核调度实体”) 多对1用户级线程模型 1对1内核级线程模型 多对多两级线程模型 多对1用户级线程模型 线程的创建、调度、同步,由所属进程的用户

林多 2万+

Linux阻塞与非阻塞IO

阻塞和非阻塞IOLinux 驱动开发里面很常见的两种设备访问模式, 在编写驱动的时候一定要考虑到阻塞和非阻塞。注意:这里的 IO 指的是 Input/Output(输入/输出):是应用程序对驱动设备的输入/输出操作。

风间琉璃的博客 3052
上一篇: Linux下线程相关知识总结
下一篇: Linux下TCP/IP协议栈的简单脉络分析
Shreck66
博客等级 码龄11年 118粉丝 91原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值