进程、线程上下文切换

上下文切换
什么是上下文切换

进程上下文切换
上下文切换(有时也称做进程切换或任务切换)是指 CPU 从一个进程或线程切换到另一个进程或线程。

上下文切换可以认为是内核(操作系统的核心)在 CPU 上对于进程(包括线程)进行以下的活动:(1)挂起一个进程,将这个进程在 CPU 中的状态(上下文)存储于内存中的某处,(2)在内存中检索下一个进程的上下文并将其在 CPU 的寄存器中恢复,(3)跳转到程序计数器所指向的位置(即跳转到进程被中断时的代码行),以恢复该进程。

进程的上下文:
不但包括虚拟内存、栈、全局变量等用户空间资源,还包括内核堆栈、寄存器等内核空间状态。
**切换过程:**进程的上下文切换比系统调用多一个步骤:保存当前进程的内核状态和 CPU 寄存器之前,先把该进程的虚拟内存、栈等保存起来;加载下一个进程的内核态后,还需要刷新进程的虚拟内存和用户栈。保存上下文和恢复上下文需要内核在 CPU 上运行才能完成。

进程是由内核管理和调度的,进程的切换只能发生在内核态什么情况发生上下文切换:

**

进程上下文切换发生情形:

**

  1. 时间片耗尽;

  2. IO阻塞、

  3. 多个任务抢占锁资源, 当前任务没有抢到

  4. 发生硬中断,CPU 上的进程会被挂起,然后去执行内核中的中断服务进程。

  5. 进程通过睡眠函数 sleep 或者wait等阻塞函数,把自己挂起来;

  6. 当有优先级更高的进程运行时,为了去运行高优先级进程,当前进程会被挂起;

注意:当系统调用(如发个信号singal)发生时 CPU 上下文切换到内核态是必要的。这应该叫做模式切换而不是上下文切换,因为没有改变当前的进程。

I/O 可以被定义为任何信息流入或流出 CPU 与主内存(RAM)。也就是说,一台电脑的
CPU和内存与该电脑的用户(通过键盘或鼠标)、存储设备(硬盘或磁盘驱动)还有其他电脑的任何交流都是 I/O。

中断上下文切换

为了快速响应硬件的事件,中断处理会打断进程的正常调度和执行,然后调用中断处理程序,响应设备事件。在打断其他进程时,需要先将进程当前的状态保存下来,等中断结束后,进程仍然可以恢复回来。

跟进程上下文不同,中断上下文切换不涉及进程的用户态。所以,即便中断过程打断了一个正处在用户态的进程,也不需要保存和恢复这个进程的虚拟内存、全局变量等用户态资源。中断上下文,只包括内核态中断服务程序执行所必需的状态,也就是 CPU 寄存器、内核堆栈、硬件中断参数等。

对同一个 CPU 来说,中断处理比进程拥有更高的优先级,所以中断上下文切换不会与进程上下文切换同时发生。

总之:中断和系统调用,由于不涉及两个进程的切换,都不会涉及进程用户态状态信息,只会保存进程在内核态的那些状态信息

上下文频繁切换为什么会影响性能?

进程上下⽂切换次数较多的情况下,很容易导致⼤量时间耗费在CPU寄存器、操作系统内核栈以及内存等资源的保存和恢复上。

线程上下文切换

线程是调度的基本单位,而进程则是资源拥有的基本单位。

内核中的任务调度实际是在调度线程,进程只是给线程提供虚拟内存、全局变量等资源。线程上下文切换时,共享相同的虚拟内存和全局变量等资源不需要修改。而线程自己的私有数据,如栈和寄存器等,上下文切换时需要保存。

线程切换分两种情况:

前后两个线程属于不同进程;
前后两个线程属于同一个进程(速度更快,消耗更少资源)。

**

切换的性能消耗:

**

1、线程上下文切换和进程上下问切换一个最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上下文切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能损耗是将寄存器中的内容切换出。

2、另外一个隐藏的损耗是上下文的切换会扰乱处理器的缓存机制。简单的说,一旦去切换上下文,处理器中所有已经缓存的内存地址一瞬间都作废了。还有一个显著的区别是当你改变虚拟内存空间的时候,处理的页表缓冲(processor’s Translation Lookaside Buffer (TLB))会被全部刷新,这将导致内存的访问在一段时间内相当的低效。但是在线程的切换中,不会出现这个问题。

