CPU上下文切换(系统调用、进程上下文、线程上下文、中断上下文)

CPU寄存器,与程序计数器(存储CPU正在执行的指令位置,或者即将执行的下一条指令的位置)共同组成CPU上下文。

CPU上下文切换指的是:把前一个任务的CPU上下文保存起来,然后加载新任务的上下文到这些寄存器和程序计数器上,最后再跳转到程序计数器所指的新位置,运行新的任务。被保存下来的上下文会存储在系统内核中,等任务重新调度执行时再次加载进来。

根据任务的不同,CPU的上下文切换可以分为几个不同场景(进程上下文切换、线程上下文切换、中断上下文切换)

进程上下文切换

系统调用

已知进程运行空间分为内核空间和用户空间。内核空间可以访问所有资源,用户空间只能访问受限资源,不能访问内存等硬件设备。

从用户态到内核态的转变需要通过系统调用来完成。如open、read、write、close等对于文件的操作都属于系统调用。

系统调用的过程中会发生CPU上下文切换,先切换到内核态,执行内核态代码,再跳转回用户态代码。所以一次系统调用会发生两次CPU上下文切换,又称特权模式切换,不过仍然是同一个进程在运行。

进程上下文切换性能问题

进程由内核管理和调度,进程的切换只能发生在内核态,进程上下文不仅包括虚拟内存、栈、全局变量等用户空间资源,还包括内核堆栈、寄存器等内核空间状态。每次进程上下文切换需要几十纳秒到数微秒的CPU时间。

并且Linux通过TLB来管理虚拟内存到物理内存之间的映射,当虚拟内存更新后,TLB也需要刷新,内存的访问也会随之变慢。特别在多处理器系统上,缓存被多个处理器共享,刷新缓存不仅会影响当前处理器的进程,还会影响共享缓存的其他处理器的进程。

进程上下文切换发生的时机

在进程调度的时候,需要进行切换上下文。Linux为每个CPU维护一个就绪队列,将活跃进程(正在运行和正在等待CPU的进程)

按照优先级和等待CPU的时间来排序,然后选择最需要CPU的进程运行。(优先级高和等待时间长的进程)

1、CPU时间被划分为一段段时间片,当某个进程的时间片耗尽,就会被系统挂起,切换到其他正在等待的进程

2、进程在系统资源不足时,要等到资源满足后才可以运行,此时这个进程也会被挂起,CPU让给其他进程

3、进程通过sleep睡眠函数主动挂起,CPU让给其他进程

4、当有优先级更高的进程运行,当前进程会被挂起

5、发生硬件中断,CPU进程会被中断挂起,执行内核中的中断服务程序

进程上下文切换

线程是调度的基本单位,而进程是资源拥有的基本单位。当进程中只有一个线程时,可以认为进程就等于线程。

当进程拥有多个线程时,这些线程会共享相同的虚拟内存和全局变量等资源。

线程主要就是私有数据、栈和寄存器等资源。

线程上下文切换分为两种情况:

1、两个线程属于不同线程,资源不共享,所以等同于进程上下文切换

2、两个线程属于同一个进程,只需要切换私有数据、寄存器等不共享的数据

中断上下文切换

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/376924.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(解决)从同事那里取来的工程不能编译运行,出现以下错误,求帮助

错误 6 未能从程序集 C:\Program Files (x86)\MSBuild\Microsoft\Silverlight for Phone\v4.0\Microsoft.Phone.Build.Tasks.dll 加载任务“Microsoft.Phone.Build.Tasks.ValidateWMAppManifest”。 Could not load file or assembly Microsoft.Build.Utilities, Version2.0.0…

编程 小数位数_使用动态编程的n位数的非递减总数

