目录
3.1进程控制块抽象(PCB Process Control Block) ——操作系统的管理
1.冯诺依曼体系
- CPU 中央处理器: 进行算术运算和逻辑判断.(CPU本质是基础的门电路组合)
- 存储器: 分为外存和内存(此处指的是内存), 用于存储数据(使用二进制方式存储)
- 输入设备: 用户给计算机发号施令的设备 .(键盘\鼠标\写板)
- 输出设备: 计算机个用户汇报结果的设备.(打印机\显示器)
针对存储空间 : 硬盘 > 内存 >> CPU
针对数据访问速度 : CPU >> 内存 > 硬盘 (CPU集成度非常高,包含了很多门电路,因此跑得快(执行效率高))
CPU 中的 PC 寄存器,是决定 CPU 要执行哪条指令的关键;
2. 指令: 由动作 + 操作对象组成
3. CPU 眼中只有指令,没有其他概念
2.操作系统OS
操作系统:一组做计算机资源管理的 软件的统称。目前常见的操作系统有:Windows系列、Unix系列、Linux系列、OSX系列、Android系列、iOS系列、鸿蒙系列. 任何计算机系统都包含一个基本的程序集合,称为操作系统(OS),包括 :
- 内核 (进程管理,内存管理,文件管理,驱动管理)
- 其他程序(例如函数库,shell程序等等)
操作系统的定位是:可理解为 负责"管理"所有软件的一款软件(系统)
设计操作系统的目的 :
- 与硬件交互,管理所有的软硬件资源(对内且对下)
- 为用户程序(应用程序)提供一个良好的执行环境(对外且对上)
可参考下图进行理解 , 需要实现软硬件之间的管理
1. 管理者的任务按照种类分两种:硬型基础设备管理和软性业务管理
2. 按照目标对象分两种:一种对内的管理,一种对外业务进行
操作系统由两个基本功能:
- 防止硬件被时空的应用程序滥用;
- 向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
程序 : 一组指令以及这组指令要处理的数据。狭义上来说 通常表现为一组文件
程序 = 指令 + 指令要处理的数据。
汇编语言和机器语言(即指令)是一一对应的,程序员完成编码之后,编译器把高级编程语言(如Java、C#)编写的程序转换为可执行的机器语言。其具体过程 : 先把高级语言编写的程序转换为汇编指令(assembly instruction),然后再转换为可执行的机器语言。
高级语言的一条语句(Statement)往往对应很多条指令(Instruction)才能完成。
3.进程/任务
对操作系统来说,任务(即进程:正在运行的一个“程序”)。
可执行文件(.exe)都是静态处于硬盘里,而执行之后就变为动态的进程(运行一个exe文件,OS会把其加载到内存中,变为进程),进程执行的二进制指令(由编译器生成)
进程是担当分配系统资源(CPU时间,内存)的实体,具有动态特性(如:打开一个应用程序,再关闭之前,该状态(进程)一直是保持开启的,未被关闭)。
线程:是进程里的一部分,进程包含线程(可理解进程是工厂,线程是内部的生产线)
进程工作,需要OS分配硬件资源:CPU、内存、磁盘、网络带宽等
- 进程:系统分配资源的基本单位
- 进程最核心的问题:进程在系统中是如何被管理的??----->并发式执行
- 操作系统对内存资源的分配:采用的是空间模式 —— 不同进程使用内存中的不同区域,互相之间不会干扰。
3.1进程控制块抽象(PCB Process Control Block) ——操作系统的管理
Linux OS如何管理进程:
- 先描述一个进程,明确进程中的相关属性(使用PCB),OS中是通过C/C++实现的
- 再组织若干个进程(使用数据结构(双向链表把每个进程串起来),把描述进程的信息放在一起,进行增删改查)
(用C语言的结构体来实现进程有哪些属性):描述进程的这个结构体,称为“PCB”
每一个 PCB 对象,就代表着一个实实在在运行着的程序,也就是进程(进程的唯一标识 —— pid)。
- 创建进程:先创建PCB,再将PCB加到双向链表
- 销毁进程:先找到链表上的PCB,并且从链表中删除
- 查看任务管理器:遍历链表,查找信息
进程(PCB)的基本属性:
- 1.pid:进程的唯一身份标识
- 2.内存指针(该进程使用的内存空间范围,代码和其依赖的数据在内存的位置)
- 3.文件描述符表(该进程打开了那些文件(存放在硬盘))---->文件操作:打开/读写/关闭文件。每打开一次文件,文件描述符表(可理解为一个数组)就增加一项内容(一个内容对应一个结构体,记录着当前文件的相关信息)。进程只要启动,就会默认打开三个文件:标准输入(System.in)、标准输出(System.out)、标准错误(System.err)
3.2进程调度
进程调度,也即是OS考虑如何为各个进行分配资源
- ............下面的比较重要....------>用于进程调度
- 进程状态: R,S,X 描述当前进程该如何被调度
- 进程优先级: 哪个先执行
- 进程上下文:须记住上次运行到那个指令,以便于下次继续运行(存档和读档),存储调度出CPU之前,寄存器中信息(寄存器里的内容保存到内存)进程被调度出CPU之前,先把CPU中所有寄存器数据保存到内存,进行数据存档,以便于下次调度直接从内存中恢复数据
- 进程记账信息:记录进程在CPU运行了多久(决定是在CPU执行,还是调度出去)
就绪(excute):进程处于可运行的状态,只是CPU时间片还没有轮转到该进程,则该进程处于就绪状态。
运行(running):进程处于可运行的状态,且CPU时间片轮转到该进程,该进程正在执行代码,则该进程处于运行状态。
阻塞/睡眠(sleep):进程不具备运行条件,正在等待某个事件的完成
3.3内存分配(虚拟地址)
进程的虚拟地址空间:一定程度的减少内存访问越界带来的后果;
- 优点:使得进程之间的隔离性更强,稳定性更好(独立性更好)
- 缺点:当两个进程需要配合时,信息交流比较麻烦,但可使用(进程通信)
虚拟地址越界:会使得当前进程崩溃,而不影响其他地址;
使用真实地址越界:会使其他进程受到影响而崩溃
3.4进程间的通信
由于进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存
在的(进程之间相互独立),即进程之间互相具备”隔离性(Isolation)“。
而对于一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要多进程进行配合,因此,进程之间就需要有进行“信息交换“的需求。(设置一个公共空间,将数据存放于此,在此实现信息交互)
目前,主流操作系统提供的进程通信机制有如下:
- 1. 管道 :内核中提供队列
- 2. 共享内存
- 3. 文件:
- 4. 网络:一种相对特殊的 IPC 机制,它除了支持同主机两个进程间通信,还支持同一网络内部非同一主机上的进程间进行通信
- 5. 信号量
- 6. 信号
最常用的两种通信方式:文件操作、网络操作(socket)
网络支持通信:
1.同主机的两个进程
2.同一网络下内部不同主机上的进程通信
3.5并发与并行
目前,多核CPU已经非常普及了,但由于任务数量远远多于CPU的核 数量,所以,操作系统也会自动把很多任务轮流调度到每个核心上执行。
并行式执行:同一时刻,多条指令在多个处理器上同时执行;
并发式执行:同一时刻,只能有一条指令执行,但多个进程指令被快速轮换执行,(宏观)多个进程同时执行的效果。
操作系统对执行权限进行分级:用户态和内核态。
操作系统内核(内核态)作为直接控制硬件设备的底层软件,权限最高;用户程序的权限最低,称为用户态。