前言❤️❤️
hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
上篇博客从计算机组成,cpu指令,操作系统分析了计算机是如何工作的,这篇文章会对计算机的操作系统,以及系统对进程的管理进行解析,进一步了解计算机的内部工作🐵
🎆个人主页:洋不写bug的博客
🎆所属专栏:JavaEE学习
🎆铁汁们对于JavaEE的各种常用核心语法,都可以在上面的前端专栏学习,专栏正在持续更新中🏀,有问题可以写在评论区或者私信我哦~
1,操作系统的管理
谈到计算机的工作,那当然是离不开操作系统的
操作系统不仅要管理所有的硬件设备,还要给各种软件提供稳定的运行环境(例如在Windows系统中,steam程序运行出现问题,是不会影响其他程序的运行的,大不了就是自己崩溃)
那既然Windows系统能保证一个程序出问题不影响其他程序的运行,那为什么电脑还会出现蓝屏的情况呢?

这个就要提到另一个东西,那就是驱动程序
驱动程序是直接在操作系统内部运行的,如果驱动程序遇到bug,电脑就很可能会蓝屏
例如买了个罗技鼠标,一般就要在罗技官网上去下载驱动程序,计算机的音响,键盘、游戏耳机都需要驱动程序
那为什么这些驱动程序还要再下载,不能直接就安装好吗?
是因为计算机可以连接的外置设备太多了 ,除了各种鼠标、键盘、音响,还有医院的心电图机器,核磁共振控制手柄这些,这些设备的功能也不同因此操作系统就允许这些硬件开发商,在研发硬件的同时,提供一套对应的驱动程序,通过开发商提供的驱动,让操作系统"认识、理解"硬件,进而对硬件进行管理
操作系统,驱动程序,硬件设备就类似于这样一个关系,校长并不熟悉每个班的同学,例如要开运动会,校长会先通知辅导员,辅导员再管理同学进行备赛组队(辅导员对同学是比较了解的),如下图所示:

操作系统在管理硬件设备和软件资源的时候,会有一个个的"类"来表示各个软件/硬件的各种属性(类是Java中的定义,主流操作系统都是C语言编写的,因此更准确来说使用的是结构体来表示属性)
操作系统的管理,具体是怎样进行的?
- 描述,通过"类"来表示硬件/软件的属性
- 管理,把这若干个类的对象,通过数据结构给串起来,方便后面的增删改查
总之,操作系统管理的资源是非常多的,例如CPU资源、内存资源、硬盘资源、网络资源...
2,进程介绍
说到操作系统的管理,就要提到进程,"运行起来的程序"用计算机的专业术语来说,就叫做进程;
每个进程都要消耗一定的系统资源,操作系统给进程分配了硬件资源,进程才能运行
以win11为例,打开任务管理器,刚进入的就是进程界面(如下图)

那操作系统是如何管理进程的呢?
这个其实前面已经提到过,就是通过描述和组织管理过程
- 描述,操作系统使用 结构体 把一个进程的关键属性给表示出来
这个结构体就称之为PCB(Process Control Block)进程控制块,这个称呼适用于各种操作系统,但是如果具体到某个操作系统,就会有专门的具体的结构体的名字来对应,例如Linux上,对应结构体的名字是task_struct - 组织,操作系统使用一定的数据结构,把上述数据体的变量(对象)给串起来,大部分情况下使用的都是链表,因为进程一会要终止一些,一会要添加一些,链表的增删比较方便
1.
- 创建进程:创建PCB变量,插入到链表上
- 销毁进程:把链表中对应的PCB删除掉,释放
- 在任务管理器中查看进程列表:遍历链表,打印每个PCB中的属性
那铁汁们想一下,组织的时候大部分是把进程的信息存到链表中的,那在数据库中建个表,存储这些进程的信息,增删改查不是更方便吗?
像MySQL,Oracle等数据库,本质都是一个运行在操作系统上的应用程序,打开数据库这个应用程序,就需要先有操作系统而这些进程的描述和组织过程,实现操作系统的时候,就得先实现出来了,因此,没法用数据库存储这些进程的信息
3, PCB中的关键属性
前面提到,PCB(结构控制块)中存储了进程的关键属性,方便系统进行管理,下面就解析下具体有哪些属性。
1,PID(进程id)
进程在系统上的身份标识,不会重复(在当前的计算机上,这个时刻不会重复)
就类似与我们在大学的学号
在这里,博主运行微软浏览器这个程序,启动了13个进程(如下图)

