操作系统难点解析之进程和线程
关于操作系统,其中最为核心的概念就是进程和线程(轻量级进程)。在进程和线程的基础之上,进而衍生出了并发和互斥的问题。本文着重介绍在并发和互斥中最为经典的几个问题,同时会简单介绍进程和线程的几个模型。
进程模型
进程模型中主要涉及的是状态的定义,以及各状态之间的转换问题。目前主要有两状态模型,五状态模型和七状态模型。很明显,状态越多的模型,对进程的描述更加精细,同时复杂度也就越高。
两状态模型
该模型中进程拥有运行态和非运行态两种状态。运行态和非运行态之间的转换由调度程序完成。该模型一般仅仅只在简单的操作系统中可以见到,目前很少在主流操作系统中使用。
五状态模型
五状态模型将菲运行态进行了细分,其中包含就绪态、阻塞态、新建态和退出态。各自含义如下表。
状态名 | 含义 |
---|---|
运行态 | 进程正在执行 |
就绪态 | 进程做好了执行的准备 |
阻塞态 | 进行在某些事情发生前不能执行 |
新建态 | 进程控制块已经创建但还未加载到内存中的进程 |
退出态 | 操作系统从可执行进程组中释放出的进程 |
七状态进程模型
在讲述七状态模型之前,首先要说明下五状态模型存在的一个问题。由于在计算机中I/O操作相对而言是较慢的,也就是说随着操作系统持续运行,会存在某些情况下,所有进程都处于阻塞态,且都是在等待I/O事件。这显然是对CPU的巨大浪费,为了解决这个问题,我们可以通过将部分进程换出内存,载入新的进程执行。即,我们可以加入挂起态来表示进程不在内存中。 相比较于五状态模型,七状态模型中新增了阻塞挂起态和就绪挂起态。
状态名 | 含义 |
---|---|
阻塞挂起态 | 进程已在外存中并等待某个事件 |
就绪挂起态 | 进程已在外存中,但只要载入内存中即可执行 |
线程模型
对于线程,并没有像进程一样存在复杂的各类模型,线程的状态中最为重要的即是就绪态、运行态和阻塞态。线程拥有进程的资源和内存空间,即线程可以轻松的访问进程的资源。线程从实现的思路可以分为三类,用户级线程、内核级线程和组合型线程。
- 用户级线程,管理线程的工作由应用程序完成,内核完全不知道线程的存在。
- 内核级线程,管理线程的工作都由内核完成,应用程序完全不参与。
- 组合型线程,组合型线程是用户级和内核级线程的结合,线程创建完全在用户空间中完成,线程的调度和同步也在应用程序中进程,但是一个应用程序中的多个用户级线程会被映射到一些内核级线程上。
进程和线程的并发
对于现代操作系统来说,并发是一个最为重要的特性,并发在很大程度上提高了计算机资源的利用效率,但是并发也为计算机操作系统带来了很多复杂性。在并发中,主要需要解决的就是线程和进程的同步及互斥的问题。 下表列出一些较为关键的术语,便于查看。
名称 | 含义 |
---|---|
原子操作 | 一个函数或动作由一个或多个指令序列实现,且不存在其他进程可以中断此操作。 |
临界区 | 一段代码,在这段代码中进程将访问共享资源,且同一时间只能有一个进程可以在临界区中。 |
死锁 | 两个或两个以上的进程因每个进程都在等待其他进程做完某些事情而不能继续执行的情形。 |
活锁 | 两个或两个以上的进程为响应其他进程中的变化而持续改变自己的状态但不做有用的工作的情形。 |
互斥 | 当一个进程在临界区访问共享资源时,其他进程不能进入该临界区访问任何共享资源的情形。 |
竞争条件 | 多个进程在读写一个共享数据时,结果依赖于他们执行的相对时间的情形。 |
饥饿 | 一个可运行进程尽管能继续执行,但被调度程序无限期地忽视,而不能被调度执行的情形。 |
下表列出常用的并发机制 机制名 |含义 | ------------|---------------| 信号量 |用于进程间传递信号的一个整数,在信号量上的操作都是原子的。递减用于阻塞某进程,递增用于解除某进程阻塞。 二元信号量 |只取0和1的信号量。 互斥量 |类似于二元信号量,区别在于为其加锁和解锁的进程必须相同。 条件变量 |一种数据类型,用于阻塞进程或线程,直到特定的条件为真。 管程 |一种编程语言结构,在数据结构中封装了变量,访问过程和初始化代码。 事件标志 |用作同步机制的一个内存字。 消息 |两个进程交换信息的一种方法,也可用于同步。 自旋锁 |互斥机制,进程在一个无条件循环中执行,等待锁变量的值可用。