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)非堵塞情况下
非堵塞情况下,是採用能够写多少就写多少的策略。与读不一样的地方在于,有多少读多少是由网络发送端是否有传输数据到为标准。
可是对于写多少是由本地网络堵塞情况为标准的,对于非堵塞的情况就是一次写多少算多少,有可能会造成部分写入
Linux下文件的堵塞与非堵塞对部分系统调用的影响的更多相关文章
- 网络编程----堵塞、非堵塞和同步、异步IO
我是学渣.但我想进步. 本文是面试我的牛人问我的.你知道什么是堵塞.非堵塞和同步.异步IO么?自觉得是分布式系统程序猿的我居然不知道.学习吧. 首先介绍堵塞IO和非堵塞IO: 堵塞IO:是指说程序等待 ...
- IO模式——同步(堵塞、非堵塞)、异步
为什么IO模式非常重要?由于现代的计算机和操作系统的架构决定了CPU是稀缺资源,大家都要来一起竞争.而IO(特别是网络相关的IO)的速度往往较慢.所以怎样进行IO就有了多种模式,包含同步.异步.堵塞. ...
- linux下文件的复制、移动与删除
linux下文件的复制.移动与删除命令为:cp,mv,rm 一.文件复制命令cp 命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination) ...
- Linux下文件的权限
一.Linux下查看文件属性 命令为: [root@localhost ~]# ls -al 结果: ls是『list』的意思,重点在显示文件的文件名与相关属性.而选项『-al』则表示列出所有的文件详 ...
- Windows与Linux下文件操作监控的实现
一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...
- 学习笔记12—linux下文件的复制、移动与删除
查看centOS 版本 cat /etc/redhat-release 1,复制粘贴文件 cp [选项] 源文件或目录 目标文件或目录 2,剪切粘贴文件 mv [选项] 源文件或目录 ...
- 高级字符驱动之堵塞与非堵塞IO
/** *此实例涉及到线程的挂起与竞态,字符IO的堵塞与非堵塞 */ struct scull_pipe { wait_queue_head_t inp, outp; char *buffer, *e ...
- Linux下文件的三种时间戳
Linux下文件的三种时间标记 三种时间对应关系表 column column column 访问时间 Access atime 修改时间 Modify mtime 状态改动时间 Change cti ...
- linux下文件结束符
linux下文件结束符,我试过了所有的linux,发现其文件的结束符都是以0a即LF结束的,这个是操作系统规定的,windows下是\r\n符结束,希望可以帮助大家. -------------转:来 ...
随机推荐
- UIPanGestureRecognizer判断滑动的方向
.h文件 CGFloat const gestureMinimumTranslation = 20.0 ; typedef enum : NSInteger { kCameraMoveDirectio ...
- 发掘StateListAnimator的全部潜能
原文地址:https://blog.stylingandroid.com/statelistanimator/ 原文作者:Leave a reply 译文出自:安卓巴士 译者: MrlLee 校对者: ...
- 【spring Boot】2.在Myecplise上把spring Boot项目打包 war包和jar包
========================================================第一部分======================================== ...
- selenium 自动化测试 测试报告 生成
https://www.cnblogs.com/yoyoketang/p/6140439.html https://www.cnblogs.com/testyao/p/5658200.html 一.下 ...
- django验证码django-simple-captha
搭建网站很经常要用到验证码,django中就有这样的中间件django-simple-captha githup地址https://github.com/mbi/django-simple-captc ...
- python核心编程学习记录之正则表达式
- python开发微信支付学习记录(转)
前言 微信支付是由微信及财付通联合推出的移动支付创新产品.如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑. 要想开发顺利进行,首先要 ...
- ES查询tags字段为空或null
现需要查询出tags为 "" 或者为 null 的数据 { "query": { "bool": { "must": { ...
- Linux7个runlevel
Linux系统有7个运行级别(runlevel) 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别 ...
- KodExplorer介绍
KodExplorer介绍 KOD·简介 官方网站https://kodcloud.com/ KodExplorer可道云,原名芒果云,是一款基于 PHP 开发的开源 WEB 网页版轻量级私有云和在线 ...