在我们看全功能的 read 和 write 方法的实现之前, 我们触及的最后一点是决定何时使 进程睡眠. 有时实现正确的 unix 语义要求一个操作不阻塞, 即便它不能完全地进行下去.

有时还有调用进程通知你他不想阻塞, 不管它的 I/O 是否继续. 明确的非阻塞 I/O 由 filp->f_flags 中的 O_NONBLOCK 标志来指示. 这个标志定义于 , 被

自动包含. 这个标志得名自"打开-非阻塞", 因为它可在打开时指定(并且起

初只能在那里指定). 如果你浏览源码, 你会发现一些对一个 O_NDELAY 标志的引用; 这 是一个替代 O_NONBLOCK 的名子, 为兼容 System V 代码而被接受的. 这个标志缺省地被 清除, 因为一个等待数据的进程的正常行为仅仅是睡眠. 在一个阻塞操作的情况下, 这是 缺省地, 下列的行为应当实现来符合标准语法:

· 如果一个进程调用 read 但是没有数据可用(尚未), 这个进程必须阻塞. 这个进程 在有数据达到时被立刻唤醒, 并且那个数据被返回给调用者, 即便小于在给方法的 count 参数中请求的数量.

· 如果一个进程调用 write 并且在缓冲中没有空间, 这个进程必须阻塞, 并且它必 须在一个与用作 read 的不同的等待队列中. 当一些数据被写入硬件设备, 并且在

输出缓冲中的空间变空闲, 这个进程被唤醒并且写调用成功, 尽管数据可能只被部 分写入如果在缓冲只没有空间给被请求的 count 字节.

这 2 句都假定有输入和输出缓冲; 实际上, 几乎每个设备驱动都有. 要求有输入缓冲是 为了避免丢失到达的数据, 当无人在读时. 相反, 数据在写时不能丢失, 因为如果系统调

用不能接收数据字节, 它们保留在用户空间缓冲. 即便如此,

输出缓冲几乎一直有用, 对 于从硬件挤出更多的性能.

在驱动中实现输出缓冲所获得的性能来自减少了上下文切换和用户级/内核级切换的次数. 没有一个输出缓冲(假定一个慢速设备), 每次系统调用接收这样一个或几个字符, 并且当 一个进程在 write 中睡眠, 另一个进程运行(那是一次上下文切换). 当第一个进程被唤 醒, 它恢复(另一次上下文切换), 写返回(内核/用户转换), 并且这个进程重新发出系统 调用来写入更多的数据(用户/内核转换); 这个调用阻塞并且循环继续.

增加一个输出缓 冲可允许驱动在每个写调用中接收大的数据块, 性能上有相应的提高. 如果这个缓冲足够 大, 写调用在第一次尝试就成功 -- 被缓冲的数据之后将被推到设备 -- 不必控制需要返 回用户空间来第二次或者第三次写调用. 选择一个合适的值给输出缓冲显然是设备特定的.

我们不使用一个输入缓冲在 scull 中, 因为数据当发出 read 时已经可用.

类似的, 不用 输出缓冲, 因为数据被简单地拷贝到和设备关联的内存区. 本质上, 这个设备是一个缓冲, 因此额外缓冲的实现可能是多余的. 我们将在第 10 章见到缓冲的使用.

如果指定

