计算机操作系统 - 进程管理

计算机操作系统 - 进程管理


前言

一、进程与线程

1.1进程

进程是资源分配的基本单位,进程控制块描述进程的基本信息和运行状态,所谓创建进程和撤销进程,指的都是对PCB的操作
下图显示了4个程序创建4个进程,这4个进程可以并发的执行。
在这里插入图片描述

1.2线程

线程式独立调度的基本单位。一个进程中可以有多个线程,他们共享进程资源。
QQ和浏览器是两个进程,浏览器进程里面有很多线程,如 HTTP 请求线程、事件响应线程、渲染线程等等,线程的并发执行使得在浏览器中点击一个新链接从而发起 HTTP 请求时,浏览器还可以渲染用户的其他事件。

在这里插入图片描述

1.3区别

(1)拥有资源

进程是资源分配的基本单位,但是线程不拥有资源,线程可以访问隶属进程的资源。

(2)调度

线程是独立调度的基本单位,在同一进程中,线程的切换不会引起进程切换,从一个进程中的线程切换到另一个进程的线程时,会引起进程切换。

(3)系统开销

由于创建或撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O 设备等,所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。

(4)通信方面

线程间可以通过直接读写同一个进程中的数据进行通信,但是进程通信需要借助IPC。

二、进程状态的切换

在这里插入图片描述

  1. 就绪状态
  2. 运行状态
  3. 阻塞状态

应该注意以下内容:

只有就绪状态和运行状态可以相互转换其他都是单向转换就绪状态的进程通过调度算法从而获得CPU时间,转为运行状态;而运行状态的进程,在他分配给他的CPU时间片之后就会转为就绪状态,等待下一次调度。

阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括CPU时间片,缺少CPU时间会从运行状态转换为就绪状态。

三、进程调度算法

不同环境的调度算法不同,因此需要针对不同环境来讨论调度算法。

3.1批处理系统

批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量和周转时间(从提交到终止的时间)

(1)先来先服务

非抢占式的调度算法,按照请求的顺序进行调度。
有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业又需要执行很长时间,造成了短作业等待时间过长。

(2)短作业优先

非抢占式调度算法,按估计运行时间最短的顺序进行调度。
长作业有可能饿死,处于一直短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度。

(3)最短剩余时间优先

最短作业的抢占式版本,按剩余运行时间的顺序进行调度。当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较。如果新的进程需要的时间更少,则挂起当前进程,运行新的进程。否则新的进程等待。

3.2交互式系统

交互式系统有大量的用户交互操作,在该系统中调度算法的目标是快速地进行响应。

(1)时间片轮转

将所有就绪进程按FCFS的原则排成一个队列,每次调度时,把CPU时间分配给队首进程,该进程可以执行一个时间片。当时间片用完时,由计时器发出时钟中断,调度程序便停止该线程的执行,并将它发送往就绪队列的末尾,同时继续把CPU时间分配给队首的进程。

时间片轮转算法的效率和时间片的大小有很大关系:

因为进程切换都要保存进程的信息并且载入新进程的信息,如果时间片太小会导致进程切换的太频繁,在进程切换上花费大流量时间。

而时间片过长,那么实时性就得不到保证。
在这里插入图片描述

(2) 优先级调度

为每个线程分配一个优先级,按优先级进行调度。
为了防止优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级

(3)多级反馈队列

一个进程需要执行100个时间片,如果采用时间片轮转,那么需要交换100次
多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如1,2,4,8,…。
进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换7次。
每个队列的优先级不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。
可以将这种调度算法看成是时间片轮转算法和优先级调度算法的结合。

3.3 实时系统

实时系统要求一个请求在一个确定时间内得到响应
分为硬实时和软实时,前者必须满足绝对截止时间,后者可以容忍一定超时。

四、进程同步

4.1临界值

对临界资源进行访问的那段代码称为临界区。

为了互斥访问临界资源,每个进程在进入临界区之前,需要先进行检查。

4.2同步与互斥

同步:多个进程因为合作关系产生的直接制约关系,使得进程有一定的先后执行关系。
互斥:多个进程在同一个时刻只有一个进程能进入临界区

4.3信号量

信号量(Semaphore)是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。

  1. 如果信号量大于0,执行-1操作;如果信号量等于0,进程睡眠,等待信号量大于0
  2. up:对信号量执行+1操作,唤醒睡眠的进程让其完成down 操作。

down和up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。

如果信号量的取值只能为0或者1,那么就成为了 互斥量(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。

typedef int semaphore;
semaphore mutex = 1;
void P1() {
    down(&mutex);
    // 临界区
    up(&mutex);
}
void P2() {
    down(&mutex);
    // 临界区
    up(&mutex);
}

(1)使用信号量实现生产者-消费者问题

问题描述:使用一个缓冲区老保存物品,只有缓冲区没有满,生产者才可以放物品;只有缓冲区不为空,消费者才可以拿走物品。
因为缓冲区属于临界资源,因此需要使用一个互斥量mutex 来控制对缓冲区的互斥访问。

为了同步生产者和消费者的行为,需要记录缓冲区中物品的数量。数量可以使用信号量来统计,这里需要使用两个信号量:empty记录空缓冲区的数量,full 记录满缓冲区的数量。
empty信号量:不为0时生产者才可以往里面添加物品
full信号量:不为0时才可以取走物品
不能先对缓冲区加锁,再测试信号量。也就是说不能先执行 down(mutex) 再执行 down(empty)

4.4管程

使用信号量机制实现的生产者消费问题需要客户端做很多控制,而管程控制的代码独立出来,不仅不容易出错,也使得客户端代码调用更容易。

五、经典同步问题

六、进程通信

进程同步和进程通信比较容易混淆区别在于:

  1. 进程同步:控制多个进程按一定顺序执行
  2. 进程通信:进程间传输信息
    进程通信是一种手段,而进程同步是一种目的。可以说为了达到进程同步的目的,需要让进程进行通信,传输一些进程同步所需要的信息。

6.1管道

管道是通过调用pipe函数创建的,fd[0] 用于读,fd[1] 用于写。

#include <unistd.h>
int pipe(int fd[2]);

它具有以下限制:

  1. 只支持半双工通信(单向交替传输)
  2. 只能在父子进程或者兄弟进程中使用
    在这里插入图片描述

6.1FIFO

也称为命名管道,去除了管道只能在父子进程中使用的限制。
在这里插入图片描述
FIFO常用于客户-服务器应用程序中,FIFO用作汇聚点,在客户进程和服务器进程之间传递数据。

6.2消息队列

相比于FIFO,消息队列有以下特点:

  1. 消息队列可以独立于读写程序的存在,从而避免FIFO中同步管道的打开和关闭时能产生的困难
  2. 避免了 FIFO 的同步阻塞问题,不需要进程自己提供同步方法;
  3. 读进程可以根据消息类型有选择地接收消息,而不像 FIFO 那样只能默认地接收

6.3信号量

它是一个计数器,用于为多个进程提供对共享数据对象的访问。

6.4共享存储

允许多个进程共享一个给定的存储区,因为数据不需要在进程之间复制,所以是一种IPC。
需要使用信号量对共享存储的访问

与其它通信机制不同的是,它可用于不同机器间的进程通信。另外 XSI 共享内存不是使用文件,而是使用内存的匿名段。

6.5套接字

与其它通信机制不同的是,它可用于不同机器间的进程通信。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值