main()
函数对应的线程)。对比项 | 进程 | 线程 |
---|---|---|
资源分配 | 独立资源(内存、文件等) | 共享进程的资源 |
通信方式 | 需要IPC(管道、消息队列等) | 共享内存,直接通信 |
切换开销 | 高(进程上下文切换) | 低(线程上下文切换) |
运行独立性 | 进程间互不影响 | 线程崩溃可能影响进程 |
适用场景 | 独立程序(如浏览器、数据库服务) | 需要并发的任务(如Web服务器的多个请求处理) |
进程调度是操作系统管理CPU资源的关键部分,它决定了哪个进程可以使用CPU以及使用多长时间。不同的调度算法适用于不同的应用场景,常见的进程调度算法如下:
进程调度的目标:
调度发生的时机:
原理:按照进程到达的顺序依次执行,先到的进程先运行,不可抢占。
优点:
缺点:
示例:
进程 | 到达时间 | 执行时间 | 完成时间 | 等待时间 |
---|---|---|---|---|
P1 | 0 | 5 | 5 | 0 |
P2 | 1 | 3 | 8 | 4 |
P3 | 2 | 8 | 16 | 6 |
平均等待时间 = (0 + 4 + 6) / 3 = 3.33
原理:优先调度执行时间最短的进程,非抢占式或抢占式均可。
优点:
缺点:
示例(非抢占式):
进程 | 到达时间 | 执行时间 | 完成时间 | 等待时间 |
---|---|---|---|---|
P1 | 0 | 6 | 6 | 0 |
P2 | 2 | 2 | 8 | 4 |
P3 | 3 | 1 | 9 | 5 |
平均等待时间 = (0 + 4 + 5) / 3 = 3
原理:综合考虑等待时间和执行时间,优先调度响应比高的进程。
响应比计算公式:
响应比=(等待时间+执行时间)/执行时间
优点:
缺点:
原理:每个进程分配一个固定时间片,时间片到后切换到下一个进程。
优点:
缺点:
示例(时间片=3ms):
进程 | 到达时间 | 执行时间 | 轮转调度 |
---|---|---|---|
P1 | 0 | 5 | P1(3) → P2(3) → P3(3) → P1(2) |
P2 | 1 | 3 | |
P3 | 2 | 8 |
原理:SJF的抢占式版本,每次调度时选择剩余执行时间最短的进程。
优点:
缺点:
原理:
优点:
缺点:
算法 | 是否抢占 | 适用场景 | 优点 | 缺点 |
---|---|---|---|---|
FCFS | 否 | 批处理系统 | 简单易实现 | 容易导致长等待时间 |
SJF | 可选 | 任务执行时间已知 | 平均等待时间短 | 可能出现饥饿问题 |
HRRN | 否 | 交互式、批处理 | 兼顾公平性 | 计算响应比增加开销 |
RR | 是 | 分时系统 | 确保每个进程公平执行 | 频繁切换增加开销 |
SRTF | 是 | 交互式、批处理 | 平均等待时间最短 | 容易造成饥饿问题 |
MLFQ | 是 | 综合系统 | 适应不同类型任务 | 复杂,调优难 |
进程间通信是指不同进程之间交换数据或同步协作的机制。由于进程间相互独立,不能直接访问彼此的内存,因此操作系统提供了多种进程间通信的方式,以下是主要的进程间通信方式。
(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)通信;可用于无亲缘关系的进程间通信;支持双向通道(全双工);
通信方式 | 数据传输 | 是否支持无亲缘关系进程 | 通信方向 | 优缺点 |
---|---|---|---|---|
管道(Pipe) | 小量数据 | 仅限父子进程 | 单向 | 简单易用,但受限于单向通信 |
信号(Signal) | 仅发送信号 | 任意进程 | 单向 | 轻量级,但只适用于通知 |
消息队列(Message Queue) | 结构化消息 | 任意进程 | 单向 | 适用于异步通信,但访问较慢 |
共享内存(Shared Memory) | 大量数据 | 任意进程 | 读写共享 | 速度最快,但需同步机制 |
信号量(Semaphore) | 无 | 任意进程 | 无 | 仅用于进程同步,非数据传输 |
套接字(Socket) | 大量数据 | 任意进程/跨网络 | 双向 | 适用于分布式通信,性能略低 |
应用场景 | 推荐IPC方式 |
---|---|
父子进程间通信 | 管道、消息队列、共享内存 |
进程间同步 | 信号、信号量 |
无关进程数据交换 | 消息队列、共享内存、套接字 |
大量数据共享 | 共享内存 |
网络进程通信 | 套接字(Socket) |