操作系统 - 进程

文章目录

  • 操作系统
    • 1.操作系统的定位
    • 2.进程
      • 2.1 PCB的一些属性
      • 2.3 进程调度相关属性 :
  • 本文小结

操作系统

操作系统是一个软件

用途 :管理

1.对下 :管理硬键设备

2.对上 : 为软件提供稳定的运行环境

进一步来说 : 操作系统是软件 硬件 用户之间交互的媒介 .

我们最熟悉的操作系统就是我们的Windows ,因为我们的电脑差不多都是这系统, 除了 windows 还有 Linux 关于 Linux 算是我们的必须要掌握的系统了 , 它特别适合我们进行开发和项目部署.

另外还有土豪标配的 苹果电脑使用的系统Mac

另外 小扩充一下 : Android 本质上就是我们的Linux , iosMac 同宗同源.

下面来看一下我们的操作系统的定位 :

1.操作系统的定位

操作系统 - 进程_第1张图片


之前说过操作系统做两件事

一 : 管理硬件设备( 看的到摸得到 好理解 )

二 :为软件提供稳定的运行环境 ,这句话想要理解就不得不谈到操作系统的进程管理。

下面就来学习一下啥是进程

2.进程


进程 : 简单来说就是一个跑起来的程序,就是一个进程


这里我们就启动了idea ,此时他就相当于一个进程 。

操作系统 - 进程_第2张图片


下面我们就来看一下我的电脑有哪些进程

操作系统 - 进程_第3张图片

重点 : 进程是操作系统资源分配的基本单位

操作系统 - 进程_第4张图片


这里就对进程有了基本的了解, 但还不够,下面我们继续.


进程是一个重要的 资源管理 , 是由操作系统内核负责管理的 。


那么操作系统是如何管理的呢 ?


答案 : 描述 + 组织

描述 : 主要是讲清楚都有那些属性和特征 。

这里使用结构体(c语言的结构体) 来描述进程属性 , 另外用来描述进程的这个结构体 ,被称为 PCB ( process control block - 进程控制块进程控制块)


组织 : 通过一定的数据结构将多个这样的基本单位给串起来 。

组织使用的数据结构是双向链表,用双向链表键 多个PCB 给串到一起 。

创建一个进程 , 本质上就是船舰一个 PCB 这样的结构体对象,把它插入到链表中。

销毁一个进程,本质上就是把链表上的PCB 节点删除掉

任务管理器查看到的进程列表,本质上就是遍历整个PCB链表.

下面来了解一下 进程(PCB) 的一些属性/ 特征 :

2.1 PCB的一些属性


1.pid进程的身份标识符 (唯一的数字)

操作系统 - 进程_第5张图片


这里通过任务管理器同样是可以看到的

这些 进程的 pid 可以说是 进程的身份证号。其目的:就是为了区分进程。


2.内存指针 :

操作系统会给我们的进程分配一定的系统资源,这里最主要的就是内存, 内存指针就相当于划分了边界,表明了这一块内存是我们的, 相当于国家与国家的边界。


3.文件描述符表 :


硬盘上的文件等其他资源

这里内存指针和 文件描述符表 就描述了进程持有了那些硬件资源 。


补充 :

这里我们的硬盘资源 , 内存 ,硬盘 网卡 都比较好分 ,但是 CPU资源就不好分, 我们电脑上进程是有很多的, 几百个,但CPU就只有那么几个(多核CPU),

操作系统 - 进程_第6张图片


另外这里给不同进程安排时间就是进程调度 ,总的来说进程调度就是时间管理 , 这里根据上面的海王的例子来理解.

2.3 进程调度相关属性 :


进程的状态 :

这里的状态就描述了当前的进程接下来改如何去调度,。


三种重要状态

1.就绪 状态

2.运行状态 : 正在CPU上执行的状态

就绪和运行很多操作系统都不会明确区分开来,所以可以看成一个,也可以分成两个。

3.阻塞/休眠 ,此时处于这种状态CPU就不会执行当前的进程


继续采用上面的海王例子, 正常情况下,我们的时间安排的非常合理 , 我们能够让 三个女朋友随叫随到 ,

但有一天女友B被他的父亲叫去管理公司产业 1个月,此时女友B是不是就处于了阻塞状态,我们就可以不用去安排陪她的时间 了,也就不用去调度了,

如果进程处于阻塞状态 那么此时的进程就可能再进行密集的IO操作读写操作。


优先级 :


优先级也非常好理解 :

举例 : 再高中我们都肯定都有喜欢的课程, 那么是不是就会先去安排做那门课相关的作业,或多刷有关于这门课的题目, 此时这门课的优先级友高

进程也一样,优先级高的就优先给他排给他资源,一些不那么重要的就最后排。

同样海王的例子也可以举例, 比如我最喜欢女友C 谁叫人家身材好呢,那么我们是不是就可以优先将时间排给 (星期一 , 星期二 , 星期三 )女友C ,然后是(星期四 , 星期 五) 女友A , 最后是 B (星期 六, 星期天 )。


上下文 :

还是拿海王的例子来 举例 :

有一天 女友A 与海王说 下次见面我想要你给我买一个包包 , 此时我们答应了,

