文章目录
- 概念
- 进程的状态
- 进程控制块(PCB)
- 进程的控制
- 发生的场景
- 线程
- 线程的状态
- 优点:
- 线程上下文的切换
- 线程的实现
前言
本文主要参考了教程和小林coding的图解系统,介绍一些进程和线程的概念。
进程
比如我们写好一行行代码,我们需要把这个代码送进学校(进程),而学校可能会分成一个个学院(线程),而教育局充当着操作系统的角色。
概念
进程是可并发执行的程序在某个数据集合上的一次计算活动,也是操作系统进行资源分配和保护的基本单位。
比如我们写了一个java程序,如果不运行就是一个位于磁盘的文件,但是如果经过jvm编译过后,再运行class文件,就会被装载到内存中,这个运行程序就可以被称为进程。
进程的状态
运行状态:CPU正在运行该进程
就绪状态:可运行,由于其他进程处于运行状态而展示停止运行
阻塞状态(等待、睡眠):该进程正在等待某一事件产生而暂时停止运行。
进程的挂起:
进程暂时不参与调度,停止工作,而阻塞状态是在等待某个事件的返回
进程控制块(PCB)
PCB是进程的唯一标识,一个进程的存在,一定会有一个PCB。
PCB包含以下信息:
- 流程描述信息: 进程标识符PID和用户标识符UID
- 进程控制和管理信息:CPU、磁盘、网络流量使用情况统计和进程当前状态
- 资源分配清单:正在使用哪些文件、内存区域和IO设备
- 处理机相关信息:PSW、PC等值。
进程的控制
这些功能都由操作系统的原语实现的。原语是在内核态下执行,完成系统特定功能的过程,其特点是执行过程中不允许被中断,是一个不可分割的基本单位,原语的执行是顺序的而不可能是并发的。
原语的实现是以系统调用方式提供原语接口,且采用设置中断屏蔽位来实现。
进程的创建
- 为进程分配一个进程的id
- 为进程分配资源,资源不足就进入等待状态
- 初始化PCB
- 把新进程状态设置为就绪态,移入就绪进程队列
进程的终止
- 查找需要终止的进程的PCB。
- 如果处于执行状态,立即终止该进程的执行,将资源归还给操作系统。
- 如果还有子进程,将其子进程终止。
- 回收PCB,归还到PCB池。
进程的阻塞
当进程需要等待事件完成时,需要调用阻塞语句进入阻塞等待状态。
- 停止进程执行,保存现场信息到PCB。
- 修改进程PCB有关内容,将进程的状态改为阻塞状态。
- 将PCB插入到阻塞队列中去。
进程的唤醒
- 从等待队列移出对应的PCB。
- 修改进程PCB的有关信息,将进程状态修改为就绪态,移入就绪队列。
- 若被唤醒进程比当前运行进程优先级高,重新设置调度标志
CPU的上下文切换
CPU寄存器和程序计数是CPU在运行任何任务前,所依赖的环境,这些环境称为CPU的上下文。
当中断/系统调用发生时,暂时中断正在执行的用户进程,把进程从用户状态切换到内核状态,去执行操作系统服务程序以获得服务,这就是一次模式切换。
进程的上下文切换
进程上下文切换时让处于运行态的进程中断运行,让出处理器,这时需要做一次进程上下文切换即保存老进程状态而装入被保护了的新进程的状态,以便新进程的运行。
发生的场景
- 当进程的时间片耗尽时,当前这个进程就会从运行状态变成就绪状态。
- 进程在系统资源不足时,要等到资源满足后才可以运行,这个时候进程也会被挂起,并由系统调度其他进程进行
- 当有优先级更高的进程运行时,为了高优先级进程先运行,当前进程会被挂起,由高优先级进程来运行
- 当发生硬件中断时,CPU上的进程会被中断挂起,转而执行内核中的中断服务程序。
线程
线程(英语:thread)是操作系统是调度和分派的基本单位。
组成:
线程的状态
运行、阻塞、就绪和阻塞。
挂起状态对线程是没有意义,进程挂起是需要换出主存,则所有线程因共享进程的地址空间对换出到外存。
优点:
- 一个进程可以存在多个线程,线程切换速度快。
- 各个线程之间可以并发执行。
- 各个线程之间可以共享地址空间和文件等资源。
线程上下文的切换
进程和线程的区别:线程是调度的基本单位,而进程是资源拥有的基本单位。
如果两个线程是同一个进程:
由于两个线程的虚拟内存是共享的,所以在切换时,只需要切换线程的私有数据,寄存器等不共享的数据
如果两个线程不是同一个进程:
线程切换的过程和进程上下文切换一样。
线程的实现
线程的实现方式主要包括用户级线程、内核级线程、混合式线程。
内核级线程
线程线程是操作系统管理,线程的创建、终止、管理都是由操作系统负责,内核可见。
用户级线程
内核不可见,线程管理由应用程序完成,
混合式线程
既支持用户级线程,又支持内核级线程
线程和进程的比较
- 进程是操作系统资源分配的单位,线程是CPU调度的单位。
- 进程拥有独立的资源平台,而线程只独享一些必需的资源。
- 线程和进程都有就绪、等待、执行基础状态,但是线程的挂起没有什么实际意义。
- 线程可以减少并发执行的时间和空间开销。