zoukankan      html  css  js  c++  java
  • 网络编程几个概念解析

    一、串行与并行

      串行与并行一般说的是程序的执行方式。

      串行是什么呢,它是同步线程的实现方式,就是任务A执行结束才能开始执行B,单个线程只能执行一个任务,就如单行道只能行驶一辆车。

        

    二、同步与异步

      同步与异步一般说的任务的调用方式。

      同步调用:提交完任务后,在原地等待任务执行完毕,拿到返回值,再执行下一行代码,只存在一个线程。

      异步调用:多个任务情况下,一个任务A正在执行,同时可以执行另一个任务B。任务B不用等待任务A结束才执行。存在多条线程。一般情况下,异步调用与回调机制一起使用。

      

    三、并发与并行

        

      并发和并行其实是异步线程实现的两种形式。并行其实是真正的异步,多核CUP可以同时开启多条线程供多个任务同时执行,互补干扰,如上图的并行,其实和异步图例一样。但是并发就不一样了,是一个伪异步。在单核CUP中只能有一条线程,但是又想执行多个任务。这个时候,只能在一条线程上不停的切换任务,比如任务A执行了20%,任务A停下里,线程让给任务B,任务执行了30%停下,再让任务A执行。这样我们用的时候,由于CUP处理速度快,你看起来好像是同时执行,其实不是的,同一时间只会执行单个任务。

      并发编程包指在同一时间执行多个任务。又包含并行,和并发。并发不一定并行,但并行一定并发 。

      并发:是伪并行,即看起来是同时运行,在程序执行过程中,不停的在进行切换。单个cpu+多道技术就可以实现并发,(并行也属于并发)

      并行:同时运行,只有具备多个cpu才能实现并行。

          

      多道技术概念回顾:内存中同时存入多道(多个)程序,cpu从一个进程快速切换到另外一个,使每个进程各自运行几十或几百毫秒,这样,虽然在某一个瞬间,一个cpu只能执行一个任务,但在1秒内,cpu却可以运行多个进程,这就给人产生了并行的错觉,即伪并发,以此来区分多处理器操作系统的真正硬件并行(多个cpu共享同一个物理内存)

    三、阻塞与非阻塞

      阻塞与非阻塞一般说的是程序状态!

      程序处于阻塞状态意思是说:当前进程被操作系统剥夺了CPU的执行权限。

      同步调用与阻塞区别:

      阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。

    # 例子1:
    # 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回#结果为止,但并未阻塞住(即便是被抢走cpu的执行权限,那也是处于就绪态);
    
    #阻塞调用:当socket工作在阻塞模式的时候,如果没有数据的情况下调用#recv函数,则当前线程就会被挂起,直到有数据为止。

     总结:

    #1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。
      而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
    #2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程

    四、其他

      程序的执行:
        串行执行:串行不意味着效率低,程序如果是纯计算的话,串行执行并没有效率问题
      串行的问题:IO密集型程序串行运行,效率极低

      并发执行(并行执行):开启多进程或多线程并发执行,彼此互不干扰
      ps:python的多线程在IO密集型程序中是有用的(GIL)

      并发的问题:不能无限制地开启多线程或多进程

      解决:进程池或线程池
      思路:将进程或线程控制在一定数量内(计算机可承受的范围)
      进程池或线程池的问题:池的大小需要跟着任务规模的增大而调高,如果任务数过多,池返回会降低效率


      最终:如何解决IO问题成了关键


      任务的调用方式:
      同步调用:提交完任务后,在原地等待任务执行完毕,拿到返回值,再执行下一行代码
      异步调用+回调机制:
        提交完任务(捆绑一个回调函数)后,不等待任务的执行,直接执行下一行代码
      然后等到进程有结果直接出发回调函数的执行

      区别阻塞的概念:
        阻塞指的是进程的一种状态:在进程遇到IO时,会被操作系统剥夺走CPU的执行权限


      最终:需要寻找一种解决方案,需要同时具备以下几点
      1、检测单线程下的IO
      2、遇到IO自动切换(切之前保存状态)

  • 相关阅读:
    cf C. Vasya and Robot
    zoj 3805 Machine
    cf B. Vasya and Public Transport
    cf D. Queue
    cf C. Find Maximum
    cf B. Two Heaps
    cf C. Jeff and Rounding
    cf B. Jeff and Periods
    cf A. Jeff and Digits
    I Think I Need a Houseboat
  • 原文地址:https://www.cnblogs.com/vipchenwei/p/7810062.html
Copyright © 2011-2022 走看看