操作系统专栏之进程管理——进程与线程,进程调度算法,进程间通信方式

一、进程与线程之间的关系及对比

1. 进程(Process)

  • 定义:进程是操作系统中运行的程序实例,它是系统资源分配的基本单位。
  • 特性
    • 具有独立的地址空间(代码段、数据段、堆栈等)。
    • 拥有自己的资源(文件句柄、内存空间等)。
    • 进程之间相互独立,一个进程的崩溃不会影响其他进程。
    • 进程之间的通信需要进程间通信(IPC) 机制,如管道(Pipe)、消息队列、共享内存等。
    • 进程切换需要较多的系统资源(如上下文切换的开销大)。

2. 线程(Thread)

  • 定义:线程是进程中的一个执行单元,是CPU调度的基本单位。
  • 特性
    • 线程共享所在进程的资源(如地址空间、全局变量、文件句柄等)。
    • 线程间的切换成本低,因为它们共享同一个地址空间。
    • 线程之间可以直接通信,不需要复杂的IPC机制。
    • 线程的创建和销毁比进程更轻量级。

3. 进程与线程的关系

  • 一个进程可以包含多个线程,这些线程共享该进程的资源。
  • 至少有一个主线程(如 main() 函数对应的线程)。
  • 多线程可以并行执行,提高程序的运行效率,如多核CPU环境下多个线程可以同时执行。
  • 线程的崩溃可能影响整个进程,因为它们共享进程的资源。

4. 进程与线程的对比

对比项 进程 线程
资源分配 独立资源(内存、文件等) 共享进程的资源
通信方式 需要IPC(管道、消息队列等) 共享内存,直接通信
切换开销 高(进程上下文切换) 低(线程上下文切换)
运行独立性 进程间互不影响 线程崩溃可能影响进程
适用场景 独立程序(如浏览器、数据库服务) 需要并发的任务(如Web服务器的多个请求处理)

5. 举例

  • 单进程单线程:如一个简单的命令行工具,只有一个主线程执行任务。
  • 单进程多线程:如浏览器,多个标签页是不同的线程,但共享同一进程资源。
  • 多进程多线程:如Web服务器(Nginx、Apache),可以使用多个进程,每个进程包含多个线程处理请求。

6. 总结

  • 进程是资源分配的单位线程是调度的单位
  • 进程间相互独立线程共享进程的资源
  • 多进程适用于高稳定性需求(如隔离任务),多线程适用于高并发场景(如服务器处理请求)。

 二、进程间调度算法

进程调度是操作系统管理CPU资源的关键部分,它决定了哪个进程可以使用CPU以及使用多长时间。不同的调度算法适用于不同的应用场景,常见的进程调度算法如下:

1. 进程调度的基本概念

进程调度的目标

  • 最大化CPU利用率
  • 最小化响应时间
  • 公平分配CPU资源
  • 最大化系统吞吐量

调度发生的时机

  • 进程从运行态变为等待态(如等待I/O)
  • 进程从运行态变为就绪态(时间片用完)
  • 进程从等待态变为就绪态(I/O完成)
  • 进程终止

2. 常见的进程调度算法

(1) 先来先服务(FCFS, First-Come First-Served)

原理:按照进程到达的顺序依次执行,先到的进程先运行,不可抢占。

优点

  • 简单,易于实现
  • 适用于CPU密集型任务

缺点

  • 容易导致“等待时间长”问题,如果某个进程执行时间过长,会导致后面的进程长时间等待(“公交车效应”)。
  • 不能很好地响应交互式进程,可能会导致短进程被长进程阻塞。

示例

进程 到达时间 执行时间 完成时间 等待时间
P1 0 5 5 0
P2 1 3 8 4
P3 2 8 16 6

平均等待时间 = (0 + 4 + 6) / 3 = 3.33


(2) 短作业优先(SJF, Shortest Job First)

原理:优先调度执行时间最短的进程,非抢占式或抢占式均可。

优点

  • 平均等待时间最短,提高系统吞吐量。

缺点

  • 可能导致“饥饿问题”,长进程可能长期等待而得不到调度。
  • 需要预知进程的执行时间(难以准确预测)。

示例(非抢占式)

进程 到达时间 执行时间 完成时间 等待时间
P1 0 6 6 0
P2 2 2 8 4
P3 3 1 9 5

平均等待时间 = (0 + 4 + 5) / 3 = 3


(3) 最高响应比优先(HRRN, Highest Response Ratio Next)

原理:综合考虑等待时间和执行时间,优先调度响应比高的进程。
响应比计算公式

响应比=(等待时间+执行时间)/执行时间

优点

  • 兼顾SJF和FCFS,减少饥饿问题。

缺点

  • 计算响应比增加调度开销。

(4) 轮转调度(RR, Round Robin)

原理:每个进程分配一个固定时间片,时间片到后切换到下一个进程。

优点

  • 适用于多任务交互系统,提高响应速度。
  • 避免了长进程阻塞短进程的问题。

缺点

  • 频繁的进程切换可能增加调度开销。
  • 选择合适的时间片大小至关重要:
    • 时间片太小 → 频繁切换,增加开销。
    • 时间片太大 → 退化为FCFS。

