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下文件的堵塞与非堵塞对部分系统调用的影响的更多相关文章

  1. 网络编程----堵塞、非堵塞和同步、异步IO

    我是学渣.但我想进步. 本文是面试我的牛人问我的.你知道什么是堵塞.非堵塞和同步.异步IO么?自觉得是分布式系统程序猿的我居然不知道.学习吧. 首先介绍堵塞IO和非堵塞IO: 堵塞IO:是指说程序等待 ...

  2. IO模式——同步(堵塞、非堵塞)、异步

    为什么IO模式非常重要?由于现代的计算机和操作系统的架构决定了CPU是稀缺资源,大家都要来一起竞争.而IO(特别是网络相关的IO)的速度往往较慢.所以怎样进行IO就有了多种模式,包含同步.异步.堵塞. ...

  3. linux下文件的复制、移动与删除

    linux下文件的复制.移动与删除命令为:cp,mv,rm 一.文件复制命令cp     命令格式:cp [-adfilprsu] 源文件(source) 目标文件(destination)      ...

  4. Linux下文件的权限

    一.Linux下查看文件属性 命令为: [root@localhost ~]# ls -al 结果: ls是『list』的意思,重点在显示文件的文件名与相关属性.而选项『-al』则表示列出所有的文件详 ...

  5. Windows与Linux下文件操作监控的实现

    一.需求分析: 随着渲染业务的不断进行,数据传输渐渐成为影响业务时间最大的因素.究其原因就是因为数据传输耗费较长的时间.于是,依托于渲染业务的网盘开发逐渐成为迫切需要解决的需求.该网盘的实现和当前市场 ...

  6. 学习笔记12—linux下文件的复制、移动与删除

    查看centOS 版本     cat /etc/redhat-release 1,复制粘贴文件 cp  [选项]  源文件或目录  目标文件或目录 2,剪切粘贴文件 mv [选项]  源文件或目录 ...

  7. 高级字符驱动之堵塞与非堵塞IO

    /** *此实例涉及到线程的挂起与竞态,字符IO的堵塞与非堵塞 */ struct scull_pipe { wait_queue_head_t inp, outp; char *buffer, *e ...

  8. Linux下文件的三种时间戳

    Linux下文件的三种时间标记 三种时间对应关系表 column column column 访问时间 Access atime 修改时间 Modify mtime 状态改动时间 Change cti ...

  9. linux下文件结束符

    linux下文件结束符,我试过了所有的linux,发现其文件的结束符都是以0a即LF结束的,这个是操作系统规定的,windows下是\r\n符结束,希望可以帮助大家. -------------转:来 ...

随机推荐

  1. 将一个txt里的A和B谈话内容获取出来并分别保存到A和B的txt文件中

    import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream;import java.io.Fi ...

  2. Map集合-根据宠物昵称查找宠物

    package collection; /** * 宠物类 * @author * */ public class Pet { private String name; private String ...

  3. 每天一个linxu命令6之jps  查看java进程的端口

    jps -- JavaVirtual Machine Process Status Tool 可以列出本机所有Java进程的pid jps [ options ] [ hostid ] 选项 -q 仅 ...

  4. C语言基础之for循环的使用

    一.for循环格式. 1: for (语句1; 条件; 语句2) 2:   3: { 4:   5: 循环体 6:   7: } 8:   9: 具体: 10:   11: 语句1:初始化语句 12: ...

  5. 在sqlserver中如何从字符串中提取数字,英文,中文,过滤重复字符

    原文:在sqlserver中如何从字符串中提取数字,英文,中文,过滤重复字符 最近做项目的时候,经常用到一个字符串中的某些字符,处理起来非常的棘手,现在用下面的方法就可以很方便的从字符串中处理你想要的 ...

  6. 使用size()方法输出列表中的元素数量。需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变。仅当没有任何线程修改列表时,才能保证返回的结果是准确的。

    使用size()方法输出列表中的元素数量.需要注意的是,这个方法返回的值可能不是真实的,尤其当有线程在添加数据或者移除数据时,这个方法需要遍历整个列表来计算元素数量,而遍历过的数据可能已经改变.仅当没 ...

  7. 在eclipse上部署openfire 3.9.1源码,並配置openfire

    参考文章:https://my.oschina.net/u/1409622/blog/205603 在网上找了很久部署openfire源码的文章,由于我使用的是最新的3.9.1源码,试了很多种部署方法 ...

  8. apache 限制某些目录不能访问通过rewrite实现

    通过deny allow访问控制肯定是可以实现的单个目录,但是这个必须指定准确的目录,如果有很多个目录,但是都包含某个名字,比如bbs.1.com/1/tmp/123.htmlbbs.1.com/2/ ...

  9. 在CcentOS系统上将deb包转换为rpm包

    deb文件格式本是ubuntu/debian系统下的安装文件,那么我想要在redhat/centos/fedora中安装,需要把deb格式的软件包转化成rpm格式. 需要用到的转换工具:alien_8 ...

  10. ElasticSearch 监控单个节点详解

    1.介绍 集群健康 就像是光谱的一端——对集群的所有信息进行高度概述. 而 节点统计值 API 则是在另一端.它提供一个让人眼花缭乱的统计数据的数组,包含集群的每一个节点统计值. 节点统计值 提供的统 ...