首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

WebView深度学习(三)之WebView的内存泄漏、漏洞以及缓存机制原理和解决方案

上两篇文章讲到了WebView的基本使用以及Android和js的交互 以及 全面总结WebView遇到的坑及优化 ,这篇文章讲一下内存泄漏和漏洞处理。如果你想更深入的了解WebView,这篇文章值得一看。 ⇒ 六、WebView的内存泄漏怎么办? 1.不在xml中定义 Webview ,而是在需要的时候在Activity中创建,并且Context使用 getApplicationgContext() LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); mWebView = new WebView(getApplicationContext()); mWebView.setLayoutParams(params); mLayout.addView(mWebView); 2.在 Activity 销毁( WebView )的时候,先让 WebView 加载null内容,然后移除 WebView,再销毁 WebView,最后置空。 @Override protected void onDestroy() { if (mWebView != null) { mWebView.loadDataWithBaseURL(null, "", "text/html", "utf-8", null); mWebView.clearHistory(); ((ViewGroup) mWebView.getParent()).removeView(mWebView); mWebView.destroy(); mWebView = null; } super.onDestroy(); } ⇒ 七、WebView的使用漏洞 及其修复方式 WebView中,主要漏洞有三类: 1.任意代码执行漏洞 2.密码明文存储漏洞 3.域控制不严格漏洞 (一)任意代码执行漏洞 (1)addJavascriptInterface 接口引起远程代码执行漏洞 1. 漏洞产生原因: js调用Android的其中一个方式是通过addJavascriptInterface接口进行对象映射: webView.addJavascriptInterface(new JSObject(), "myObj"); // 参数1:Android的本地对象 // 参数2:JS的对象 // 通过对象映射将Android中的本地对象和JS中的对象进行关联,从而实现JS调用Android的对象和方法 所以,漏洞产生原因是:当JS拿到android这个对象后,就可以调用这个Android对象中所有的方法,包括系统类(Java.lang.Runtime 类), 从而进行任意代码执行。(比如**我们可以执行命令获取本地设备的SD卡中的文件等信息从而造成信息泄露**) 具体获取系统类的描述:(结合 Java 反射机制) Android中的对象有一公共的方法:getClass() ; 该方法可以获取到当前类 类型Class 该类有一关键的方法: Class.forName; 该方法可以加载一个类(可加载 java.lang.Runtime 类) 而该类是可以执行本地命令的 以下是攻击的Js核心代码: function execute(cmdArgs) { // 步骤1:遍历 window 对象 // 目的是为了找到包含 getClass ()的对象 // 因为Android映射的JS对象也在window中,所以肯定会遍历到 for (var obj in window) { if ("getClass" in window[obj]) { // 步骤2:利用反射调用forName()得到Runtime类对象 alert(obj); return window[obj].getClass().forName("java.lang.Runtime") // 步骤3:以后,就可以调用静态方法来执行一些命令,比如访问文件的命令 getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs); // 从执行命令后返回的输入流中得到字符串,有很严重暴露隐私的危险。 // 如执行完访问文件的命令之后,就可以得到文件名的信息了。 } } } 当一些 APP 通过扫描二维码打开一个外部网页时,攻击者就可以执行这段 js 代码进行漏洞攻击。在微信盛行、扫一扫行为普及的情况下,该漏洞的危险性非常大 2.解决方法 Android 4.2版本之后:Google 在Android 4.2 版本中规定对被调用的函数以 @JavascriptInterface进行注解从而避免漏洞攻击 Android 4.2版本之前:采用拦截prompt()进行漏洞修复。 具体步骤如下: 1.继承 WebView ,重写 addJavascriptInterface 方法,然后在内部自己维护一个对象映射关系的 Map ( 将需要添加的 JS 接口放入该Map中 ) 2.每次当 WebView 加载页面前加载一段本地的 JS 代码,原理是: 1) 让JS调用一Javascript方法:该方法是通过调用prompt()把JS中的信息(含特定标识,方法名称等)传递到Android端; 2) 在Android的onJsPrompt()中 ,解析传递过来的信息,再通过反射机制调用Java对象的方法,这样实现安全的JS调用Android代码。 关于Android返回给JS的值:可通过prompt()把Java中方法的处理结果返回到Js中 具体需要加载的JS代码如下: javascript:(function JsAddJavascriptInterface_(){ // window.jsInterface 表示在window上声明了一个Js对象 // jsInterface = 注册的对象名 // 它注册了两个方法,onButtonClick(arg0)和onImageClick(arg0, arg1, arg2) // 如果有返回值,就添加上return if (typeof(window.jsInterface)!='undefined') { console.log('window.jsInterface_js_interface_name is exist!!');} else { window.jsInterface = { // 声明方法形式:方法名: function(参数) onButtonClick:function(arg0) { // prompt()返回约定的字符串 // 该字符串可自己定义 // 包含特定的标识符MyApp和 JSON 字符串(方法名,参数,对象名等) return prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onButtonClick',args:[arg0]})); }, onImageClick:function(arg0,arg1,arg2) { return prompt('MyApp:'+JSON.stringify({obj:'jsInterface',func:'onImageClick', args:[arg0,arg1,arg2]})); }, }; } } )() // 当JS调用 onButtonClick() 或 onImageClick() 时,就会回调到Android中的 onJsPrompt () // 我们解析出方法名,参数,对象名 // 再通过反射机制调用Java对象的方法 关于采用拦截prompt()进行漏洞修复需要注意的两点细节: 细节1:加载上述JS代码的时机 由于当 WebView 跳转到下一个页面时,之前加载的 JS 可能已经失效,所以,通常需要在以下方法中加载js: onLoadResource(); doUpdateVisitedHistory(); onPageStarted(); onPageFinished(); onReceivedTitle(); onProgressChanged(); 细节2:需要过滤掉 Object 类的方法 由于最终是通过反射得到Android指定对象的方法,所以同时也会得到基类的其他方法(最顶层的基类是 Object类) 为了不把 getClass()等方法注入到 JS 中,我们需要把 Object 的共有方法过滤掉,需要过滤的方法列表如下: getClass() hashCode() notify() notifyAl() equals() toString() wait() (2)searchBoxJavaBridge_接口引起远程代码执行漏洞 1. 产生原因 1) 在Android 3.0以下,Android系统会默认通过searchBoxJavaBridge_的Js接口给 WebView 添加一个JS映射对象: searchBoxJavaBridge_对象 2) 该接口可能被利用,实现远程任意代码。 2. 解决方法 删除searchBoxJavaBridge_接口 // 通过调用该方法删除接口removeJavascriptInterface(); (3)accessibility和 accessibilityTraversal接口引起远程代码执行漏洞 1. 产生原因 1) 在Android 3.0以下,Android系统会默认通过searchBoxJavaBridge_的Js接口给 WebView 添加一个JS映射对象: searchBoxJavaBridge_对象 2) 该接口可能被利用,实现远程任意代码。 2. 解决方法 删除searchBoxJavaBridge_接口 // 通过调用该方法删除接口removeJavascriptInterface(); (二)密码明文存储漏洞 (1)问题分析 //WebView默认开启密码保存功能 : mWebView.setSavePassword(true) 开启后,在用户输入密码时,会弹出提示框:询问用户是否保存密码; 如果选择”是”,密码会被明文保到 /data/data/com.package.name/databases/webview.db 中,这样就有被盗取密码的危险 (2)解决方案 //关闭密码保存提醒 WebSettings.setSavePassword(false) (三)域控制不严格漏洞 先看Android里的WebViewActivity.java: public class WebViewActivity extends Activity { private WebView webView; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_webview); webView = (WebView) findViewById(R.id.webView); //webView.getSettings().setAllowFileAccess(false); (1) //webView.getSettings().setAllowFileAccessFromFileURLs(true); (2) //webView.getSettings().setAllowUniversalAccessFromFileURLs(true); (3) Intent i = getIntent(); String url = i.getData().toString(); //url = file:///data/local/tmp/attack.html webView.loadUrl(url); } } /**Mainifest.xml**/ // 将该 WebViewActivity 在Mainifest.xml设置exported属性 // 表示:当前Activity是否可以被另一个Application的组件启动 android:exported="true" (1)问题分析 上述demo中:即 A 应用可以通过 B 应用导出的 Activity 让 B 应用加载一个恶意的 file 协议的 url,从而可以获取 B 应用的内部私有文件,从而带来数据泄露威胁 具体:当其他应用启动此 Activity 时, intent 中的 data 直接被当作 url 来加载(假定传进来的 url 为 file:///data/local/tmp/attack.html ),其他 APP 通过使用显式 ComponentName 或者其他类似方式就可以很轻松的启动该 WebViewActivity 并加载恶意url。 下面我们着重分析WebView中getSettings类的方法对 WebView 安全性的影响: setAllowFileAccess() setAllowFileAccessFromFileURLs() setAllowUniversalAccessFromFileURLs() (2) setAllowFileAccess() // 设置是否允许 WebView 使用 File 协议,默认设置为true,即允许在 File 域下执行任意 JavaScript 代码 webView.getSettings().setAllowFileAccess(true); 但是同时也限制了 WebView 的功能,使其不能加载本地的 html 文件,( 移动版的 Chrome 默认禁止加载 file 协议的文件 ) ,如下图: 解决方案: 1) 对于不需要使用 file 协议的应用,禁用 file 协议; setAllowFileAccess(false); 2) 对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。 setAllowFileAccess(true); // 禁止 file 协议加载 JavaScript if (url.startsWith("file://") { setJavaScriptEnabled(false); } else { setJavaScriptEnabled(true); } (3)setAllowFileAccessFromFileURLs() 设置是否允许通过 file url 加载的 Js代码读取其他的本地文件 , 在Android 4.1前默认允许 , 在Android 4.1后默认禁止 webView.getSettings().setAllowFileAccessFromFileURLs(true); 当AllowFileAccessFromFileURLs()设置为 true 时,攻击者的JS代码为 ( 通过该代码可成功读取 /etc/hosts 的内容数据 ) : <script> function loadXMLDoc(){ var arm = "file:///etc/hosts"; var xmlhttp; if (window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); } xmlhttp.onreadystatechange=function(){ //alert("status is"+xmlhttp.status); if (xmlhttp.readyState==4){ console.log(xmlhttp.responseText); } } xmlhttp.open("GET",arm); xmlhttp.send(null); } loadXMLDoc(); </script> 解决方案: 设置setAllowFileAccessFromFileURLs(false); 当设置成为 false 时,上述JS的攻击代码执行会导致错误,表示浏览器禁止从 file url 中的 JavaScript 读取其它本地文件。 (4) setAllowUniversalAccessFromFileURLs() 设置是否允许通过 file url 加载的 Javascript 可以访问其他的源(包括http、https等源),在Android 4.1前默认允许(setAllowFileAccessFromFileURLs()不起作用),在Android 4.1后默认禁止 webView.getSettings().setAllowUniversalAccessFromFileURLs(true); 当AllowFileAccessFromFileURLs()被设置成true时,攻击者的JS代码是: // 通过该代码可成功读取 http://www.so.com 的内容 <script> function loadXMLDoc(){ var arm = "http://www.so.com"; var xmlhttp; if (window.XMLHttpRequest){ xmlhttp=new XMLHttpRequest(); } xmlhttp.onreadystatechange=function(){ //alert("status is"+xmlhttp.status); if (xmlhttp.readyState==4){ console.log(xmlhttp.responseText); } } xmlhttp.open("GET",arm); xmlhttp.send(null); } loadXMLDoc(); </script> 解决方案: 设置setAllowUniversalAccessFromFileURLs(false); (5) setJavaScriptEnabled() 设置是否允许 WebView 使用 JavaScript(默认是不允许),但很多应用(包括移动浏览器)为了让 WebView 执行 http 协议中的 JavaScript,都会主动设置为true,不区别对待是非常危险的,如下代码所示: webView.getSettings().setJavaScriptEnabled(true); 即使把setAllowFileAccessFromFileURLs()和setAllowUniversalAccessFromFileURLs()都设置为 false,通过 file URL 加载的 javascript仍然有方法访问其他的本地文件:符号链接跨源攻击(前提是允许 file URL 执行 javascript,即webView.getSettings().setJavaScriptEnabled(true);) 原因分析: 这一攻击能奏效的原因是:通过 javascript 的延时执行和将当前文件替换成指向其它文件的软链接就可以读取到被符号链接所指的文件。 具体攻击步骤:(在该命令执行前 xx.html 是不存在的;执行完这条命令之后,就生成了这个文件,并且将 Cookie 文件链接到了 xx.html 上。) 1. 把恶意的 js 代码输出到攻击应用的目录下,随机命名为 xx.html,修改该目录的权限; 2. 修改后休眠 1s,让文件操作完成; 3. 完成后通过系统的 Chrome 应用去打开该 xx.html 文件 4. 等待 4s 让 Chrome 加载完成该 html,最后将该 html 删除,并且使用 ln -s 命令为 Chrome 的 Cookie 文件创建软连接, 于是就可通过链接来访问 Chrome 的 Cookie 注意事项: Google 没有进行修复,只是让Chrome 最新版本默认禁用 file 协议,所以这一漏洞在最新版的 Chrome 中并不存在。 但是,在日常大量使用 WebView 的App和浏览器,都有可能受到此漏洞的影响。通过利用此漏洞,容易出现数据泄露的危险 如果是 file 协议,禁用 javascript 可以很大程度上减小跨源漏洞对 WebView 的威胁。 但并不能完全杜绝跨源文件泄露。例:应用实现了下载功能,对于无法加载的页面,会自动下载到 sd 卡中;由于 sd 卡中的文件所有应用都可以访问,于是可以通过构造一个 file URL 指向被攻击应用的私有文件,然后用此 URL 启动被攻击应用的 WebActivity,这样由于该 WebActivity 无法加载该文件,就会将该文件下载到 sd 卡下面,然后就可以从 sd 卡上读取这个文件了 (6) 最终解决方案 1)对于不需要使用 file 协议的应用,禁用 file 协议; // 禁用 file 协议; webView.setAllowFileAccess(false); webView.setAllowFileAccessFromFileURLs(false); webView.setAllowUniversalAccessFromFileURLs(false); 2)对于需要使用 file 协议的应用,禁止 file 协议加载 JavaScript。 // 需要使用 file 协议 webView.setAllowFileAccess(true); webView.setAllowFileAccessFromFileURLs(false); webView. setAllowUniversalAccessFromFileURLs(false); // 禁止 file 协议加载 JavaScript if (url.startsWith("file://") { webView.setJavaScriptEnabled(false); } else { webView.setJavaScriptEnabled(true); } ⇒ 八、WebView 的缓存机制 & 资源预加载方案 参考文章:http://blog.csdn.net/carson_ho/article/details/71402764

