摄影分享~
文章目录
- 冯诺依曼体系
- 操作系统
- 操作系统的定位
- 进程/任务(process/task)
- 内存管理
冯诺依曼体系
线代的计算机,大多遵守冯诺依曼体系结构。
CPU 中央处理器: 进行算术运算和逻辑判断.
存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储)
输入设备:用户给计算机发号施令的设备.
输出设备: 计算机个用户汇报结果的设备.
针对存储空间:
硬盘 > 内存 >> CPU
针对数据访问速度:
CPU >> 内存 > 硬盘
操作系统
操作系统是一个软件。
- 对下:要管理硬件设备。
- 对上:要给软件提供稳定的运行环境。
操作系统的定位
操作系统的两个基本功能:
- 防止硬件被时空的应用程序滥用;
- 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
进程/任务(process/task)
进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程;
同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。简而言之,一个跑起来的程序就是一个“进程。”
每个进程都对应一些资源。
进程是操作系统资源分配的基本单位!
句柄(handler):系统中包含很多的软件资源,写代码就需要用到一些软件资源。软件资源是在操作系统内核中,在应用程序的代码中,不方便直接操作。句柄,就相当于一个遥控器(简单的整数。编号)通过系统调用这个句柄就可以操作软件资源了。
进程是一个很重要的“软件资源”。是由操作系统内核负责管理的。
而这种管理是以描述+组织的形式。描述是讲清楚都有哪些属性特征。组织是通过一定的数据结构,把多个这样的单位穿起来。
描述:使用结构体(C语言的结构体)来描述进程属性。这个结构体,叫做PCB(进程控制块)。
组织:通过双向链表。来把多个PCB串在一起。(注意,不是一个单纯的双向链表)
创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入到链表中。
销毁一个进程,本质上就是把链表上的PCB节点删除掉。
任务管理器查看到的进程列表,本质上就是遍历这个PCB链表。
PCB里面有哪些描述了进程的特征:
- PID进程的身份标识符(唯一的数字)
- 内存指针:指向了说自己的内存是哪些
- 文件描述符表:硬盘上的文件等其他资源
- 操作系统中有一个很重要的模块调度器,就负责让有限的CPU来调度执行进程。现在我们的电脑上基本都是多核CPU。
并行:微观上同一时刻,两个核心上的进程,就是同时执行的。
并发:微观上同一时刻,一个核心上只嗯呢该运行一个进程,但是它能够对进程快速的切换。
宏观上,我们是感知不到的。所以讲并行和并发统称为并发。
进程调度相关的属性:
1)进程的状态
就绪状态:进程随时准备好去CPU上执行
运行状态:正在运行的。
阻塞状态:短时间内无法到CPU上执行。(比如:正在进行密集IO操作,读写数据)
2)优先级
进程也是有优先级的。操作系统进行调度并不是平均分配。
3)上下文
操作系统正在进行进程切换的时候,就需要把进程执行的“中间状态”记录下来。下次这个进程在上CPU上运行时,就可以恢复上次的状态。上下文,本质上就是存档的内容;进程的上下文,就是CPU中各个寄存器(CPU内置的存储数据模块,保存的就是程序运行过程中的中间结果)的值;保存上下文,就是把这些CPU寄存器的值,记录保存到内存中。恢复上下文,就是把内存中的哲学寄存器值恢复回去。
4)记账信息:操作系统,统计每个进程在CPU上占用的时间和执行的指令数目。根据这个来决定下一阶段如何进行调度。
内存管理
操作系统对内存资源的分配,采用的是空间模式——不同进程使用内存中的不同区域。互相之间不会干扰。
程序中所获取到的内存地址,并非是真实的物理内存的地址,而是经过了一层抽象,虚拟出来的地址。
假如我们把内存比作一栋楼,楼里有很多个小房间。那么,每个房间的门牌号,就是“地址”。这个地址也就是“物理地址”。
内存具有随机访问的特性。
针对进程使用的内存空间,进行“隔离”引入了虚拟地址空间。代码中不再直接使用真实的物理地址了。而使用的是虚拟的地址。
由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换。
虚拟地址空间。主要就是为了避免进程之间相互产生影响。
虽然进程隔离了。但是在我们实际中,进程之间,需要进行数据的交互。于是,进程间通信,我们需要做一个多个进程都能访问到的“公共空间”,基于这个“公共空间”来进行数据交互即可。