首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏灰子学技术

    2.中断和进程阻塞

    本篇是多路复用相关的知识的第二篇文章,主要讲解中断和进程阻塞在整个网络数据传递过程中,所经历的过程。 二、进程阻塞 阻塞是进程调度的关键一环,指的是进程在等待某事件(如接收到网络数据)发生之前的等待状态,recv、select和epoll都是阻塞方法。 对于阻塞来说,是不占用CPU资源的。 下面我们看下“进程阻塞为什么不占用cpu资源?” 操作系统为了支持多任务,实现了进程调度的功能,会把进程分为“运行”和“等待”等几种状态。 1.运行状态是进程获得cpu使用权,正在执行代码的状态; 2.等待状态是阻塞状态,比如上述程序运行到recv时, 程序会从运行状态变为等待状态,接收到数据后又变回运行状态。 所以进程A被阻塞,不会往下执行代码,也不会占用cpu资源。 ?

    2K31发布于 2020-10-30
  • 来自专栏数据云团

    并发篇-python非阻塞套接字-2

    IO多路复用 IO多路复用也是阻塞IO, 只是阻塞的方法是select/poll/epoll, 好处就是单个进程可以处理多个socket 用select,poll,epoll监听多个io对象,当io对象有变化 但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写时间就绪后自己负责进行读写,也就是说这个读写过程是阻塞的 因为阻塞I/O只能阻塞一个I/O操作,而I/O复用模型能够阻塞多个

    78330发布于 2019-07-18
  • 来自专栏小雨的CSDN

    多线程案例(2)——阻塞队列

    生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力 ,队列空了,也会阻塞,一直阻塞到没有其他线程生产了元素,才能继续出队列 阻塞队列也符合先进先出的规则 阻塞队列实现 //阻塞队列 public class ThreadDemo21 { static } size++; notify(); } } //2. } } }; t1.start(); //消费者:这里设置的消费的快 Thread t2 start(); t1.join(); t2.join(); } }

    40230编辑于 2022-10-26
  • 来自专栏菲宇

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

    阻塞与非阻塞   应用进程请求I/O操作时,如果数据未准备好,如果请求立即返回就是非阻塞,不立即返回就是阻塞。简单说就是做一件事如果不能立即获得返回,需要等待,就是阻塞,否则就可以理解为非阻塞阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。 socket接收数据的另外一个函数recv则是一个阻塞调用的例子。当socket工作在阻塞模式的时候, 如果没有数据的情况下调用该函数,则当前线程就会被挂起,直到有数据为止。 非阻塞阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 同步/异步与阻塞/非阻塞的组合 同步阻塞形式: 等待执行结果是一直等待,执行时线程挂起(未对fd 设置O_NONBLOCK 标志位的read/write 操作) 同步非阻塞形式:等待执行结果是一直等待,

    3.7K40发布于 2019-06-13
  • 来自专栏技术碎碎念

    同步异步,阻塞阻塞

    什么是阻塞和非阻塞 阻塞和非阻塞是针对于进程在访问数据的时候,根据IO操作的就绪状态来采取的不同方式,阻塞方式下读取或者写入函数将一直等待,而非阻塞方式下,读取或者写入函数会立即返回一个状态值。 阻塞与非阻塞:针对函数(程序)运行的方式,在IO未就绪时,是等待就绪还是直接返回(执行别的操作)。 阻塞与非阻塞的区别: 阻塞是程序在调用系统函数IO时,在系统执行系统调用时由CPU通过轮询等方式来实现数据的IO。 非阻塞是在程序级别通过轮询/信号/事件的机制,去查看IO数据是否就绪。 可以是阻塞或非阻塞阻塞则一直在等待内核/应用程序把IO数据准备好,非阻塞则是直接返回内核/应用程序是否已经准备好数据。 应用程序框架:同步或异步。 IO多路复用,同步,异步,阻塞和非阻塞 区别 关于异步,同步,阻塞与非阻塞 解读I/O多路复用技术

    3.8K60发布于 2018-04-11
  • 来自专栏浪人聊编程

    同步 异步 阻塞阻塞

    以调用函数为例, 同步指的是调用方主动查询返回结果,异步是等待被调用方通知查询结果 阻塞是等待返回结果的时间内挂起,非阻塞是等待返回结果的时间内可以干其他事情. 同步和阻塞完全不是一件事,是否同步指的是获取返回结果的方式,是否阻塞指的是等待获取结果的时间内是否可以干其他事情

    3.2K20发布于 2019-12-20
  • 来自专栏CSDN搜“看,未来”

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

    这里讲的都是基于IO的 阻塞、非阻塞、同步、异步 ---- 一个典型的IO操作包括了两个阶段,数据准备和数据读写。比如说现在要使用 recv 执行一个读操作,数据就绪就是远端是否有数据可读。 当IO工作在阻塞状态下的时候,如果数据没有就绪,recv就会阻塞当前线程;如果说IO工作在非阻塞状态下,会立即返回。 一个同步IO接口的示例: char buf[1024]; int sz = recv(sockfd,buf,1024,0); //阻塞:一直在这儿死等 //非阻塞:时不时的回来问一下 if(sz>0) 仅被 lio_listio() 函数使用 */ /* Various implementation-internal fields not shown */ }; 陈硕大神说:在处理IO的时候,阻塞和非阻塞都是同步 ---- 五种IO模型 阻塞: 非阻塞: 多路IO复用 信号驱动: 这里就完全放飞自我了 异步: ---- Reactor反应堆模型 One loop per thread

    3.5K10发布于 2021-10-09
  • 来自专栏写字母的代码哥

    精讲响应式WebClient第2篇-GET请求阻塞与非阻塞调用方法详解

    本文是精讲响应式WebClient第2篇,前篇的blog访问地址如下: 精讲响应式webclient第1篇-响应式非阻塞IO与基础用法 在上一篇文章为大家介绍了响应式IO模型和WebClient的基本用法 一、block()阻塞式获取响应结果 WebClient客户端既支持同步异步、阻塞与非阻塞IO,我们先来为大家介绍一下同步阻塞式的编程方式。 即:在请求发送之后使用block()方法,阻塞当前线程等待获取响应结果。 二、subscribe()非阻塞式获取响应结果 与block()阻塞式获取响应结果不同,使用subscribe()异步订阅响应结果,不会阻塞主线程继续向下执行。 写死的参数方式不灵活 .uri("/posts/1") //服务请求路径,基于baseurl 第一种占位符传参:数字顺序占位符 Mono<String> mono = webClient.uri("/{1}/{2}

    3.7K21发布于 2020-09-23
  • 来自专栏java达人

    Zuul 2: Netflix的异步、无阻塞系统之旅

    Zuul 2与原始版本之间的主要架构差异是,Zuul 2在异步、非阻塞框架(Netty)上运行。 阻塞和非阻塞系统的区别 要理解为什么我们要构建Zuul 2,您必须首先理解异步和非阻塞(“异步”)系统与多线程、阻塞(“阻塞”)系统在理论上和实践中的架构差异。 构建非阻塞Zuul 在Netflix的基础架构中构建Zuul 2比预期的更具挑战。Netflix生态系统中的许多服务都是基于阻塞的假设建立起来的。 因此,构建Zuul 2的复杂性多在于梳理出使用线程局部变量的隐秘角落,其他的挑战则包括将阻塞网络逻辑转换成非阻塞网络代码,并在库中寻找阻塞代码,修复资源泄漏,以及将核心基础设施转换为异步运行。 开源项目Reactive-Audit通过插桩server的方式来帮助发现代码块和库被阻塞的情况。 我们采用了一种有趣的方法来构建Zuul 2

    2.1K30发布于 2020-02-14
  • 来自专栏全栈程序员必看

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

    :”发送操作被阻塞了!!! 阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上它们是不同的。 非阻塞阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 对象的阻塞模式和阻塞函数调用 对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。 阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。

    2.8K20编辑于 2022-09-16
  • 来自专栏原创分享

    阻塞和非阻塞的实现

    我们可能都已经听过阻塞阻塞的概念,本文以tcp中的connect系统调用为例子(基于1.12.13内核,新版的原理类似,但是过程就很复杂了,有时间再分析),分析阻塞和非阻塞是什么并且看他是如何实现的。 sock->state = SS_CONNECTED; // 返回成功 return(0); } 我们看到connect函数首先会调用tcp层的函数发送一个sync包,然后根据socket的属性(阻塞阻塞 这也是非阻塞+事件驱动架构中的做法。因为这种架构下通常是单进程的,要避免阻塞进程,那么返回后什么时候才能知道连接成功呢? 这就是进程阻塞的原理,主要是两个过程 1 加入等待队列 2 让出CPU,调度其他进程执行。 我们这个进程什么时候被唤醒呢?我们从收到sync的回包开始分析。具体逻辑在tcp_rcv中。 以上就是进程阻塞和非阻塞的原理。

    2.9K20发布于 2021-07-08
  • 来自专栏深度学习计算机视觉

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

    阻塞 阻塞调用是指调用结果返回之前,当前线程会被挂起。函数只有在得到结果之后才会返回。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。 非阻塞阻塞阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,而会立刻返回。 对象的阻塞模式和阻塞函数调用 对象是否处于阻塞模式和函数是不是阻塞调用有很强的相关性,但是并不是一一对应的。 阻塞对象上可以有非阻塞的调用方式,我们可以通过一定的API去轮询状态,在适当的时候调用阻塞函数,就可以避免阻塞。而对于非阻塞对象,调用特殊的函数也可以进入阻塞调用。 阻塞/非阻塞则是小明的等待方式,或者说 API 调用者的等待方式。 在不同的场景下,同步/异步、阻塞/非阻塞的四种组合都有应用。

    2.7K50发布于 2018-04-24
  • 来自专栏余林丰

    Java IO(2阻塞式输入输出(BIO)

    什么是(同步)阻塞式输入输出(Blocking I/O)   这一部分的内容将解释本文的另一主题——阻塞式输出输出。   首先需要了解何为“阻塞”。 上面的例子都是在“同步”条件下的阻塞与非阻塞。当然还有异步阻塞与非阻塞,这里暂不涉及异步相关,所以本文所述阻塞与非阻塞均是在同步状态下。    1 //同步阻塞式,服务器端接收数据 2 DatagramPacket request = new DatagramPacket(new byte[1024], 1024); 3 socket.receive ,但此时服务器端是同步阻塞式的获取数据并进行处理,在第1条数据未处理完时,第2条数据就必须等待,通常地做法就是上面提到的采用伪异步的方式对接收到的数据进行处理。 1 //(伪)异步阻塞式,服务器端接收数据 2 DatagramPacket request = new DatagramPacket(new byte[1024], 1024); 3 socket.receive

    1.3K50发布于 2018-01-09
  • 来自专栏乐行僧的博客

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

    阻塞和非阻塞 阻塞:是指IO操作需要彻底完成后才能返回用户空间。 非阻塞:是指IO操作被调用后立即返回一个状态值,无需等待IO操作完成。 阻塞和非阻塞(线程内调用) 阻塞和非阻塞是对于一个线程来讲的,在任意时刻,线程要么是处于阻塞的,要么是出于非阻塞的。 阻塞和非阻塞关注的程序等待调用结果(消息,返回值)时的状态。 阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。 非阻塞调用是指不能立刻得到返回结果之前,该调用就不会阻塞当前线程。

    2.8K40编辑于 2022-02-25
  • 来自专栏BanzClub

    阻塞队列与非阻塞队列

    Java提供两种方式来实现阻塞式和非阻塞式,阻塞式使用锁实现,非阻塞式使用CAS方式实现。使用阻塞队列和非阻塞队列的场景还有很多,比较常用的就是我们常说的生产者\消费者模型。 阻塞队列 Java提供了一个阻塞队列的接口——BlockingQueue,在队列的基础上增加可阻塞添加元素和可阻塞获取元素的方法。 ? ? allocationSpinLockOffset, 0, 1)) { try { // 小于64,每次增长size+2, (oldCap + 2) : // grow faster if small (oldCap >> 1)); 当队列为空(或队列为满)时,消费者(或生产者)线程会进入阻塞状态,使用线程的阻塞/通知模型,来通知阻塞的线程。

    3.8K30发布于 2019-06-15
  • 来自专栏后端技术探索

    IO - 同步,异步,阻塞,非阻塞

    同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 当一个read操作发生时,它会经历两个阶段: 1 等待数据准备 (Waiting for the data to be ready) 2 将数据从内核拷贝到进程中 (Copying the data 而在用户进程这边,整个进程会被阻塞。当kernel一直等到数据准备好了,它就会将数据从kernel中拷贝到用户内存,然后kernel返回结果,用户进程才解除block的状态,重新运行起来。 does not cause the requesting process to be blocked; 两者的区别就在于synchronous IO做”IO operation”的时候会将process阻塞

    2.7K10发布于 2018-08-09
  • 来自专栏知识同步

    同步异步阻塞阻塞详解

    阻塞和非阻塞 对于阻塞和非阻塞,其实更关心的是进程的状态,如果函数返回结果之前,主进程被挂起,也就是处于阻塞状态,那这时候整个过程是阻塞的;如果结果返回之前,主进程状态是非阻塞的,那整个过程是非阻塞。 这时候关心的是你是否在等待结果,有没有不管这件事 阻塞与非阻塞: 你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞式调用,你会一直把自己“挂起”,直到得到这本书有没有的结果,如果是非阻塞式调用 在这里阻塞与非阻塞与是否同步异步无关。跟老板通过什么方式回答你结果无关。 这时候关心的是你是否立即有答复,你是否离开了书店 c++ socket阻塞与非阻塞代码 阻塞模式下的socket读取 int main(){ #创建和绑定socket,creat和bind函数 res = read(fd, buf, sizeof(buf)); printf("user data : %s\n", buf); /* 模拟 阻塞

    2.5K50编辑于 2022-12-26
  • 来自专栏编程

    浅析同步异步阻塞阻塞

    阻塞阻塞调用是指调用结果返回之前,当前线程会被挂起,一直处于等待消息通知,不能够执行其他业务。 非阻塞:非阻塞调用是指调用结果返回之前,当前线程不会被挂起,能够执行其他业务。 阻塞和非阻塞是与线程相关的,阻塞阻塞是等待消息通知时的状态角度来说的。 同步依赖消息的同步返回,异步是通过状态,回调和通知的方式实现的。 阻塞与非阻塞: 如果上面排队和取号之后,我们什么都不做,只是等待通知到我们去办理业务,那就是阻塞的。 如果我们这个时候去吃了一波鸡,那就是非阻塞了。 同步阻塞:是用户层的读或写的请求转换成内核的I/O请求,直到I/O请求阻塞阻塞,读到数据返回,读不到一直等待)结束,才结束用户层的请求。 总结:同步和异步仅仅是关注的消息如何通知的机制,而阻塞与非阻塞关注的是等待消息通知时的状态。

    2.4K80发布于 2018-01-09
  • 来自专栏python3

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

    阻塞与非阻塞   阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态。   阻塞调用是指调用结果返回之前,当前线程会被挂起,调用线程只有在得到结果之后才会返回。    非阻塞调用指在不能立刻得到结果之前,该调用不会阻塞当前线程。    还是上面的例子:   你打电话问书店老板有没有《分布式系统》这本书,你如果是阻塞调用,你会一直把自己挂起,直到得到这本书有没有的结果,如果是非阻塞调用   你不管老板有没有告诉你,你自己先一边去玩了,当然你也要偶尔过几分钟 阻塞与非阻塞与是否同步异步无关。 总结: 阻塞:进程给CPU传达一个任务之后,一直在等待CPU处理完成,然后才执行后边的操作。    非阻塞:进程给CPU传达一个任务之后,继续处理后续的操作,隔段时间再来询问之前的操作是否完成,这样的机制也叫轮询。   

    2.5K30发布于 2020-01-16
  • 来自专栏不知非攻

    准确理解阻塞、非阻塞、同步、异步

    while(performance.now() - now < 2000) { // todo } console.log('task1 finish') } const task2 = () => { console.log('task2') } const job = () => { console.log('job') } setTimeout(task1, 2000 ) setTimeout(task2, 2000) job() 又例如这个例子。 两个异步任务 task1,task2,一个同步任务 job。job 会最先执行。2000ms 之后 task1 开始执行,2000ms 之后执行结束,此时 task2 执行。 从结果上来说,我们可以说:task1、task2 都没有阻塞 job 的执行。 我们可以说:setTimeout 本身阻塞了 job 的执行。 我们可以说:task1 阻塞了 task2 的执行。

    43710编辑于 2024-03-11
领券