优秀的个人博客,低调大师

Linux运维课程一览(不定期更新学习要点及重难点笔记)

第一阶段计算机网络基础 ISO/OSI参考模型和TCP/IP协议 网络层协议和IP地址划分 CISCO/IOS操作系统 路由原理 EIGRP和OSPF路由协议 访问控制列表 网络地址转换技术 交换机原理 生成树协议 VLAN技术 第二阶段Linux基础 Linux系统管理 简介、安装 常用命令 VI编辑器 软件管理 用户和用户组管理 权限管理 文件系统管理 LVM和RAID管理 SHELL基础、SHELL编程 启动管理 服务管理 系统管理 日志系统 备份与恢复 第三阶段Linux基础服务 Linux网络基础 DHCP服务器配置 VSFTPD服务器部署 SAMBA服务器部署 NFS服务器部署 DNS服务器 APACHE服务器配置 LNMP环境部署 NGINX服务器 邮件服务器部署 RSYNC数据同步 NTP时间服务器 第四阶段MySQL SQL语句 用户权限管理 数据导入与导出 数据库备份与恢复 MySQL主从备份 MySQL读写分离 第五阶段Linux集群管理 KickStart无人值守安装 Squid正向代理 Squid反向代理 LVS负载均衡集群 Keeppalived高可用性架构 Nagios/cacti监控服务器 网络存储技术iscsi 第六阶段云计算 云计算概述与发展 虚拟化技术 Xen虚拟化技术 KVM虚拟化实现 KVM虚拟机管理技术 第七阶段SElinux/iptables SELinux安全策略 防火墙概述 TCP-wrappers防护机制 Iptables防火墙语法 常用防火墙脚本 将iptables作为NAT路由器 本文转自 chaijowin 51CTO博客,原文链接:http://blog.51cto.com/jowin/1629860,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 66)——Cocoa Touch设计模式及应用之通知机制

