在Linux上,PCB是一个叫做 struct task_struct{.....}这样的结构体
使用链表这样的数据结构来把若干个task_struct给串起来
当我们看到任务管理器中的这些进程的时候,意味着系统内部就在遍历链表,并且打印每个节点的相关信息;
如果运行一个新的程序,于是系统中就会多一个进程,多的这个进程就需要构造除一个新的PCB
并且添加到链表上
如果某个运行中的程序,退出了,就需要把对应进程的PCB从链表中删除掉,并且销毁对应的PCB资源
此处的表述是一个简化版本,事实上组织更加复杂
(例如:一个优秀的音乐家,听到一首歌,就能把对应的谱子,给写出来)
一个优秀的程序员,看到一个程序的效果,也能大概知道对应的代码是咋搞的
PCB中的一些核心属性,
PCB这个结构体,是一个非常庞大的结构体 (上百个属性)
比如有些程序,是带有驱动的,驱动,是在系统内核中执行的,这里出现的问题是可能会导致系统卡死或蓝屏的
pid 进程的身份标识
此处通过一个简单的不重复的整数来进行区分的
系统会保证,同一个机器上,统一时刻,每个进程pid都是唯一的
后续针对某个进程进行操作,就可以拿着pid来进行区分了
比如,选中某个进程,并且点击结束任务,此时,就是任务管理器获取到你选中的进程的pid
一个系统api,把pid 作为参数穿进去,从而完成这里的杀死进程的操作
内存指针(一组)
进程运行过程中,需要消耗一些系统资源的,其中内存就是一种重要的资源
整个系统,内存这么多(16G),这16G都可以随意使用嘛???
当然不是,先从系统这里申请,系统分给你一块,你才能使用
(把内存想象成小旅馆,有很多房间,所谓的申请内存,就是跟小旅馆老板说开个房间,申请到了才可以使用,如果房子你没申请,你也进不去,就算你强行破门而入,产生的后果也不可预期)
每个进程,都必须使用自己申请到的内存
内存指针,
就是用来描述说你这个进程,都能使用哪些内存
一个进程跑起来的时候,需要有“指令”也需要有数据(指令和数据,都是要加载到内存中的)
进程也需要知道,哪里是存的指令,哪里是存的数据
当你双击一个exe的时候,就会"运行进程“
这个过程中,就是系统先把exe这个文件里的内容(包含了指令和数据,先加载到内存中)然后再创建进程,让进程开始执行
指令一般不会很大,数据有可能很大的,程序加载的慢,加载的数据比较多可能性是很大的
文件描述符表
描述了这个进程,所设计的硬盘相关的资源
我们的进程经常要访问硬盘
操作系统,对于硬盘这样的硬盘设备进行了封装=》文件
存储器=内存+外存 外存(包括不限于,硬盘,软盘,光盘,U盘)
操作系统,不管你是哪种盘,都是统一进行的抽象,都是按照”文件“的方式来操作的
U盘:flash卡 光盘:VCD
一个进程要想操作文件,需要先打开文件 ,就是让你的进程在文件描述表中分配一个表项(
(构造一个结构体)表示这个文件的相关信息
fopen是c语言的标准库函数
操作系统提供的api(Linux),就叫做open
Java标准库封装的api 本质上都是调用系统api
进程,是系统分配资源的基本单位(内存,硬盘=>就会在PCB中有所体现)
内存硬盘,网卡等资源,在pcb中都好体现
cpu这块是最复杂的
一个进程,消耗cpu资源,是啥意思??
CPU是一个舞台,要执行的指令,就是演员 进程要执行指令
一个cpu可能有一个核心,也可能有多个核心
每个核心都是一个舞台 演员需要登上舞台,才能进行表演
同一时刻,一个舞台上,只能有一个演员
我这个电脑上的cpu,有16个逻辑核心,我系统上的进程,远远不止16个
舞台不够用,咋办??
所以,这就涉及到一个非常关键的概念,分时复用(并发)
关键要点,让多个演员,轮流登台
考虑一个简单的场景:现在咱们的电脑上只有一个核心---2007年前的cpu基本都是单核的
Q:单个核心的cpu,能否支持一个“多任务操作系统”运行呢??
那个年代,像windows xp,windows 2000,windows 98甚至更早之前,早都有多任务操作系统了
分时复用
cpu核心只有一个,先执行进程1的代码(进程1 登台演出)执行一会后,让进程1 下来,进程2上,以此类推
只要切换速度足够快,人是感知不到这个切换的过程的。在人眼看起来,多个任务/进程,就是“同时执行”的
cpu频率,都是多少多少GHz,一秒钟执行几十亿条指令
意味着,短时间内,cou就可以进行很多次的任务切换,只要足够快,人就感知不到
(当然也有极端情况,比如,系统进程太多了,负担太重,就会出现卡顿,鼠标出现转圈这种情况,卡住了,这个进程捞不着去cpu上执行了)
后来,随着多核cpu诞生,同时执行进程,变得更复杂了
同时就可以有四个不同的进程,在各自的舞台上进行执行,此时此刻,微观上,这几个进程也是同时执行的,而不是靠快速切换模拟的“同时执行”
称为“并行执行”
与之对应的,前面的并发执行,仍然存在
每个核心仍然要分时复用,仍然要快速切换
当前现代的计算机执行过程,往往是并行+并发同时存在的