过了几天,我们陪女友C ,然后女友C 说 下次见面想你带我去游乐场玩一天,此时我们也答应了,

但是因为有了两个请求一个 买包包一个去游乐场玩,但是作为初级海王的我给弄叉了, 把女友A带去了游乐场, 把包包送给了女友C,此时不就露馅了吗,


高级的海王是不会有这种低级的错误的, 他们都会有一个小本本,每次都会记录一下每次约会后的小细节,下次再约会的时候是不是就可以通过小本本快速恢复到之前的状态。

所以上下文总的来说就是操作系统再进行进程切换的时候,就需要把进程执行的 中间状态 记录下来,保存好


这里也可以理解未 存档 和读档 ,所以上下文本质上就是你存档的内容.

扩展 :

更细节点来说进程的上下文就是CPU 中的各寄存器的值

寄存器 : CPU内置的存储数据模块 保存的就是程序运行过程中的中间结果 ,

保存上下文 : 就是把这些CPU 寄存器的值记录保存到内存中(PCB中)

回复上下文 : 就是把内存中的这些寄存器值恢复回去.


记账信息 :

还是用我们的好朋友的例子 : 还是这个海王他已经与 ABC相处了一段时间。

他有一个小习惯 , 每隔一段时间 做一个总结 ,统计一下,一个月内再每个人身上大概花费了多少精力。

假设 A 陪了 10 天 , B陪了 5天 , C 陪了 15天,那么他发现,这个月陪B的天数有点少了, 下个月多陪陪她,防止人家的好感度降低最后不和我们谈了

这里就需要始终保持一个合适的尺度,不能太远也不能太近.


总的来说记账信息就是统计了每个进程,都分别被执行了多久,分别都执行了那些指令。分别都排队等了多久了…

这里记账信息就可以统计每个进程当前再CPU的资源,然后再根据这里面的统计结果,来去对那些分配特别少,特别不均衡的进程,再去做出一些补偿。


最后来看一下我们的内存管理 :


上面我们一直将的进程调度, 知道了进程调度主要是如何去将CPU资源分配给各个进程, 但我们的电脑上除了CPU还有其他的资源,典型的就是我们的内存资源,那么内存资源又是如何进行分配的呢 ? 这里就需要要学习一下我们的下一个话题 虚拟地址空间

虚拟地址空间

在我们的程序中所获取都的内存地址, 并非真实的物理内存的地址,而是经过一层抽象出来的地址

如果学过c语言的同学, 肯定知道指针, 指针所指向的内存地址就是虚拟的内存地址,并非真实的物理内存地址


这里补充一下内存是一个啥东西 :

就拿我们的宿舍楼来举例 ,在宿舍楼的每一层会有很多的房间,每一个房间就是一个宿舍,每一个宿舍上面拥有房间编号,如 101 , 102 等,我们通过这些编号快速定位到房间如外卖送饭上楼假设我在 9栋102,那么地址就可以添 9栋102那么就能直接送过里, 这里的房间编号就相当于地址


内存 :在物理上就是一个内存条, 里面可以存很多数据


物理地址 :
操作系统 - 进程_第7张图片


为啥使用虚拟地址空间 :

操作系统 - 进程_第8张图片


总结 : 虚拟地址空间 ,主要就是为了避免进程之间相互产生影响.

到这还没完 ,这里通过虚拟地址空间将进程进行了隔离,但是我们进程之间需要进行数据交互(相互配合) 呢 ?

这里就不好办了, 这里我们就需要再隔离性的基础上,开一个口子。

这口子咋开呢 ? 其实很简单,就那我们现在的外卖来说,因为我们的疫情吗,我们可以选择无接触拿外卖, 相当于我们叫外卖小哥将我们的外卖送到一个指定的地方,我们自己去拿,这里指定的地方就是一块公共的空间,进程A可以将数据放在这里,等进程A放完,进程B就可以去拿,此时进程A和B就不用碰面也能拿到数据,这里就完成了交互过程,这样的操作就被称为进程间通信.

现在最主要使用的 进程间通信 方式,有两种:

1.文件操作 :

2.网络操作 :

本文小结


1.操作系统 , 定位 , 结构

结构 : 应用程序 ,系统调用(操作系统给应用程序的API ) , 内核 ,驱动, 硬件设备.


2.进程 (重点)

跑起来的程序就是进程

操作系统就需要管理很多进程

如何管理?

描述 (PCB) + 组织 (双向链表)


PCB 相关属性 :

1.pib

2.内存指针

3.文件描述符

4.进程调度的属性 :状态 , 优先级 , 上下文 ,记账信息


另外 : 进程调度本质上是要解决 狼多肉少的问题 ,让大量的进程可以在少数的 CPU 上同时运行 . --> 可以想到我们海王的例子来记忆


最后扩展了一下 进程的虚拟地址空间

关于虚拟地址空间主要解决的进程之间因为某种原因导致出现bug,使原本进程1的bug 影响到了进程2 导致进程2崩溃。

通过虚拟地址空间使用进程之间隔离开,如果需要进程之间进行数据交互就需要使用到进程间通信.


下文预告 多线程

你可能感兴趣的:(javaee,java-ee)