文章目录
- 操作系统
- 1.操作系统的定位
- 2.进程
- 2.1 PCB的一些属性
- 2.3 进程调度相关属性 :
- 本文小结
操作系统
操作系统是一个软件
用途 :管理
1.对下 :管理硬键设备
2.对上 : 为软件提供稳定的运行环境
进一步来说 : 操作系统是软件 硬件 用户之间交互的媒介 .
我们最熟悉的操作系统就是我们的Windows
,因为我们的电脑差不多都是这系统, 除了 windows
还有 Linux
关于 Linux
算是我们的必须要掌握的系统了 , 它特别适合我们进行开发和项目部署.
另外还有土豪标配的 苹果电脑使用的系统Map
另外 小扩充一下 : Android 本质上就是我们的Linux
, ios
和 Map
同宗同源.
下面来看一下我们的操作系统的定位 :
1.操作系统的定位
之前说过操作系统做两件事
一 : 管理硬件设备( 看的到摸得到 好理解 )
二 :为软件提供稳定的运行环境 ,这句话想要理解就不得不谈到操作系统的进程管理。
下面就来学习一下啥是进程
2.进程
进程 : 简单来说就是一个跑起来的程序,就是一个进程
这里我们就启动了idea ,此时他就相当于一个进程 。
下面我们就来看一下我的电脑有哪些进程
重点 : 进程是操作系统资源分配的基本单位
这里就对进程有了基本的了解, 但还不够,下面我们继续.
进程是一个重要的 资源管理 , 是由操作系统内核负责管理的 。
那么操作系统是如何管理的呢 ?
答案 : 描述 + 组织
描述 : 主要是讲清楚都有那些属性和特征 。
这里使用结构体(c语言的结构体) 来描述进程属性 , 另外用来描述进程的这个结构体 ,被称为 PCB ( process control block - 进程控制块进程控制块)
组织 : 通过一定的数据结构将多个这样的基本单位给串起来 。
组织使用的数据结构是双向链表,用双向链表键 多个PCB 给串到一起 。
创建一个进程 , 本质上就是船舰一个 PCB 这样的结构体对象,把它插入到链表中。
销毁一个进程,本质上就是把链表上的PCB 节点删除掉
任务管理器查看到的进程列表,本质上就是遍历整个PCB链表.
下面来了解一下 进程(PCB) 的一些属性/ 特征 :
2.1 PCB的一些属性
1.pid进程的身份标识符 (唯一的数字)
这里通过任务管理器同样是可以看到的
这些 进程的 pid 可以说是 进程的身份证号。其目的:就是为了区分进程。
2.内存指针 :
操作系统会给我们的进程分配一定的系统资源,这里最主要的就是内存, 内存指针就相当于划分了边界,表明了这一块内存是我们的, 相当于国家与国家的边界。
3.文件描述符表 :
硬盘上的文件等其他资源
这里内存指针和 文件描述符表 就描述了进程持有了那些硬件资源 。
补充 :
这里我们的硬盘资源 , 内存 ,硬盘 网卡 都比较好分 ,但是 CPU资源就不好分, 我们电脑上进程是有很多的, 几百个,但CPU就只有那么几个(多核CPU),
另外这里给不同进程安排时间就是进程调度 ,总的来说进程调度就是时间管理 , 这里根据上面的海王的例子来理解.
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那么就能直接送过里, 这里的房间编号就相当于地址
内存 :在物理上就是一个内存条, 里面可以存很多数据
物理地址 :
为啥使用虚拟地址空间 :
总结 : 虚拟地址空间 ,主要就是为了避免进程之间相互产生影响.
到这还没完 ,这里通过虚拟地址空间将进程进行了隔离,但是我们进程之间需要进行数据交互(相互配合) 呢 ?
这里就不好办了, 这里我们就需要再隔离性的基础上,开一个口子。
这口子咋开呢 ? 其实很简单,就那我们现在的外卖来说,因为我们的疫情吗,我们可以选择无接触拿外卖, 相当于我们叫外卖小哥将我们的外卖送到一个指定的地方,我们自己去拿,这里指定的地方就是一块公共的空间,进程A可以将数据放在这里,等进程A放完,进程B就可以去拿,此时进程A和B就不用碰面也能拿到数据,这里就完成了交互过程,这样的操作就被称为进程间通信.
现在最主要使用的 进程间通信 方式,有两种:
1.文件操作 :
2.网络操作 :
本文小结
1.操作系统 , 定位 , 结构
结构 : 应用程序 ,系统调用(操作系统给应用程序的API ) , 内核 ,驱动, 硬件设备.
2.进程 (重点)
跑起来的程序就是进程
操作系统就需要管理很多进程
如何管理?
描述 (PCB) + 组织 (双向链表)
PCB 相关属性 :
1.pib
2.内存指针
3.文件描述符
4.进程调度的属性 :状态 , 优先级 , 上下文 ,记账信息
另外 : 进程调度本质上是要解决 狼多肉少的问题 ,让大量的进程可以在少数的 CPU 上同时运行 . --> 可以想到我们海王的例子来记忆
最后扩展了一下 进程的虚拟地址空间
关于虚拟地址空间主要解决的进程之间因为某种原因导致出现bug,使原本进程1的bug 影响到了进程2 导致进程2崩溃。
通过虚拟地址空间使用进程之间隔离开,如果需要进程之间进行数据交互就需要使用到进程间通信.
下文预告 多线程