通知(Notification)机制是基于观察者(Observer)模式也叫发布/订阅(Publish/Subscribe)模式,是MVC(模型-视图-控制器)模式的重要组成部分。 问题提出 天气一直是英国人喜欢讨论的话题,而最近几年天气的变化也成为中国人非常关注的话题。我会根据天气预报决定是坐地铁还是开车上班,我的女儿也会根据天气预报决定明天穿哪件衣服。于是我在移动公司为我的手机定制了天气预报短信通知服务,它的工作模型如图所示。 每天气象局将天气预报信息投送给移动运营商,移动运营商的短信中心负责把天气预报发送给定制过这项服务的手机。 在软件系统中,一个对象状态改变也会连带影响其他很多对象的状态发生改变。能够实现这一需求的设计方案有很多,但能够做到复用性强且对象之间匿名通信的,观察者模式是其中最为适合的一个。 解决方案 通知机制可以实现“一对多”的对象之间的通信。如图所示,在通知机制中对某个通知感兴趣的所有对象都可以成为接收者。首先,这些对象需要向通知中心(NSNotificationCenter)发出addObserver消息进行注册通知,在投送对象通过postNotificationName消息投送通知给通知中心,通知中心就会把通知广播给注册过的接收者。所有的接收者都不知道通知是谁投送的,更不关心它的细节。投送对象与接收者是一对多的关系。接收者如果对通知不再关注,会给通知中心发出removeObserver消息注销通知,以后不再接收通知。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1749097,如需转载请自行联系原作者

