进程实体是静态的,进程则是动态的
PCB组成
进程的组织讨论的是多个进程之间的组织方式问题
链接方式
索引方式
索引使用数组存放?链接是通过链表存放?
①动态性
进程是程序的依次执行过程,是动态地产生、变化和消亡的
②并发性
内存中有多个进程实体,各进程可并发执行
③独立性
进程是能独立运行、独立获得资源、独立接受调度的基本单位
④异步性
各进程按各自独立的、不可预知的速度向前推进,操作系统要提供“进程同步机制”来解决异步问题
⑤结构性
每个进程都会配置一个PCB。结构上看,进程由程序段、数据段、PCB组成。
①运行态
占有CPU,并在CPU上运行
②就绪态
已经具备运行条件,但由于没有空闲CPU,而暂时不能运行(进程已经拥有了除处理机之外所有需要的资源,一旦获得处理及,即可立即进入运行态开始运行。)
③阻塞态
因等待某一事件而暂时不能运行
④创建态
进程正在被创建,操作系统为进程分配资源、初始化PCB
⑤终止态
进程正在从系统中撤销,操作系统会回收进程拥有的资源、撤销PCB
进程控制,主要功能是对系统中的所有进程实施有效的管理,它具有创建新进程、撤销已有进程、实现进程状态转换等功能
使用原语实现进程控制。
原语的特点是执行期间不允许中断,只能一气呵成。
原语采用“关中断指令” 和 “开中断指令” 实现
关/开中断的指令权限非常大,必然是只允许在核心态下执行的特权指令
进程控制相关的原语
进程控制会导致进程状态的转换。无论哪个原语,要做的无非三类事情:
状态转换: 无 -> 创建态 -> 就绪态
功能:申请空白PCB、为新进程分配所需资源、初始化PCB、将PCB插入就绪队列
引起条件:
状态转换: 就绪态/阻塞态/运行态 -> 终止态 -> 无
功能:
引起条件:
状态转换: 运行态 -> 阻塞态
功能:
引起条件:
状态转换:阻塞态 -> 就绪态
功能:
引起条件:
等待的事件发生
状态转换:运行态 -> 阻塞态/就绪态 | 就绪态 -> 运行态
功能:
引起条件:
阻塞和唤醒要成对出现
**进程通信:**就是指进程之间的信息呼唤。
进程是分配系统资源的单位(包括内存地址空间),因此各进程拥有的内存地址空间相互独立。
为了保证安全,一个进程不能直接访问另一个进程的地址空间。但是进程之间的信息交换又是必须实现的。为了保证进程间的安全通信,操作系统提供了一些方法。
①基于数据结构的共享
比如共享空间里只能放一个长度为10的数组。这种共享方式速度慢、限制多、是一种低级通信方式。
②基于存储区的共享
在内存中画出一块共享存储区,数据的形式、存放位置都由进程控制,而不是操作系统。相比之下,这种共享方式速度更快,是一种高级通信方式。
管道,是指用于连接读写进程的一个共享文件,又名pipe文件。其实就是在内存中开辟一个大小固定的缓冲区。
进程间的数据交换以 格式化的消息 为单位。进程通过操作系统提供的 “发送消息/接收消息” 两个原语进行数据交换。
有的进程可能需要"同时"做很多事,而传统的进程只能串行地执行一系列程序。为此,引入了"线程",来增加并发度。
传统的进程时程序执行流的最小单位。
引入线程后,线程成为了程序执行流的最小单位。进程只作为除CPU之外的系统资源的分配单元。(如打印机、内存地址空间等都是分配给进程的)
①资源分配、调度
②并发性
③系统开销
用户级线程,由应用程序通过线程库实现。所有的线程管理工作都由应用程序负责(包括线程切换)。
线程切换可以在用户态下即可完成,无需操作系统干预。
内核级线程,管理工作由操作系统内核完成。线程调度、切换等工作都由内核负责,因此内核级线程的切换必然需要在核心态下才能完成。
在同时支持用户级线程和内核级线程的系统中,可采用二者组合的方式:将n各用户级线程映射到m各内核级线程上( n >= m )
key: 操作系统只“看得见”内核级线程,因此只有内核级线程才是处理机分配的单位
3.1 组合方式——多对一模型
多对一模型:多个用户及线程映射到一个内核级线程。每个用户进程只对应一个内核级线程。
优点:用户级线程的切换在用户空间即可完成,不想需要切换到核心态,线程管理的系统开销小,效率高
缺点:当一个用户级线程被阻塞后,整个进程都会被阻塞,并发度不高。多个线程不可在多核处理及上并行运行
为什么会被阻塞?
因为线程切换是在核心态进行的,操作系统只能看到内核级线程,用户级线程阻塞反映在内核级线程也是阻塞的,所以整个进程会被阻塞?
3.2 组合方式——一对一模型
一对一模型:一个用户及线程映射到一个内核级线程。每个用户进程有于用户级同数量的内核级线程
优点:当一个线程被阻塞后,别的线程还可以继续执行,并发能力强。多线程可在多处理机上并行执行。
缺点:一个用户进程会占用多个内核级线程,线程切换由操作系统内核完成,需要切换到核心态,因此线程管理的成本高,开销大。
3.3 组合方式——多对多模型
多对多模型:n用户及线程映射到 m 各内核级线程 (n >= m )。每个用户进程对应 m 各内核级线程。
克服了多对一模型并发度不高的缺点,又克服了一对一模型中一个用户进程占用太多内核级线程,开销头太大的缺点。
为什么同时需要内核级和用户级线程?
用户级线程不暴露在内核态,不一定需要转换到内核态操作,可以节省开销。