目录
3.同一个进程的多个线程之间共用同一份内存/文件资源,进程与进程之间,则是独立的内存/文件资源
谈到操作系统,进程线程的概念和区别,就是出场频率最高的面试问题(没有之一)!
首先来看看面试官会如何引出这样一个问题~
例如写一个服务器程序,针对每个客户端就可以分别创建一个进程去服务,但是想象一下,如果这里有多个客户端,每个客户端一来都要创建一个进程来服务,客户端一走,就要销毁这个进程,这样一来二去,进程的创建销毁过于频繁,实际上效率是比较低的;来看看进程的创建与销毁有哪些步骤:
创建进程的步骤:1.创建PCB、2.给进程分配资源(内存/文件),赋值到PCB中、3.把PCB插入链表;
销毁进程的步骤:1.把PCB从链表中删除、2.把PCB持有资源释放、3.销毁PCB;
因此聪明的程序员就发明了“线程”;线程也称为“轻量级进程”,因为创建和删除的线程的开销都比进程少~
打个比方,如果把进程比作工厂,线程就是工厂中的流水线;
你的工厂做的很好,需要材料的人越来越多,因此你需要加快效率,来看看有两种办法:
方法一,再创建一个工厂(再创建一个进程)
方法二,再创建一个流水线(再创建一个线程)
你会怎么选择呢?当然是创建一个流水线了~
打个比方,现在有个需求,你在这个餐厅里需要把100只鸡吃了
当然你一个人肯定是吃不完,因此还需要叫上很多人一起(多线程)
这个时候你们这些人(多线程)就是在同一个房间里吃鸡(同一个进程的多个线程共用一块空间);
但同时这么做,会有一定的问题,当一个桌子周围围满了人,多出来的人就吃不上了,而且吃不上不说,房间越来越拥挤,还影响中间吃饭的人;
因此类比一下,线程也并不是越多越好,也会又吃满的时候,并且一旦过多,反而会影响效率(CPU的核心数是有限的,线程数量达到一定程度便会吃满,并且会因为线程太多,所以线程调度开销太大,影响效率);
如下图:
继续上图,多个人一起,也会不安全,如果又两个人看上了同一个鸡腿,都去伸手去拿,于是两个人就抢起来了;也就是说,多线程有可能会引发线程安全,例如两个线程同时修改同一个变量,也容易产生线程不安全问题;
大家都在吃,突然有一个滑稽边吃边抠脚,另一个滑稽就不高兴了,直接掀桌,因此,其他人也就吃不成了;如果某个线程发生意外,执行过程出现异常,并且这个异常没有处理好的话,整个进程都会随之崩溃,这时,其他线程自然就无法运行了;
那么有人就想,让每个人都分开吃吧~(多进程)如下图
此时,自然有他的优势,优势就是两个滑稽之间互不干扰了,但劣势也很明显,就是效率太低,开销太大
如果了解了以上三点,这点理解十分简单了