优秀的个人博客,低调大师

《从零开始学Swift》学习笔记(Day 7)——Swift 2.0中的print函数几种重载形式

Swift 2.0中的print函数有4种重载形式: print(_:)。输出变量或常量到控制台,并且换行。 print(_:_:)。输出变量或常量到指定类型的流中,并且换行。 print(_:appendNewline:)。输出变量或常量到控制台,appendNewline参数是布尔值,true表示换行,false表示不换行。 print(_:_:appendNewline:)。输出变量或常量指定类型的流中,appendNewline参数是布尔值,true表示换行,false表示不换行。 本文转自 tony关东升 51CTO博客,原文链接:http://blog.51cto.com/tonyguan/1746078,如需转载请自行联系原作者

优秀的个人博客,低调大师

NUMA与英特尔下一代Xeon处理器学习心得(2)

上回说到NUMA的一个简介,现在再扯扯NUMA与英特尔下一代Xeon处理器的关系,咱们切入正题 做为英特尔下一代的45nm Xeon处理器, 它会成为未来英特尔从台式机、笔记本到服务器全线产品的主流处理器。 比较前一代酷睿处理器平台,它的平台在对以前的系统架构和内存层次体系进行了重大改变的同时,对微架构也进行了全方位的细化, 主要改进表现在以下的特性:  > 新的核心架构,最大可扩展到每个接口4个核心  > 同步多线程(SMT) 技术最大允许每个处理器可以运行8个线程  > 最新的点到点直连架构:Intel® QuickPath Interconnect (Intel® QPI)技术  > Intel® QuickPath 集成内存控制器(IMC),DDR3接口  > 微架构功能的改进,包括增强的SSE4.2指令集,改进的锁定支持,循环流和分支预测等特性  > 更好的节能特性 下面详细介绍一下下一代Xeon处理器四大主要技术:  > Intel® QuickPath Interconnect (Intel® QPI)技术 使用QPI架构代替了原来的FSB架构,QPI是基于数据包传输,高带宽低延迟的点到点传输技术,速度可以达到6.4GT/s,对双向传输的QPI总线连接来说理论最大值可以达到25.6GB/s的数据传输,远远高于原来基于FSB架构的数据带宽。  > Intel® QuickPath 集成内存控制器(IMC) 在每一个socket上集成了独立的DDR3内存控制器(IMC)供接口访问内存,较之非IMC的平台,大大提高了带宽(使用DDR3-1333可以达到 32GB/s的峰值带宽,较之以前的平台具有四到六倍的带宽提升),显著地降低了内存延迟,从而提升了性能,为每个CPU提供了访问本地内存资源的快速通 道。与前一代平台不同的是,内存访问采用NUMA架构,对于NUMA-aware的应用来说可以得到更大的性能提升。DDR3的IMC最大支持到每个 CPU接口96GB的DDR3内存容量,将来最大容量可以达到144GB,为高端的企业运算提供了强有力的内存支持。 同志们,NUMA在这就闪亮登场了!  > 改进的电源管理 集成在芯片上的电源管理使得能耗的控制更加高效。  > 同步多线程技术(SMT) 同步多线程技术使得每个核心可以同时执行2个线程,所以对于4核的CPU来说,就可以在每个处理器芯片上达到最大8个逻辑处理器。 本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/130488,如需转载请自行联系原作者

