目录
1.何为操作系统?
操作系统(Linux win Mac 等等)是一个软件:搞管理的软件
管的啥? 1.对下要管理硬件设备 2.对上要给软件提供稳定的运行环境
进一步的认为:操作系统是软件 硬件 用户之间交互的媒介!!!
1.2 操作系统定位
2.进程
一个跑起来的程序(正在运行的程序)就是一个进程
反言之,没在运行就是不是进程!!!
系统中包含很多的软件资源(进程就是一种软件资源)写代码的时候就需要这些软件资源,但是软件资源在操作系统的内核中,在代码中无法直接跳过系统调用直接对内核进行操作,这时候就需要一个类似“遥控器” 进行操作 这个遥控器(简单的整数/编号)就叫 句柄 (handler)
通过系统调用借助这个句柄就可以直接操作软件资源了
进程是一个重要的软件资源,是由操作系统内核负责管理的!!!
2.2 如何管理进程的?
可以分为俩部分 : 描述 + 组织
①. 描述
描述就是讲清楚进程属性特征
描述:使用一个结构体(就是c语言) 来描述进程属性
用来描述进程的结构体就叫 PCB (进程控制块)
②. 组织
通过双向链表(不是单纯的双向链表)将多个PCB串在一起
其实可以理解为:
创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入链表
销毁一个进程,本质上就是把链表上的PCB删除掉
任务管理器看到进程列表,就是遍历
2.3那么PCB描述了哪些进程的特征
1.pid进程的身份标识符(唯一的数字)
身份证可以这样理解~~
2.内存指针 指向了说自己的内存有哪些
3.文件描述符表 :硬盘上的文件等其他资源
2,3都是描述了进程持有 了哪些硬件资源 硬件资源,内存等等都好分,但是CPU不好分~~
因为进程少说数百个,但是cpu就那么几个,造成了“狼多肉少”的问题,我们就希望“同时运行”——分时复用
并行:微观上同一时刻,俩个核心上的进程,同时执行
并发:微观上同一时刻,一个核心只能运行一个进程,但是它能够对进程进行快速的切换 宏观上人 感知不到的
这俩内核负责处理,程序员也感知不到,因此统称 并发~~
因此操作系统里有一个重要的模块调度器,就专门负责让有限的CPU来调度执行这么多的进程~~
4.进程调度相关的属性:
1.进程状态:
就绪状态:随叫随到
运行状态:正在运行
阻塞状态:短时间无法响应
2.优先级:
先给谁排,给谁排多?.......
操作系统调度的时候,不会一碗水端平的,要涉及优先级
3.上下文:
操作系统在进行进程切换的时候,需要把进程执行的“中间状态”记录下来,保存好~~
下次这个进程再上CPU运行的时候,可以恢复上次的状态——存档,读档
进程的上下文,就是CPU中的各个寄存器的值:CPU内置的存储数据的模块,保存的就是程序运行过程中中间结果
保持上下文,把这些CPU中寄存器的值 记录到内存(PCB)中
恢复上下文,就是把内存中的值恢复回去
4.记账信息:
操作系统 统计每个进程在CPU上占用的时间和执行的指令数目,根据这个来决定下一阶段如何调度
3.内存管理
虚拟地址空间:程序中获取的内存地址,并非真实的物理内存地址,而是经过了一层抽象,虚拟出来的地址~~
//内存有个了不得的特性,它可以随机访问:造就了数组取下标操作时O(1)
但是,如果程序1有bug造成越界访问,可能会影响到程序2
因此,针对进程使用的内存空间,进行“隔离”引入了虚拟地址空间!!!代码里不再直接使用真实的物理地址了,而是使用虚拟地址,由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换~~
MMU也就是能说让转换更快一点,集成到CPU中~~
4.进程间通信
虽然进程隔离了,但是又出现了问题,有些进程之间需要进行数据的交互~~
就需要在隔离的基础上,开个口子
进程间通信,实现方式很多,但是核心思路是一致的,需要整一个“公共空间”,基于这个公共空间来进行交互数据~~
这里的通信方式/公共空间,有很多的具体体现形式~~
但是我们主要讲的是 基于文件与基于网络~~