计算机操作系统
第一部分: 进程
这一部分主要回顾进程的基本概念、进程的三种状态模型、理解进程挂起的概念。
一. 为什么会提出进程这个概念?
操作系统必须全方位的管理计算机系统中运行的程序。 因此,
操作系统就会为正在运行中的程序建立一个管理实体 --- 进程。
具体来讲,进程:
- 是一个具有某个独立功能的程序关于某个数据集合的一次运行活动。
- 是操作系统进行资源分配和调度的一个独立单位。
二、进程的概念、组成部分?
一个进程包括5个实体部分:
- (OS管理运行程序的)数据结构P。
- (运行程序的)内存代码C
- (运行程序的)内存数据D
- (运行程序的)通用寄存器信息R
- (OS控制程序执行的)程序状态字信息PSW
三、进程举例
1. 无共享 内存程序C1在内存数据D1上运行构成了进程P1。内存程序C2在内存数据D2上运行构成了进程P2。注意:C为Code(代码、程序、代码即程序)、D为Data(数据)、P为Process(进程)。
故: 不同程序在不同数据集上运行: 构成两个无关进程。
2. 共享数据 内存程序C1在内存数据D上运行构成了进程P1。 内存程序C2在同一个数据集D上运行构成了进程P2。
故: 不同程序在共享数据上运行: 构成了两个共享数据的交往进程。
3. 共享代码 共享代码C 在内存数据D1上运行构成了进程P1。 共享代码C2在内存数据D2上运行构成了进程P2。
故: 共享代码在不同数据集上运行: 构成了两个共享代码的无关进程。
注意: 1.共享的代码称为可再入程序,如编辑器,编辑器就是共享了代码,但是数据不同。 可再入程序必须是纯代码的,不能带入任何数据。
2.前述的程序与数据集均是内存级的。
四、概念级的进程状态
一. 概念级的进程状态分为三种:
- 运行态指进程占有处理器运行。
- 就绪态指进程具备运行条件等待处理器运行。
- 等待态指进程由于等待资源、输入输 出、信号等而不具备运行条件。
二. 这三种状态之间是怎么进行转化的呢?
(a).在运行态的进程 出现等待资源、I/O、信号的事件时 会进入等待态。
(b).在等待态的进程 满足资源满则、I/O结束、信号完成 的条件时, 会进入就绪态。
(c).在就绪态的进程 发现处理器空闲时或者该进程的优先级更高时, 就会进入运行态。
(d).在运行态的进程 运行时间片到或者被更高优先级的进程抢占时,就会进入就绪态。
五、进程挂起
计算机操作系统无法预期进程的数目和操作需求, 所以在计算机运行的过程中,有可能出现资源不足的情况(表现为性能低和死锁)。
那么资源不足该怎么办呢?
解决方法:
这时计算机操作系统就会剥夺某些进程的内存和其他资源, 调入OS管理的对换区,不参加进程调度,在适当的时候再调入内存、恢复资源、参与运行,这就是 进程挂起。
注意进程挂起和等待态的区别: 两者有着本质的区,等待态是目前没有资源,但是它申请了啊, 一旦得到了申请的资源和其他条件,就会进入就绪态。 但是进程挂起的进程是完全没有资源的,所以不可能进入就绪态,更不可能进入运行态。
那么进程挂起后的状态模型是什么样的呢?
- 一般选择等待态进程进入挂起等待态。
- 也可选择就绪态进程进入挂起就绪态。
- 运行态进程还可以挂起自己。
- 等待事件结束后,挂起等待态进入挂 起就绪态。
- 一般选择挂起就绪态进程予以恢复。
第二部分: 多线程技术
这一部分主要回顾 单线程结构进程、 多线程结构进程、多线程环境下进程和线程的概念、多线程环境下线程的状态和调度、多线程并发程序设计的优势和应用。
一、单线程结构进程
传统进程是单线程结构进程,它包括一个管理者和一个执行序列,但是单线程结构进程是有问题的,问题在于:
- 进程切换的开销大
- 进程通信的开销大
- 限制了进程并发的粒度
- 降低了并行计算的效率
比如一个人做一件事情需要100天事件。 这个人就是一个单线程结构进程。
那么是不是说10个人做一件事情只要10天呢。
不是的,因为如果是单线程结构进程,10个人就是10个进程, 做事可能要大约10天,再加上召集过来时路上花费的时间(进程切换)和做这件事的开会的时间(进程通信)一共也许就要20天了。
同理,是不是说100个人做一件同样的事情只要1天呢?
不是的,单线程结构进程,100个人就是100个进程,因为进程切换和通信的开销很大,也许100个人加上通信和切换的时间要大于100天才能完成,我还不如自己干呢!
因此,我们为了能够解决进程切换和进程通信耗时的问题,需要找出新的解决办法。 即不要频繁的切换耗时的进程,而线程作为系统调度和分配的基本单位,能轻装运行,会被频繁的调度与切换而耗时较少, 由此提出了多线程结构进程的概念。
二、多线程结构进程
多线程结构进程正是为了解决单线程结构进程在切换和通信开销大的问题上提出来的。
多线程结构进程同样具有一个管理者,但是它可以有多个执行序列,这正是区别于单线程结构进程之处。如下所示:
刚刚我们说100个人干一件事情是100个进程,而如果使用多线程结构进程的概念,那么就是说这100个人不是遍布在五湖四海的,而是就在同一个屋檐下,这样在协作的时候, 切换(召集过来)花费的时间就会大大减少,另外,之前的进程在通信的时候,可能会收到操作系统管理者的监管, 那么通信的消耗是比较大的,但是在同一个进程下的100个线程在通信起来说悄悄话,谁还管你呢? 这样切换和通信的时间都会大大缩短,这就是多进程线程的好处。
三、多线程环境下进程和线程的概念
1. 多线程环境下进程的概念
在多线程环境中,进程是操作系统中进行保护和分配的独立单位。具有:用来容纳进程映像的虚拟地址空间和对进程、文件和设备的存取保护机制。
2. 多线程环境下线程的概念
线程是进程的一条执行路径,是调度的基本 单位,同一个进程中的所有线程共享进程获 得的主存空间和资源。具有:线程执行状态和受保护的线程上下文,当线程不运行时, 用于存储现场信息和独立的程序指令计数器和执行堆栈和容纳局部变量的静态存储器。
四、多线程环境下线程的状态和调度
1. 线程状态有运行、就绪和睡眠,这一点和进程是类似的,但是由于挂起是进程的专有概念,故线程的状态中没有挂起概念。
2 与线程状态变化有关的线程操作有: 孵化、封锁、活化、剥夺、指派、结束。
3. 有意思的是:线程这个概念最初并不是由操作系统提出来的, 而是由程序设计语言所提出的。 所以说线程就会有两种状态:
(1).操作系统(OS)可以感知的线程---那么处理器的调度对象就是线程、进程没有三状态(或者说只有挂起状态)
(2).操作系统(OS)感知不到的线程---那么处理器的调度对象仍然是进程,用户空间中的用户调度程序调度线程。
五、多线程并发程序设计的优势和应用
之前我们已经引入了多线程结构进程,从而进行多线程并发程序设计,它的优点如下:
- 线程之间切换速度更快
- 减少(系统)管理开销
- (线程)通信易于实现
- 并行程度提高
- 节省内存空间
多线程的应用现在已经非常广泛了,主要有:
- 前台和后台工作
- C/S应用模式
- 加快执行速度
- 设计用户接口
举例:如在word中输入文字的时候, 他还在检查你输的对不对, 这就是两件事, 不可能用两个进程, 而是一个进程,多个线程来实现。
又如客户与服务器,服务器去访问数据,如果一访问就让出cpu, 肯定不行,所以可以有两个线程,一个去执行,一个去输入输出。
第三部分:KLT和ULT
在第二部分中我讲到了多线程技术最开始是由程序设计语言提出的, 所以产生了内核级多线程KLT和用户级多线程ULT。 这一部分内容主要介绍他们的基本概念和主要的区别所在。
一、内核级多线程KLT (Kernel - Level Threads)