一、进程
1. 进程的概念
“进程”是操作系统的最基本、最重要的概念之一。但迄今为止对这一概念还没有一个确切的统一的描述。下面是三个典型的定义:
- 进程是程序的一次执行
- 进程是一个程序及其数据在处理机上顺序执行所发生的活动
- 进程是一个具有独立功能的程序在一个数据集合上运行的过程,它是系统进程资源分配和调度的一个独立单位
2. 进程控制块PCB
系统利用PCB来描述进程的基本情况和运行状态,PCB包含了与一个特定进程相关的信息,他们包括:
- 进程状态
- 程序计数器
- CPU寄存器
- CPU调度信息
- 内存管理信息
- 记账信息
- I/O状态信息
3. 进程的特征
- 动态性 进程是程序的一次执行,它有创建、活动、阻塞、终止等过程,具有一定的生命周期,是动态的产生变化和消亡的。动态性是进程最基本的特征。
- 并发性 指多个进程实体能在一段时间内同时运行。进程的并发性提高了系统资源利用率。
- 独立性 指进程是一个独立运行、独立获得资源、和独立接受调度的基本单位。未建立PCB的程序不能作为一个独立单位。
- 异步性 由于进程的相互制约,使进程具有执行的间断性,即进程按照各自独立的不可预知的速度向前推进。所以在操作系统中需要配置进程同步机制。
- 结构性 每个进程都配置一个PCB进行描述。进程实体是由程序段、数据段、和PCB组成。
4. 进程的状态及其转换
进程状态
通常一个进有5中状态:
- 创建 进程正在被创建,尚未转到就绪状态 。
- 就绪 进程在就绪队列中,等待分配处理器。
- 运行 进程正在处理机上运行。
- 阻塞(等待) 进程在等待某个事件的发生(如I/O完成或受到信号)。
- 终止 进程完成执行。
注意区分就绪状态和等待状态:就绪状态是指进程仅缺少处理机,只需要获得处理机资源就可以运行。而等待状态除了处理机资源外还需要其它资源或等待某一个事件的发生(如I/O请求)。
五种进程状态的转换
- 就绪态 --> 运行态 处于就绪态的进程获得CPU资源
- 运行态 --> 就绪态 处于运行态的进程时间片用完后让出CPU资源,然后退出到就绪态
- 运行态 --> 阻塞态 当进程请求某资源分配或者等待某事件发生(I/O)时,从运行态转换为阻塞态
- 阻塞态 --> 就绪态 当进程等待的时间到达时,如I/O操作结束等,中断处理程序将进程从阻塞态转换为就绪态
5、进程间通信方式
- 共享内存 在通讯的进程间有一块可以直接访问的共享内存,通过这块共享内存的读写操作来实现进程间的信息交互。须要使用同步互斥工具控制数据的读写。
优点:共享内存是最快的IPC方法,仅在建立共享内存的时需要系统调用(内核参与),之后所有的访问被当作常规的内存访问,不需要内核的参与。
- 消息传递 在消息传递系统中,进程间的数据交换是以格式化的消息(Message)为单位的。它使用操作系统提供的消息传递方法实现进程通讯。进程通过系统提供的发送消息和接受消息原语来进行信息交换。
优点:消息传递对于交换次数较少的数据很有用,因为不需要避免冲突,但是需要内核频繁的参与,速度不如共享内存快。
- 管道 所谓管道就是一个连接读进程和写进程以实现他们间信息的一种共享文件,又称作pipe文件。向管道中输入的写入进程 以字符流的形式将数据写入管道,接收进程从管道中读数据。管道机制必须提供以下三方面协调能力:互斥、同步、确定对方存在
二、线程
1、线程概念
线程最直接的理解就是一个轻量级进程(LWP),它是一个基本的CPU执行单元,它由线程ID、程序计数器、寄存器集合、堆栈组成。线程是进程的一个实体,它是系统调用和分配的基本单位。线程可以和它同属一个进程的其它线程共享进程资源。线程有就绪、阻塞、运行三种状态。
2、线程与进程的比较
- 调度 在传统操作系统中,拥有资源和独立调度的基本单位是进程。在引入线程的操作系统中,线程是独立调度的基本单位,进程是拥有资源的基本单位。
- 拥有资源 进程是资源拥有的基本单位,而线程不拥有系统资源(只有一点必不可少的资源),但线程可以访问隶属进程的系统资源。
- 并发性 在引入线程的操作系统中,进程和线程都可以并发执行,使得操作系统具有更好的并发性。
- 系统开销 创建或者撤销进程,系统都要为其分配和回收资源,因此操作系统所付出的开销远远大于创建、撤销线程。同样的在进程切换时,操作系统需要保存当前进程的信息并恢复下一个进程的信息,而线程切换只需要保存和设置少部分寄存器内容,开销小。此外属于同一进程的多个线程共享地址空间,这样的话线程间的同步和通信容易实现,甚至无需操作系统的干预。
- 地址空间和其它资源 进程间的地址空间相互独立,属于同一进程的线程之间共享进程资源,某进程内的线程对其它进程不可见。
- 通讯方面 进程间的通讯需要进程同步和互斥手段来辅助,而线程可以直接通过读/写进程数据段(如全局变量 )来进程通讯。
3、为什么线程的提出有利于提高系统的并发?
线程切换的开销小,在线程切换时可能发生进程切换,也可能不发生,这样平均下来每次切换的开销就小啦。
4、线程实现
线程实现分两类:用户线程、内核线程:
- 用户线程 有关线程的管理工作都由应用程序完成,内核意识不到用户线程的存在。应用程序可以通过线程库设计成多线程程序。
- 内核线程 内核线程的所有管理工作由内核完成,应用程序没有线程管理的代码,只有一个到内核线程的编程接口。
5、多线程模型
- 多对一模型 多对一模型将多个用户线程映射到一个内核线程。优点:线程管理是由线程库在用户空间进行的,因而效率比较高。缺点:如果一个线程执行了阻塞系统调用,那么整个进程就会阻塞。
- 一对一模型 一对一模型将每个用户线程映射到一个内核线程。优点:当一个线程被阻塞后,允许另一个线程继续执行,所以并发能力较强。缺点:每创建一个用户级线程都需要创建一个内核级线程与其对应,这样创建线程的开销比较大,会影响到应用程序的性能。
- 多对多模型 多对多模型将(n)个用户级线程映射到(m)个内核级线程上,要求内核线程个数(m)小于等于用户线程(n)。特点:在多对一模型和一对一模型中取了个折中,克服了多对一模型的并发度不高的缺点,又克服了一对一模型的一个用户进程占用太多内核级线程,开销太大的缺点。又拥有多对一模型和一对一模型各自的优点,可谓集两者之所长。
6、线程池
线程池主要思想是在进程开始时创建一定量的线程,并放入池中以等待工作。当服务器收到请求时,他会唤醒池中的一个线程,并将要处理的请求传递给它。一旦线程完成服务,他会返回池中等待工作。如果池中没有线程,那么服务器会等待到有空线程为止。线程池有以下优点:
- 通常用现有的线程处理请求比等待创建的线程要块。
- 线程池限制了在任何时候可以使用线程的数量。这对那些不支持大量并发线程的系统非常重要。