既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
一、进程
1**、进程的简介:**
(1)进程是程序在某个数据集合上的一次运行活动,也是操作系统进行资源分配和保护的基本单位;
(2)通俗讲:进程就是程序的一次执行过程。
(3)进程包括:正在运行的程序实体+所占用的所有资源(CPU+内存+网络资源等…)
2**、进程的组成:**
(1)进程控制块****PCB:进程存在的唯一标识,是操作系统用来记录和刻画进程状态及环境信息的数据结构,也是操作系统掌握进程的唯一资料结构和管理进程的主要依据;
进程描述信息:会分配身份证号:PID(进程ID)+UID(用户ID)
3**、进程的状态**
- 运行态(running):进程占有 CPU 正在运行。
- 就绪态(ready):进程具备运行条件,等待系统分配 CPU 以便运行。
- 阻塞态 / 等待态(wait):进程不具备运行条件,正在等待某个事件的完成。
正常是3态
有些系统会新增2态:新建态和结束态
从上图可以发现,只有就绪态和运行态可以相互转换,其它的都是单向转换。
4**、进程控制:**
对系统中的所有进程实施有效的管理,实现进程状态转换功能
(1)包括:创建进程、阻塞进程、唤醒进程、终止进程等
(2)操作系统通过原语来实现进程控制;
(3)原语:是一种特殊的程序,执行具有原子性。
也就是说:程序的运行必须一气呵成,不可中断。
为什么进程控制过程要一气呵成?
答:如果进程状态转换的过程不能一气呵成,就有可能导致操作系统中的某些关键数据结构信息不统一,会影响操作系统进行别的管理工作。
5**、进程的创建:**
(1)操作系统初始启动时会创建承担系统资源分配和控制管理的一些系统进程,同时还会创建一个所有用户进程的祖先,其他用户进程是在应用程序运行时创建的。
(2)操作系统允许一个进程创建另一个进程,而且允许子进程继承父进程所拥有的资源,当子进程被终止时,其在父进程处继承的资源应当还给父进程。同时,终止父进程时同时也会终止其所有的子进程。
创建进程的过程,也就是创建原语包含的内容如下:
(1)在进程列表中增加一项,从 PCB 池中申请一个空闲的 PCB(PCB 是有限的,若申请失败则创建失败),为新进程分配一个唯一的进程标识符;
(2)为新进程分配地址空间,由进程管理程序确定加载至进程地址空间中的程序;
(3)为新进程分配各种资源;
(4)初始化 PCB,如进程标识符、CPU 初始状态等;
(5)把新进程的状态设置为就绪态,并将其移入就绪队列,等待被调度运行。
什么事件会触发进程的创建呢?有如下四种情况:
- 用户登录:分时系统中,用户登录成功,系统会为其建立一个新的进程
- 作业调度:多道批处理系统中,有新的作业放入内存中,会为其建立一个新的进程
- 提供服务:用户向操作系统提出某些请求时,会新建一个进程处理该请求
- 应用请求:由用户进程主动请求创建一个子进程
6**、进程的终止**
进程的终止也称为撤销,进程完成特定工作或出现严重错误后必须被终止。引起进程终止的事件有三种:
- 正常结束:进程自己请求终止(exit 系统调用)
- 异常结束:比如整数除 0,非法使用特权指令,然后被操作系统强行终止
- 外界干预:Ctrl + Alt + delete 打开进程管理器,用户手动杀死进程
终止(撤销)进程的过程,也就是撤销原语包含的内容如下:
- 从 PCB 集合中找到终止进程的 PCB;
- 若进程处于运行态,则立即剥夺其 CPU,终止该进程的执行,然后将 CPU 资源分配给其他进程;
- 如果其还有子进程,则应将其所有子进程终止;
- 将该进程所拥有的全部资源都归还给父进程或操作系统;
- 回收 PCB 并将其归还至 PCB 池。
7**、进程的阻塞和唤醒**
- 进程阻塞是指进程让出 CPU 资源转而等待一个事件,如等待资源、等待 I/O 操作完成等。
- 进程通常使用阻塞原语来阻塞自己,所以阻塞是进程的自主行为,是一个同步事件。
- 当等待事件完成时会产生一个中断,激活操作系统,在系统的控制下将被阻塞的进程唤醒,也就是唤醒原语。
进程的阻塞和唤醒显然是由进程切换来完成的。
进程的阻塞步骤,也就是阻塞原语的内容为:
- 找到将要被阻塞的进程对应的 PCB;
- 保护进程运行现场,将 PCB 状态信息设置为阻塞态,暂时停止进程运行;
- 将该 PCB 插入相应事件的阻塞队列(等待队列)。
进程的唤醒步骤,也就是唤醒原语的内容为:
- 在该事件的阻塞队列中找到相应进程的 PCB;
- 将该 PCB 从阻塞队列中移出,并将进程的状态设置为就绪态;
- 把该 PCB 插入到就绪队列中,等待被调度程序调度。
阻塞原语和唤醒原语的作用正好相反,阻塞原语使得进程从运行态转为阻塞态,而唤醒原语使得进程从阻塞态转为就绪态。如果某个进程使用阻塞原语来阻塞自己,那么他就必须使用唤醒原语来唤醒自己,因何事阻塞,就由何事唤醒,否则被阻塞的进程将永远处于阻塞态。因此,阻塞原语和唤醒原语是成对出现的。
8、进程上下文切换
(1)所谓进程的上下文切换,就是说各个进程之间是共享 CPU 资源的,不可能一个进程永远占用着 CPU 资源,不同的时候进程之间需要切换,使得不同的进程被分配 CPU 资源,这个过程就是进程的上下文切换,一个进程切换到另一个进程运行。
(2)因为进程是由内核进行管理和调度的,所以进程的上下文切换一定发生在内核态。
(3)进程上下文的切换也是一个原语操作,称为切换原语,其内容如下:
- 首先,将进程 A 的运行环境信息存入 PCB,这个运行环境信息就是进程的上下文(Context)
- 然后,将 PCB 移入相应的进程队列;
- 选择另一个进程 B 进行执行,并更新其 PCB 中的状态为运行态
- 当进程 A 被恢复运行的时候,根据它的 PCB 恢复进程 A 所需的运行环境
- 引起进程上下文切换的事件,也就是某个占用 CPU 资源运行的当前进程被赶出 CPU 的原因有如下:
- 当前进程的时间片到
- 有更高优先级的进程到达
- 当前进程主动阻塞
- 当前进程终止
二、线程
1**、线程:**
(1)线程是进程中一个实体,是被系统独立分配和调度的基本单位。
(2)线程是CPU可执行调度的最小单位。
(3)也就是说,进程本身并不能获取CPU时间,只有线程才可以。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
…(img-X6BS7v8s-1715543359476)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新