Linux2.6对新型CPU的支持
文章分析了在 Linux 2.6 中引入的对 Intel CPU 快速系统调用指令 SYSENTER/SYSEXIT 支持的实现。Linux 驱动及内核开发者通过了解快速系统调用指令的机制,可以在自己的代码中通过利用这一机制,提高系统性能,并避开由快速系统调用方式带来的一些局限(如系统调用中嵌套系统调用)。
前言
在 Linux 2.4 内核中,用户态 Ring3 代码请求内核态 Ring0 代码完成某些功能是通过系统调用完成的,而系统调用的是通过软中断指令(int 0x80)实现的。在 x86 保护模式中,处理 INT 中断指令时,CPU 首先从中断描述表 IDT 取出对应的门描述符,判断门描述符的种类,然后检查门描述符的级别 DPL 和 INT 指令调用者的级别 CPL,当 CPL<=DPL 也就是说 INT 调用者级别高于描述符指定级别时,才能成功调用,最后再根据描述符的内容,进行压栈、跳转、权限级别提升。内核代码执行完毕之后,调用 IRET 指令返回,IRET 指令恢复用户栈,并跳转会低级别的代码。
其实,在发生系统调用,由 Ring3 进入 Ring0 的这个过程浪费了不少的 CPU 周期,例如,系统调用必然需要由 Ring3 进入 Ring0(由内核调用 INT 指令的方式除外,这多半属于 Hacker 的内核模块所为),权限提升之前和之后的级别是固定的,CPL 肯定是 3,而 INT 80 的 DPL 肯定也是 3,这样 CPU 检查门描述符的 DPL 和调用者的 CPL 就是完全没必要。正是由于如此,Intel x86 CPU 从 PII 300(Family 6,Model 3,Stepping 3)之后,开始支持新的系统调用指令 sysenter/sysexit。sysenter 指令用于由 Ring3 进入 Ring0,SYSEXIT 指令用于由 Ring0 返回 Ring3。由于没有特权级别检查的处理,也没有压栈的操作,所以执行速度比 INT n/IRET 快了不少。
不同系统调用方式的性能比较:
下面是一些来自互联网的有关 sysenter/sysexit 指令和 INT n/IRET 指令在 Intel Pentium CPU 上的性能对比:
1:系统调用性能测试测试硬件:
Intel? Pentium? III CPU, 450 MHz Processor Family: 6 Model: 7 Stepping: 2
用户模式花费的时间核心模式花费的时间
基于 sysenter/sysexit 指令的系统调用9.833 microseconds6.833 microseconds
基于中断 INT n 指令的系统调用 17.500 microseconds 7.000 microseconds
2:各种 CPU 上 INT 0x80 和 SYSENTER 执行速度的比较
CPU Int0x80 sysenter
Athlon XP 1600+ 277 169
800MHz mode 1 athlon279 170
2.8GHz p4 northwood ht1152442
上述数据为对 100000 次 getppid() 系统调用所花费的 CPU 时钟周期取的平均值
自这种技术推出之后,人们一直在考虑在 Linux 中加入对这种指令的支持,在 Kernel.org 的邮件列表中,主题为 "Intel P6 vs P7 system call performance" 的大量邮件讨论了采用这种指令的必要性,邮件中列举的理由主要是 Intel 在 Pentium 4 的设计上存在问题,造成 Pentium 4 使用中断方式执行的系统调用比 Pentium 3 以及 AMD Athlon 所耗费的 CPU 时钟周期多上 5~10 倍。因此,在 Pentium 4 平台上,通过 sysenter/sysexit 指令来执行系统调用已经是刻不容缓的需求。
相关推荐
-
linux vps服务器进程kswapd0与events/0消耗大量CPU的问题
今天下午网站宕了两次机,发工单给阿里云,发现原因是服务器的CPU 100%了. 重启服务器后,使用 top 命令看看是哪些进程消耗那么大的 CPU 使用.盯了有好十几分钟,主要消耗 CPU 的进程有两个,一个是 mysql,另一个是 apache.下面的图可以看到,mysql 占用了很大部分的 CPU 使用.apache 单个进程虽然占得不多,但有不少个 apache 进程同时存在,也消耗了不少 CPU 的使用. 当然,这些不足以让服务器的 CPU 直接跑满挂掉,后来发现了两个大家伙: 当 my
-
linux php-cgi.exe占用cpu 100%的一次排障之旅
先说下我们网站的架构,由于目前网站访问量不是很大,但是由于最近公司网站要推广,所以将网站由单机切换成前端用nginx做负载均衡,带动两台web服务器,所有网页和静态文件都通过NFS共享调用,NFS服务装在其中的一个web服务器上,后端用mysql主从的方式,是很典型的架构. 切换成这个架构才2天,就收到nagios的报警,报警信息显示有一台web服务器负载很高,于是通过SecureCRT登录到服务器上,用top命令看了一下,发现有几个php-cgi进程占用了大量的CPU,如下: 13889 ww
-
Linux中使用Shell脚本查看Java线程的CPU使用情况
线上Java应用,在业务高峰期的时候经常出现CPU跑高,需要查看实时的线程占用cpu情况,下面是一个很好用的脚本,可以快速导出每个线程的占用CPU情况,结合jstack日志,排查到具体的线程类名. 一.首先获得jvm的进程ID: 复制代码 代码如下: ps -ef|grep javatomcat 374 372 1 11:45 ? 00:02:30 jsvc.exec -java-home /usr/java/latest -user tomcat -pidfile
-
linux系统使用python获取cpu信息脚本分享
linux系统使用python获取cpu信息脚本分享 复制代码 代码如下: #!/usr/bin/env Pythonfrom __future__ import print_functionfrom collections import OrderedDictimport pprint def CPUinfo(): ''' Return the information in /proc/CPUinfo as a dictionary in the following format:
-
使用python获取CPU和内存信息的思路与实现(linux系统)
大家都知道,linux里一切皆为文件,在linux/unix的根目录下,有个/proc目录,这个/proc 是一种内核和内核模块用来向进程(process)发送信息的机制(所以叫做"/proc"),这个伪文件系统允许与内核内部数据结构交互,获取有关进程的有用信息,在运行中(on the fly)改变设置(通过改变内核参数).与其他文件系统不同,/proc 存在于内存而不是硬盘中.proc 文件系统提供的信息如下: •进程信息:系统中的任何一个进程,在 proc 的子目录中都有一个同名的
-
Linux shell脚本实现CPU预警
如果CPU占用率持续达到80以上则调用打印java线程占用率堆栈的脚本,见https://github.com/oldratlee/useful-shells/blob/master/show-busy-java-threads.sh,具体用法见他的github wiki! #!/bin/bash #cpu idle percent cpu_idle=`top -b -d 1 -n 2 | grep Cpu | awk 'NR>1{print $5}' | cut -f 1 -d ".&q
-
Linux 查看cpu 信息的命令及简单实例
有的时候领导会问你某个服务器是多少核的,多少线程的,是不是会懵了,下面教你怎么看cpuinfo 1.查看cpu个数: # cat /proc/cpuinfo | grep 'physical id' | sort -u 2.查看cpu核数: # cat /proc/cpuinfo | grep 'core id' | sort -u | wc -l 3.查看cpu线程: # cat /proc/cpuinfo | grep 'processor' | sort -u | wc -l eg:
-
linux查看cpu是否支持64位的方法
查看cpuinfo中是否有lm,如果有lm表示支持64位,lm的意思是long mode,具体命令如下: 复制代码 代码如下: cat /proc/cpuinfo | grep flags 检查输出里面是否有 lm 字符或 复制代码 代码如下: cat /proc/cpuinfo | grep flags | grep lm | wc -l 输出结果大于 0 表示支持64位
-
linux使用管道命令执行ps获取cpu与内存占用率
复制代码 代码如下: #include <stdio.h>#include <unistd.h>int main(){ char caStdOutLine[1024]; // ps 命令的标准输出中的一行信息 char* pcTmp = NULL; // 指向以空格拆分后的字符串 char caSelfPID[10]; // 自身进程的PID字符串 char caPSCmd[24]; // "ps aux | grep
-
Linux2.6对新型CPU的支持
文章分析了在 Linux 2.6 中引入的对 Intel CPU 快速系统调用指令 SYSENTER/SYSEXIT 支持的实现.Linux 驱动及内核开发者通过了解快速系统调用指令的机制,可以在自己的代码中通过利用这一机制,提高系统性能,并避开由快速系统调用方式带来的一些局限(如系统调用中嵌套系统调用). 前言 在 Linux 2.4 内核中,用户态 Ring3 代码请求内核态 Ring0 代码完成某些功能是通过系统调用完成的,而系统调用的是通过软中断指令(int 0x80)实现的.在 x86
-
pytorch算子torch.arange在CPU GPU NPU中支持数据类型格式
目录 正文 一. torch.arange() 和 torch.range() 的用法 二. torch.arange 支持的数据类型格式 正文 CPU(Central Processing Unit):中央处理器 GPU(Graphics Processing Unit):图形处理器 NPU(Neural Network Processing Unit):神经网络处理器,是基于神经网络算法与加速的新型处理器总称. 一. torch.arange() 和 torch.range() 的用法 py
-
这18条背下来没人敢和你忽悠CPU
1.主频 主频也叫时钟频率,单位是MHz,用来表示CPU的运算速度.CPU的主频=外频×倍频系数.很多人认为主频就决定着CPU的运行速度,这不仅是个片面的,而且对于服务器来讲,这个认识也出现了偏差.至今,没有一条确定的公式能够实现主频和实际的运算速度两者之间的数值关系,即使是两大处理器厂家Intel和AMD,在这点上也存在着很大的争议,我们从Intel的产品的发展趋势,可以看出Intel很注重加强自身主频的发展.像其他的处理器厂家,有人曾经拿过一快1G的全美达来做比较,它的运行效率相当于2G的I
-
浅谈linux kernel对于浮点运算的支持
目前大多数CPU都支持浮点运算单元FPU,FPU作为一个单独的协处理器放置在处理器核外,但是对于嵌入式处理器,浮点运算本来就少用,有些嵌入式处理器就会去掉浮点协处理器. X86处理器一般都是有FPU的.而ARM PPC MIPS处理器就会出现没有FPU的现象. linux kernel如何处理浮点运算,我们就分为带FPU的处理器和不带FPU的处理器来讨论. (以下为个人知识总结,研究不深,错误之处希望大家指正,共同学习) 一 对于带FPU的处理器 1 对于linux kernel来说,kerne
-
Linux系统查看CPU、机器型号、内存等信息
系统维护时随时可能有需要查看 CPU 使用率,并根据相应信息分析系统状况的需要.在 linux 中,可以通过 top 命令来查看 CPU 使用状况.关于 top 命令的详细说明请参看 使用top命令分析linux系统性能的详解 这篇文章. top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器:不过这里我们主要是介绍一下 linux 系统如何查看CPU信息.机器型号.内存信息等. 系统 # uname -a # 查看内核/操作系统/
-
Linux学习基础
1.什么是Linux? 准确的说,是指Linux的kernel(系统的核心程序),其内核版权属于Linus Torvalds,在GPL(GNU General Public License)版权协议下发行, 任何人都可以自由的复制(copy), 修改(change), 套装分发(distribute),销售,但是不可以在分发时加入任何限制, 而且所有原码必须是公开的,所以任何人都可以无偿取得所有执行文件和原代码. 对于Linux用户和系统管理员来说,Linux是指包含Linux kernel.u
-
CentOS 7中搭建KVM虚拟化平台的方法步骤
什么是虚拟化 虚拟化就是把硬件资源从物理方式转变为逻辑方式,打破原有物理结构,使用户可以灵活管理这些资源,并且允许1台物理机上同时运行多个操作系统,以实现资源利用率最大化和灵活管理的一项技术. 虚拟化的优势 减少服务器数量,降低硬件采购成本. 资源利用率最大化 降低机房空间.散热.用电消耗的成本. 硬件资源可动态调整,提高企业IT业务灵活性. 高可用性. 在不中断服务的情况下进行物理硬件调整. 降低管理成本. 具备更高效的备灾能力. KVM虚拟化 KVM自linux2.6.20版本后就直接整合到
-
KVM虚拟化安装部署及管理教程
目录 1.kvm部署 1.1 kvm安装 1.2 kvm web管理界面安装 1.3 kvm web界面管理 1.3.1 kvm连接管理 1.3.2 kvm存储管理 1.3.3 kvm网络管理 1.3.4 实例管理 故障 1.kvm部署 1.1 kvm安装 //关闭防火墙和selinux [root@kvm ~]# systemctl disable --now firewalld.service Removed /etc/systemd/system/multi-user.target.wan
-
VMware使用方法(图文详解)
VMware 8虚拟机+汉化包+注册机下载地址:http://www.jb51.net/softs/377756.html 可用序列号: MV4YN-0L38Q-2ZK60-XUA7K-AAZ18(用下载的注册机生成序列号也可) 安装视频教程,个人不建议进行汉化,当然汉化后正常操作问题也不会太大 安装好之后就可以看到软件的主界面了(我没有汉化,所以界面是全英文,已汉化过的友友照着图的对应位置点击即可) 首先讲的当然是如何创建虚拟机 先在Home界面单击"Create a New Virtual
随机推荐
- 8个基于Lucene的开源搜索引擎(推荐)
- js中继承的几种用法总结(apply,call,prototype)
- JS限制文本框只能输入数字和字母方法
- AngularJS中update两次出现$promise属性无法识别的解决方法
- BootstrapTable与KnockoutJS相结合实现增删改查功能【一】
- 全面解析多种Bootstrap图片轮播效果
- android手机端与PC端使用adb forword通信
- js 不用重复检测浏览器提高效率
- jquery异步循环获取功能实现代码
- Sql Server中的非聚集索引详细介
- javascript自动恢复文本框点击清除后的默认文本
- win2008 IIS7.5防盗链配置方法
- 新技巧:Linux系统常见6种紧急情况处理方法
- 详解 Java Maximum redirects (100) exceeded
- Android实现将View保存成Bitmap的方法
- Android引用开源框架通过AsyncHttpClient实现文件上传
- Java并发计数器的深入理解
- Django 静态文件配置过程详解
- OpenCV实现图像角点检测
- 常用的 JS 排序算法 整理版