O_NONBLOCK, read 和 write 的行为是不同的. 在这个情况下, 这个调用简单 地返回 -EAGAIN(("try it

agin")如果一个进程当没有数据可用时调用 read , 或者如果 当缓冲中没有空间时它调用 write .

如你可能期望的,

非阻塞操作立刻返回, 允许这个应用程序轮询数据. 应用程序当使用 stdio 函数处理非阻塞文件中, 必须小心, 因为它们容易搞错一个的非阻塞返回为 EOF.

它们始终必须检查 errno.

自然地, O_NONBLOCK 也在 open 方法中有意义. 这个发生在当这个调用真正阻塞长时间 时; 例如, 当打开(为读存取)一个 没有写者的(尚无)FIFO, 或者存取一个磁盘文件使用

一个悬挂锁. 常常地, 打开一个设备或者成功或者失败, 没有必要等待外部的事件. 有时, 但是, 打开这个设备需要一个长的初始化, 并且你可能选择在你的 open 方法中支持 O_NONBLOCK , 通过立刻返回 -EAGAIN,如果这个标志被设置. 在开始这个设备的初始化进 程之后. 这个驱动可能还实现一个阻塞 open 来支持存取策略, 通过类似于文件锁的方式. 我们将见到这样一个实现在"阻塞 open 作为对

EBUSY 的替代"一节, 在本章后面.

一些驱动可能还实现特别的语义给 O_NONBLOCK;

例如, 一个磁带设备的 open 常常阻塞 直到插入一个磁带. 如果这个磁带驱动器使用 O_NONBLOCK 打开, 这个 open 立刻成功, 不管是否介质在或不在.

只有 read, write, 和

open 文件操作受到非阻塞标志影响.

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

1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

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

[基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件后再进行操作.被挂起的进程进入休眠状态(不占用cpu资源),从调度器的运行队列转移到等待队列,直到 ...

蜕变成蝶~Linux设备驱动中的阻塞和非阻塞I/O

今天意外收到一个消息,真是惊呆我了,博客轩给我发了信息,说是俺的博客文章有特色可以出本书,,这简直让我受宠若惊,俺只是个大三的技术宅,写的博客也是自己所学的一些见解和在网上看到我一些博文以及帖子里综合 ...

linux驱动编写之阻塞与非阻塞

一.概念 应用程序使用API接口,如open.read等来最终操作驱动,有两种结果--成功和失败.成功,很好处理,直接返回想要的结果:但是,失败,是继续等待,还是返回失败类型呢?  如果继续等待,将进 ...

python全栈开发day31-操作系统介绍,异步、同步、阻塞、非阻塞,进程

一.网络编程内容回顾 1.arp协议 #交换机 #广播.单播 2.ip协议 3.tcp和udp协议 tcp:可靠的,面向连接的,字节流传输,长连接 三次握手:一方发送请求,另一方确认请求同时发送请求, ...

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

在前面学习网络编程时,曾经学过I/O模型 Linux 系统应用编程——网络编程(I/O模型),下面学习一下I/O模型在设备驱动中的应用. 回顾一下在Unix/Linux下共有五种I/O模型,分别是: ...

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

8.1 阻塞与非阻塞IO 8.1.0 概述 阻塞:访问设备时,若不能获取资源,则进程挂起,进入睡眠状态:也就是进入等待队列 非阻塞:不能获取资源时,不睡眠,要么退出.要么一直查询:直接退出且无资源时, ...

Linux中同步与异步、阻塞与非阻塞概念以及五种IO模型

1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

从linux源码看socket的阻塞和非阻塞

从linux源码看socket的阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统的每一处代码,是一件Exciting的事情. 大部分高性能网络框架采用的是非阻塞模式.笔者这次就从linux ...

Linux设备驱动中的阻塞和非阻塞I/O <转载>

Green 博客园 首页 新随笔 联系 订阅 管理 Linux设备驱动中的阻塞和非阻塞I/O   [基本概念] 1.阻塞 阻塞操作是指在执行设备操作时,托不能获得资源,则挂起进程直到满足操作所需的条件 ...

随机推荐

Java中的Bigdecimal类型运算

Java中的Bigdecimal类型运算 双精度浮点型变量double可以处理16位有效数.在实际应用中,需要对更大或者更小的数进行运算和处理.Java在java.math包中提 供的API类BigD ...

ASP.NET MVC- EF返回连接池用ADO.NET方式访问数据库

用习惯了ADO.NET的方式去访问数据库,虽然ADO.NET写的代码没有EF简洁,可是也并不麻烦.而且EF在进行多表查询的那种方式是,EF需要先去数据库里定义外键,再进去一次代码生成,然后才能用INC ...

jQuery自学笔记(二):jQuery选择器

一.简单选择器 ID选择器:$('#box') 元素标签名:$('div') 类选择器:$('.box') jQuery提供了length和size()两种方法查看返回的元素,可验证ID在页面只出现一 ...

真实经纬度(gps)转成百度坐标的js方法

转:http://www.360doc.com/content/16/0320/14/18636294_543805051.shtml 结果图:

【Demo 0009】Android 组件(BroadcastReceiver)

本章学习要点:        1.  了解Broadcast的作用;        2.  掌握自定义广播和系统广播的接收:        3.  掌握广播的发送:

SpringCloud学习笔记(4)——Zuul

参考Spring Cloud官方文档第19章 19. Router and Filter: Zuul 路由是微服务架构的一部分.例如,"/"可能映射到你的web应用,"/ ...

[Swift]LeetCode898. 子数组按位或操作 | Bitwise ORs of Subarrays

We have an array A of non-negative integers. For every (contiguous) subarray B = [A[i], A[i+1], ..., ...

Centos7安装Nginx+PHP+MySQL

之前曾经在服务器上从头到尾搭过一次环境,但那时新手一枚,很多地方搞不定,是前辈帮忙解决的.这次独自一人在服务器上撘环境,感慨上次没有做好相关笔记,所以事后整理一下,下次再搭环境时可以轻车熟路. 一.准 ...

hibernate---级联保存、级联删除

直接上菜: dept.hbm.xml:关键点标蓝色这部分,inverse表示放弃维护外键关系,cascade就不用说了

linux 查看进程阻塞,linux进程 阻塞和非阻塞操作相关推荐

  1. linux查看pid关联的进程

    1.linux查看pid关联的进程 ps -aux |grep -v grep|grep pid进程id ps -aux |grep -v grep|grep 28990(pid) 2.linux查看 ...

  2. linux查看端口物理状态,Linux查看端口使用状态及启动

    LINUX网络性能之管理工具三剑客 本文是介绍管理Linux查看端口这些输出信息,该命令将显示从每个数据包传出的头和来自主机hostname对端口80的编址. Netstat -tln 命令是Linu ...

  3. linux查看显卡核心数,linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息 | 帮助信息-动天数据...

    linux查看硬件信息,linux查看硬盘信息,linux查看CPU信息,linux查看显卡,硬件型号信息 作者:dthost | 时间:2015-09-30 | 8,325 次阅读 linux服务器 ...

  4. linux查看显示器名称命令,linux 查看显示器信息Linux下查看硬件信息命令大全

    /proc 虚拟的目录,是系统内存的映射.可直接访问这个目录来获取系统信息.其中也包含下面的信息: 主机CPU信息:cpuinfo 主机DMA通道信息:dma 文件系统信息:filesystems 主 ...

  5. 通过命令查看linux 密码,linux查看用户密码(linux查看用户密码命令)

    linux查看用户密码(linux查看用户密码命令) 2020-05-15 13:18:30 共10个回答 1.用户名和密码的存储位置存储帐号的文件:/etc/passwd存储密码的文件:/etc/s ...

  6. 同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  7. linux 查看正在执行的进程的pid编号_不小心执行 rm f,该如何恢复?

    作者:justmine 链接:http://www.cnblogs.com/justmine/p/10359186.html 前言 每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小 ...

  8. Linux 查看并杀掉tomcat进程

    启动/停止tomcat  bin/startup.sh #启动tomcat bin/shutdown.sh #停止tomcat tail -f logs/catalina.out #看tomcat的控 ...

  9. linux查看3306是哪个进程占用,linux查看端口占用

    发表于 2019-08-18 21:00:36 by 月小升 一. 例子 lsof -i:7000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ...

  10. linux查看已杀死的进程,linux 查看并杀死僵尸进程

    1.可以先试用top 命令查看是否有僵尸进程 在红色表示的地方  如果zombie 大于"0"表示服务器当前存在僵尸进程 2.如果存在僵尸进程,可以使用命令 ps -A -osta ...

最新文章

  1. 【原】iOS学习之Quartz2D(1)
  2. ustc小道消息20211213
  3. 日常生活 -- 开博二周年
  4. 你已经用上 5G 网络了吗?
  5. 【Java】浅显理解 hashcode 和 hash 算法
  6. selenium 控制ie_Python爬虫---Selenium的简单介绍
  7. 浅析.Net 在 winform及wpf中涉及界面交互的多线程类的封装
  8. linux命令--vi,vim
  9. 树的遍历 (和) 玩转二叉树 的总结博客
  10. 开源软件许可协议介绍
  11. 基于C#的AE二次开发之GP工具的使用心得
  12. 用打比方的方法,10分钟给小白讲清楚Kubernetes
  13. 解决电脑“自动修复 电脑未正确启动/无法修复你的电脑”
  14. 接受offer又不去入职,需要承担啥责任嘛?
  15. http://www.dewen.net.cn/q/14879/搜索引擎结果自动跳转
  16. python字符串反码输出_一阶段day3-进制、原码反码补码、位运算、字符串
  17. iis打开aspx文件时显示无法找到该页
  18. 在线 mp3铃声裁剪 铃声制作 html5+JavaScript 是西安
  19. cindy什么意思中文(cindy英语怎么读什么意思)
  20. RationalDMIS 2020 蛙跳测量方法

热门文章

  1. 渗透测试之暴力破解路由器wifi(加强安全意识)
  2. python进制转换函数及方法
  3. linux下实现QT计算器,Qt实现计算器
  4. 【GLSL教程】(八)纹理贴图
  5. 【基本类型】——基本类型与包装类型
  6. 第二周-python实战-youtube视频分析
  7. Vue解决Axios跨域问题
  8. 枪火重生灵界狂潮攻略(八)雀哥流派
  9. 牛吃草问题 (牛顿问题)
  10. 数据共享与整合技术-总结01