Linux
进程间通信
例如:$ping localhost | cut -c 1-24
基于管道的进程间数据交换发生在内核空间,创建管道后,这个管道在内核空间中会有一个专用的缓冲区,用于写入和读取数据。
进程控制块
操作系统对进程的管理就是先描述,后组织。怎么对进程进行描述的呢?答案就是:进程控制块PCB是对进程描述的一个结构体。这里我们知道了PCB是用来描述进程的一个结构体。是为了我们后面对进程更好的组织和管理。
在Linux下描述进程的PCB是task_struct。
进程控制块(PCB,Process Control Block) 是操作系统用来管理和控制进程的一个数据结构。每当操作系统创建一个新进程时,都会为该进程分配一个 PCB,存储该进程的相关信息。PCB 是操作系统进行进程调度和管理的核心,它保存了与进程执行相关的重要信息,帮助操作系统在进程切换时恢复进程的状态。
PCB 包含的主要信息:
-
进程状态(Process State):
- 表示进程当前的状态,例如 就绪、运行、等待、终止等。
-
程序计数器(Program Counter, PC):
- 存储进程下一条指令的地址。操作系统在上下文切换时,通过该信息能够恢复进程的执行状态。
-
CPU 寄存器的值:
- 包括通用寄存器、浮点寄存器、指令寄存器、堆栈指针等,这些是进程执行时用到的寄存器内容。
- 当进程切换时,操作系统需要保存当前进程的寄存器状态,以便下次恢复执行时继续从正确的位置开始。
-
内存管理信息:
- 包括进程的地址空间信息,比如页表、段表等,用来管理进程的虚拟内存和物理内存映射。
-
进程标识符(PID, Process ID):
- 每个进程都会有一个唯一的标识符,操作系统通过该 ID 来识别进程。
-
父进程和子进程信息:
- 记录进程的父进程和子进程关系,通常有
PPID
(父进程 ID)和PID
(当前进程 ID)字段。
- 记录进程的父进程和子进程关系,通常有
-
调度信息:
- 包括调度优先级、时间片、等待队列、调度队列等,操作系统利用这些信息来决定进程的调度顺序。
-
I/O 状态信息:
- 包括与进程相关的输入输出设备的信息,以及与 I/O 操作相关的缓冲区、文件描述符等。
-
进程的资源信息:
- 包括进程拥有的资源,如打开的文件、占用的系统资源、网络连接等。
-
进程的计时信息:
- 包括进程使用的 CPU 时间、启动时间、终止时间等,用于进程的时间管理和调度。
PCB 在进程调度中的作用:
-
上下文切换:操作系统通过保存当前进程的 PCB 和加载下一个进程的 PCB,来实现进程的上下文切换。这意味着当 CPU 从一个进程切换到另一个进程时,操作系统能够恢复每个进程的执行状态,使得进程看起来像是“并行”执行。
-
进程管理:操作系统可以通过检查和修改 PCB 中的信息,来管理进程的生命周期,如创建、销毁、挂起、恢复等。
PCB 结构示例:
假设一个 PCB 结构可能如下所示:
struct PCB {
int pid; // 进程 ID
int ppid; // 父进程 ID
int state; // 进程状态(就绪、运行、等待等)
int priority; // 进程优先级
int program_counter; // 程序计数器
int registers[32]; // CPU 寄存器
int memory_info; // 内存管理信息(页表等)
int io_info; // I/O 状态信息
int resource_info; // 资源使用情况
// 其他资源和状态信息...
};
线程和进程
1. 进程(Process)
定义:
进程是一个程序在操作系统中运行时的实例,它包含了程序代码、当前活动、堆栈、数据以及程序执行所需的其他资源。每个进程都有自己独立的地址空间、代码、数据、堆栈和系统资源(如文件句柄、内存等)。
主要特点:
- 独立性:每个进程都有自己的独立内存空间(虚拟地址空间),互相之间不能直接访问对方的内存。
- 资源占用:进程启动时会分配一定的系统资源(如内存、CPU 时间、I/O 设备等)。每个进程通常有自己的堆、栈、文件描述符等资源。
- 调度:进程由操作系统调度和管理,通常有较大的开销,因为涉及到上下文切换(保存和恢复进程的状态)。
- 隔离性:不同进程之间的错误不会直接影响其他进程,这种隔离性提高了系统的稳定性和安全性。
进程的生命周期:
- 创建:由操作系统或用户请求启动。
- 执行:进程会在 CPU 上执行。
- 阻塞:进程可能会等待某些资源或事件(如 I/O 操作)。
- 终止:执行完毕或被终止。
进程间通信(IPC):
进程间的通信需要特殊的机制,如:
- 管道(Pipes)
- 消息队列(Message Queues)
- 共享内存(Shared Memory)
- 信号量(Semaphores)
2. 线程(Thread)
定义:
线程是进程内的一个执行单元。一个进程可以有多个线程,这些线程共享进程的资源(如内存、文件描述符等),但每个线程有自己的寄存器、堆栈和程序计数器。线程是 CPU 调度的基本单位。
主要特点:
- 共享资源:同一进程内的所有线程共享进程的内存空间、全局变量等资源,因此线程之间的通信非常高效。
- 较轻量级:线程的创建、销毁和切换开销相对较小,因为它们共享大部分资源,不需要操作系统分配和管理大量资源。
- 并发执行:多线程可以并发执行,通常用于提高程序的响应性和并行处理能力。
- 独立执行:每个线程有自己的程序计数器和栈空间,它们的执行流是独立的,但共享进程的堆和全局变量。
线程的生命周期:
- 创建:由主线程或其他线程创建。
- 执行:线程会在 CPU 上执行。
- 阻塞:线程可能会等待某些资源或事件。
- 终止:线程执行完成后终止。
线程之间的通信:
线程之间的通信非常简单,因为它们共享同一个进程的内存空间。常见的通信方式包括:
- 共享内存
- 互斥锁(Mutexes)
- 条件变量(Condition Variables)
- 读写锁(Read/Write Locks)
3. 进程与线程的比较
特性 | 进程(Process) | 线程(Thread) |
---|---|---|
定义 | 进程是程序的一个实例,拥有独立的资源。 | 线程是进程中的一个执行单元,多个线程共享进程资源。 |
资源分配 | 每个进程有独立的内存空间、文件描述符等资源。 | 线程共享进程的内存空间和资源,每个线程有自己的堆栈和寄存器。 |
调度与切换开销 | 进程切换开销较大,需要保存和恢复整个进程的状态。 | 线程切换开销较小,因为线程共享进程资源。 |
通信方式 | 进程间通信较复杂,通常需要 IPC(如共享内存、消息队列)。 | 线程间通信简单,通过共享内存或同步机制即可。 |
创建与销毁 | 进程的创建和销毁需要较多的操作系统资源。 | 线程的创建和销毁较为轻量。 |
独立性 | 进程相互独立,彼此的错误不会直接影响。 | 线程共享同一进程的内存空间,线程之间的错误可能影响整个进程。 |
可靠性与稳定性 | 由于进程间隔离,系统的稳定性较高。 | 由于线程共享内存,某个线程出错可能导致整个进程崩溃。 |
4. 进程和线程的使用场景
-
进程:适用于需要完全独立的资源和隔离的应用场景,如运行多个应用程序、进程间通信比较复杂的情况。
- 例如,操作系统中运行的不同应用程序、数据库服务器中的每个数据库实例。
-
线程:适用于需要并发处理的任务,线程轻量化的特点使得它非常适合并行计算、I/O 密集型任务和响应性要求高的应用场景。
- 例如,Web 服务器、图形用户界面(GUI)应用程序、并行计算(如科学计算、数据处理等)。
总结:
- 进程 是操作系统分配资源的基本单位,每个进程都有独立的内存空间和资源,进程间相互独立。
- 线程 是进程中的最小执行单位,线程之间共享进程资源,它们的创建、调度和切换比进程轻量,因此常用于并发和多任务处理。
两者在性能、资源分配、调度策略等方面有不同的优势和应用场景。在实际开发中,经常会根据需要选择使用进程或线程,甚至是两者结合的方式来实现并发或并行计算。