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. UIPanGestureRecognizer判断滑动的方向

    .h文件 CGFloat const gestureMinimumTranslation = 20.0 ; typedef enum : NSInteger { kCameraMoveDirectio ...

  2. 发掘StateListAnimator的全部潜能

    原文地址:https://blog.stylingandroid.com/statelistanimator/ 原文作者:Leave a reply 译文出自:安卓巴士 译者: MrlLee 校对者: ...

  3. 【spring Boot】2.在Myecplise上把spring Boot项目打包 war包和jar包

    ========================================================第一部分======================================== ...

  4. selenium 自动化测试 测试报告 生成

    https://www.cnblogs.com/yoyoketang/p/6140439.html https://www.cnblogs.com/testyao/p/5658200.html 一.下 ...

  5. django验证码django-simple-captha

    搭建网站很经常要用到验证码,django中就有这样的中间件django-simple-captha githup地址https://github.com/mbi/django-simple-captc ...

  6. python核心编程学习记录之正则表达式

  7. python开发微信支付学习记录(转)

    前言 微信支付是由微信及财付通联合推出的移动支付创新产品.如今,随着微信支付的全面开放,相关需求也越来越多,很多开发人员进行微信支付开发及商家申请微信支付时,面临着诸多疑惑. 要想开发顺利进行,首先要 ...

  8. ES查询tags字段为空或null

    现需要查询出tags为 "" 或者为 null 的数据 { "query": { "bool": { "must": { ...

  9. Linux7个runlevel

    Linux系统有7个运行级别(runlevel) 运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动 运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆 运行级别 ...

  10. KodExplorer介绍

    KodExplorer介绍 KOD·简介 官方网站https://kodcloud.com/ KodExplorer可道云,原名芒果云,是一款基于 PHP 开发的开源 WEB 网页版轻量级私有云和在线 ...