忍不住来一篇进程与线程(学习阮一峰老师得正解)

 进程与线程等抽象概念类比:

  *  计算器系统对计算资源的分配(CPU)和对内存的分配是分开进行的。

  * CPU:计算机的核心,他承担了所有的计算任务。假设其为 一座工厂(因为现代的操作系统大都可以执行多任务。即多核CPU),时刻在生产。

 1. 单核CPU: 一台单核处理器计算机=-个车间;

 2. 多核CPU: 一台多核处理器计算机=一座工厂;

  *  1个cpu里面有几核? 一般cpu 4核8g, 8核16g.

      * cpu单核和多核的区别为:单元组数不同、运行线程数不同、执行速度不同。

        一、单元组数不同

          1、cpu单核:cpu单核只有1个独立的CPU核心单元组。

          2、cpu多核:cpu多核包括2个相对独立的CPU核心单元组。

        二、运行线程数不同

          1、cpu单核:cpu单核能同时运行的线程数较多核更少,不利于同时运行多个程序。死机卡顿。

          2、cpu多核:cpu多核能同时运行的线程数较单核更多,有利于同时运行多个程序。

  3. 进程: 一个车间  =  一个进程; (即-程序的一次执行)

  4. 多进程: 一座工厂可以同时运行多个车间; 

  5. CPU和进程: 单核CPU只能同时运行单个进程,多核CPU可以同时运行多个进程。

  6. 线程: 车间内一个工人  =  一个线程; 

  7. 进程与线程:  一个进程可以包括多个线程。

  8. 线程间内存共享: 车间的空间是工人们共享的。

进程(车间)的内存空间是天然独立的,但是线程(工人)的内存空间是天然共享的,一个进程有多个线程。看图


  ps:  图为https://baijiahao.baidu.com/s?id=1611925141861592999&wfr=spider&for=pc  而且该文有提到: 线程没有地址空间,线程包含在进程的地址空间中。进程拥有的所有资源都属于线程,所有的线程共享进程的内存和资源。同一进程中的多个线程共享代码段(代码和常量),数据段(全局变量和静态变量),扩展段(堆存储)。但是每个线程拥有自己的栈段, 寄存器的内容,栈段又叫运行时段,用来存放所有局部变量和临时变量。

  所以我是这样理解的,对上面提及的 【进程的内存空间是天然独立的】 是针对多进程的时候,不同进程与进程之间是相对独立,无法访问的,即A车间与B车间之间是相互独立的。这样的话A车间的所有内存和资源,A车间的工人都可以共享。也就是下面这些:

    - 进程的内存空间是共享的,每个线程都可以使用这些共享内存。

    - 内存安全: 由于该车间的每个房间容纳大小不同,有的最多只能容纳一个人(一个线程)。空间人满的时候,其他人就进不去了。

    - 个线程使用某些共享内存时,其他线程必须等它结束,才能使用这-块内存,这种线程间同步是为了防止竞争(就是说因同时修改,而导致的数据不一致)。

    - 互斥锁: 防止两个线程同时读写某块内存区域(假如两个线程同时做修改,会导致数据不一致),所以可以理解为我在使用某个独间,你想要使用你必须等我用完,所以让你知道我在用的最好的办法就是你进不来,也就是上锁,如果我使用完了我就会解锁,然后你就可以用了。

    - 信号量: 这时的解决方法,就是在门口挂n把钥匙牌。进去的人就取-把钥匙牌,出来时再把钥匙牌挂回原处。后到的人发现钥匙牌架空了,就知 道必须在门口排队等着了。

    这种做法叫做"信号量”(Semaphore) ,用来告诉你你可以使用还是需要等待,以保证多个线程不会互相冲突。

    - 锁和信号量:不难看出,互斥锁是信号量的一种特殊情况(n=1时) 。也就是说,完全可以用后者替代前者。但是,因为 mutex(互斥锁) 较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

  ryf总结: 不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者(n)。但是,因为mutex较为简单,且效率高,所以在必须保证【资源独占】的情况下,还是采用这种设计。

你可能感兴趣的:(忍不住来一篇进程与线程(学习阮一峰老师得正解))