线代的计算机,大多遵守冯诺依曼体系结构。

CPU 中央处理器: 进行算术运算和逻辑判断. 存储器: 分为外存和内存, 用于存储数据(使用二进制方式存储) 输入设备:用户给计算机发号施令的设备. 输出设备: 计算机个用户汇报结果的设备.
针对存储空间: 硬盘 > 内存 >> CPU
针对数据访问速度: CPU >> 内存 > 硬盘
操作系统是一个软件。
操作系统的两个基本功能:

进程是操作系统对一个正在运行的程序的一种抽象,换言之,可以把进程看做程序的一次运行过程; 同时,在操作系统内部,进程又是操作系统进行资源分配的基本单位。简而言之,一个跑起来的程序就是一个“进程。” 每个进程都对应一些资源。 进程是操作系统资源分配的基本单位!


句柄(handler):系统中包含很多的软件资源,写代码就需要用到一些软件资源。软件资源是在操作系统内核中,在应用程序的代码中,不方便直接操作。句柄,就相当于一个遥控器(简单的整数。编号)通过系统调用这个句柄就可以操作软件资源了。 进程是一个很重要的“软件资源”。是由操作系统内核负责管理的。 而这种管理是以描述+组织的形式。描述是讲清楚都有哪些属性特征。组织是通过一定的数据结构,把多个这样的单位穿起来。 描述:使用结构体(C语言的结构体)来描述进程属性。这个结构体,叫做PCB(进程控制块)。 组织:通过双向链表。来把多个PCB串在一起。(注意,不是一个单纯的双向链表)

创建一个进程,本质上就是创建一个PCB这样的结构体对象,把它插入到链表中。 销毁一个进程,本质上就是把链表上的PCB节点删除掉。 任务管理器查看到的进程列表,本质上就是遍历这个PCB链表。
PCB里面有哪些描述了进程的特征:

并行:微观上同一时刻,两个核心上的进程,就是同时执行的。 并发:微观上同一时刻,一个核心上只嗯呢该运行一个进程,但是它能够对进程快速的切换。 宏观上,我们是感知不到的。所以讲并行和并发统称为并发。 进程调度相关的属性: 1)进程的状态 就绪状态:进程随时准备好去CPU上执行 运行状态:正在运行的。 阻塞状态:短时间内无法到CPU上执行。(比如:正在进行密集IO操作,读写数据) 2)优先级 进程也是有优先级的。操作系统进行调度并不是平均分配。 3)上下文 操作系统正在进行进程切换的时候,就需要把进程执行的“中间状态”记录下来。下次这个进程在上CPU上运行时,就可以恢复上次的状态。上下文,本质上就是存档的内容;进程的上下文,就是CPU中各个寄存器(CPU内置的存储数据模块,保存的就是程序运行过程中的中间结果)的值;保存上下文,就是把这些CPU寄存器的值,记录保存到内存中。恢复上下文,就是把内存中的哲学寄存器值恢复回去。 4)记账信息:操作系统,统计每个进程在CPU上占用的时间和执行的指令数目。根据这个来决定下一阶段如何进行调度。
操作系统对内存资源的分配,采用的是空间模式——不同进程使用内存中的不同区域。互相之间不会干扰。 程序中所获取到的内存地址,并非是真实的物理内存的地址,而是经过了一层抽象,虚拟出来的地址。 假如我们把内存比作一栋楼,楼里有很多个小房间。那么,每个房间的门牌号,就是“地址”。这个地址也就是“物理地址”。 内存具有随机访问的特性。

针对进程使用的内存空间,进行“隔离”引入了虚拟地址空间。代码中不再直接使用真实的物理地址了。而使用的是虚拟的地址。 由操作系统和专门的硬件设备负责进行虚拟地址到物理地址的转换。

虚拟地址空间。主要就是为了避免进程之间相互产生影响。 虽然进程隔离了。但是在我们实际中,进程之间,需要进行数据的交互。于是,进程间通信,我们需要做一个多个进程都能访问到的“公共空间”,基于这个“公共空间”来进行数据交互即可。