zoukankan      html  css  js  c++  java
  • 进程与线程

    什么是多道处理机制

    加入abc三个依次执行,但是a阻塞了,就直接不执行a,直接跳过去执行b,c,最后在执行a

    多道程序设计提高了cpu的利用率

    进程与线程

    进程:本质上就是一个一段程序的运行过程(抽象的概念)

    线程:最小的执行单元(实例)

    进程:最小的资源单位(操作系统在分资源时,只能分到进程这里)

    进程就相当于一个容器,里面可以容纳多个线程

     进程只是把资源集中到一起,(进程只是一个资源单位,或者说一个资源集合),而线程才是cpu上的执行单位

     

    什么进程

    假如有两个程序A和B,程序A在执行到一半的过程中,需要读取大量的数据输入(I/O操作),
        而此时CPU只能静静地等待任务A读取完数据才能继续执行,这样就白白浪费了CPU资源。
        是不是在程序A读取数据的过程中,让程序B去执行,当程序A读取完数据之后,让
        程序B暂停,然后让程序A继续执行?
        当然没问题,但这里有一个关键词:切换
        既然是切换,那么这就涉及到了状态的保存,状态的恢复,加上程序A与程序B所需要的系统资
        源(内存,硬盘,键盘等等)是不一样的。自然而然的就需要有一个东西去记录程序A和程序B
        分别需要什么资源,怎样去识别程序A和程序B等等,所以就有了一个叫进程的抽象
    通俗的说就是

    想象一位有一手好厨艺的计算机科学家egon正在为他的女儿元昊烘制生日蛋糕。

    他有做生日蛋糕的食谱,

    厨房里有所需的原料:面粉、鸡蛋、韭菜,蒜泥等。

    在这个比喻中:

        做蛋糕的食谱就是程序(即用适当形式描述的算法)

        计算机科学家就是处理器(cpu)

        而做蛋糕的各种原料就是输入数据

       进程就是厨师阅读食谱、取来各种原料以及烘制蛋糕等一系列动作的总和

    什么是线程

    线程的出现是为了降低上下文切换的消耗,提高系统的并发性,并突破一个进程只能干一样事的缺陷,
    使到进程内并发成为可能。
    
    假设,一个文本程序,需要接受键盘输入,将内容显示在屏幕上,还需要保存信息到硬盘中。若只有
    一个进程,势必造成同一时间只能干一样事的尴尬(当保存时,就不能通过键盘输入内容)。若有多
    个进程,每个进程负责一个任务,进程A负责接收键盘输入的任务,进程B负责将内容显示在屏幕上的
    任务,进程C负责保存内容到硬盘中的任务。这里进程A,B,C间的协作涉及到了进程通信问题,而且
    有共同都需要拥有的东西-------文本内容,不停的切换造成性能上的损失。若有一种机制,可以使
    任务A,B,C共享资源,这样上下文切换所需要保存和恢复的内容就少了,同时又可以减少通信所带
    来的性能损耗,那就好了。是的,这种机制就是线程。

    为什么要有多线程

     

    多线程指的是,在一个进程中开启多个线程,简单的讲:如果多个任务共用一块地址空间,那么必须在一个进程内开启多个线程。详细的讲分为4点:

      1. 多线程共享一个进程的地址空间

          2. 线程比进程更轻量级,线程比进程更容易创建可撤销,在许多操作系统中,创建一个线程比创建一个进程要快10-100倍,在有大量线程需要动态和快速修改时,这一特性很有用

          3. 若多个线程都是cpu密集型的,那么并不能获得性能上的增强,但是如果存在大量的计算和大量的I/O处理,拥有多个线程允许这些活动彼此重叠运行,从而会加快程序执行的速度。

          4. 在多cpu系统中,为了最大限度的利用多核,可以开启多个线程,比开进程开销要小的多。(这一条并不适用于python)

    并发,并行

    并发:在同一时间间隔内执行(指系统具有处理多个任务的能力,cpu切换)

    并行:在同一时刻执行        (同时处理多个任务,)

    关系:

    并行是并发的一个子集

     

    2.并发和并行的区别:

         所有的并发处理都有排队等候,唤醒和执行这三个步骤,所以并发是宏观的观念,在微观上他们都是序列被处理的,只不过资源不会在某一个上被阻塞(一般是通过时间片轮转),所以在宏观上多个几乎同时到达的请求同时在被处理。如果是同一时刻到达的请求也会根据优先级的不同,先后进入队列排队等候执行。

         并发与并行是两个既相似但是却不相同的概念:

             并发性:又称共行性,是指处理多个同时性活动的能力,。

             并行:指同时发生两个并发事件,具有并发的含义。并发不一定并行,也可以说并发事件之间不一定要同一时刻发生。 

         并发的实质是一个物理CPU(也可以是多个物理CPU)在若干个程序之间多路复用,并发性是对有限物理资源强制行使 多用户共享以提高效率。

         并行指两个或两个以上事件或活动在同一时刻发生,在多道程序环境下,并行使多个程序同一时刻可在不同CPU上同时执行。    

         并发是在同一个cpu上同时(不是真正的同时,而是看来是同时,因为CPU要在多个程序之间切换)运行多个程序。

         并行是每一个CPU运行一个程序。

         打个比方:并发就像一个人(CPU)喂两个小孩(程序)吃饭,表面上是两个小孩在吃饭,实际是一个人在喂。

                       并行就是两个人喂两个小孩子吃饭。 

     

     

    3.并发、并行和多线程的关系:

         并行需要两个或两个以上的线程跑在不同的处理器上,并发可以跑在一个处理器上通过时间片进行切换。

    同步,异步,阻塞,非阻塞

    同步与异步

    同步: 当一个进程执行到I/O(等待外部数据)的时候,你等待:------同步

    异步:                     不等待:一直等到数据接收成功,再回来处理----异步

    同步
    所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回。按照这个定义,其实绝大多数函数都是同步调用。但是一般而言,我们在说同步、异步的时候,特指那些需要其他部件协作或者需要一定时间完成的任务。
    异步
    #异步的概念和同步相对。当一个异步功能调用发出后,调用者不能立刻得到结果。当该异步功能完成后,通过状态、通知或回调来通知调用者。如果异步功能用状态来通知,那么调用者就需要每隔一定时间检查一次,效率就很低(有些初学多线程编程的人,总喜欢用一个循环去检查某个变量的值,这其实是一 种很严重的错误)。如果是使用通知的方式,效率则很高,因为异步功能几乎不需要做额外的操作。至于回调函数,其实和通知没太多区
    
    阻塞
    阻塞调用是指调用结果返回之前,当前线程会被挂起(如遇到io操作)。函数只有在得到结果之后才会将阻塞的线程激活。有人也许会把阻塞调用和同步调用等同起来,实际上他是不同的。对于同步调用来说,很多时候当前线程还是激活的,只是从逻辑上当前函数没有返回而已。
    #举例:
    #1. 同步调用:apply一个累计1亿次的任务,该调用会一直等待,直到任务返回结果为止,但并未阻塞住(即便是被抢走cpu的执行权限,那也是处于就绪态);
    #2. 阻塞调用:当socket工作在阻塞模式的时候,如果没有数据的情况下调用recv函数,则当前线程就会被挂起,直到有数据为止。
    
    非阻塞
    #非阻塞和阻塞的概念相对应,指在不能立刻得到结果之前也会立刻返回,同时该函数不会阻塞当前线程。
    总结
    
    #1. 同步与异步针对的是函数/任务的调用方式:同步就是当一个进程发起一个函数(任务)调用的时候,一直等到函数(任务)完成,而进程继续处于激活状态。而异步情况下是当一个进程发起一个函数(任务)调用的时候,不会等函数返回,而是继续往下执行当,函数返回的时候通过状态、通知、事件等方式通知进程任务完成。
    
    #2. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程
    同步,异步 ,阻塞,非阻塞

     

  • 相关阅读:
    UVA 1386 Cellular Automaton
    ZOJ 3331 Process the Tasks
    CodeForces 650B Image Preview
    CodeForces 650A Watchmen
    CodeForces 651B Beautiful Paintings
    CodeForces 651A Joysticks
    HUST 1601 Shepherd
    HUST 1602 Substring
    HUST 1600 Lucky Numbers
    POJ 3991 Seinfeld
  • 原文地址:https://www.cnblogs.com/xiaokang01/p/9096062.html
Copyright © 2011-2022 走看看