菜鸟笔记
提升您的技术认知

操作系统笔记

进程,线程,协程与并行,并发进程线程协程的区别死锁进程,线程,多线程i++的线程安全性同步和异步孤儿进程和僵尸进程/proc进程信息linux中的分段和分页互斥量 mutex线程进程间通信进程创建进程优先级进程的基础知识进程与线程的区别(面试题)线程的控制(创建,终止,等待,分离)可重入 VS 线程安全死锁的概念一级缓存和二级缓存的理解一句话解说内存屏障 Memory barrierbrk(), sbrk() 用法详解malloc/free函数的简单实现一文讲透 “进程、线程、协程”Linux进程状态线程池的陷阱linux内核学习之进程和线程进程与线程的区别和联系内存寻址linux IO子系统和文件系统读写流程Page cache和buffer cache的区别与联系漫谈linux文件IO多线程和多进程的区别内存泄漏字节、字、位、比特的概念和关系如何避免死锁ANSI是什么编码?CPU寻址范围(寻址空间)CPU 使用率低高负载的原因创建多少个线程合适操作系统下spinlock锁解析、模拟及损耗分析线程堆栈堆和栈的内存分配堆和栈的概念和区别堆和栈的区别,申请方式,程序的内存分配什么是 POD 数据类型Linux内存分配小结--malloc、brk、mmap系统调用与内存管理(sbrk、brk、mmap、munmap)进程描述和控制CPU执行程序的原理编译的基本概念Linux虚拟地址空间布局一个程序从源代码到可执行程序的过程程序的运行机制——CPU、内存、指令的那些事分页内存管理——虚拟地址到物理地址的转换深刻理解Linux进程间通信fork之后父子进程的内存关系fork之后,子进程继承了父进程哪些内容关于协程及其锁的一些认识对协程的一点理解std::thread join和detach区别CAS和ABA问题CAS算法锁和无锁无锁队列的实现Lock-Free 编程锁开销优化以及CAS进程、线程和协程之间的区别和联系多线程的同步与互斥(互斥锁、条件变量、读写锁、自旋锁、信号量)Linux 原来是这么管理内存的线程上下文切换怎么玩儿进程和线程通信原理CPU密集型 和 IO密集型cas原理以及Atomic原子类分析改变线程状态的八个方法六种进程间通信方式进程和线程的区别系统调用进程的概念linux共享内存进程间通讯方式进程的调度线程同步的方式mmap和shm 区别

进程和线程的区别

阅读 : 114

进程线程的切换过程

进程和线程的切换是操作系统中非常重要的概念,它们涉及到系统资源的分配、调度以及上下文切换等操作。以下是进程和线程切换过程的详细解释:

进程和线程的区别

一、进程切换
进程切换是指操作系统将 CPU 从一个进程切换到另一个进程的过程。它通常发生在以下几种情况:

  • 时间片用完:当前进程的时间片用完,操作系统需要选择下一个进程运行。
  • 进程阻塞:当前进程因等待资源(如 I/O)而阻塞,操作系统需要切换到其他就绪的进程。
  • 更高优先级进程到来:有更高优先级的进程就绪,操作系统需要切换到该进程。

进程切换的步骤:
1. 保存当前进程的上下文:
– 保存程序计数器(PC):记录当前进程执行到的位置。
– 保存寄存器状态:包括通用寄存器、状态寄存器等,这些寄存器保存了进程执行时的临时数据和状态。
– 保存进程状态信息:如进程的优先级、资源使用情况等。

  1. 更新进程控制块(PCB):
    • 将当前进程的状态从“运行态”改为“就绪态”或“阻塞态”,并更新其在进程队列中的位置。
  2. 选择下一个进程:
    • 操作系统根据调度算法(如轮转调度、优先级调度等)选择下一个要运行的进程。
    • 如果没有就绪的进程,可能会选择进入空闲进程或等待外部事件。
  3. 恢复新进程的上下文:
    • 恢复程序计数器(PC):将新进程上次运行时的位置加载到 PC 中。
      • 恢复寄存器状态:将新进程的寄存器状态加载到 CPU 的寄存器中。
    • 更新新进程的状态:将新进程的状态从“就绪态”改为“运行态”。
  4. 开始新进程运行:
    • 将 CPU 的控制权交给新进程,新进程从上次保存的位置继续执行。

线程切换

线程切换是指操作系统将 CPU 从一个线程切换到另一个线程的过程。线程切换的开销通常比进程切换小,因为线程共享进程的资源,切换时不需要切换进程的上下文。

线程切换的步骤:

  1. 保存当前线程的上下文:
    • 保存线程的程序计数器(PC):记录当前线程执行的位置。
    • 保存线程的寄存器状态:线程有自己的线程控制块(TCB),保存线程的局部变量、栈指针等信息。
    • 保存线程状态信息:如线程的优先级、阻塞原因等。
  2. 更新线程控制块(TCB):
    • 将当前线程的状态从“运行态”改为“就绪态”或“阻塞态”,并更新其在线程队列中的位置。
  3. 选择下一个线程:
    • 操作系统根据线程调度算法(如时间片轮转、优先级调度等)选择下一个要运行的线程。
    • 如果没有就绪的线程,可能会选择进入空闲线程或等待外部事件。
  4. 恢复新线程的上下文:
    • 恢复线程的程序计数器(PC):将新线程上次运行时的位置加载到 PC 中。
    • 恢复线程的寄存器状态:将新线程的寄存器状态加载到 CPU 的寄存器中。
    • 更新新线程的状态:将新线程的状态从“就绪态”改为“运行态”。
  5. 开始新线程运行:
    • 将 CPU 的控制权交给新线程,新线程从上次保存的位置继续执行。

进程切换与线程切换的对比

  1. 上下文切换的开销:
    • 进程切换:开销较大,需要切换进程的代码段、数据段、寄存器状态、文件描述符等。
    • 线程切换:开销较小,只需要切换线程的寄存器状态和栈指针等局部信息。
  2. 资源共享:
    • 进程切换:进程之间是独立的,切换时需要切换资源。
    • 线程切换:线程共享进程的资源,切换时不需要切换资源。
  3. 调度单位:
    • 进程切换:以进程为单位进行调度。
    • 线程切换:以线程为单位进行调度,线程是 CPU 调度的最小单位。
  4. 适用场景:
    • 进程切换:适用于需要独立资源的场景,如运行不同的程序。
    • 线程切换:适用于需要高并发的场景,如多线程服务器。

上下文切换的优化

上下文切换虽然可以提高系统的并发性,但频繁的上下文切换会增加系统的开销,降低系统性能。因此,操作系统和应用程序需要采取一些优化措施:

  1. 减少上下文切换的次数:
    • 增加时间片的长度,减少进程或线程切换的频率。
    • 使用高效的调度算法,减少不必要的上下文切换。
  2. 优化上下文切换的开销:
    • 减少保存和恢复的寄存器数量。
    • 使用缓存技术,减少对内存的访问。
  3. 减少线程的阻塞时间:
    • 提高 I/O 操作的效率,减少线程因 I/O 阻塞而切换的次数。
    • 使用非阻塞 I/O 或异步 I/O,减少线程的阻塞时间。

总之,进程切换和线程切换是操作系统中非常重要的机制,它们的合理使用可以提高系统的并发性和性能。