【README】
本文内容总结自 B站 《操作系统-哈工大李治军老师》,内容非常棒,墙裂推荐;
多进程图像定义:多个进程使用cpu的图像;
多进程图像是操作系统的核心图像;
【1】概述
1) PCB:
- 指的是 process control block, 进程控制块,是一个结构体(数据结构),用于记录进程状态,并按照顺序推进进程执行(分配资源,进行调度等);
- pcb说的简单点,就是用于存储cpu物理寄存器的数据的结构体,当然还需要存储进程状态,内存映射表等信息;
2)多进程图像从启动开始到关机结束
【1.1】main函数中的fork()创建第1个进程
1)fork函数:启动一个进程;
2)Linux操作系统初始化函数main函数,调用fork启动了第1个进程,该进程执行init函数,init启动一个shell程序;(window操作系统创建一个进程,启动一个桌面)
3)对于linux操作系统,用户通过shell程序创建其他进程;
- 可见,进程对于计算机的使用至关重要;因为我们每解决一个任务,计算机都会启动一个进程来执行这个任务;
4)window 打开任务管理器查看多个进程;
【补充】用户使用计算机本质
- 用户使用计算机,就是启动了一堆进程;
- 用户管理计算机,就是管理了一堆进程;
【2】多进程如何组织与存放
1)操作系统感知与组织进程:
- 全靠 PCB, process control block, 进程控制块;
- 用PCB 形成一个链表(数组)来组织多进程;
2) 进程分类:
- 正在执行的进程;
- 等待执行的进程;
- 需要等待某些事件完成后(如等待磁盘响应)再继续执行的进程;
【2.1】多进程如何组织 :PCB+状态+队列
1)进程状态:
- 新建态;
- 就绪态;
- 运行态;
- 阻塞态;
- 终止态;
2)操作系统更新进程状态,利用状态对进程进行管理,有序推进进程执行进度;
小结:
- 操作系统用PCB存储进程,用进程状态推进进程执行,对进程进行管理;
【2.2】多进程交替执行
1)schedule函数,进程切换函数;
Schedule(){ pNew = getNext(readQueue); // 获取下一个就绪进程; switch_to(pCur, pNew); // 从当前进程切换到就绪进程; } |
补充: pCur, pNew 都是PCB,进程控制块;
2)getNext() ,进程调度算法;
- 调度策略包括: FIFO-先进先出,Priority-优先级;
3)进程交替执行三个部分:
- 队列操作;
- 调度;
- 切换;
4)切换前,把物理cpu的信息,主要是寄存器内容,保存在PCB,PCB存储在内存;
(干货)可以这样理解,cpu物理寄存器内容,存储在pcb,pcb是所有物理寄存器内容存储的载体,即pcb是逻辑寄存器;
【补充】(汇编代码与C代码区别)
- 汇编代码,可以指定变量存储到某个具体的内存地址;
- 而C代码,无法做到;
- 即汇编代码可以对程序进行精细控制;
【小结】操作系统支持多进程图像所做的工作;
- 工作1)操作系统如何组织多个进程,用PCB,PCB形成队列;
- 工作2)如何完成进程切换?通过调度函数,选择下一个进程,得到下一个进程的PCB,最后把cpu中物理寄存器内容与下一个进程PCB内容(逻辑寄存器)进行交换,(需要注意的是PCB保存在内存中);
- 工作3)如何处理进程间的相互影响;
5)多进程交替执行时,如何处理相互产生的影响? 即并发访问问题;
多进程的信息存储在内存中,这样cpu才能取指执行;
如进程1操作地址100的数据,地址100存储进程2的代码,这样就会产生相互影响;
如何解决?
- 限制对地址100的读写;或 多进程的地址空间分离,即每个进程占用不同的内存地址空间;(从而可以看到,内存管理也为多进程服务的)
- 这就进入了内存管理;
【2.3】 进程管理和内存管理形成多进程图像
1) 进程的内存空间映射
- 进程1的逻辑地址100映射到物理内存地址 780;
- 进程2的逻辑地址100映射到物理内存地址 1260;
- 进程1与进程2 相互不会影响;
【2.4】多进程合作
1)进程合作:
- word进程,把word文件放入打印队列,打印进程从队列取出数据进行打印;
2)进程合作问题:
- 进程合作问题1:因为进程1和进程2交替执行,则队列7号元素存储的数据既包括进程1,也包括进程2的数据;存在数据被错误覆盖或覆写的风险;
- 进程合作问题2:生产者-消费者实例 (多进程并发执行问题,因为counter被两个进程操作)
因为多进程的并发执行问题,导致Counter语义错误,多进程合作失败;
3)进程有序合作的核心在于进程同步
进程同步指的是: 写counter时,阻断其他进程访问counter;通过加锁来阻断其他线程来访问;
【小结】
- 1) 多进程图像: 包含 pid1, pid2, pid3 多个进程;
- 2) 进程数据存储:存储在 PCB结构体,PCB存储在内存;
- 3) 多进程交替执行:通过调度函数实现,如 fifo,优先级;
- 4) 多进程合作: 每个进程都有一段独立的内存空间;若多个进程操作同一个变量,需要对变量上锁,操作完成后,解锁变量;