示例(时间片=3ms)

进程 到达时间 执行时间 轮转调度
P1 0 5 P1(3) → P2(3) → P3(3) → P1(2)
P2 1 3
P3 2 8

(5) 最短剩余时间优先(SRTF, Shortest Remaining Time First)

原理:SJF的抢占式版本,每次调度时选择剩余执行时间最短的进程。

优点

  • 平均等待时间最短。

缺点

  • 可能造成高优先级进程不断抢占,低优先级进程无法运行(饥饿问题)。

(6) 多级反馈队列调度(Multilevel Feedback Queue, MLFQ)

原理

  • 设定多个队列,每个队列优先级不同。
  • 短任务优先级高,长任务优先级低。
  • 长时间运行的进程逐渐降低优先级。

优点

  • 适用于多任务、多优先级场景
  • 兼顾短任务的响应速度长任务的公平性

缺点

  • 复杂度高,难以调优。

3. 进程调度算法对比

算法 是否抢占 适用场景 优点 缺点
FCFS 批处理系统 简单易实现 容易导致长等待时间
SJF 可选 任务执行时间已知 平均等待时间短 可能出现饥饿问题
HRRN 交互式、批处理 兼顾公平性 计算响应比增加开销
RR 分时系统 确保每个进程公平执行 频繁切换增加开销
SRTF 交互式、批处理 平均等待时间最短 容易造成饥饿问题
MLFQ 综合系统 适应不同类型任务 复杂,调优难

三、进程间的通信方式

进程间通信是指不同进程之间交换数据或同步协作的机制。由于进程间相互独立,不能直接访问彼此的内存,因此操作系统提供了多种进程间通信的方式,以下是主要的进程间通信方式。

1、进程间通信的主要方式

(1)管道(pipe)

概念:管道是最简单的IPC方式,适用于具有亲缘关系的进程,如父子进程。

特点:单向通信;半双工(数据智能沿一个方向流动);只能用于有亲缘关系的进程;基于文件描述符进行数据读写;

使用方式示例:

int fd[2];
pipe(fd); // 创建管道
pid_t pid = fork(); // 创建子进程
if (pid > 0) {
    write(fd[1], "Hello", 5); // 父进程写入
} else {
    read(fd[0], buffer, 5); // 子进程读取
}

(2)信号(signal)

概念:信号是一种异步通知机制,用于通知进程发生了特定的事件。

特点:轻量级,适用于进程间的简单通知(如终止,暂停);进程可以捕捉特定信号并处理;操作系统提供默认的信号处理机制;

常见信号:

信号 描述
SIGINT 用户中断(如 Ctrl+C)
SIGKILL 强制终止进程
SIGTERM 终止进程(可被捕获)
SIGCHLD 子进程结束通知父进程

(3)消息队列

概念:消息队列是一种先进先出的消息存储机制,可以在无亲缘关系的进程之间传递数据;

特点:进程间可以异步通信,消息存储在内核中;支持多对多通信,多个进程可以读写同一个队列;需要使用msgget(),msgsnd(),msgrcv();

(4)共享内存

概念:共享内存是一种最快的进程间通信方式,不同进程可以直接访问同一块内存区域;

特点:速度快,因为数据无需在内核和用户空间传输;可以实现大数据量通信(比如音视频);需要同步机制(如信号量)来避免多个进程同时访问数据导致冲突。

(5)信号量(semaphore)

概念:信号量是一种用于进程同步的机制,用于控制多个进程对共享资源的访问;

特点:主要用于进程间同步,而非数据传输;可以实现互斥锁,防止多个进程同时访问关键资源;

(6)套接字(socket)

概念:套接字是一种支持不同主机和不同进程之间通信的机制,常用于网络通信,但也适用于本地进程间通信。

特点:支持本地(UNIX Domain Sockets)和远程(TCP/IP)通信;可用于无亲缘关系的进程间通信;支持双向通道(全双工);

2. 进程间通信方式对比

通信方式 数据传输 是否支持无亲缘关系进程 通信方向 优缺点
管道(Pipe) 小量数据 仅限父子进程 单向 简单易用,但受限于单向通信
信号(Signal) 仅发送信号 任意进程 单向 轻量级,但只适用于通知
消息队列(Message Queue) 结构化消息 任意进程 单向 适用于异步通信,但访问较慢
共享内存(Shared Memory) 大量数据 任意进程 读写共享 速度最快,但需同步机制
信号量(Semaphore) 任意进程 仅用于进程同步,非数据传输
套接字(Socket) 大量数据 任意进程/跨网络 双向 适用于分布式通信,性能略低

3. 适用场景分析

应用场景 推荐IPC方式
父子进程间通信 管道、消息队列、共享内存
进程间同步 信号、信号量
无关进程数据交换 消息队列、共享内存、套接字
大量数据共享 共享内存
网络进程通信 套接字(Socket)

4. 总结

  • 小数据传输:消息队列、管道。
  • 大数据传输:共享内存 + 信号量(同步)。
  • 进程同步:信号、信号量。
  • 远程/本地通用通信:套接字(Socket)。

你可能感兴趣的:(操作系统,后端)