2,内存
这里有个内存列(如下图),可以看出来,在进程运行时,需要申请一系列的内存资源,这些内存资源分为两部分,指令和数据

下图在上篇博客中有提到过,0123地址处里面存储的是指令,13,14,15地址处存储的是纯数据

那操作系统如何知道每个进程的内存空间中分成了哪些部分的区域呢,以及每个区域存储的到底是数据还是指令?
这就需要通过一个叫做内存指针的东西,通过内存指针,操作系统就知道在哪里找数据,哪里找指令
那铁汁们想下,既然程序的指令是存储在内存中的,那有没有办法直接修改内存中的指令内容,让程序的逻辑发生变化呢?🐵
当然是可以的!!!
这个一般有两种情况会这样做,一种是外挂,一种是病毒😅就拿做外挂而言,比如做PUBG的无敌锁血挂,大概就是分析出内存中的哪条指令在判定死亡,然后修改这条指令,让系统永远不会判定玩家被击杀(如下图,hp就是血量,这里只是简单举个例子,实际肯定不会这么简单)

注:做游戏外挂是犯法行为,要做遵纪守法的好公民🐵
3,文件描述符表
我们平时在计算机都是直接访问文件,这就相当于访问了硬盘上的某一块空间
操作系统就是通过文件这样的概念,来管理硬盘的
进程在使用文件的时候,需要先打开,才能使用(就像在C语言中,要先通过fopen打开文件,再通过fwrite和fread这些真正访问硬盘),进程打开文件成功之后,会得到一个文件描述符(整数,类似于身份标识)
一个进程可以打开多个文件,使用多个文件的硬盘资源,这些文件的文件描述符,就可以通过一个数组来进行表示,这个数组就体现了进程访问的内存资源
4,进程状态
要理解这个概念,要先大概了解进程的运行
打开任务管理器,会发现这里有很多进程,如下图所示:

打开性能部分,看下面的信息,博主的计算机中现在有296个进程(如下所示),博主的计算机有28个逻辑处理器

一个逻辑处理器在同一时间只能处理一个进程 ,铁汁们想一下,这28个逻辑处理器全部使用也只能分别同时处理28个进程(这也就是并行),那这296个进程是如何处理的呢?
一个处理器核心,可以一会运行线程1,一会运行线程2,一会运行线程3,这样进行快速的切换 ,铁汁们看下上面这个图,里面的速度是4.03GHz,也就是1s可以进行40亿次运算,因此切换线程的速度我们是感受不到的现在这296个线程看起来是在同时执行,但实际上还是"串行执行",这种操作模式就叫做并发
现在的操作系统实际执行的时候,都是并发&并行(就是不同处理器可以执行不同线程,互不干扰) 这两种模式同时存在的
这种多任务操作系统,同一个处理器快速切换线程的模式,在windows 95系统上就已经使用了,还是比较经典的(诺基亚使用的塞班系统比较老,就是单任务操作系统,已经淘汰十多年了)
这些进程有个状态,有的方便调到cpu上执行,有的不方便,最关键的两个进程状态就是就绪状态和阻塞状态:
- 就绪状态
就可以理解为是随叫随到,进程随时可以调到cpu上来执行 - 阻塞状态
表示现在进程暂时不方便调度到cpu上执行,比如说控制台上等待用户输入的情况(scanner.next(),用户不输入,就一直处于阻塞状态)
5,优先级
操作系统会给进程分配cpu资源,分配并不一定是平分的,会根据进程的优先级
就好比在电脑上玩三角洲,同时电脑也运行着QQ,那QQ的消息延迟个几s问题不大,但是三角洲如果延迟几s,如果正在和别人打架,那就很炸缸了,因此,优先级还是比较重要的
6,上下文
就好比铁汁们玩那些黑神话,这次打到哪里了,存个档,下次接着这次打,总不可能每次都重新打
进程也是类似,进程在运行时会有一系列的中间状态,因为cpu是会切换进程的,当进程从cpu中调走的时候,就需要把中间状态保存起来
当进程下次被cpu运行的时候,就可以把中间状态恢复过来,继续上次执行
进程的中间状态,就叫做上下文
7,记账信息
PCB会统计该进程在cpu过去一共执行了多少条指令
可以识别出某一条指令是不是太久没有执行了
结语💕💕
在JavaEE初学基础概念时,还是比较简单的,不涉及代码什么的,还是比较好理解的,后面线程部分就要上强度了,会写很多的代码🐵,铁汁们要做好准备💪
以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

🎆个人主页: