首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux编程(阻塞概念)

看还有哪个家伙读成阻zu塞sai,还有谁不会念? 你还真的点开链接啦? 今天真的是一趟语文课,就教会大家正确念这两个字姿势,看: 兹z武u,阻zu。 丝s饿e,塞se。 阻塞。...阻塞是啥意思呢? 就是水管堵住了!扭开水龙头没有水出来。...这个道理跟Linux下读取慢速设备(主要指管道和套接字)数据情形非常相似,例如当我们在读取一个管道时,如果管道里面没有数据,那么我们什么都读不出来,于是就进入了所谓阻塞”状态了,说白了阻塞就是使得当前进程或者线程睡眠了意思...那么再进一步,什么时候会阻塞呢?下面的表格简单描述了这些清空: ? 其中,读者指的是对管道文件拥有读权限进程或线程(注意不是正在读),写者指的是对管道文件拥有写权限进程或线程(注意不是正在写)。...除此之外,其实open()函数也会发生阻塞,比如用只读或者只写open一个管道文件时候。因为一根只有出口或者只有入口水管,是无法使用呀!其实就是生活常识。嘿嘿!

2.2K30

linux源码看socket阻塞和非阻塞

笔者一直觉得如果能知道从应用到框架再到操作系统每一处代码,是一件Exciting事情。 大部分高性能网络框架采用是非阻塞模式。...笔者这次就从linux源码角度来阐述socket阻塞(block)和非阻塞(non_block)区别。 本文源码均来自采用Linux-2.6.24内核版本。...一个TCP非阻塞client端简单例子 如果我们要产生一个非阻塞socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM....recvmsg = tcp_recvmsg, ...... } fcntl控制socket阻塞\非阻塞状态 我们用fcntl修改socket阻塞\非阻塞状态。...),再通过linux软中断机制调用net_rx_action,如下图所示: 注:上图来自PLKA(>) 紧接着跟踪next_rx_action next_rx_action

