5.1 进程线程基础知识
进程
进程的基本定义:
进行的程序。代码经过编译,变成二进制可执行文件,运行这个可执行文件后,装载到内存中,然后CPU执行其中指令。
并行和并发:
并行指两个任务并列前行,并发指两个任务交替进行。
那么进程为什么会交替呢?因为有的进程会处于暂停等待状态,这时候就需要让出cpu的计算资源。因此,进程主要分三个状态:就绪,阻塞,运行
就绪:等别的进程用好cpu资源
阻塞:有事用不了cpu资源
运行:正在使用cpu资源
还有开始结束状态不说了
那么在阻塞的进程等待过程中,实际上占用这物理内存,这很难受,因此需要把这个物理内存交换到硬盘,等再运行的时候,再接入到物理内存
因此,还需要一个挂起状态,指进程实际上没有占用物理内存
因此:
阻塞挂起状态:指进程在硬盘等待某事的发生
就绪挂起状态:进程在硬盘,只要进入内存立马运行
进程的控制结构
进程控制块PCB process control block PCB
PCB和进程绑定:
包含进程描述信息(pid),进程控制(当前状态,阻塞,就绪,运行),进程优先级。资源分配清单(关于内存地址,打开文件列表,和OI信息)。CPU相关信息,很重要,进程被切换时,状态保存在对应的PCB中,重新执行进程时,能从断点处继续执行
进程的控制
1、创建进程
申请一个空白的PCB并填写相关信息,分配资源,将这个pcb插入到就绪队列
2、终止进程
有三种:正常结束,异常结束,外界干预(kill)
3、阻塞进程
一旦一个进程被阻塞,只能由另一个进程唤醒
过程:寻找阻塞进程的PCB,然后将其转为阻塞,然后将PCB插入到阻塞进程中
4、唤醒进程
过程:
在该事件的阻塞队列中找到相应进程PCB,然后移出阻塞队列,标记为就绪状态,然后插入到就绪队列中等待调度
进程的上下文切换
一个进程切换到另一个进程,称为上下文切换
先介绍CPU的上下文切换:CPU中有着CPU寄存器和程序计数器,每次运行的时候都依赖的环境。CPU上下文切换就是把前一个任务的上下文(寄存器和程序计数器)保存下来,然后加载新任务的上下文,运行新任务。
系统内核保存的就是上一次的上下文信息
那么进程的上下文切换:
除了虚拟内存,栈,全局变量等用户空间的资源,还包括内核堆栈、寄存器等内核空间的资源。
线程
用于满足:实体之间可以并发运行,且共享地址空间
线程是进程中的一条执行流程。
同一进程内,多个线程可以共享代码段、数据段 、打开的文件等资源,但每个线程都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。
线程和进程的比较
进程是资源(内存,文件)分配单位,线程是CPU的调度单位
进程拥有完整资源平台,线程只独享寄存器和栈
线程同样具有就绪、阻塞、执行的三种状态
现成能减少并发执行的时间和开销
线程比进程更能节约时间:
1、线程创建时间短(不需要像进程一样创建那么多,只需要寄存器和栈),共享进程的资源
2、线程终止时间快,释放的资源少
3、同一个进程内线程切换速度比进程快,因为线程共享一个虚拟空间,也就是同一个进程的线程的页表一样,不需要切换页表这个开销
4、数据交互时候不需要经过内核,这就使得线程之间的数据交互效率更高
线程的上下文切换
线程是调度的基本单位,进程是资源拥有的基本单位
线程的上下文切换的是什么?
1、若不同进程的线程,则切换过程和进程上下文一样
2、若相同线程,虚拟内存共享,因此只切换寄存器,栈等信息,因此开销很小
线程的实现
1、用户线程:在用户空间实现的线程,不是内核管理的,用户态的线程库来管理的线程
2、内核线程:在内核中实现的线程,内核管理
3、轻量级线程:内核中支持用户线程
用户线程,内核线程存在一对一,多对一,一对多的关系
用户线程
用户线程是基于用户态的线程管理库来实现的,线程控制块TCB(Thread Control Block)也是库中实现的,操作系统看不到,只能看到PCB(进程控制块)
因此操作系统不直接参与线程的管理和调度。
内核线程
调度