进程的概念、组成、特征
1.进程的概念
程序:是静态的,就是个存放在磁盘里的可执行文件,就是一系列的指令集合。
进程(Process):是动态的,是程序的一次执行过程
同一个程序多次执行会对应多个进程
2.进程的组成
  PID:操作系统给进程分配的一个唯一的、不重复的“身份证号”—— PID(Process ID,进程ID)
UID:记录用户是谁(User ID)
这些信息都被保存在一个数据结构PCB (Process Control Block)中,即进程控制块。操作系统需要对各个并发运行的进程进行管理,但凡管理时所需要的信息,都会被放在PCB中
程序段、数据段、PCB三部分组成了进程实体(进程映像)
进程是进程实体的运行过程,是系统进行资源分配和调度的一个独立单位。(进程是动态的过程)
注意:PCB是进程存在的唯一标志!
3.进程的特征

小结

进程的组织
在一个系统中,通常有数十、数百乃至数千个PCB。为了能对他们加以有效的管理,应该用适当的方式把这些PCB组织起来。
注:进程的组成讨论的是一个进程内部由哪些部分构成的问题,而进程的组织讨论的是多个进程之间的组织方式问题
1.链接方式
 指针指向排好队的进程队列
阻塞队列还可能再细分为多个不同原因的阻塞队列
2.索引方式
 指针指向索引表,再从索引表中去查找相应的进程
小结

进程的状态与转换
1.进程的状态
创建态:进程正在被创建时,它的状态是“创建态”,在这个阶段操作系统会为进程分配资源(分配一些空间装程序段、数据段)、初始化PCB
就绪态:具备所有运行条件,不过还没获得CPU,在等待。(万事俱备,只欠CPU)
运行态:如果一个进程此时在CPU上运行,那么这个进程处于“运行态”。
阻塞态:在进程运行的过程中,可能会请求等待某个事件的发生(如等待某种系统资源的分配,或者等待其他进程的响应)。 在这个事件发生之前,进程无法继续往下执行,它会请求操作系统让它下CPU,并进入阻塞态。 然后CPU会让另一个“就绪态”进程上CPU运行
终止态:进程运行结束或者遇到不可修复的错误,会进入终止态,操作系统会让该进程下CPU,并回收内存空间等资源,最后还要回收该进程的PCB。 当终止进程的工作完成之后,这个进程就彻底消失了。
2.进程的转换
 阻塞态——就绪态:不是进程自身能控制的,是一种被动行为 。(比如请求的打印机资源准备好了,那打印机会给CPU发信号。之后,CPU会执行"原语",让进程会进入就绪态)
运行态——阻塞态:是一种进程自身做出的主动行为(进程用“系统调用” 的方式申请某种系统资源,或者请求等待某个事件发生)
注意:不能由阻塞态直接转换为运行态, 也不能由就绪态直接转换为阻塞态(因为进入阻塞态是进程主动请求的,必然需要 进程在运行时才能发出这种请求)
除了运行态,就绪态和阻塞态也可能直接进入终止态(比如你拿任务管理器杀进程)
小结

进程的控制
进程控制就是要实现进程状态转换
用原语实现,一气呵成(如果不能“一气呵成”,就有可能导致操作系统中的某些关键数据结构信息不统一的情况, 这会影响操作系统进行别的管理工作)
1.原语
原语的执行具有原子性,即执行过程只能一气呵成,期间不允许被中断。 可以用 “关中断指令”和“开中断指令”这两个特权指令实现原子性
CPU执行了关中断指令之后,就不再例行检查中断信号,直到执行开中断指令之后 才会恢复检查。这样,关中断、开中断 之间的这些指令序列就是不可被中断的,这就实现了“原子性”
      
小结

进程通信
各进程拥有的内存地址空间相互独立
为了保证安全,一个进程不能直接访问另一个进程的地址空间。 但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。
1.共享存储
两个进程对共享空间的访问必须是 互斥(一个读另外一个就不能使用了) 的(互斥访问通过操作系统提供的工具(P、V)实现)。 
基于数据结构的共享
比如共享空间里只能放 一个长度为10的数组。这种共享方式速度慢、限制多,是一种低级通信方式
基于存储区的共享
在内存中划出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
2.管道通信
 本质上是一个共享的缓冲区
半双工通信意味着,一个管道只能让一个进程写另一个进程读,如果想实现另一边的话就要再来一个管道
还是互斥的,一个写的时候另外一个就不能读了(读的时候同理)
3.消息传递

直接通信方式
消息直接挂到接收进程的消息缓冲队列上
间接通信方式
要先发送到中间实体(信箱)中 进程1用发送原语发到信箱里,进程2再用接受原语去取
小结

线程概念
1.线程的概念
 可以把线程理解为“轻量级进程”。
线程是一个基本的CPU执行单元,也是程序执行流的最小单位。
引入线程之后,不仅是进程之间可以并发,进程内的各线程之间也可以并发,从而进一步提升了系统的并发度,使得一个进程内也可以并发处理各种任务(如QQ视频、文字聊天、传文件)
引入线程后,进程只作为除CPU之外的系统资源的分配单元(如打印机、内存地址空间等都是分配给进程的)。 线程则作为处理机的分配单元。(CPU分配给线程)

2.线程的属性

线程的实现方式、多线程模型
1.线程的实现方式
用户级线程
 这些用户级线程都由线程库管理和实现(在用户态下就可以,包括线程切换),线程库再接入内核态中的内核级线程由操作系统管理
其中一个用户级线程阻塞了,那么对应内核级线程里其他的用户级线程也会阻塞(因为他们对应的是一个内核级线程),而且多个线程也只能在一个核里运行,并发度不高。
注意:在计算机中,“透明”是指看不见的,“不透明”才是指看得见的,透明也就是隐身的意思。
内核级线程
 TCB:和PCB差不多,操作系统通过TCB对线程进行管理
2.多线程模型
一对一模型

多对一模型
 多个用户级线程映射到一个内核级线程。且一个进程只被分配一个内核级线程。
重点: 操作系统只“看得见”内核级线程,因此只 有内核级线程才是处理机分配的单位。
多对多模型

多对多模型就是上面两种模型的折中,克服了多对一模型并发度不高的缺点(一个阻塞全体阻塞),又克服了一对一模型中一个用户进程占用太多内核级线程,开销太大的缺点。
内核级线程才是处理机分配的单位。例如:多核CPU环境下,左边这个进程最多能被分配两个核。
内核级线程中可以运行任意一个有映射关系的用户级线程代码,只有两个内核级线程中正在运行的代码逻辑都阻塞时,这个进程才会阻塞
小结

|