进程上下文切换开销都有哪些
1、切换页表全局目录
2、切换内核态堆栈
3、切换硬件上下文(进程恢复前,必须装入寄存器的数据统称为硬件上下文)
ip(instruction pointer):指向当前执行指令的下一条指令
bp(base pointer): 用于存放执行中的函数对应的栈帧的栈底地址
sp(stack poinger): 用于存放执行中的函数对应的栈帧的栈顶地址
cr3:页目录基址寄存器,保存页目录表的物理地址

4、刷新TLB
5、系统调度器的代码执行

<think>好的,我需要回答用户关于进程线程上下文切换的区别及性能影响的问题。首先,我应该回顾一下用户提供的引用内容,确保正确引用信息。用户给出的四个引用主要讨论了线程进程上下文切换的不同之处,包括虚拟内存空间、资源切换、性能损耗如寄存器切换、缓存失效TLB刷新等。 首先,我需要明确进程线程的基本概念。进程是资源分配的基本单位,拥有独立的虚拟内存空间、文件描述符等资源,而线程是调度的基本单位,属于同一进程线程共享这些资源。根据引用[1],线程切换时虚拟内存空间不变,而进程切换时虚拟内存空间改变。这是关键区别之一。 接下来,上下文切换的具体内容。进程切换涉及更多资源的保存恢复,比如页表、文件描述符等,而线程切换只需处理私有数据如寄存器栈。引用[3]提到线程切换时共享资源不需要修改,只需要保存私有数据,而进程切换需要切换全部资源。 然后考虑性能影响。引用[1][4]指出,进程切换会导致更高的性能损耗,因为需要切换寄存器内容,还可能刷新TLB,导致缓存失效,增加内存访问延迟。而线程切换由于共享内存空间,避免了这些开销,因此更高效。此外,引用[2]提到同进程内的线程切换只需切换私有数据,而跨进程线程切换等同于进程切换。 我需要将这些信息组织成结构清晰的回答,分点说明区别性能影响。同时,确保使用正确的LaTeX格式,如行内公式用$...$,独立公式用$$...$$。可能还需要生成相关问题,比如优化方法、实际应用场景等。 检查是否有遗漏点,比如寄存器切换、缓存TLB的影响,这些在引用中都有提到,需要整合到回答中。最后,确保引用标识正确对应,比如[^1]、[^2]等,并放在适当的位置。 现在,将这些整理成用户易懂的中文回答,分步骤解释区别性能影响,同时引用相关文献支持观点。确保回答真实可靠,结构清晰,帮助用户逐步理解问题。</think>### 进程线程上下文切换的区别及性能影响 #### 一、核心区别 1. **虚拟内存空间** - **进程切换**:需要切换虚拟内存空间,导致页表缓冲(TLB)刷新,内存访问效率降低[^1][^4]。 - **线程切换**:同一进程内的线程共享虚拟内存空间,无需修改页表,TLB保持不变[^3]。 2. **资源切换范围** - **进程切换**:需保存恢复全部资源,包括寄存器、页表、文件描述符、全局变量等[^1][^3]。 - **线程切换**:仅需切换线程私有数据(如寄存器、栈),共享资源(如虚拟内存)保持不变[^2][^3]。 3. **调度主体** - 线程是系统调度的基本单位,内核任务调度直接操作线程进程线程提供资源支持[^2][^3]。 --- #### 二、性能影响 1. **直接损耗** - 进程切换需要保存恢复更多寄存器内容(如程序计数器、栈指针),耗时显著[^1][^4]。 - 线程切换的寄存器操作量更少,例如同进程线程切换仅需处理私有寄存器,时间开销较低[^2][^3]。 2. **间接损耗** - **缓存失效**:进程切换会导致CPU缓存(如L1/L2缓存)失效,重新加载数据增加延迟[^4]。 - **TLB刷新**:进程切换后TLB被清空,后续内存访问需重新查询页表,效率下降[^4]。 - 线程切换因共享内存空间,缓存TLB可继续复用,间接损耗较小。 3. **数学表达示例** 假设一次进程切换耗时$T_p$,线程切换耗时$T_t$,通常满足: $$T_p = k \cdot T_t \quad (k > 1)$$ 其中$k$与资源切换量正相关[^1][^2]。 --- #### 三、典型场景对比 | **场景** | **进程切换** | **线程切换** | |------------------------|------------------------------------------|------------------------------------------| | Web服务器处理请求 | 不同用户请求分配独立进程时,频繁切换导致高延迟 | 多线程处理请求,切换开销低,吞吐量高[^2] | | 数据库事务并发 | 进程间隔离性强,但并发性能差 | 线程共享连接池,切换效率高,适合高并发[^3] | | 科学计算并行任务 | 需跨节点通信时采用多进程(如MPI) | 单节点多线程共享内存,计算效率更高[^4] | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值