本文最后更新于14 天前,其中的信息可能已经过时,如有错误请发送邮件到3368129372@qq.com
进程间如何通信
- 管道连接内核空间。缺点:管道效率低,不太适合通信。
- 使用消息队列:内核中的消息链表。
缺点:- 链表有长度上限,不太适合较大数据的传输
- 内核态与用户态间拷贝数据存在开销
- 共享内存,两个应用写的虚拟内存映射到同一个物理内存中
- 信号量
- socket(socket支持同一个服务器不同进程间通信)
进程间上下文切换
在操作系统中,进程和线程的切换是多任务处理的核心部分,涉及到上下文切换。上下文切换是指操作系统在保存当前执行的进程或线程的状态,并恢复另一个进程或线程的状态,使其能够继续执行。以下是进程和线程切换的详细过程和区别:
进程切换
-
保存当前进程的上下文:
- 当操作系统决定切换进程时,它会保存当前进程的上下文,包括程序计数器(PC)、寄存器状态、内存管理信息(如页表)、文件描述符表等。
- 这些信息通常存储在进程控制块(PCB, Process Control Block)中。
-
更新进程调度队列:
- 操作系统将当前进程的状态更新为等待(waiting)或就绪(ready),并将其放入相应的调度队列中。
- 选择下一个要运行的进程,并将其状态更新为运行(running)。
-
加载新进程的上下文:
- 操作系统从新进程的 PCB 中恢复其上下文,包括程序计数器、寄存器状态、内存管理信息等。
- 切换到新进程的地址空间(虚拟内存)。
-
切换到新进程:
- 更新 CPU 的程序计数器,使其指向新进程的下一条指令。
- 开始执行新进程。
线程切换
线程切换与进程切换类似,但由于线程共享同一进程的地址空间和资源,切换的开销较小。
-
保存当前线程的上下文:
- 当操作系统决定切换线程时,它会保存当前线程的上下文,包括程序计数器、寄存器状态等。
- 这些信息通常存储在线程控制块(TCB, Thread Control Block)中。
-
更新线程调度队列:
- 操作系统将当前线程的状态更新为等待或就绪,并将其放入相应的调度队列中。
- 选择下一个要运行的线程,并将其状态更新为运行。
-
加载新线程的上下文:
- 操作系统从新线程的 TCB 中恢复其上下文,包括程序计数器、寄存器状态等。
-
切换到新线程:
- 更新 CPU 的程序计数器,使其指向新线程的下一条指令。
- 开始执行新线程。
区别
-
上下文切换的开销:
- 进程切换的开销较大,因为需要切换整个地址空间和相关资源,如内存页表、文件描述符等。
- 线程切换的开销较小,因为线程共享进程的地址空间和大部分资源,只需切换寄存器和程序计数器等少量信息。
-
调度粒度:
- 进程调度是操作系统的核心功能,涉及到进程的创建、销毁、同步和通信等。
- 线程调度可以在用户态或内核态进行,用户态线程库(如 Pthreads)可以实现用户级线程的调度,而内核态线程则由操作系统内核调度。
上下文切换的触发条件
-
时间片到期:
- 操作系统使用时间片轮转调度算法时,当当前进程或线程的时间片用完,会触发上下文切换。
-
阻塞操作:
- 当前进程或线程执行阻塞操作(如 I/O 操作、等待信号量等)时,会触发上下文切换。
-
优先级调度:
- 操作系统根据进程或线程的优先级进行调度,当有更高优先级的进程或线程需要运行时,会触发上下文切换。
-
中断处理:
- 硬件中断(如时钟中断、I/O 中断)会触发操作系统进行上下文切换,以处理中断事件。
总之,进程和线程的切换是操作系统实现多任务处理的关键机制,通过上下文切换,操作系统能够在多个进程或线程之间高效地分配 CPU 资源。