zoukankan      html  css  js  c++  java
  • 理不清的进程与线程

    我们的CPU是分时运行的。可以同时运行多个程序,但是同一时间只能运行一个,但是切换的很快,就会给人的感觉是同时运行多个程序。一个CPU可以运行3个程序,那多核的CPU就可以运行更多的程序。

    进程也可以给优先级,多分配一些CPU。

    当这个程序执行完了,或者分配给他的CPU执行时间用完了,那它就要被切换出去,等待下一次CPU的临幸。在被切换出去的最后一步工作就是保存程序上下文,因为这个是下次他被CPU临幸的运行环境,必须保存。

    先加载程序A的上下文,然后开始执行A,保存程序A的上下文,调入下一个要执行的程序B的程序上下文,然后开始执行B,保存程序B的上下文。

    进程和线程就是这样的背景出来的,两个名词不过是对应的CPU时间段的描述,名词就是这样的功能。

    进程就是包换上下文切换的程序执行时间总和 = CPU加载上下文+CPU执行+CPU保存上下文

    如果我们把进程比喻为一个运行在电脑上的软件,那么一个软件的执行不可能是一条逻辑执行的,必定有多个分支和多个程序段,就好比要实现程序A,实际分成 a,b,c等多个块组合而成。

    这里a,b,c的执行是共享了A的上下文,CPU在执行的时候没有进行上下文切换的。这里的a,b,c就是线程,也就是说线程是共享了进程的上下文环境,是更细小的CPU时间段。

    计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

    一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

    进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

    一个车间里,可以有很多工人。他们协同完成一个任务。

    线程就好比车间里的工人。一个进程可以包括多个线程。

    每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

    一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁",防止多个线程同时读写某一块内存区域。

    一个软件可以开启多个进程,共同工作。

    附上多线程编程的概念。

    这儿先讲一个场景。这个场景是这样子的,山上有座庙(进程),庙里住了很多小和尚和老和尚(线程),当然隔壁山上也有很多尼姑妹子。小和尚和老和尚们每天都需要下山挑水喝。这些个和尚有刚上山的(就是有点傻的),有比较聪明的,也有闹过矛盾的。场景,人物呢,大概就是这么个样子。俗话说的好,有人的地方就有江湖。这些个小和尚,老和尚都不是很安分,为了每天的这个挑水工作闹了很多很多的矛盾,也犯过很多傻。下面对挑水工作所有发生的情况做个详述:

    1)刚上山的小和尚挑水,就是比较傻的那个,和别人都不认识,每天挑水都自己一个人,一次挑一桶水,一天下来发现挑的水根本不够喝。(串行)

    2)和尚里面有个力气大的,和别人关系不好,每次挑水能挑三桶左右,一天下来,发现挑的水勉强够喝。 (并发)

    3)和尚里面有几个关系好的,力气也比较大,每次挑水都一起去,每个人都能挑两桶左右,一天下来,发现挑的水不仅够喝,还有时间帮隔壁山尼姑妹子挑水。 (并行)

    4)在水井里打水,有个专门的妹子负责打水,比较傻的那个小和尚每次都盯着打水的妹子,还随时随地看水桶装满没有(同步);当然,有傻的,也有聪明的,这个聪明的和尚在妹子打水的时候,就乘机在一旁休息,水打满以后,妹子都过来告诉他。(异步)

    5)水井里有一天没水了,傻和尚看见水井里没水以后,在水井边上一直等着,等有水了再挑回去(阻塞);聪明和尚呢,看见水井里没水了,一点都不犹豫的回去了。(非阻塞)

    6)又有一天,那闹过矛盾的两个和尚挑水,正好狭路相逢,谁也不让谁过去,一直僵持着。(死锁)

    7)寺庙里厨房空间有限,每次只能进去一定数量的和尚,当厨房满了以后,其他人只能在外面等着,直到里面的人出来。这个实现的方法是,厨房门口挂了很多锁,每个人进去以后都拿走一把锁,出来以后把锁挂上,这样外面的人就可以知道厨房里面人满没满。(信号量)

    下面解释下多线程。还是上面的例子,在这个寺庙里面,如果每天都由那个新来的傻子和尚挑水喝,肯定是不行的,有的喝没得喝咱且不说,你让他累死了咋整。何况寺庙里那么些个空着的水桶那么些个不干活的人闲着也是闲着。所以多线程的意思就是多个线程一起去协同完成一个任务,通过充分去共享资源来达到提升效率的一种编程思想。当然,在这个过程中会遇到很多麻烦,比如会碰上死锁的问题,同时去争抢同一个资源的问题等等。为了解决这个问题,使用加锁这个方法避免,当然,使用锁,会在一定的程度上印象执行的效率,我们需要在效率和安全之间寻找一个平衡点。

  • 相关阅读:
    不用加减乘除做加法
    数组中只出现一次的数字
    平衡二叉树
    二叉树的深度
    两个链表的第一个公共结点
    连续子数组的最大和
    最小的K个数
    数组中出现次数超过一半的数字
    二叉搜索树与双向链表
    复杂链表的复制
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/8267098.html
Copyright © 2011-2022 走看看