首页
学习
活动
专区
工具
TVP
发布

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...的阻塞\阻塞状态 我们用fcntl修改socket阻塞\阻塞状态。...阻塞后什么时候恢复运行呢 情况1:有对应的网络数据到来 首先我们看下网络分组到来的内核路径,网卡发起中断后调用netif_rx将事件挂入CPU的等待队列,并唤起软中断(soft_irq),再通过linux

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

Linux编程(阻塞阻塞IO)

Linux设备驱动中的阻塞阻塞I/0,简单来说就是对I/O操作的两种不同的方式,驱动程序可以灵活的支持用户空间对设备的这两种访问方式。...阻塞操作:在不能进行设备操作时,并不挂起,它或者放弃,或者不停地查询,直到可以进行操作。...阻塞应用程序通常使用select系统调用查询是否可以对设备进行无阻塞的访问最终会引发设备驱动中 poll 函数执行。...|O_NONBLOCK); //O_NONBLOCK 阻塞标识 ..... while(read(fd,&buf,1)!...阻塞I/O的操作在应用层通常会用到select()poll()系统调用查询是否可对设备进行无阻塞访问。select()poll()系统调用最终会引发设备驱动中的poll()函数被调用。

5.4K20

ioctlsocket() 用法 socket recvfrom 阻塞 阻塞 设置

iMode);//阻塞设置 rs=recvfrom(socketc,rbuf,sizeof(rbuf),0,(SOCKADDR*)&addr,&len); int ioctlsocket (SOCKET...支持下列命令: FIONBIO:允许或禁止套接口s的阻塞模式。argp指向一个无符号长整型。如允许阻塞模式则零,如禁止阻塞模式则为零。...当创建一个套接口时,它就处于阻塞模式(也就是说阻塞模式被禁止)。这与BSD套接口是一致的。WSAAsynSelect()函数将套接口自动设置为阻塞模式。...支持下列命令: FIONBIO:允许或禁止套接口s的阻塞模式。argp指向一个无符号长整型。如 允许阻塞模式则零,如禁止阻塞模式则为零。...支持下列命令: FIONBIO:允许或禁止套接口s的阻塞模式。argp指向一个无符号长整型。如允许阻塞模式则零,如禁止阻塞模式则为零。

3.4K20

同步、异步、阻塞阻塞

同步异步 同步:是用户线程发起IO请求需要等待或者轮询内核IO操作完成后才能继续执行。...阻塞阻塞 阻塞:是指IO操作需要彻底完成后才能返回用户空间。 阻塞:是指IO操作被调用后立即返回一个状态值,无需等待IO操作完成。...同步异步(线程间调用) 同步异步是对应调用者被调用者,他们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。 同步操作时,调用者需要等待被调用者返回结果,才能进行下一步操作。...阻塞阻塞(线程内调用) 阻塞阻塞是对于一个线程来讲的,在任意时刻,线程要么是处于阻塞的,要么是出于阻塞的。 阻塞阻塞关注的程序等待调用结果(消息,返回值)时的状态。...阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。 阻塞调用是指不能立刻得到返回结果之前,该调用就不会阻塞当前线程。

2.1K40

socket阻塞阻塞,同步与异步、IO模型