优秀的个人博客,低调大师

NUMA与英特尔下一代Xeon处理器学习心得(5)

多谢各位的参与和支持,让我更有动力去把这个系列写好。前面有同学问起了QPI,我这里就详细解释一下,而QPI也是下一代Xeon处理器的特性之一。 QPI全称 Intel® QuickPath Interconnect,是直接连接同一台机器的不同CPU之间的传输通道,使得各个核(CORE)之间的数据传输更快:如果数据在cache里,就可以直接用QPI来传输,而不用再访问内存了。 下一代Xeon处理器使用QPI架构代替了原来的FSB架构,QPI是基于数据包传输,高带宽低延迟的点到点传输技术,速度可以达到 6.4GT/s,远远高于原来基于FSB架构的数据带宽。当然,具体平台的实现中QPI连接数目可以根据目标市场和系统复杂性而有所不同,表现出极大的灵 活性和扩展性。 又有同学可能要问,那同一个CPU内的不同的核怎么交换数据呢?这就更简单了。下一代Xeon处理器的不同核是存在cache共享的,这样如果数据在cache里,那就直接共享了,不用再到内存里找,简单吧,呵呵 本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/130469,如需转载请自行联系原作者

优秀的个人博客,低调大师

NUMA与英特尔下一代Xeon处理器学习心得(6)