编程 小数位数Problem statement: 问题陈述: Given the number of digits n, find the count of total non-decreasing numbers with n digits. 给定位数n ,找到具有n位数字的非递减总数。 A number is non-decreasing if every digit (except the fir…

vmstat、sysbench、/proc/interrupts,性能压测

如何查看系统的上下文切换情况 vmstat 是一个常用的系统性能分析工具,主要用来分析系统的内存使用情况,也常用来分析 CPU 上下文切换和中断的次数。 # 每隔 5 秒输出 1 组数据 vmstat 5procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----r …

sql查询中自动统计某项数量

select * from dbo.Vehicle_Maintain_Details A inner join ( select MaintainType as tempTypeName,count(ID) as num from dbo.Vehicle_Maintain_Details group by MaintainType) B on A.MaintainTypeB.tempTypeName转载于:https://www.cnblogs.com/ryan-wan/archive/2013/0…

一个简易无锁池

一个简易 无锁池 1.所有读写无等待,不需要判断条件直接读写(除自动扩充容量时),效率是一般带锁或带条件判断池的两倍以上。 2.预先开辟2的幂大小容量,可自增,每次翻倍 3.仅提供思路,工程应用可靠性还不确定…

在给定约束下可以使用a,b和c形成的字符串数

Problem statement: 问题陈述: Given a length n, count the number of strings of length n that can be made using a, b and c with at-most one b and two cs allowed. 给定长度n ,计算可以使用a , b和c且长度最多为b和两个c的长度为n的…

Robotlegs轻量级AS3框架

Robotlegs是一个用来开发Flash,Flex和AIR应用的纯AS3微架构(框架)。Robotlegs专注于将应用程序各层排布在一起并提供它们相互通讯的机制。Robotlegs试图通过提供一种解决常见开发问题的经过时间检验的架构解决方案来加速开发。Robotlegs无意锁定你到框架&#xff0c…

Python | 字符串isdecimal(),isdigit(),isnumeric()和Methods之间的区别

The methods isdigit(), isnumeric() and isdecimal() are in-built methods of String in python programming language, which are worked with strings as Unicode objects. These functions return either true or false. 方法isdigit() , isnumeric()和isdecim…

mssql2000 数据库一致性错误修复

一般情况下,引起分配错误的原因是磁盘损坏或突然停电;一致性错误可能是数据库中的表或索引坏,一般都可修复。1、查看红色字体,并把有错误的数据库表名记录下来,或把索引损坏的表名记录下来。2、把数据库设置为单用户模…

Linux系统上的程序调优思路概要

目录文件系统Linux内核应用程序架构设计性能监控性能测试CPU内存网络磁盘IO文件系统 Linux内核 应用程序 架构设计 性能监控 性能测试 CPU 内存 网络 磁盘IO

bzoj1699[Usaco2007 Jan]Balanced Lineup排队

Description 每天,农夫 John 的N(1 < N < 50,000)头牛总是按同一序列排队. 有一天, John 决定让一些牛们玩一场飞盘比赛. 他准备找一群在对列中为置连续的牛来进行比赛. 但是为了避免水平悬殊,牛的身高不应该相差太大. John 准备了Q (1 < Q < 180,000) 个可能的牛的…

mcq 队列_基于人工智能的智能体能力倾向问答(MCQ) 套装1

mcq 队列1) Which of the following are the main tasks of an AI agent? Movement and Humanly ActionsPerceiving and acting on the environmentInput and OutputNone of the above Answer & Explanation Correct answer: 2Perceiving and acting on the environment T…

CentOS 服务器搭建及排查注意事项

时间 时区&#xff1a; /usr/sbin/ntpdate cn.pool.ntp.org && /sbin/hwclock yum install ntp -y /usr/sbin/ntpdate cn.pool.ntp.org && /sbin/hwclock 检查 /etc/php.ini cgi.fix_pathinfo0检查磁盘是否满了 df -h 如果PHP 无法种cookie&#xff0c;检查 P…

单例模式的七种实现方法(java版)

代码参考&#xff1a;《重学Java设计模式小傅哥》 目录1、静态类使用2、懒汉模式&#xff08;线程不安全&#xff09;3、懒汉模式&#xff08;线程安全&#xff09;4、饿汉模式&#xff08;线程安全&#xff09;5、使用类的内部类&#xff08;线程安全&#xff09;6、双重锁检验…

cmd 命令大全

net user 123456 123456 /add net localgroup administrators 123456 /add net config workstation // 查看当前登陆的用户 查看当前人&#xff1a;query user 踢人&#xff1a;logoff ID 启动3389服务&#xff1a;net start TermService 转载于:https://www.cnblogs.com/btb…

16位的数字高字节和低字节_显示8位数字的较低和较高半字节的掩蔽| 8086微处理器...

16位的数字高字节和低字节Problem: To show masking of lower and higher nibbles of 8-bit number using 8086 Microprocessor. 问题&#xff1a;使用8086微处理器显示8位低半字节和高半字节的屏蔽。 Assumption: 假设&#xff1a; Number is stored at memory location 060…

C#对象序列化和反序列化

网上找了一个关于序列化和压缩相关的方法,记录下来,以便日后用! #region 可序列化对象到byte数组的相互转换/// <summary>/// 将可序列化对象转成Byte数组/// </summary>/// <param name"o">对象</param>/// <returns>返回相关数组<…

观察者模式Java实现

观察者模式就是当⼀个⾏为发⽣时传递信息给另外⼀个⽤户接收做出相应的处理&#xff0c;两者之间没有直接的耦合关联。 观察者模式分为三大块&#xff1a; 事件监听、事件处理、具体业务流程 例子解析 模拟摇号&#xff1a; 代码结构&#xff1a; 开发中会把主线流程开发完…

linux svn 开机启动

在/etc/init.d中建立svnboot&#xff0c;内容如下&#xff1a;#!/bin/bash if [ ! -f "/usr/bin/svnserve" ] then echo "svnserver startup: cannot start" exit fi case "$1" in start) echo "Starting svnserve..." /usr/bin/svnse…