精华内容
下载资源
问答
  • 同步与阻塞的区别

    2021-02-26 12:25:10
    阻塞:表示该线程被挂起,失去cpu操作权利,等待被唤醒。 同步:线程仍然在运行,没有被挂起,比如在一个线程中,需要调用一个本地方法或者远程方法,在本地方法或远程方法返回前,该线程不能继续向下执行。 ...

    阻塞:表示该线程被挂起,失去cpu操作权利,等待被唤醒。

    同步:线程仍然在运行,没有被挂起,比如在一个线程中,需要调用一个本地方法或者远程方法,在本地方法或远程方法返回前,该线程不能继续向下执行。

    展开全文
  • 同步与阻塞的区别与联系 何谓同步 在大多数情况下,同步是相对于异步而言的。在iOS开发中,同步主要涉及两个语义:同步调用与线程同步。这里我们主要讨论的是线程同步。 同步调用 同步调用指的是我们在调用一个函数...

    同步与阻塞的区别与联系

    何谓同步

    在大多数情况下,同步是相对于异步而言的。在iOS开发中,同步主要涉及两个语义:同步调用线程同步。这里我们主要讨论的是线程同步。

    同步调用

    同步调用指的是我们在调用一个函数时,立刻可以得到运行结果,并进行后续的操作。

    NSString *message = [self getMessage];
    // do something
    复制代码

    与之相对的,异步调用指的是在我们调用一个函数的时候,并不能立刻得到运行结果。而是在运行完成时,通过回调函数、代理事件、通知等方式告知我们,并进行后续操作。

    [self fetchMesssageWithCompletion:^(NSString *message) {
          // do something
    }];
    
    
    [self getMessage];
    - (void)didReceiveMessage:(NSString *)message
    {
        // do something
    }
    
    复制代码

    线程同步

    线程同步,一种线程间的直接制约关系,是指多个线程(或进程)为了合作完成任务,步调一致的执行。

    • 同一时刻,只能有一个线程执行。有一个线程在执行,则其他线程等待。
    • 线程之间可以指定特定的顺序依次执行,也可以在当前执行线程完成之后,进行竞争

    值得注意的是只有一个线程,或者相同的线程之间是不能称之为同步的。

    何时需要线程同步

    线程间的通讯与资源共享

    多个线程之间要想步调一致的执行,必须保持彼此之间的有效沟通。尤其是在线程之间存在着一个或多个共享资源时。

    • 保持各个线程之间共享资源的数据一致性
    • 其他线程对于共享资源的操作,必须及时告之其他线程。

    线程间存在某种关联

    如果两个线程之间没有任何关联,那么他们之间的同步是毫无意义的。如果两个或多个线程是同步的那么他们之间必然存在着某种关联。

    • 一个线程的执行,会对其他线程的运行结果产生影响。
    • 一个线程的执行依赖另一个线程的运行结果。

    值得注意的是,现实开发中,这种关联存在一线程当中某些关键任务与另一个线程的某些任务之间,并不存在与整个线程生命周期。通常来说是,线程间某些任务之间的相互关联,相互影响。

    同步往往伴随着互斥

    如果多个线程之间是同步的,那么他们之间的执行往往是互斥的。也就是说,在任意时刻,他们都不可能同时执行。当一个线程正在执行时,其他线程必须进入等待状态,等该线程执行结束之后,才以恰当的方式(事件队列、线程优先级、竞态条件)争夺执行的机会。

    值得注意的是,这种互斥往往只在执行某些特定任务时(通常是涉及共享数据的操作)发生。一个线程整个生命周期都与其他线程互斥,这是很少见的。除非该线程只用于处理特定的任务事件。

    同步是更为复杂的互斥,同步与互斥的区别参见这篇文章

    阻塞

    广义上的阻塞,指的是某一段代码、某个任务事件的执行耗费了了大量的时间,或者耗时不确定,阻碍了程序继续往下运行。

    而狭义上的阻塞,等同于线程的挂起,指的就是在下述状态模中进入了阻塞状态,线程挂起,等待某个事件发生以将其唤醒。

    ![进程/线程的状态模型](

    • 线程创建成功之后进入就绪状态,等待操作系统调度
    • 系统调度获得时间片之后,进入运行状态
    • 时间片消耗光之后,进入就绪状态,继续等待系统调度
    • 当某些事件发生时,譬如在争夺某个系统资源时,需要等待其他任务完成,或者自己主动挂起。会进入阻塞状态、或者称之为挂起状态。
    • 当所要等待的事件发生,或被主动唤醒时,进入就绪状态,等待操作系统调度
    • 当线程所有操作结束时,线程终止并销毁。

    某些情况下同步意味着阻塞

    在通常情况下,同步往往伴随着线程阻塞。如果多个线程之间是同步的,当一个线程执行时,其他线程必须等待。而等待有好几种方式,通常是线程挂起,也就是阻塞。

    GCD在同步派发时,当前线程会发生阻塞,等待目标线程的目标任务执行完毕才唤醒。除了自旋锁之外,所有用以实现互斥效用的锁,在实现同步操作时,都会阻塞。

    dispatch_queue_t queueA = dispatch_queue_create("A", DISPATCH_QUEUE_SERIAL);
    dispatch_sync(queueA, ^{
        NSString *message = [self getMessage];
        NSLog(@"%@", message);
    });
    复制代码

    同步非阻塞情形

    在进行线程同步时,如果处于等待状态的线程没有发生阻塞,或则说没有挂起,继续暂用着CPU的时间片,即同步非阻塞情形。这种情形一般是异部调用,同步轮询。轮询包括空转轮询、定时循序

    • 线程在等待时不挂起,而是空转。用自旋锁实现同步是很好的例子。也可以自己启循环,譬如下述代码示例:
    dispatch_queue_t q1 = dispatch_queue_create("1", DISPATCH_QUEUE_SERIAL);
        
        __block int result = 0;
        dispatch_async(q1, ^{
            
            sleep(2);
            
            result = 56;
        });
        
        while (!result) {
            // do something
        }
        
        NSLog(@"result = %d",result);
        // do something
    
    复制代码
    • 线程不挂起,而是定时监测共享资源的状态。
    dispatch_queue_t q1 = dispatch_queue_create("1", DISPATCH_QUEUE_SERIAL);
        
    __block int result = 0;
    dispatch_async(q1, ^{
        
        sleep(2);
        
        result = 56;
    });
        
    NSTimer *timer = [NSTimer timerWithTimeInterval:0.1 repeats:YES block:^(NSTimer * _Nonnull timer) {
        if (result) {
            // do something
            NSLog(@"result = %d",result);
            [timer invalidate];
        }
    }];
    [[NSRunLoop mainRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
    复制代码

    阻塞非同步情形

    单纯将线程挂起,而不进行任何线程之间的同步操作,即是此种情形。

    转载于:https://juejin.im/post/5a854ced5188257a5b0468a7

    展开全文
  • c 语言 同步与阻塞的区别

    千次阅读 2019-05-30 10:10:22
    异步概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果,但也不会等待结果,函数会立即返回。实际处理这个调用结果是在完成后,通过事件(event)状态、通知和回调来通知调用者获取数据。 3,阻.....

     1,同步:

        所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事。

        2,异步:

        异步的概念和同步相对。当一个异步过程调用发出后,调用者不能立刻得到结果,但也不会等待结果,函数会立即返回。实际处理这个调用结果是在完成后,通过事件(event)状态、通知和回调来通知调用者获取数据。

        3,阻塞:

        阻塞调用是指在同步调用结果返回之前,当前线程会被挂起(线程进入非可执行状态,在这个状态下,cpu不会给线程分配时间片,即线程暂停运行)。函数只有在得到结果之后才会返回。

        有人也许会把阻塞调用和同步调用等同起来,实际上是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。 例如,我们在socket中调用recv函数,如果缓冲区中没有数据,这个函数就会一直等待,直到有数据才返回。而此时,当前线程还会继续处理各种各样的消息。所以,同步调用中的函数,既可以是阻塞的,也可以是非阻塞的。但阻塞的调用方法,一定是同步的。

        4,非阻塞:

    非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前,该函数不会阻塞当前线程,一直处于激活状态,也不会让出CPU。

    展开全文
  • 同步与阻塞,异步与非阻塞的区别 同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。 阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。 ...

    同步与阻塞,异步与非阻塞的区别

    同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。
    
    阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。
    
    阻塞是使用同步机制的结果,非阻塞则是使用异步机制的结果。
    
    

    处理大并发之一 对异步非阻塞的理解

        在研究nginx和node.js的时候常会遇到异步、非阻塞等,之前自己也经常使用epoll,对其同步与阻塞,异步与非阻塞有了一定的认识,现对参考资料总结下。

        首先讨论下使用事件驱动,异步编程的优点:

        充分利用了系统资源,执行代码无须阻塞等待某种操作完成,有限的资源可以用于其他的任务。其非常适合于后端的网络服务编程。

        在服务器开发中,并发的请求处理是个大问题,阻塞式的函数会导致资源浪费和时间延迟。通过事件注册、异步函数,开发人员可以提高资源的利用率,性能也会改善。其nginx和node.js处理并发都是采用的事件驱动异步非阻塞模式。其中nginx中处理并发用的是epoll,poll,queue等方式,node.js使用的是libev,它们对大规模的HTTP请求处理的都很好。

    阻塞

        《node.js开发指南》是这样定义的:线程在执行中如果遇到(I/O 操作)如磁盘读写或网络通信,通常要耗费较长的时间,这时操作系统会剥夺这个线程的 CPU 控制权,使其暂停执行,同时将资源让给其他的工作线程,这种线程调度方式称为 阻塞。当 I/O 操作完毕时,操作系统将这个线程的阻塞状态解除,恢复其对CPU的控制权,令其继续执行。这种 I/O 模式就是通常的同步式 I/O(Synchronous I/O)或阻塞式 I/O(Blocking I/O)。

    非阻塞

        非阻塞是这样定义的,当线程遇到 I/O 操作时,不会以阻塞的方式等待 I/O 操作的完成或数据的返回,而只是将 I/O 请求发送给操作系统,继续执行下一条语句。当操作系统完成 I/O 操作时,以事件的形式通知执行 I/O 操作的线程,线程会在特定时候处理这个事件。

    对比阻塞与非阻塞

        阻塞模式下,一个线程只能处理一项任务,要想提高吞吐量必须通过多线程。

        非阻塞模式下,一个线程永远在执行计算操作,这个线程所使用的 CPU 核心利用率永远是 100%,I/O 以事件的方式通知。

        在阻塞模式下,多线程往往能提高系统吞吐量,因为一个线程阻塞时还有其他线程在工作,多线程可以让 CPU 资源不被阻塞中的线程浪费。

        而在非阻塞模式下,线程不会被 I/O 阻塞,永远在利用 CPU。多线程带来的好处仅仅是在多核 CPU 的情况下利用更多的核。

     

        来看看《深入浅出Node.js》对异步I/O的解释,在操作系统中,程序运行的空间分为内核空间和用户空间。我们常常提起的异步I/O,其实质是用户空间中的程序不用依赖内核空间中的I/O操作实际完成,即可进行后续任务。

        I/O的阻塞与非阻塞的解释

        阻塞模式的I/O会造成应用程序等待,直到I/O完成。同时操作系统也支持将I/O操作设置为非阻塞模式,这时应用程序的调用将可能在没有拿到真正数据时就立即返回了,为此应用程序需要多次调用才能确认I/O操作完全完成。

     

        I/O的同步与异步I/O的同步与异步出现在应用程序中。如果做阻塞I/O调用,应用程序等待调用的完成的过程就是一种同步状况。相反,I/O为非阻塞模式时,应用程序则是异步的。

     

        参照《node.js入门经典》中对同步的解释,同步的代码意味着每一次执行一个操作,在一个操作完成之前,代码的执行会被阻塞,无法移到下一个操作上。也就是说代码的执行会在函数返回前停止。直到函数返回后,代码才会继续执行。

    相反,异步就意味着函数的执行无需等待某个操作的结果就可以继续执行,其操作的结果会在事件发生时由回调来处理。

     

    异步I/O优缺点

        使用同步IO,它的优点是可以使程序调试方便,但是它的缺点也是明显的,程序的执行过程中如果入到一些耗时的IO操作,程序的执行都要等待该IO的完成,在这个等待的过程中,程序无法充分利用CPU,导致了CPU的闲置,为了充分利用CPU,和IO并行操作,常用的方法有2中:

        (1)多线程单进程

        多线程的设计之处就是为了在共享的程序空间中,实现并行处理任务,从而达到充分利用CPU的效果。

        多线程缺点:

        其一、执行时(线程切换)上下文交换的开销较大,一个线程大约需要2M的内存空间,占用资源较大。

        其二、状态同步(锁)的问题,它也使得程序的编写和调用复杂化。

        (2)单线程多进程

        为了避免多线程造成的使用不便问题,有的语言选择了单线程保持调用简单化,采用启动多进程的方式来达到充分利用CPU和提升总体的并行处理能力。它的缺点在于业务逻辑复杂时(涉及多个I/O调用),因为业务逻辑不能分布到多个进程之间,事务处理时长要远远大于多线程模式。

    异步I/O与轮询技术

        当进行非阻塞I/O调用时,要读到完整的数据,应用程序需要进行多次轮询,才能确保读取数据完成,以进行下一步的操作。轮询技术的缺点在于应用程序要主动调用,会造成占用较多CPU时间片,性能较为低下。现存的轮询技术有以下这些: read、select、poll、epoll、pselect、kqueue 

     

        read是性能最低的一种,它通过重复调用来检查I/O的状态来完成完整数据读取。

        select是一种改进方案,通过对文件描述符上的事件状态来进行判断。

        操作系统还提供了poll、epoll等多路复用技术来提高性能。

        轮询技术满足了异步I/O确保获取完整数据的保证。但是对于应用程序而言,它仍然只能算时一种同步,因为应用程序仍然需要主动去判断I/O的状态,依旧花费了很多CPU时间来等待。上一种方法重复调用read进行轮询直到最终成功,用户程序会占用较多CPU,性能较为低下。而实际上操作系统提供了select方法来代替这种重复read轮询进行状态判断。select内部通过检查文件描述符上的事件状态来进行判断数据是否完全读取。但是对于应用程序而言它仍然只能算是一种同步,因为应用程序仍然需要主动去判断I/O的状态,依旧花费了很多CPU时间等待,select也是一种轮询。

    理想的异步I/O模型

        理想的异步I/O应该是应用程序发起异步调用,而不需要进行轮询,进而处理下一个任务,只需在I/O完成后通过信号或是回调将数据传递给应用程序即可。

    展开全文
  • 同步与阻塞,异步与非阻塞的区别 同步与异步是对应的,它们是线程之间的关系,两个线程之间要么是同步的,要么是异步的。 阻塞与非阻塞是对同一个线程来说的,在某个时刻,线程要么处于阻塞,要么处于非阻塞。 ...
  • 简单说,、 同步与异步是指线程之间关系,两条线程之间要么同步要么异步;’ 阻塞与非阻塞是指线程状态;一条线程要么处于阻塞状态中要么处于非阻塞状态中;
  • 问题源于知乎 怎样理解阻塞阻塞与同步异步的区别? 以下乃个人见解,如有不对之处,欢迎指出讨论。 概念 同步异步是形容结果的通知形式。通知形式!主动/被动。 阻塞和非阻塞是形容客户端在接受到结果之前的自身...
  • 同步和异步的区别同步与阻塞的关系 同步  同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不返回。  要想实现同步操作,必须要获得线程的对象锁。获得它可以保证在同一时刻只有一个线能够进入...
  • 线程是否挂起是阻塞和非阻塞的区别,主动被动的通知方式才是异步与同步的区别 在处理 IO 的时候,阻塞和非阻塞都是同步 IO。 只有使用了特殊的 API 才是异步IO 参考:...
  • 本文主要讲了IO中同步、异步与阻塞、非阻塞的区别。希望对你的学习有所帮助。
  • 开场白: 异步就是异步 网上有许多I/O模型的相关文章,主要涉及四个概念,同步,异步,阻塞,非阻塞。有些文章将这四个作了两两组合,于是就有了:异步阻塞和异步非阻塞,可以明确的... 同步与异步的区别: 同步...
  • 理解同步异步与阻塞阻塞的区别

    千次阅读 2019-01-09 10:44:46
    同步异步与阻塞阻塞的概念对于很多初学者来说是一个模糊的概念,其实我们的生活中存在着很多同步和异步的例子。 同步和异步关注的是消息通信机制 在计算机领域,同步就是指一个进程在执行某个请求的时候,若该...
  • 同步就是烧开水,要自己来看开没开;异步就是水开了,然后水壶响了通知你水开了。...同步与异步说是你获得水开了方式不同。阻塞与非阻塞是你得到结果之前能不能干其他事情。两组概念描述是不同内容。 ...
  • 理解阻塞和非阻塞同步异步,有一个核心点要搞清楚就是用户发起内核调用时候,内核处理分两个阶段:一是准备数据,二是把数据拷贝到用户态内存。 可以近似把内核处理IO操作和用户态线程执行看成是并行(近似...
  • 阻塞、非阻塞是描述在同一个进程执下行一个函数调用,异步和同步是描述两个功能模块关系阻塞当我们是执行某个系统调用时,当我们是执行某个系统调用时,进程被挂起。 非阻塞当我们是执行某个系统调用时,...
  • 阻塞/非阻塞IO:关注调用者在等待结果返回之前所处状态 阻塞IO: 指IO操作需要彻底完成后才返回用户空间,调用结果返回之前,调用者被挂起。 非阻塞IO: 指IO操作被调用后立即返回给用户一个状态值,无需等待IO...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,960
精华内容 784
关键字:

同步与阻塞的区别