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. 阻塞与非阻塞针对的是进程或线程:阻塞是当请求不能满足的时候就将进程挂起,而非阻塞则不会阻塞当前进程
    同步,异步 ,阻塞,非阻塞

     

  • 相关阅读:
    打印图片的属性和实现另存图片功能以及使用numpy
    opencv3.3 安装环境教程以及实现个图片读取功能
    在linux 创建网络会话和绑定两块网卡
    安装yum仓库
    C#添加错误日志信息
    关于使用宏将csv批量转换成xls的分享
    C#关于MySQL中文乱码问题
    无法启动iis express web服务器解决
    关于关闭WPS锁屏屏保及设置电脑自动关闭显示屏及休眠的分享
    为什么QQ能上却打不开网页呢?
  • 原文地址:https://www.cnblogs.com/xiaokang01/p/9096062.html
Copyright © 2011-2022 走看看