目录
一、操作系统
操作系统的本质其实是一个软件,其作用为 管理软件。
其 功能 有两点:
1、对下管理各种硬件设备。
2、对上给软件提供稳定的运行环境。
系统调用:操作系统提供API,应用程序通过调用其提供的API完成运行。
操作系统内核:实现了操作系统最核心的功能,内存管理,硬盘管理,进程管理,设备管理,文件管理.......
驱动:指的是驱动应用软件的程序,其中包含有关硬件设备的信息。此信息能够使计算机与相应的设备进行通信。eg:游戏鼠标的某些按键,计算机无法在没有安装驱动程序的情况下运行这个特殊键的功能。
二、操作系统之进程管理
2.1、什么是进程?
进程也称“任务”,一个跑起来的程序,就称之为进程——操作系统分配资源的最基本的单位。
🍉🍉前言:我们也观察到,同一时刻,系统中的进程有很多,那么操作系统是如何将其安排好呢?(如下)
2.2、管理进程的方式
2.2.1、描述
详细的表示清楚,一个进程有哪些属性/信息(而这些详细信息就存放在 PCB 中,其本质为结构体)。
2.2.2、组织
通过一定的数据结构(通常为双向链表),把若干个用来描述的实体(PCB),给放在一起,并且进行增删查改。
🎈🎈小结:
创建一个进程,本质上就是创建PCB,并且加入到链表上,
销毁一个进程,本质就是从链表上删除对应的PCB节点。
而上述所展示的 查看任务管理器 的操作,本质就是遍历这个链表。
一个进程可能对应一个PCB,也可能对应多个,同样,系统管理的PCB链表也不一定为一个。
2.3、PCB中的属性
2.3.1、PID
PID:进程的身份标识。
一个主机,同一时刻,这些进程的PID是唯一的,通过PID来区分一个进程。
2.3.2、内存指针
🚩🚩一个可执行的文件,运行时,操作系统会把文件中的核心数据(要执行的指令以及指令依赖的数据)加载到内存中去。也就是说,创建一个进程,务必是需要给其分配内存空间,有的是存放指令,有的是放数据,还有的是用来维护运行状态的。
而 内存指针 :就是指明哪一块内存是干什么用的。
🎈🎈总结:内存指针描述的是 进程持有的 内存资源。
2.3.3、文件描述表
每个进程,都可以打开一些文件(文件是存储在硬盘上的数据),
文件描述符表的功能则是:记录了当前进程都打开了哪些文件(打开了之后就可以后续针对这些文件进行读写操作)。
🎈🎈总结:文件描述表描述的是 进程持有的 文件资源。
三、进程调度
🍉🍉前言:PCB的其他属性:进程状态,进程优先级,进程上下文以及进程进账信息,我们将同进程调度一起理解。
3.1.为什么要进行进程调度?
我们知道 进程其实是一个正在运行的程序,而调度发生的原因其实是因为当前资源(CPU资源)有限,需要进行合理的安排。
3.2、什么是进程调度?
🚩🚩 所谓进程调度其实就是通过 "并发" "并行" 的方式让计算机可以同时执行多个进程(任务), 这就是我们平常为什么说操作系统是 多任务 的原因。
3.2.1、并行执行
多个 CPU 核心,在同时独立的运行多个进程。(每一个CPU都运行一个独立的进程)
3.2.2、并发执行
一个 CPU 核心,先运行一下进程1,再运行进程2,再运行进程3........
只要微观上切换的足够快,宏观上看起来就好像是3个进程同时运行一样。
3.3进程调度需要考虑的因素
3.3.1、状态
事例:老张家有三只哈士奇,每天当他一回家时,三只哈士奇都会用充满睿智的眼神看向老张,但是如果某一天,一只哈士奇病了,那么在老张回家的时候,这只哈士奇可能就没有精力来看向自己主人了。
🍉🍉分析:当老张回到家中时,没有生病的哈士奇(进程处于就绪状态),就会用睿智的眼神看向老张(进程在CPU上运行),生了病的哈士奇(进程处于阻塞状态),就无法看向老张。
🎈🎈总结:进程处于阻塞状态时,就无法被调度到CPU上执行,
进程处于就绪状态时,才能上CPU来运行。
3.3.2、优先级
事例:老张在三只哈士奇中,最偏爱那只傻里傻气的哈士奇,愿意花最长的时候陪它。而其他两只就相对较少。
🍉🍉分析:傻里傻气的哈士奇(进程优先级最高),其他两只哈士奇(优先级相对较低)。
🎈🎈总结:凡事都有个度,同样的,进程也有优先级,系统在调度的时候,就会根据优先级来给进程安排时间。当然创建进程的时候,可以通过一些系统调用来干预优先级。(相对而言)
3.3.3、上下文
事例:老张应出差的缘故,不得已将三只哈士奇寄养在隔壁老郑家,等老张出差回来之后,再去领回三只哈士奇一起玩耍。
🍉🍉分析:老张去出差相当于切换到别的进程,将哈士奇放在老郑家是 存档,而取回哈士奇是 读档。
🎈🎈总结:进程在 CPU 上执行了一会之后,要切换到别的进程,就需要保存当前运行的中间结果(存档),下次再轮到他执行的时候,就恢复之前的中间结果(读档),继续往下执行。
对于进程来说,上下文就是CPU中的寄存器的值(寄存器的值就包含了运行的中间结果,需要把这些结果保存到PCB的上下文信息中(内存))。
3.3.4、记账信息
事例:前文说到,老张养了三只哈士奇,最喜欢其中一只傻傻的,但是作为狗的主人,并不能全都把时间花在这只哈士奇上,也需要花时间在其他两只上面。
🍉🍉分析:花时间在其他两只哈士奇上。(时间分配更加均衡,避免CPU”忘记“这个进程)
🎈🎈总结:记账信息本质是:统计信息。记录的是:每个进程在CPU上执行的时间(这里的时间不是通过秒来进行衡量,而是通过执行指令的条数衡量的)。
3.4、进程资源的内存分配
前言:因为我们需要 避免内存访问越界(下图中进程1的指针访问到了进程2) 的情况:
我们引入了一个“虚拟地址空间”的概念(不是真实的物理内存地址)。
每当进程划分内存空间时,通过专门的 设备 MMU 来完成虚拟地址到物理地址之间的映射。
🍉🍉分析:MMU就可以针对这里的地址进行 校验,如果某个内存指针想要访问的是非法地址就通知进程(比如将其杀死),从而及时止损,避免干扰其他进程运行。
使用 虚拟地址空间,就认为进程之间存在“隔离性”(一个进程是不能直接访问另一个进程的内存数据的)。
隔离性到底是啥?
:在当前这个示例中,隔离性主要体现在,如果出现了越界访问的情况(因为在虚拟地址空间),是不会出现进程之间的冲突的。
🎈🎈总结:这种防止干扰的操作,提高了系统的稳定性,但是如果在某些特别场景(需要进程间相互配合),就很难进行交互。于是系统又引入了另一个机制:进程间通信(基于文件,socket(网卡))。