目录
进程总结
线程总结
进程与程序的区别
程序是静态的,进程是动态的,是程序的一次执行,同一个程序的多次执行对应多个进程。
进程的概念
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。
PID,每一个进程,系统会为其分配一个PID地址,所以同一个程序的多次执行创建的多个进程是不同的。
系统为每一个进程配置一个专门的数据结构,称为进程控制块(PCB),用来描述进程的过程和基本情况。
PCB是进程存在的唯一标志,进程创建时,也会创建相应的 PCB,进程结束时,会回收PCB。
进程实体由PCB、数据块(进程运行的过程中产生的各种数据)、程序块组成。进程是动态的、进程实体是静态的,进程实体反映了每一时刻进程的状态。(同时挂三个QQ、会创建三个不同的进程,各自的PCB、数据块都不相同,但其程序块的内容是相同的,都是运行相同的程序)
进程的特征
动态性、并发性、独立性、异步性、结构性。
进程的状态与转换
进程的状态
三种基本状态——就绪态、执行态、阻塞态
创建态
就绪态(进程创建完成准备执行的状态,具备运行条件,需要等待空闲的CPU)
执行态(进程执行时的状态,占有CPU,并在CPU上运行)
阻塞态(进程在执行的过程中,可能会等待某个事件的发生而无法进行、如等待系统资源的分配、或者等待其他进程的响应。)
终止态(进程运行结束或运行的过程中遇到不可修复的错误)。
进程的转换
注意:阻塞态不能直接转换为执行态、也不能直接由就绪态转换为阻塞态。
阻塞态是进程在执行的过程中主动请求的,所以由阻塞态转换为执行态,需要等阻塞态的主动请求完成然后进入就绪态,最后等待进入执行态;由就绪态转换为阻塞态,需要进程进入执行态,运行的过程中主动请求然后进入阻塞态 。
执行态---》阻塞态是主动行为, 而阻塞态----》就绪态是被动行为。对于执行态,如果CPU为单核,执行态只能有一个进程执行,多核可以由多个进程并发进行。
进程控制
进程的控制是通过原语实现的,原语具有原子性。 进程的控制也就是控制进程的状态转换。
进程的控制分为进程的创建、进程的阻塞、进程的唤醒、进程的撤销、进程的切换。
进程的创建
进程的撤销
进程的切换
一个进程在执行的过程中切换到另一个进程时,正在执行的进程中的所有指令以及数据信息等都存在相应的寄存器中,如果突然另一个进程的指令插入进来,会占有正在执行存放指令的寄存器,则该进程需要等待,切换另一个进程执行,执行时会更新寄存器中的内容。在执行前,需要将已中断的进程的过程中存放在寄存器等中的指令和信息中放入PCB中,再次执行时恢复PCB中的内容即可。
进程的通信
进程间的通信是指两个进程之间进行数据的交互。各进程的内存地址空间相互独立。
共享存储、消息传递、管道通信
共享存储
基于数据结构的共享、基于存储区的共享。前者共享方式速度慢、限制多。后者操作系统指明了内存中共享的区域,但没有确定共享区域中各进程的位置。速度快、灵活性高。
消息传递
分为直接信息传递和间接信息传递。直接信息传递是以消息的形式传递,消息存放了发送进程的信息和确定了要接受的进程的地址。间接信息传递是以信箱为中介的形式进行传递,发送的进程发送的信息发送到信箱,并未指明由哪个进程接收。
管道通信
线程的概念
为什么要引入线程
首先回顾进程的两个属性、进程是一个可拥有资源的独立单位。也是一个可以独立的进行调度和分派的基本单位。进程并发执行时,系统上下切换进程时系统开销很大。引入线程,提高进程执行过程中的时间。(例子:打开QQ时,一个进程创建,想要用QQ聊天的同时发送文件,进程中的聊天和发送文件两个线程可以并发执行。)
引入线程后的变化
引入线程后,进程执行时,CPU服务的对象是线程,线程作为了调度和分派的基本单位,成为了能够独立运行的基本单位。而进程只是作为除CPU外系统分配资源的单位。
引入线程后,不仅进程可以并发执行、进程内的线程也可以并发执行,可以提高系统的并发度。
线程的属性
线程的实现方式
用户级线程(ULT)
用户级线程的执行是通过应用程序中的线程库实现的。线程相当于一段代码的逻辑,线程库对进程中的线程进行管理,用户可以体验到线程的切换,但操作系统是意识不到线程的存在,CPU的调度单位仍是进程。
用户级线程的优点:
线程的切换不需要切换到内核态、节省开销、效率高。
缺点:
并发度不高。如果一个线程发生阻塞、进程中的所有线程都会被阻塞。CPU的调度单位是进程、对于多核处理机来说,系统只会为这一个进程分配一个处理机,造成如果用户态的一个线程发生阻塞、进程就不能执行、进程中的其他线程也不能分配到其他处理机上执行。
内核级线程(KLT)
内核级线程是在内核态下进行的。内核级线程是CPU调度的基本单位。操作系统会意识到线程的存在。
优点:
并发度高。多核处理机会为一个进程分配多个处理机、如果其中一个线程发生阻塞、不会影响其他线程的执行。
缺点:
成本高、系统开销大。进程和内核级线程都是在内核态的支持下进行,用户级的线程切换到另一个线程,需要从用户态到内核态。
多线程模型
一对一模型、多对一模型、多对多模型。
一对一模型
一个用户级线程映射到一个内核级线程。优点:并发度高、多线程可在多处理机上运行。缺点:系统开销大。
多对一模型
多个用户级线程映射到一个内核级线程,系统只会为一个进程分配一个处理机。优点:效率高,线程的切换不需要切换到内核态。缺点:并发度不高。注意:只有内核级线程是处理机分配的单位。
多对多模型
多个用户级线程映射到多个内核级线程,其中前者的数量大于后者。这样的模型与一对一模型相比,节省了系统的开销。此模型,内核级线程仍是处理机分配的单位。
用户级线程相当于“代码逻辑”,内核级线程相当于代码运行的逻辑。在用户级线程执行的过程中,自由度高,如果一个内核级线程阻塞,可以选择切换到另一个内核级线程。内核级都阻塞的情况下,进程才会不能继续执行。