4.6K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux编程(阻塞和非阻塞IO)

    Linux设备驱动中阻塞和非阻塞I/0,简单来说就是对I/O操作两种不同方式,驱动程序可以灵活支持用户空间对设备这两种访问方式。...非阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞访问最终会引发设备驱动中 poll 函数执行。...=1); //串口上没有输入则返回,所以循环读取 printf("%c/n",buf); 阻塞操作常常用等待队列来实现,而非阻塞操作用轮询方式来实现。...非阻塞I/O操作在应用层通常会用到select()和poll()系统调用查询是否可对设备进行无阻塞访问。select()和poll()系统调用最终会引发设备驱动中poll()函数被调用。...poll_wait()函数,将对应等待队列头添加到poll_table 返回表示是否能对设备进行无阻塞读,写访问掩码 驱动函数中poll()函数典型模板如下: static unsigned int

    5.5K20

    linux阻塞与非阻塞(connect连接超时)

    ②但是非阻塞connect返回错误是有讲究: 如果非阻塞connect返回错误是EINPROGRESS,代表不是connect系统调用出错了,而是connect可能会在后面才会建立完整地连接(...,进一步来等待非阻塞connect客户端与服务端建立完整地连接,在等待过程中,如果非阻塞connect建立成功了,客户端sock_fd就会变成可写(这个在本人IO复用文章中介绍过,见下图) ④当非阻塞...: 1.首先,非阻塞socket可能导致connect始终失败 2.其次,select对处于EINPROGRESS状态下socket可能不起作用 3.最后,对于出错socket,getsockopt...在有些系统(比如Linux)上返回-1,而在有些系统上(比如源自伯克利UNIX)返回0 这些问题没有一个统一解决办法 三、编码演示案例 #include #include <stdlib.h...于是在后面的select中等待非阻塞connect建立成功并且客户端fd变为可写

    6.4K10

    linux源码看socket阻塞和非阻塞

    linux源码看socket阻塞和非阻塞 笔者一直觉得如果能知道从应用到框架再到操作系统每一处代码,是一件Exciting事情。 大部分高性能网络框架采用是非阻塞模式。...笔者这次就从linux源码角度来阐述socket阻塞(block)和非阻塞(non_block)区别。 本文源码均来自采用Linux-2.6.24内核版本。...一个TCP非阻塞client端简单例子 如果我们要产生一个非阻塞socket,在C语言中如下代码所示: // 创建socket int sock_fd = socket(AF_INET, SOCK_STREAM....recvmsg = tcp_recvmsg, ...... } fcntl控制socket阻塞\非阻塞状态 我们用fcntl修改socket阻塞\非阻塞状态。...阻塞后什么时候恢复运行呢 情况1:有对应网络数据到来 首先我们看下网络分组到来内核路径,网卡发起中断后调用netif_rx将事件挂入CPU等待队列,并唤起软中断(soft_irq),再通过linux

    3.5K20

    阻塞和非阻塞实现

    我们可能都已经听过阻塞阻塞概念,本文以tcp中connect系统调用为例子(基于1.12.13内核,新版原理类似,但是过程就很复杂了,有时间再分析),分析阻塞和非阻塞是什么并且看他是如何实现。...sync包,然后根据socket属性(阻塞阻塞,可以通过setsocketopt设置)做下一步处理,如果是非阻塞,那么就比较简单,直接返回给应用层。...这也是非阻塞+事件驱动架构中做法。因为这种架构下通常是单进程,要避免阻塞进程,那么返回后什么时候才能知道连接成功呢?...这就是epoll提供机制,当连接成功后,tcp层会通知epoll,epoll就会通知应用层。下面我们继续分析阻塞过程,interruptible_sleep_on(sk->sleep)。...另外我们看到,这里这是修改进程为可执行状态,但是不会立刻调度,要等下一次进程调度时候才发生进程调度。以上就是进程阻塞和非阻塞原理。

    2.2K20

    阻塞与非阻塞区别verilog_如何理解阻塞和非阻塞

    send做工作其实只是把数据传输(Copy)到TCP/IP协议栈输出缓冲区,它执行成功并不代表数据已经成功发送出去了,如果TCP/IP协议栈没有足够可用缓冲区来保存你Copy过来数据的话…这时候就体现出阻塞和非阻塞不同之处了...socket接收数据另外一个函数recv则是一个阻塞调用例子。当socket工作在阻塞模式时候, 如果没有数据情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...非阻塞阻塞阻塞概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...对象阻塞模式和阻塞函数调用 对象是否处于阻塞模式和函数是不是阻塞调用有很强相关性,但是并不是一一对应。...阻塞对象上可以有非阻塞调用方式,我们可以通过一定API去轮询状态,在适当时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊函数也可以进入阻塞调用。

    2.3K20

    一种理解同步异步,阻塞阻塞Linux IO 模型,select poll epoll 方法

    同步/异步与阻塞/非阻塞理解 线程是程序执行中一个单一顺序控制流程,是程序执行流最小单元,是处理器调度和分派基本单位。用线程执行程序流过程去理解同步异步,阻塞阻塞。...同步异步关注是流执行过程需不需要等待外部调用结果,而阻塞阻塞关注是外部调用对流本身产生影响。...区分:线程流向下执行需不需要等待系统调用结果。 阻塞与非阻塞 线程执行过程中,产生一个外部调用后,会不会把该线程流“堵”住,会“堵”对应阻塞,反之为非阻塞。...Linux五种IO模型 上一节中对同步/异步,阻塞/非阻塞描述只能说能够恰好区分它们,如果不是在计算机领域而是生活中,道理也类似。...然而计算机中某些专业术语又需要放在专门情景中去看,例如下面将要提到Linux IO模型,建议理解模型本身,而不是抠同步/异步与阻塞阻塞字眼,因为会发现就算是非阻塞模型也有阻塞部分,同步IO与异步

    6.9K10

    关于IO同步,异步,阻塞,非阻塞

    中途正好讨论了网络IO同步、异步、阻塞、非阻塞概念,当时讲下来,大家理解各不相同,各执己见。搜索了网络上一些文章,观点也各不相同,甚至连wiki也将异步和非阻塞当成一个概念在解释。...虽然网络上充斥了大量关于同步、异步、阻塞、非阻塞文章,但大都是抄来抄去,没有一个权威说法。...这样,同步和异步概念就非常明显了。以上五种IO模型,前面四种都是同步,只有第五种IO模型才是异步IO。 阻塞和非阻塞 那么阻塞和非阻塞呢?注意到以上五个模型。...阻塞IO,非阻塞IO,只是上面的五个模型中两个。阻塞,非阻塞,是针对单个进程而言。 当对多路复用IO进行调用时,比如使用poll。...这就要看fd状态了,如果fd被设置成了非阻塞,那么此时read就是非阻塞;如果fd被设置成了阻塞,那么此时read就是阻塞

    86940

    linux网络编程系列(七)--如何将socket设置成非阻塞,非阻塞socket与阻塞socket在收发数据上区别

    生成socket时设置 socket函数创建socket默认是阻塞,也可以增加选项将socket设置为非阻塞: int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK...非阻塞阻塞在收发数据时有什么区别 3.1 发送时区别 3.1.1 TCP发送(即send函数) send函数在阻塞模式下,会等待所有数据都被拷贝到发送缓冲区才会返回,也就是说,阻塞模式下,send函数返回值必定是参数中发送长度大小...; send函数在非阻塞模式下,会立即返回,但是会尽可能多拷贝数据到缓冲区,但不保证全部拷贝后返回,因此非阻塞模式下,send函数返回值可能比参数中发送长度小,而如果缓冲区满了的话,就会立即返回; 3.1.2...UDP发送(即sendto函数) 即使在阻塞模式下,sendto也不会阻塞,因为UDP并没有真正发送缓冲区,它所做只是将应用缓冲区数据拷贝给下层协议栈,加上UDP头、IP头等,实际是不存在阻塞,...3.2 接收时区别 3.2.1 TCP接收(即recv函数) 在阻塞模式下, recv将会阻塞,直到缓冲区里有至少一个字节才返回,当没有数据到来时,recv会一直阻塞或者直到超时,不会返回; 在非阻塞模式下

    3.2K30

    Linux epoll 使用 LT + 非阻塞 IO 和 ET + 非阻塞 IO 有效率上区别吗?

    写这篇文章初衷是回答一位同学学习网络模型时困惑。 他问题: Linux epoll 使用 LT + 非阻塞 IO 和 ET + 非阻塞 IO 有效率上区别吗? 问题补充:请看清楚。。...都是非阻塞IO,这是否意味着他们系统调用次数基本是一致?那么ET+非阻塞存在意义是什么呢?...以下是我回答,全文如下: 综合 select 和 poll 一些优缺点,Linux 从内核 2.6 版本开始引入了更高效 epoll 模型,本文我们来详细介绍 epoll 模型。...,可写事件触发后,你调用 send 函数(Linux 平台也可以使用 write)去发送数据,如果数据本次不能全部发送完(对于非阻塞 socket,此时 send 函数返回 -1,错误码为 EAGAIN...因为,现代互联网大环境下作为后台服务载体主流操作系统是 Linux,而 epoll 系统调用是 Linux 下实现高性能服务网络模块必备组件!

    2.3K51

    Linux下Socket编程(三)——非阻塞select使用简介

    简介 什么叫阻塞和非阻塞 select fd_set类型变量相关宏定义 fcntl 实例 select总是返回1问题。...什么叫阻塞和非阻塞 阻塞方式block,顾名思义,就是进程或是线程执行到这些函数时必须等待某个事件发生,如果事件没有发生,进程或线程就被阻塞,函数不能立即返回。...使用Select就可以完成非阻塞(所谓非阻塞方式non- block,就是进程或线程执行此函数时不必非要等待事件发生,一旦执行肯定返回,以返回值不同来反映函数执行情况,如果事件发生则与阻塞方式相同...一定等到监视文件描述符集合中某个文件描述符发生变化为止 若将时间值设为0秒0毫秒,就变成一个纯粹阻塞函数,不管文件描述符是否有变化,都立刻返回继续执行,文件无变化返回0,有变化返回一个正值 timeout...值大于0,这就是等待超时时间,即 select在timeout时间内阻塞,超时时间之内有事件到来就返回了,否则在超时后不管怎样一定返回,返回值同上述。

    4.2K10

    同步、异步、阻塞、非阻塞

    阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同。...socket接收数据另外一个函数recv则是一个阻塞调用例子。当socket工作在阻塞模式时候, 如果没有数据情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...非阻塞阻塞阻塞概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...同步/异步与阻塞/非阻塞组合 同步阻塞形式: 等待执行结果是一直等待,执行时线程挂起(未对fd 设置O_NONBLOCK 标志位read/write 操作) 同步非阻塞形式:等待执行结果是一直等待,...执行时函数立即返回(对fd 设置O_NONBLOCK 标志位read/write 操作) 异步阻塞形式:不是在处理消息时一直等待(通过状态、通知,或回调函数通知主调函数select ),而是在等待消息被触发时被阻塞

    3K40

    同步异步,阻塞阻塞

    什么是阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据时候,根据IO操作就绪状态来采取不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。...同步/异步与阻塞/非阻塞区别 同步与异步:针对数据访问方式,程序是主动去询问操作系统数据准备好了么,还是操作系统在数据准备好时候通知程序。...阻塞与非阻塞区别: 阻塞是程序在调用系统函数IO时,在系统执行系统调用时由CPU通过轮询等方式来实现数据IO。 非阻塞是在程序级别通过轮询/信号/事件机制,去查看IO数据是否就绪。...二者区别其实就是,把阻塞位置从系统CPU层面提到了程序层面。...框架若使用异步IO,则通常需要应用程序内核之间是非阻塞。一旦内核应用程序数据IO完成,则执行回调函数,执行一定操作。 参考文章: 怎样理解阻塞阻塞与同步异步区别?

    3.1K60

    阻塞 & 非阻塞 | 同步 & 异步

    这里讲都是基于IO 阻塞、非阻塞、同步、异步 ---- 一个典型IO操作包括了两个阶段,数据准备和数据读写。比如说现在要使用 recv 执行一个读操作,数据就绪就是远端是否有数据可读。...当IO工作在阻塞状态下时候,如果数据没有就绪,recv就会阻塞当前线程;如果说IO工作在非阻塞状态下,会立即返回。...返回值-1的话,就说明连接出现问题,连接异常;如果返回值是0,且errno是EAGIN的话,就说明这是一个正常阻塞,返回数据未就绪状态。...一个同步IO接口示例: char buf[1024]; int sz = recv(sockfd,buf,1024,0); //阻塞:一直在这儿死等 //非阻塞:时不时回来问一下 if(sz>0)...,阻塞和非阻塞都是同步IO,只有使用了特殊API才是异步IO。

    2.9K10

    关于IO同步,异步,阻塞,非阻塞

    中途正好讨论了网络IO同步、异步、阻塞、非阻塞概念,当时讲下来,大家理解各不相同,各执己见。搜索了网络上一些文章,观点也各不相同,甚至连wiki也将异步和非阻塞当成一个概念在解释。...虽然网络上充斥了大量关于同步、异步、阻塞、非阻塞文章,但大都是抄来抄去,没有一个权威说法。...这样,同步和异步概念就非常明显了。以上五种IO模型,前面四种都是同步,只有第五种IO模型才是异步IO。 阻塞和非阻塞 那么阻塞和非阻塞呢?注意到以上五个模型。...阻塞IO,非阻塞IO,只是上面的五个模型中两个。阻塞,非阻塞,是针对单个进程而言。 当对多路复用IO进行调用时,比如使用poll。...这就要看fd状态了,如果fd被设置成了非阻塞,那么此时read就是非阻塞;如果fd被设置成了阻塞,那么此时read就是阻塞

    794100

    异步,同步,阻塞,非阻塞程序实现

    终于用透支生命方法把这一课学完了。感动。以后不这样了。 实现异步非阻塞是一个大命题,这里只从原理出发。我会慢慢修改这篇文章。 本文将从异步sleep实现入手,来讲解异步非阻塞程序原理。...什么是异步,同步,阻塞,非阻塞 在写这篇文章前,我对这四个概念是非常模糊。 同步,异步 异步同步差异,在于当线程调用函数时候,线程获取消息方式....同步: 线程 ----我主动来拿结果----> 函数 异步: 线程 <---你把结果拿给我---- 函数 阻塞,非阻塞 阻塞阻塞差异,在于线程调用函数时候,线程状态。...线程在同步调用下,也能非阻塞(同步轮循非阻塞函数状态),在异步下,也能阻塞(调用一个阻塞函数,然后在函数中调用回调,虽然没有什么意义)。 下面,我会慢慢实现一个异步非阻塞sleep。...那么,我们该如何实现自己阻塞sleep呢。 (tornadosleep,原理十分复杂。以后再细说。) 场景二:轮循非阻塞 实现非阻塞场景,关键在于函数不能阻塞住当前线程。

    7.5K10

    关于同步异步、阻塞阻塞IO摘要

    四种IO模型 Boost application performance using asynchronous I/O把同步阻塞、同步非阻塞、异步阻塞、异步非阻塞模型讲得很清楚。...有人对于event-driven模型有一些批判,认为多线程模型(同步阻塞模型)不比事件模型差: Thousands of Threads and Blocking I/O,讲了C10K提到多线程模型性能瓶颈在如今内核里已经不存在了...),只利用了40%左右CPU,而vert.x测试CPU利用率为100%。...事件驱动模型解决是C10K问题,注意C是Connection,解决是用更少硬件资源处理更多连接问题,它不解决让请求更快速问题(这是程序员/算法问题)。...对于事件驱动模型来说也有CPU用满问题,现实中总会存在一些阻塞操作会造成CPU闲置,这也就是为什么SEDA和Scalable IO in Java都提到了要额外开线程来处理这些阻塞操作。

    99000

    总是搞不懂同步异步,阻塞阻塞

    摘要:更好理解同步/异步,阻塞/非阻塞概念和机制。 一、同步与异步 同步/异步, 它们是消息通知机制。...B、非阻塞阻塞阻塞概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。...C、对象阻塞模式和阻塞函数调用 对象是否处于阻塞模式和函数是不是阻塞调用有很强相关性,但是并不是一一对应。...阻塞对象上可以有非阻塞调用方式,我们可以通过一定 API 去轮询状态,在适当时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊函数也可以进入阻塞调用。...四、同步/异步与阻塞/非阻塞组合分析 同步阻塞形式: 效率是最低,拿上面的例子来说,就是你专心等待,什么别的事都不做。

    87110
    领券