进程调度不明白?看这一篇文章就够了,逻辑衔接严密,文末附有关键面试题,一个海后的小故事让你瞬间明白这里面的弯弯绕绕!
目录
1.什么是进程?
2.进程控制块(PCB)
2.1 一个PCB就是一个进程吗?
2.2 操作系统如何管理内存?
2.3 PCB有哪些属性?
3.CPU分配--进程调度(海后小故事)
4.多核CPU
5. 什么是线程?
6. 为啥要有线程?
7.进程和线程的区别(关键面试题)
1.什么是进程?
每个应⽤程序运行于现代操作系统之上时,操作系统会提供⼀种抽象,好像系统上只有这个程序在运行,所有的硬件资源都被这个程序在使用。这种假象是通过抽象了⼀个进程的概念来完成的,进程可以说是计算机科学中最重要和最成功的概念之⼀。
进程是操作系统对⼀个正在运行的程序的⼀种抽象,换言之,可以把进程看做程序的⼀次运行过程;同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。
相信大家都用过任务管理器,如下图,这些运行起来的可执行文件称为“进程”。
操作系统是如何是管理进程的呢? 这里就不得不引入一些概念了
2.进程控制块(PCB)
PCB 是进程控制块(Process Control Block)的缩写。它是操作系统中用来管理和维护进程信息的数据结构,每个进程在系统中都有对应的 PCB。PCB 包含了进程的各种状态信息、上下文(Context)信息以及控制信息,主要用于操作系统进行进程管理和调度。
2.1 一个PCB就是一个进程吗?
一个PCB就是一个进程这不完全准确。我们首先要明白,PCB是什么?它是一个数据结构啊,而我们的进程可以看成程序的一次运行,一个 PCB(进程控制块)是操作系统中用来描述和管理一个进程的数据结构,它存储了一个进程的各种状态信息、上下文信息和控制信息。但 PCB 本身并不是一个进程,而是为一个进程服务的数据结构。一个进程在操作系统中由多个部分组成,包括代码、数据、堆栈等,而 PCB 则是用来管理这些部分的数据结构。换句话说,一个进程包含了代码执行的逻辑和数据,而 PCB 则是用来记录和管理这个进程的状态、资源和其他相关信息。可以将 PCB 比喻为一个进程的档案,里面包含了进程的各种资料和信息,而进程则是实际运行的程序实体。在操作系统中,每个进程都有对应的 PCB,操作系统通过管理 PCB 来对进程进行调度、管理和控制。
讲到这,我们稍微注意下上面所讲的内容
首先,进程可以理解成程序的一次运行(诸如:.exe后缀的文件,都是可执行程序)
其次,PCB是一种数据结构,用来描述和管理进程,可比喻为一个进程的档案
2.2 操作系统如何管理内存?
一个PCB对象,代表着一个实实在在运行着的程序,也就是进程,注意这里的字眼是“代表”。操作系统通过数据结构,例如线性表、搜索树等将PCB对象组织起来,方便管理时进行增删查改,比如用链表,把他们当糖葫芦一样,一个一个串起来,这里所运用的数据结构因操作系统而异。
这里给大家简单讲一下进程的一些操作:
“创建进程”,先创建出PCB(PCB中有pid(下文会讲到)用于识别进程),然后把PCB放入链表
“销毁进程”,也就是遍历链表,找到链表中的PCB并删除。
而本文开头查看任务管理器,其实就是对链表进行遍历,找出所有PCB
2.3 PCB有哪些属性?
- pid: 一个进程身份的标识,就像我们的身份证号对应着一个人,pid也是如此,对应一个进程
- 内存指针:用于指明该进程所要执行的代码/指令在内存中的哪个位置,所需要的数据在哪里。当运行一个.exe文件时,此时操作系统就会把这个.exe文件加载到内存中,变成进程。
- 文件描述符表:文件描述符表是一个数据结构,可以视为一个数组,里面的每一个元素由是一个结构体,对应了一个文件的相关信息。当我们执行程序的时候,经常会和文件打交道,进程每访问一个文件,就会在上面增添一个元素用于记录这个文件的相关信息,这个文件描述符的下标,就称为”文件描述符“。
上面是PCB的基础属性,下面这些则是用于进程调度
- 状态:指的是进程当前的状态。如:1.就绪状态:表示进程已经准备好被操作系统调度执行;2.阻塞/休眠状态:进程因为某种原因而暂时无法继续执行;3.运行状态:进程正在执行指令,占用 CPU 资源。 还有其他的一些状态这里就不赘述了。
- 优先级:用来指示操作系统在进行进程调度时,应该优先执行哪些进程。
- 记账信息:统计了进程被执行了多久,都执行了哪些指令。都排队等了多久,目的是给进程调度提供指导依据的。
上下文:包含了进程在执行过程中需要保存和恢复的所有状态信息,以便在进程切换或者中断处理时能够正确地恢复执行。就像我们看电视剧的时候,有时候会因种种原因没看完,当隔天我们点开电视剧的时候,影视软件会给我们恢复到历史观看时间,让我们继续看下去。
3.CPU分配--进程调度(海后小故事)
小芳是个大美女,肤白貌美,大长腿,她希望她的男朋友是个高富帅,还要巨能舔,但是这样的优质男是真的不好找!为了满足自己的要求,于是她就交了三个男朋友:
- 有钱的公子哥
- 一米八的大帅比
- 温柔的舔狗
这个时候我们的海后小芳就要给他们进行时间安排,作为一个时间管理大师,怎么会让他们三个碰面呢?那不就火星撞地球了!
于是她规定了星期一、二跟公子哥出去玩,星期三、四跟大帅比出去约会,星期五、六跟舔狗出去逛街,星期天休息一天。
在宏观上看,她同时交了三个男朋友,但是在微观上,在不同时刻,她只能和一个男朋友在一起约会。
“同时”交三个男朋友这就是并发,而规划时间的过程也就是所谓的“进程调度”。
我们回过头看PCB的属性
- 状态:正常情况下,小芳约男朋友们出去玩,都是随叫随到的情况,此时男朋友们都是“就绪状态”,但是有一天公子哥犯错了,给他的老爸关禁闭了,这个时候公子哥就处于“阻塞/休眠状态”,此时小芳就不会约他出来,也就是说进程不会被CPU调度。
- 优先级: 这段时间小芳看上了一个lv的包包,这个时候她三个男朋友中她肯定会优先找公子哥出来,然后再考虑帅比和舔狗。
- 记账信息:由于上个星期公子哥给她买了包包,于是陪了公子哥五天,陪了帅比男朋友一天,还有一天实在撑不住了,需要休息,这个时候小芳翻账本发现忽略了舔狗一个星期,舔狗给她发的信息已经99+了,为了挽留住舔狗,让他能够继续卖力舔下去,小芳连忙在这个星期抽出了两天陪舔狗
- 上下文:约会时,有些事情没完成,下次继续,这时候就需要把约会结果保存好,(存档)以备下次继续,比如跟公子哥说好了下次去海滩,小芳到时候带泳衣去,结果记错了,拿着泳衣去跟帅比去酒吧蹦迪······为了避免这种尴尬情况,就需要(存档)
4.多核CPU
随着技术的进步,我们的CPU从单核到了现在的多核,基本上都看不到单核CPU的出现了,每个核心各干各活,互相之间不影响,此时就需要进程调度来负责,用“分时复用”来完成调度!
一个核心,同一时刻,只能运行一个进程
十六个核心,同一时刻,同时运行十六个进程(完全是同时执行) ---- 并行执行
但是,一个核心,不同时刻,可执行不同的进程!这一时刻执行进程1,下一刻,执行进程2·····
CPU就把总的执行时间,切换成若干个小的片段,每个片段可执行一个进程,每个片段称为“时间片”,由于时间片较短(CPU切换进程太快,人感觉不到),站在人的角度来看,就是若干个进程在“同时执行”(本质上不是同时) ---- 并发执行
操作系统就会按照 并行+并发 相互搭配,运行所有进程!!
并行,微观时间上是同时执行(多核心各自运行各自的进程)
并发,宏观时间上是同时执行,微观时间上是串行执行 (一个核心执行多个进程)
这里的串行执行在操作系统内核内部管理好了,编写应用程序时无法干预,普通用户也无法感知到,因此往往把 并行+并发 统称为 “并发” ,把解决并发问题的程序,称为“并发编程”
在弄懂了进程之后,我们接下来谈谈线程。
5. 什么是线程?
一个线程就是一个“执行流”,每个线程之间都可以按照顺序执行自己的代码,多个线程之间“同时”执行着多份代码。简单点说,线程可以理解成“进程的一部分”,一个进程中可以包含一个或者多个线程。
当一个进程中只有一个线程时候,一个PCB就代表了一个进程,但是在多个线程的进程中,一个PCB代表了一个线程,多个PCB联合起来描述了一个进程
6. 为啥要有线程?
- 首先,“并发编程”成为了“刚需”,单核CPU已经遇到瓶颈了,要想提高算力,就需要多核CPU,而并发编程能更充分利用多核CPU资源。
- 其次,虽然多进程也能实现并发编程,但是线程比进程更轻量!
轻量体现在如下三点:
- 创建线程比创建进程更快
- 销毁线程比销毁进程更快
- 调度线程比调度进程更快
那么为什么线程比进程更轻量?
核心在于,创建进程,这个进程可能包含多个线程,这过程,涉及到了 资源分配/释放 (很费劲),而创建线程,相当于资源已经有了,省去了 资源分配/释放 步骤,同一个进程包含N个线程,这些线程之间共用资源,只有你创建第一个线程时,(也是创建第一个进程时),会去进行资源申请操作,后续再创建线程,就没有资源申请的过程了
7.进程和线程的区别(关键面试题)
- 进程包含线程,每个进程至少有一个线程存在,即主线程。
- 进程和线程之间不共享内存空间,同一个进程的线程之间共享一个内存空间
- 进程是系统分配资源的最小单位(操作系统创建进程,需要给进程分配内存空间) 线程是系统调度的最小单位(操作系统创建线程,是在CPU上进行调度的)
- 一个进程挂了一般不会影响到其他进程,但是一个线程挂了,可能把同进程内的线程一起带走,使整个程序崩溃
感谢阅读,希望对您有所帮助!!