进程与线程等抽象概念类比:
* 计算器系统对计算资源的分配(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较为简单,且效率高,所以在必须保证【资源独占】的情况下,还是采用这种设计。
网友评论