接下来讲讲 NUMA 策略,也就是为了更好的利用NUMA来给咱们干活: 为描述在 NUMA 架构下针对内存访问的优化,我们可以引入 NUMA 策略的概念。 NUMA 策略 (NUMA Policy) 即是指在多个节点上合理的进行内存分配的机制。对于不同软件设计要求,策略的目标可能会不同:有一些设计可能强调低延迟访问,另一些则可能更加看重内存的访问带宽。 对于强调低延迟访问的设计,基本的分配方式就是尽量在线程的本地内存上为其进行分配, 并尽量让线程保持在该节点上。这被称为线程的节点亲和性 (Node affinity) 。这样既充分利用了本地内存的低延迟, 同时也能有效降低节点间的通信负担。 NUMA 架构的一个优势是,即便是在拥有大量 CPU 的大规模系统中,我们也可以保证局部内存访问的低延迟。通常来讲, CPU 的处理速度是远大于内存的存取速度的。在读写内存时, CPU 常常需要花大量的时钟周期来等待。降低内存访问的延迟因而能够有效的提升软件性能。 另外,为 SMP 设计的操作系统通常会有缓存亲和性 (Cache Affinity) 的优化措施。缓存亲和性机制可以让数据尽量长时间的保留在某一个 CPU 的缓存中,而不是来回在多个 CPU 的缓存里换来换去。操作系统通常是通过优化进行线程 / 进程调度来保证这一点:在线程被重新调入时,调度器会尽量让线程在之前运行的同一个 CPU 上运行,从而保证缓存利用率。这一机制显然是和 NUMA 系统尽量利用本地内存的策略是一致的,有利于面向 SMP 系统的程序向 NUMA 架构移植。 但缓存亲和性机制同 NUMA 系统的节点亲和性又是有区别的:首先,同一个节点间多个 CPU 或者核的线程迁移并不影响该线程的节点亲和性;其次,当线程被迫迁移到其他节点时,他所拥有的内存是不会跟着迁移的, 仍然保留在原来位置。这个时候,本地内存就变成了远端内存,对它的访问既慢又占用节点通信带宽。相对的,线程在迁移之后能够以较小的代价迅速建立起新的缓存,并继续在新 CPU 上体现缓存的亲和优势。 因此, NUMA 系统对于节点亲和性的依赖更大。 操作系统的调度器同时也不能仅仅为保证节点亲和性做优化。因为通常相对于频繁访问远端内存来说,让 CPU 空闲带来的性能损失更大。如果特定应用系统的性能受内存访问的影响远大于 CPU 的利用率,这个时候程序员或者管理员则可采用特别的 NUMA 策略来强调节点的亲和性,从而提升性能。 另外 , 尽管大部分应用会因为优化响应时间而收益,还有一部分应用则对内存带宽比较敏感。为了提升内存带宽, NUMA 架构下的多个内存控制器可以并行使用。这类似于 RAID 阵列通过并行处理磁盘 IO 来提升读写性能。通过适当的软件或者硬件机制, NUMA 架构可以使内存控制单元在各个内存控制器上交替的分配内存。这意味着分配得到的连续内存页面会水平地分布到各个节点上。当应用程序对内存进行流式读写时,各个内存控制器的带宽就相当于累加了。此机制获得性能提升决定于 NUMA 架构的实现。对于远端内存访问延迟严重的架构,该提升往往会比较明显。在一些 NUMA 系统中,系统硬件本身提供了节点交织分配机制;而在没有硬件提供节点交织的系统中,可由操作系统来实现该机制。 本文转自Intel_ISN 51CTO博客,原文链接:http://blog.51cto.com/intelisn/130462,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册