一. 程序, 进程
程序 : 未完成特定任务, 用某种语言编写的一组指令的集合. 即指一段静态的代码, 静态对象
进程 : 程序的一次执行过程, 或者是正在内存中运行的应用程序, 是动态的.
-
程序只是占用了硬盘的空间, 而进程会消耗CPU资源, 内存资源, 硬盘资源, 网络带宽
-
进程是操作系统调度和分配资源的最小单位, 系统在运行时会给每个进程分配不同的内存区域.
-
每个进程都有一个独立的内存空间, 系统运行一个程序即是一个进程从创建, 运行, 到消亡的过程(生命周期).
二. 进程的管理
在进程数量非常多的时候, 需要对进程进行管理.
-
先描述: 会使用一个专门的结构体(PCB 进程控制块), 来记录进程中的每个属性.
-
PCB中大概都有什么?
-
PID 进程的标识

-
内存指针, 表示了该进程对应的内存资源, 内存资源中主要存储了.exe文件中加载过来的指令和数据
-
文件描述符表, 记录当前进程正在使用哪些文件.打开一个文件, 就会产生一个文件描述符, 同时会使用文件描述符表(类似于数组), 把文件描述符给组织起来.
-
-
-
再组织: 绘制用一系列的数据结构(Linux通常使用双向链表), 把多个进程进行一个有效的组织, 随时方便进行遍历, 查找, 汇总数据.
- 使用双向链表组织的时候,
- 查看进程的列表 -> 遍历链表
- 创建进程 -> 创建了PCB结构体, 并插入到链表上
- 销毁进程 -> 将PCB结构体从链表上删除并释放
- 使用双向链表组织的时候,
三. 进程的运行
3.1 单核CPU和多核CPU
进程是在CPU上执行的, CPU分为单核CPU和多核CPU.
单核CPU在一个时间单元内, 只能执行一个进程的任务. 例如, 可以把CPU看成是医院的医生诊室, 在一定时间内只能给一个病人诊断治疗。所以单核CPU就是, 代码经过前面一系列的前导操作(类似于医院挂号,比如有10个窗口挂号), 然后到cpu处执行时发现, 就只有一个CPU(对应一个医生), 大家排队执行.
这时候想要提升系统性能, 只有两个办法, 要么提升CPU性能(让医生看病快点), 要么多加几个CPU(多整几个医生), 即为多核的CPU. 还有超线程技术, 即是1个CPU物理核心当做是2个逻辑核心.
有些电脑就会显示为8核16线程, 我的电脑是14核20线程的(大小核)

3.2 进程的调度
**并行 **: 指两个或多个事件在同一时刻发生. 指在同一时刻有多条指令再多个CPU核心上同时执行. 比如, 多个人同时做不同的事.
并发 : 之两个或多个事件在同一个时间段内发生. 即在一段时间内, 有多条指令在单个CPU核心上快速轮换, 交替执行, 使得在宏观上具有多个进程同时执行的效果.
操作系统在调度这些进程的时候, 可能是按照并行的方式来调度, 也可能是按照并发的方式来调度. 通常统称为并发.
PCB中关于进程调度相关的属性, 这些属性也就描述了进程对应的CPU资源的使用情况.
- 状态
- 就绪状态
- 阻塞状态
- 优先级 : 操作系统在调度的时候不是绝对公平的.
- 上下文 : 由于进程是轮番调度的, 所以一次调度可能会运行不完, 所以需要把产生的中间数据记录好. 对于操作系统来说, 记录的上下文是该进程在执行过程中, CPU的寄存器中对应的数据.
- 寄存器中, 有的是存一些中间结果, 有的是存一些特定含义的数据. 这些寄存器中的数据就需要在进程离开CPU之前, 都保存到对应进程的PCB的上下文字段中(内存中), 下次该进程回到CPU执行, 就可以把PCB中的上下文里的数据再恢复到对应的寄存器中, 进程就变成和上次一模一样的状态了
- 记账信息 : 相当于一个统计信息, 会统计每个进程在CPU上执行的时间, 执行了几个指令了, 是对于进程调度进行的一个"兜底", 防止某个进程执行太长时间, 某个进程没有机会执行.
四. 进程的内存分配
每个进程, 都需要一定的内存资源, 而早期的操作系统是直接把物理内存分配给了进程, 这就带来了一个严重的问题: 如果某个进程内部的代码出现bug, 内存越界访问了, 就可能会影响到别的进程, 非常影响系统的稳定性.
所以操作系统就引入了"虚拟地址空间", 有效解决了上述问题.
- 虚拟地址不是物理内存上真实存在的地址, 只是在该进程内存在.
- 不同的进程中, 可以存在相同的虚拟地址, 但实际上映射到的是不同的物理内存.
- 虚拟地址和物理地址, 操作系统可以灵活的转换.
- 但是在应用程序中, 只能看到虚拟地址.
这样设定之后, 每个进程的有效的虚拟地址都是固定的范围, 进程使用虚拟地址的内存时, 都需要操作系统将其转换成物理地址, 转换过程中, 就可以针对虚拟地址是否有效做出一个校验, 当系统检查出了非法地址的使用时, 就可以及时的通知这个进程, 甚至直接让进程结束, 避免影响到其他进程, 进而提高了系统的稳定性.
在虚拟地址空间的加持下, 进程就有了"独立性"(一个进程无法直接访问或修改其他进程虚拟地址空间的内容)
五. 进程间通信
进程间通信, 就是在进程隔离性的基础上, 让进程之间能够有限制的相互影响.
进程之间进行通信的方法有很多, 无论哪种办法, 本质都是一样的: 通过一个公共的, 多个进程都能访问到的区域, 借助该区域完成数据的交换.
-
文件(公共区域: 硬盘)
进程之间进行通信的方法有很多, 无论哪种办法, 本质都是一样的: 通过一个公共的, 多个进程都能访问到的区域, 借助该区域完成数据的交换. -
文件(公共区域: 硬盘)
-
网络(socket 公共区域: 网卡)
1305

被折叠的 条评论
为什么被折叠?



