(一)进程与线程
1、进程:
目的:更好地描述和控制程序并发执行,提高资源利用率。
定义:进程是进程实体的一次运行,是系统进行资源分配和调度的一个独立单位。
组成:
- PCB(进程控制块):进程存在的唯一标志。
- 程序段:能被进程调度程序调度到CPU运行的程序的代码段。
- 数据段:存储程序运行期间的相关数据。
特征:动态性、并发性、独立性、异步性、结构性。
状态种类:运行、就绪、阻塞、创建、结束。
这里注意区别就绪状态和等待状态:就绪状态和等待状态是进程生命周期中两个完全不同的状态。就绪状态指进程仅缺少处理机,只要获得处理机资源就立刻执行;而等待状态是指进程需要其他资源(除了处理机)或等待某一事件。
状态变化:
- 就绪->运行:经处理机调度,就绪进程得到处理机资源。
- 运行->就绪:时间片用完或在可剥夺系统中有更高优先级进程进入。
- 运行->阻塞:进程需要的某一资源还没准备好。
- 阻塞->就绪:进程需要的资源已准备好。
进程控制:
- 创建:终端用户登录、作业调度、系统提供服务、用户程序应用请求
- 终止:正常结束、发生异常、外界干预
- 阻塞:等待资源
- 唤醒:资源到达
- 切换:时间片用完、主动放弃处理机、更高优先级进程剥夺
注:“调度”和“切换”的区别:调度是指决定资源分配给哪个进程的行为,是一种决策行为;切换是指实际分配的行为,是执行行为。一般来说,先有资源的调度,然后才有进程的切换。
进程间通信的方式:
(1)共享内存
可以说这是最有用的进程间通信方式。它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据的更新。这种方式需要依靠某种同步操作,如互斥锁和信号量等。共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的IPC方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量,配合使用,来实现进程间的同步和通信。- 低级方式:基于数据结构的共享。
- 高级方式:基于存储区的共享。
(2)消息队列
消息队列是由消息的链表,存放在内核中并由消息队列标识符标识。消息队列克服了信号传递信息少、管道只能承载无格式字节流以及缓冲区大小受限等缺点。具有写权限的进程可以按照一定的规则向消息队列中添加新信息;对消息队列有读权限的进程则可以从消息队列中读取信息。- 直接通信方式:直接把消息挂到接收进程的消息队列
- 间接通信方式:挂到某个中间实体,接收进程找实体接收消息
- (3)信号(signal)
信号是在软件层次上对中断机制的一种模拟,它是比较复杂的通信方式,用于通知进程有某事件发生,一个进程收到一个信号与处理器收到一个中断请求效果上可以说是一致的。 - (4)信号量(semaphore)
信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程之间及同一种进程的不同线程之间的同步和互斥手段。 - (5)套接字(socket)
这是一种更为一般的进程间通信机制,它可用于网络中不同机器之间的进程间通信,应用非常广泛。 - (6)管道(pipe)及有名管道(named pipe)
管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用。进程的亲缘关系通常是指父子进程关系;有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信。
2、线程:
概念:
线程是进程中执行运算的最小单位,是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。
引入目的:
为了更好的使多道程序并发执行,以提高资源利用率和系统吞吐量。
是程序执行的最小单元,是处理机调度的基本单位,基本不拥有任何系统资源。
优势:
- 易于调度。
- 提高并发性。通过线程可方便有效地实现并发性。进程可创建多个线程来执行同一程序的不同部分。
- 开销少。创建线程比创建进程要快,所需开销很少。
- 利于充分发挥多处理器的功能。通过创建多线程进程,每个线程在一个处理器上运行,从而实现应用程序的并发性,使每个处理器都得到充分运行。
实现方式:用户级线程、系统级线程。
线程间通信的方式:
- 锁机制
- 互斥锁:提供了以排他方式防止数据结构被并发修改的方法。
- 读写锁:允许多个线程同时读共享数据,而对写操作是互斥的。
- 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。
- 信号量机制(Semaphore)
- 无名线程信号量
- 命名线程信号量。
- 信号机制(Signal)
类似进程间的信号处理。
线程间的通信目的主要是用于线程同步,所以线程没有像进程通信中的用于数据交换的通信机制。 - 管道(Pipe)
线程和进程的关系以及区别:
进程和线程的关系:
- 一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。
- 资源分配给进程,同一进程的所有线程共享该进程的所有资源。
- 处理机分给线程,即真正在处理机上运行的是线程。
- 线程在执行过程中,需要协作同步。不同进程的线程间要利用消息通信的办法实现同步。线程是指进程内的一个执行单元,也是进程内的可调度实体。
进程与线程的区别:
- 调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位。
- 并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行。
- 拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源。
- 系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
(二)处理机调度
调度的层次:
- 作业调度(高级调度):从外存上,执行频率低。
- 内存调度(中级调度):从内存上,提高内存利用率和系统吞吐量
- 进程调度(低级调度):按照某种方法和策略,最基本、频率高。
进程调度方式:
- 剥夺式
- 非剥夺式:实现简单系统开销小,适用于大多数的批处理系统,但它不能用于分时系统和大多数的实时系统。
调度的基本准则:
- CPU利用率
- 系统吞吐量
- 周转时间
- 周转时间=作业完成时间-作业提交时间
- 带权周转时间=作业周转时间/作业实际运行时间
- 等待时间
- 响应时间
典型调度算法:
1)先来先服务(FCFS):选择最先进入队列的
FCFS调度算法属于不可剥夺算法,不能作为分时系统和实时系统的主要调度策略。
算法特点:
- 算法简单,但效率低
- 对长作业有利,但对短作业不利
- 有利于CPU繁忙型作业,而不利于I/O繁忙型作业
2)短作业优先(SJF):选择完成时间最短的
3)优先级调度:选择优先级别最高的
4)高响应比优先:选择响应比最高的
5)时间片轮转:总是选择就绪队列中第一个进程,但仅能运行一个时间片
6)多级反馈队列:时间片轮转调度算法和优先级调度算法的综合