文章目录
- 一、冯诺依曼体系结构
- 二、CPU基本工作流程
- CPU工作流程
- 三、操作系统
- 操作系统的基本功能
- 四、进程(process)/任务(task)
- 操作系统如何管理进程
- 描述一个进程(进程的相关属性)
- 组织若干进程
- CPU的分配
- 内存的分配
- 进程间通信
一、冯诺依曼体系结构
- CPU中央处理器:进行算术运算和逻辑判断
- 存储器:分为外存和内存,用于存储数据(使用二进制存储)
- 输入设备:用户给计算机发号施令的设备;
- 输出设备:计算机给用户汇报结果的设备
存储空间的大小
硬盘>内存>>CPU
数据访问速度
数据访问速度
CPU >>(三到四个数量级) 内存 > 硬盘
二、CPU基本工作流程
CPU构成原理:电子开关 -> 基础门电路 -> 半加器 -> 全加器 -> 加法器 -> 进行加减乘除
算术逻辑单元:ALU
控制单元:CU
指令:指导CPU进行工作的命令,主要有操作码 + 被操作数组成。指令本身也是一个数字,用二进制形式保存在内存的某个区域中
电子计算机中的CPU靠背后一个时钟来进行周期驱动
ALU + CU + 寄存器 + 时钟 = 中央处理器(CPU)
CPU工作流程
- 从内存中读取指令
- 解析指令
- 执行指令
小结:
- CPU中的PC寄存器,是决定CPU要执行哪条指令的关键
- 指令是由动作 + 操作对象组成
- CPU眼里只有指令,没有其他概念
#三、编程语言
注意,一条高级语言的一条语句(statement)往往需要很多条指令(instruction)才能完成
三、操作系统
操作系统是一组做计算机资源管理的软件的统称
操作系统位于硬件和应用程序之间
操作系统的基本功能
操作系统是一个“搞管理的软件”
1.对上,防止硬件被失控的应用程序滥用,要给各种软件提供稳定的运行环境
2.对下,向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备
四、进程(process)/任务(task)
进行就是在计算机里面运行中的程序
操作系统如何管理进程
需要管理两部分内容
描述一个进程(进程的相关属性)
由于操作系统里面主要是通过C/C++实现的,因此此处的描述就是使用C的“结构体”
该结构体称为进程控制块(process control block)(PCB)
基础属性
1.pid(进程id)。进程的身份标识
2.内存指针。指明了这个进程要执行的代码/指令在内存的哪里,以及这个进程执行中依赖的数据都在哪里(运行一个.exe文件时,操作系统就会把这个.exe文件加载到内存中,变成进程[包括指令和数据])
3.文件描述符表(程序运行过程中,经常要和文件打交道[文件是在硬盘上]),进程每次打开一个文件,就会在文件描述符表上多增加一项,(这个文件描述符表可以视为是一个数组,里面的每个元素又是一个结构体,对应一个文件的相关信息);一个进程启动后,默认打开三个文件,标准输入(System.in),标准输出(System.out),标准错误(System.err)
进程调度过程的属性
前提:并行和并发(通常统称为并发)
并行:微观上,两个CPU核心,同时执行两个任务的代码
并发:微观上,一个CPU核心,一个小的时间段执行一个进程的一小段任务,然后快速切换到其他进程,宏观上看起来就是多个进程同时执行一样
1.状态
就绪状态:随时可以去CPU上执行
阻塞/睡眠状态:暂时无法去CPU上执行
…
2.优先级
先给谁分配时间,再给谁分配时间;以及给谁分的多,给谁分的少的一种依据
3.记账信息
统计该进程被执行了多久,执行了哪些指令,排队了多久(给进程调度提供指导依据)
4.上下文
表示上次该进程释放CPU时执行的进度,然后在下次再使用CPU时恢复到这个状态,继续往下执行,即存档和读档
保存的内容就是当前CPU中各个寄存器中的数据(保存到上下文字段中<内存中>)。到时候恢复时直接把数据恢复到对应寄存器即可
组织若干进程
使用一些数据结构(Linux使用双向链表),存放描述进程的信息,方便增删改查
- “创建进程”,就是先创建出 PCB ,然后把 PCB 加到双向链表
- “销毁进程”,找到链表上的 PCB ,并且从链表中删除
- “查看任务管理器”,遍历链表
CPU的分配
操作系统对于CPU的分配,采用的是时间模式———不同的进程在不同(或相同)的时间段去使用CPU资源(并发)
内存的分配
早期操作系统在一块内存运行着多个进程,如果一个进程出现bug(比如修改了0x0这种非常特殊的内存数据),那么就极有可能殃及池鱼,严重的导致系统进程崩溃。因此,现代操作系统采用了”虚拟地址“的方法,不让进程访问到实际的物理地址,每个进程只能使用系统分配给自己的那块内存,多个进程之间相当于隔离开(比如A和B的虚拟地址都是0x1000—0x2000,但实际上它们的内存地址并不是一块)
进程间通信
由于现代系统采用虚拟内存分配,因此各个进程之间就无法感知到各自的存在,但是有时进程之间需要“信息交换”,这个时候就需要提供所谓的“公共空间”,这样A将数据存到公共空间中,B再访问公共空间将数据取走,就实现了进程间通信
主流操作系统提供的进程通信机制有很多种,现在最主要的进程通信机制是下面两种:
1.文件操作
2.网络操作(socket)