阻塞IO阻塞IO的区别就在于:应用程序的调用是否立即返回! 同步异步都只针对于本机SOCKET而言的。同步异步,阻塞阻塞,有些混用,其实它们完全不是一回事,而且它们修饰的对象也不相同。...二、Linux下的五种I/O模型: 1)阻塞I/O(blocking I/O) 2)阻塞I/O (nonblocking I/O) 3) I/O复用(select poll) (I/O multiplexing...我们把一个SOCKET接口设置为阻塞就是告诉内核,当所请求的I/O操作无法完成时,不要将进程睡眠,而是返回一个错误。...当使用socket()函数WSASocket()函数创建套接字时,默认都是阻塞的。在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为阻塞模式。...Linux下的函数是:fcntl()。 套接字设置为阻塞模式后,在调用Windows Sockets API函数时,调用函数会立即返回。

1.5K30

深入理解--异步阻塞同步阻塞异步阻塞

异步阻塞的概念实际上已经出现了很长一段时间。但是异步真正开始流行起来,是因为AJAX技术逐渐成为主流的web开发技术。...本文就会详细讨论这个问题,希望能帮助读者更好的了解这几个概念 同步阻塞 首先,我们先开始介绍与异步阻塞对立的两个概念:同步阻塞 对于web开发者来说,理解同步的概念相对比较容易,因为HTTP协议就是一个同步的协议...这通常会造成性能的瓶颈,因为这个方法会阻塞,导致无法继续执行随后的操作。 异步阻塞 异步阻塞就是同步阻塞的相反面。...通常来说,系统调用会进入内核,一般都是阻塞的,所以read操作往往是阻塞的,会等待可用数据,并且将线程休眠。 现在,我们应该对于异步阻塞的概念已经有所了解了。...下面我们就举个现实中的例子来加强理解: 例如,传统的sockets API中,一个阻塞socket,通常会立即返回一个"would block" 的错误信息,然后需要调用独立的函数select or

96940

阻塞阻塞的区别verilog_如何理解阻塞阻塞

:对于阻塞模式的socket send函数将不返回直到系统缓冲区有足够的空间把你要发送的数据Copy过去以后才返回,而对于阻塞socket来说send会立即返回WSAEWOULDDBLOCK告诉调用者说...:耗费着系统资源….对于阻塞模式的socket该函数会马上返回,然后告诉你:WSAEWOULDDBLOCK—“现在没有数据,回头在来看看” 扩展: 在进行网络编程时,我们常常见到同步、异步、阻塞阻塞四种调用方式...当连接真正建立起来以后,socket底 层会发送一个消息通知该对象。这里提到执行部件调用者通过三种途径返回结果:状态、通知回调。...如果主窗口调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。...阻塞 阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

2.2K20

同步与异步,阻塞阻塞

Java 中的 BIO、NIO AIO 可以理解为是 Java 语言对操作系统的各种 IO 模型的封装。...在讲 BIO,NIO,AIO 之前,先来回顾一下这样几个概念:同步与异步,阻塞阻塞。...阻塞阻塞 阻塞阻塞就是发起一个请求,调用者一直等待请求结果返回,也就是当前线程会被挂起,无法从事其他任务,只有当条件就绪时才能继续; 阻塞阻塞就是发起一个请求,调用者不用一直等着结果返回...举个生活中简单的例子: 你妈妈让你烧水,小时候你比较笨啊,在那里傻等着水开(同步阻塞); 等你稍微长大了,你知道每次烧水的空隙可以去干点其他事,然后只需要时不时来看看水开了没有(同步阻塞); 再后来...,你们家用上了水开了会发出声音的壶,这样你只需要听到响声后,就知道水开了,在这期间你可以随便干自己的事情,最后才需要去倒水了(异步阻塞)。

1.1K20

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

生成socket时设置 socket函数创建socket默认是阻塞的,也可以增加选项将socket设置为阻塞的: int s = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK...使用fcntl设置 将socket设置为阻塞的 if ((nFlags = fcntl (nSock, F_GETFL, 0)) < 0) return 0; nFlags = nFlags...阻塞阻塞在收发数据时有什么区别 3.1 发送时的区别 3.1.1 TCP发送(即send函数) send函数在阻塞模式下,会等待所有数据都被拷贝到发送缓冲区才会返回,也就是说,阻塞模式下,send函数返回值必定是参数中发送长度的大小...; send函数在阻塞模式下,会立即返回,但是会尽可能的多拷贝数据到缓冲区,但不保证全部拷贝后返回,因此阻塞模式下,send函数返回值可能比参数中发送长度小,而如果缓冲区满了的话,就会立即返回; 3.1.2...阻塞模式也一样。

2.7K30

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

阻塞connect详情介绍可以参见文章:https://blog.csdn.net/qq_41453285/article/details/89890429 一、阻塞connect概述 man手册...解析文档,阻塞connect如何使用: ①当我们将sock设置为阻塞之后,使用connect去连接服务端,即使服务端开启了,connect系统调用也不会连接成功,connect而是以失败告终,并返回错误...,进一步来等待阻塞connect客户端与服务端建立完整地连接,在等待的过程中,如果阻塞connect建立成功了,客户端的sock_fd就会变成可写的(这个在本人的IO复用文章中介绍过,见下图) ④当阻塞...connect建立成功之后还可以利用getsockopt来读取错误码并清除该socket上的错误: 如果错误码为0,表示连接成功建立 否则连接失败 二、阻塞connect的移植性问题 移植性问题如下...: 1.首先,阻塞socket可能导致connect始终失败 2.其次,select对处于EINPROGRESS状态下的socket可能不起作用 3.最后,对于出错的socket,getsockopt

5.9K10

Java同步异步,阻塞阻塞

同步异步、阻塞阻塞 同步异步关注的是消息通信机制. 同步是指: 发送方发出数据后, 等待接收方发回响应后才发下一个数据包的通讯方式....阻塞阻塞属于进程API执行动作的方式, 关注的是程序在等待调用结果时的状态. 阻塞是指: 调用结果返回之前, 当前线程会被挂起. 函数只有在得到结果之后才会返回, 线程需要等待结果....阻塞是指: 与阻塞的概念相对应, 指在不能立刻得到结果之前, 该函数不会阻塞当前线程, 而会立刻返回. 线程不需要等待结果....阻塞: 线程同样需要线程B给一个数, 但是线程A仅仅告知线程B要给这个数, 并没有马上就要使用这个数, 此时线程A没有被挂起, 仍然能分到cpu, 仍然能执行, 这样被称为阻塞....offer()方法并没有阻塞当前线程, 而又希望同步, 于是通过循环来实现, 最终实现同步阻塞.

5.2K31

同步异步,阻塞阻塞

什么是同步异步 同步异步是针对应用程序内核的交互而言的, 同步指的是用户进程触发IO操作并等待或者轮询的去查看IO操作是否就绪,而异步是指用户进程触发IO操作以后便开始做自己的事情,而当IO操作已经完成的时候会得到...什么是阻塞阻塞 阻塞阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。...内核应用程序  同步执行,阻塞/阻塞。用户进程/线程无法直接读写内核数据,需要数据在用户空间内核空间搬来搬去。除非个别接口,否则一般是同步的。...可以是阻塞阻塞阻塞则一直在等待内核/应用程序把IO数据准备好,阻塞则是直接返回内核/应用程序是否已经准备好数据。 应用程序框架:同步或异步。...IO多路复用,同步,异步,阻塞阻塞 区别 关于异步,同步,阻塞阻塞 解读I/O多路复用技术

3.1K60

同步、异步、阻塞阻塞

阻塞阻塞   应用进程请求I/O操作时,如果数据未准备好,如果请求立即返回就是非阻塞,不立即返回就是阻塞。简单说就是做一件事如果不能立即获得返回,需要等待,就是阻塞,否则就可以理解为阻塞。...阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用同步调用等同起来,实际上它们是不同的。...如果主窗口调用函数在同一个线程中,除非你在特殊的界面操作函数中调用,其实主界面还是应该可以刷新。socket接收数据的另外一个函数recv则是一个阻塞调用的例子。...当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。...阻塞 阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。

2.9K40

阻塞 & 阻塞 | 同步 & 异步

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

2.8K10

从事件调度理解阻塞阻塞

所有对该实践敏感的进程都会按照任意顺序进行评估仿真时间用来模拟被仿真电路所需的实际时间2 事件队列Verilog事件队列被分为五个区域:活跃事件、活跃事件、阻塞赋值更新时间、监视事件将来事件下面是大佬总结的图图片在执行顺序上...:活跃事件 -> 活跃事件 -> 阻塞赋值更新事件 -> 监控事件 -> 将来事件不过这五个事件内包含的操作,它们的执行顺序是随机的我对当前仿真时间的理解是当T,将来仿真时间是次T3 确定性不确定性...block中,而这两个block我们没办法预知到底是哪个block先执行,因此最终变量q是a的值还是b的值是不确定的,这也是为什么在学习Verilog时一直在强调,同一个变量不能在多个block中进行赋值4 阻塞阻塞从上面的调度表可以看出...,阻塞赋值在活跃事件中;阻塞的右式计算在活跃事件中,而更在阻塞赋值更新事件中由于事件队列的执行是顺序执行的,当仿真进入当前仿真时间时,先执行活跃事件,对于阻塞阻塞来说,当进入活跃事件时,阻塞赋值进行右式计算...、阻塞赋值的右式计算$display都属于活跃事件那么对于这个例子可以做出提前预测结果,变量a成功赋值,变量b没有完成赋值,来看看运行结果图片可以看到运行结果与我们的猜测一致同样的,如果我们加入监控事件

40330
领券