目录
1.进程的概念
1.1:进程控制块抽象(PCB)
1.2:进程调度的相关属性
1.2.1:进程的状态
1.2.2:优先级
1.2.3:上下文
1.2.4:记账信息
2:进程的虚拟地址空间
3.线程
3.1进程和线程对资源的区别
3.2:如何描述线程
3.3:线程问题
3.3.1:线程数量过多
3.3.2:线程不安全
3.3.3:线程不安全的延申
4.进程和线程的联系
5.进程和线程之间的区别(面试题)
1.进程的概念
进程就是操作系统时一个正在运行的程序的一种抽象。可以把进程看作程序的依次运行过程,进程是操作系统进行资源分配的最小单位。
知道进程的基本概念,就要进一步了解怎么描述一个进程,就像你知道一个美女,但你要知道怎么描述一个美女给你朋友。
进程是通过进程控制块来进行描述进程。
是通过双向链表把多个PCB给串到一起来进行组织的。
1.1:进程控制块抽象(PCB)
1.进程的唯一标识 pid
就相当于每个人的身份证一样。
2.进程关联的程序信息---内存指针
指明自己运用了哪些内存。
3.文件描述符表
硬盘上的文件等其他资源。
4.进程调度的相关属性
接下来,会详细的讲解。
1.2:进程调度的相关属性
打开QQ是一个进程,打开微信是一个进程.....这么多进程又是如何的分配资源了,这里就要说起操作系统中一个中重要的调度器CPU。
我的电脑只有8个cpu,难道只能一次调用8个进程。这当然是不行的呀!,所以我们希望进程是同时运行,分时复用。这又是什么意思呢?这就引出了并行和并发的两个概念。
并行:微观上同一时刻,两个核心的进程同时执行。
并发:微观上统一时刻,一个核心只能运行一个进程,但是它能对进程快速的切换。就好像一个cpu上多个进程不停的切换。
例如:并行,就是两个人喂两个小孩。
并发,就是一个人喂两个小孩,一个小孩吃一口,轮流的吃。
从这里就引出来进程状态。
1.2.1:进程的状态
就绪状态:随叫随到,进程时刻准备着去CPU执行。
运行状态:正在CPU上执行。
堵塞状态:一定时间内,无法到CPU上执行。
1.2.2:优先级
CPU进行多线程进行调度的时候,是按什么规律来进行调度的?在进行进程调度的时候,CPU是不会一碗水端平的,也是有优先级。
1.2.3:上下文
操作系统在进行切换的时候,就需要把进程中间状态记录下来,保存好,下次直接恢复到上次的状态。这上面的这段操作就类似于游戏中的"存档“,"读档"。
上下文本质就是你存档的内容。进程中的上下文就是CPU中的各个寄存器(CPU内置的存储数据的模块,保存的就是程序过程中的中间结果。)的值。
保存上下文:就是把这些CPU寄存器的值,记录保存到PCB中。
恢复上下文:就是把PCB中的这些寄存器值恢复回去。
1.2.4:记账信息
操作系统统计每个进程在CPU上占用的时间和执行的指令数目,根据这个来决定下一个阶段如何调度。
2:进程的虚拟地址空间
在程序中所获取的内存地址,并非是真实的物理内存的地址,而是经过了一层抽象,虚拟出来的地址。正如c语言的指针,这里的内存地址,就是虚拟的内存地址,并非真实的物理内存地址。
如果用真实的内存进程,一旦进程1不小心访问的内存越界就又可能导致越界的这段内存的该进程也出现崩溃,无法使用。这就引出来虚拟地址空间。
假如进程1访问内存的时候,操作系统内核该地址是否超出进程1的访问范围,如果超出,就会直接向进程反馈你一个错误(SIGN SEGEMENT FAULT)会引起该进程的崩溃,而其他进程不会收到影响。
虚拟地址空间,让进程使用的内存空间,进行"隔离"起来。主要就是为了避免进程之间相互产生影响。
以上就是进程的知识,接下来我们要了解一下,什么是线程。
3.线程
进程和线程都是解决并发编程的问题,但进程都可以实现并发编程,为什么又要提出线程这个概念呢?
正就是因为进程太重了,这里的重,是主要就是重在"资源分配/回收"上,具体的来说:创建一个进程,开销大;销毁一个进程,开销也比较大,调度一个进程,开销还比较大,这样就使消耗资源多,速度慢。在这个追求速度的世界,线程应运而生,故线程也叫做“轻量级进程",它为啥轻呢?因为它把申请资源/释放资源的操作给省下来了。
3.1进程和线程对资源的区别
这个我们就来举一个例子,假如你有一个餐馆,生意很好,你餐馆的位子不够,这时候你要增加座位。
进程:
这就是进程,它决定开一个分店,那你就需要一个新的送菜,新的地方,新的餐桌,你在等这些新的资源,是不是需要大量的时间,而这些新的在操作系统都是资源。这就说明开一个进程,需要分配资源。
线程:
线程就打算在店外面多加几套桌椅。这样这些增加的桌椅可以共同使用之前的资源,可以节省时间。就这样剩下了申请资源的操作,从而达到轻量。
3.2:如何描述线程
前面介绍的PCB 里的状态,上下文,优先级,记账信息,都是每个线程有自己的,各自记录各自的。但是同一个进程里的PCB之间,所有线程的pid ,内存指针和文件描述附表也是一样的。
3.3:线程问题
3.3.1:线程数量过多
上面讲述了开辟线程会节省时间,但多个线程会不会,使得时间搜快搜快的呢?答案是不是的!
假如你想找三个人分别给你扎头发,化妆,配礼服,但是那三个人又带了自己的闺蜜,你瞬间有六个人,但其中两个人一直在商量,哪套衣服更好,一直决定不下来。
上述问题拿到操作系统上,增加线程数量,也不是可以一直提高速度,一个人只能穿套礼服(CPU核心数量是有限的)太多人一起决定穿哪一套,反而拖慢了速度。线程数量太多,核心数目有限,不少的开销反而浪费在在线程调度上。
3.3.2:线程不安全
举例子:
假如有一天,三兄弟收到了一个任务,要去吃一只鸡,大哥吃了一只鸡腿,告诉二哥和小弟说:”这鸡腿是我吃过最好吃的",二哥和小弟听了此话,都去抢另一个鸡腿,还为此打架起来。
上述问题拿到操作系统上,两个线程同时访问同一个公共变量。此时就会出现线程不安全问题。
3.3.3:线程不安全的延申
接上面的例子,大哥最后一把夺过鸡腿,给了小弟,这时候二哥火了,瞬间就把桌子给掀翻了,哦吼!大家都吃不了。
这就是一个线程抛异常了,如果处理不好,很可能把整个进程都给带走。其他线程也就挂了。
4.进程和线程的联系
1,进程包含线程,每一个进程至少有一个线程(只有第一个线程启动的时候,开销比较大)。
2,同一个进程的多个线程之间,共用了进程的同一份资源。
5.进程和线程之间的区别(面试题)
1.本质区别:.进程是资源分配的最小单位,线程是系统调度的最小单位。
2.从属关系:进程包含线程,线程属于进程。
3.开销不同:进程的创建,销毁,调度的开销都远大于线程。
4.资源拥有不同:进程和进程之间不共享内存空间,每个进程都有自己独立的内存和资源。同一个进程的所有线程之间共享同一个内存空间。
总结:
以上就是我总结的进程和线程的知识点,若有错的,或是不太准确的,请各位铁子留言指错,若感觉不错,请一键三连。