CSDN日报190823:Linux内核争抢式并发在SMP多核扩展上的不足

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/blogdevteam/article/details/100042143

CSDN日报来啦!给大家奉上当日最新鲜的技术干货!

操作系统|Linux内核争抢式并发在SMP多核扩展上的不足

作者:dog250

我其实并不想讨论微内核的概念,也并不擅长去阐述概念,这是百科全书的事,但无奈最近由于鸿蒙的发布导致这个话题过火,也就经不住诱惑,加上我又一直比较喜欢操作系统这个话题,就来个老生常谈吧。
说起微内核,其性能往往因为IPC饱受诟病。然而除了这个显而易见的 “缺陷” ,其它方面貌似被关注的很少。因此我写点稍微不同的。
微内核的性能 “缺陷” 我假设是高开销的IPC引起的(实际上也真是),那么,我接下来便继续假设这个IPC性能是可以优化的,并且它已经被优化(即便不做任何事,随着硬件技术的发展,所谓的历史缺点往往也将逐渐弱化…)。我不公道地回避了核心问题,这并不是很道德,但为了下面的行文顺利,我不得不这么做。
很多人之所以并不看好微内核,很大程度上是因为它和Linux内核是如此不同,人们认为不同于Linux内核的操作系统内核都有这样那样的缺陷,这是因为Linux内核给我们洗了脑。
点击阅读全文

数据库|Redis持久化的两种方式RDB和AOF理解

作者:QuellanAn2

前面将了redis的主从复制以及怎么搭建,还介绍了哨兵模式以及哨兵模式的搭建。虽然操作跟上了,但是还是补一下redis的持久化。redis之所以这么流行,很大一部分原因便是持久化,断电重启数据不消失,使得redis在数据库领域中站稳了脚。前文将的主从复制其实就是依赖持久化的,如果没有持久化,这些数据都不会从主服务器备份到从服务器。下文我们就讲讲redis的持久化。
说起redis持久化,大家或多或少都知道一些,简单点一句话也能概括。redis通过RDB和AOF方式将数据存入磁盘,实现持久化。RDB是定期生成快照存入磁盘中,AOF是将写操作存入磁盘中。二者各有优劣,RDB 是存放数据库中数据,适合做数据备份,但是数据可能不全,最近几分钟的数据可能没有。AOF是每秒中执行一次,如果有写操作的命令就存储起来,最多只会丢失1秒钟的数据,适合做数据恢复。但是这个就不适合做数据备份了,并且由于每秒都会执行多多少少会抢占redis的内存,会影响性能。但是在实际应用中是二者是配合使用的。
下面就来具体的讲讲RDB和AOF吧
点击阅读全文

Python|简单 Python 快乐之旅之:Python 基础语法之文件操作专题

作者:Defonds

在 Python 中可以使用 open() 函数来打开文件,该函数将返回一个文件对象,然后我们可以通过调用该文件对象的 read() 函数对其内容进行读取。
在目录 D:\work\20190810 下新建文件,编辑其内容为 Hello Python~ 后保存。
点击阅读全文

架构|Spring Cloud Alibaba Sentinel 网关流量控制之Spring Cloud Gateway实战

作者:请叫我小东子

Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。
Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:
GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。
ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。
点击阅读全文

编程语言|java高并发系列 - 第25天:掌握JUC中的阻塞队列

作者:路人甲Java

本文内容
掌握Queue、BlockingQueue接口中常用的方法
介绍6中阻塞队列,及相关场景示例
重点掌握4种常用的阻塞队列
点击阅读全文

优质博文推荐

如果您的文章符合以下要求,欢迎大家投稿,拉您进入CSDN博文推荐群,添加运营小姐姐微信:172984955 备注:博文推荐!
1.有一定技术指导性的中高级技术文章
2.基础知识点讲解
3.最新的科技热点资讯
4.求职面试、职场进阶、人生感悟
推荐格式:文章标题+CSDN文章地址+推荐语(一两句话阐述)

推荐阅读:

文章创建于:
展开阅读全文

关于 多核 多CPU SMP

09-05

这几个词听了很多遍,还是没有理解透彻,特来请教。rnrn1. 我们说多核机器,是指一块CPU芯片里面有多个核心,核心与核心之间的通信是由rn CPU芯片内部的总线完成的;rn 说多CPU机器,则强调的是这个机器有多块CPU芯片,至于每块CPU芯片是不是多核,rn 则取决于具体的设计。而多块CPU芯片之间的通信则应该有CPU与CPU之间的总线完rn 成。rn 那这样来讲,多CPU之间的通信成本是不是要高一些,当然制造成本也要高一些,rn 甚至可以下结论说,多核技术要比多CPU技术先进,有了多核技术,多CPU技术应该rn 只有在多核技术满足不了应用需求的情况下,才有生存的空间——假设目前一个CPUrn 芯片最多可以集成4核,如果我要造一台相当于4核CPU性能以上的机器,我才需要rn 考虑使用多CPU技术,否则,我应该毫不犹豫地选择多核技术。rn2. SMP:对称多处理器,这个多处理器是指多CPU芯片还是多核?从Google的结果已经rn 我的理解来看,应该是多个相同的处理器芯片,那每个芯片是单核还是多核是不是rn 也取决于具体的设计实现?rn3. 多核、多CPU、SMP都是共享内存的吗?还是也取决于具体实现?rn4. 按照传统概念,通常每个CPU都有Cache,甚至还分一级Cache,二级Cache,那请问,rn 多核、多CPU、SMP在Cache是否共享这个问题上是怎么处理的,为什么要那么处呢?rn rn 暂时就想到这么多。没找到一个合适的版块,最后挑了Linux,是想到这个版块可能rn 有一些Kernel的牛人,而搞kernel肯定是要对体系结构这一块有比较深入的了解的,rn 至少在概念上不能太含糊。 论坛

扩展 csdn 的功能

08-04

有时候查看一篇帖子的时候,只想看楼主的回复, 但现在的CSDN居然没有这个功能rnrn于是用 greasemonkey 给 csdn 做了一些扩展功能(包括只看楼主,高亮楼主,只看自己的回复等)rnrn运行后页面上会多一个下拉框,如下图。rnrn显示的是“高亮楼主”的效果rnrn[img=http://album.hi.csdn.net/app_uploads/huwei001982/20090804/171517358.p.JPG?d=20090804171529983][/img]rnrn完整的 greasemonkey 脚本如下(部分脚本来源于 csdn, 已做了标注)rn[code=JScript]// ==UserScript==rn// @name CSDNViewerrn// @namespace HWrn// @include http://topic.csdn.net/u/*rn// ==/UserScript==rnvar cbo = null;rnrnaddComboBox();rnrn//改变显示样式rnfunction OnCboChange(event)rnrn updateReplyItems();rn var value = this.options[this.selectedIndex].value;rn rn for (var i = 0; i < reply_items.length; i++) rn rn if (!reply_items[i].replyId) continue; // 非回复rn reply_items[i].table.className = "mframe"; // 去掉隐藏属性rn switch (value) rn rn case "v_all": // 全部显示rn reply_items[i].table.style.display = "";rn reply_items[i].table.style.backgroundColor = "";rn break;rn case "v_only_anthor": // 楼主回复rn reply_items[i].table.style.display = getAnthorName().toLowerCase()== reply_items[i].username ? "" : "none";rn break;rn case "hl_anthor": // 高亮楼主回复rn if (getAnthorName().toLowerCase() == reply_items[i].username)rn reply_items[i].table.style.backgroundColor = "yellow";rn break;rn case "v_only_self": //只看自己的回复rn reply_items[i].table.style.display = getUserName().toLowerCase()== reply_items[i].username ? "" : "none";rn break;rn case "hl_self": //高亮自己的回复rn if (getUserName().toLowerCase() == reply_items[i].username)rn reply_items[i].table.style.backgroundColor = "yellow";rn break;rn case "cancel_hl":rn reply_items[i].table.style.backgroundColor = "";rn rn rn rn //对楼主主帖的处理rn getAnthorContent().style.backgroundColor = value =="hl_anthor"?"yellow":"";rnrnrn//取得楼主名字rnfunction getAnthorName()rnrn var objs = document.evaluate(rn "//table[@class='mframe']/tbody/tr/td/div/ul/li/dfn/a",rn document,rn null,rn XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,rn null);rn if (objs.snapshotLength == 0)rn return null;rn var obj = objs.snapshotItem(0);rn return obj.text;rnrnrn//取得楼主帖子正文的 tdrnfunction getAnthorContent()rnrn var objs = document.evaluate(rn "//table[@class='mframe']/tbody/tr/td[@class='rw']",rn document,rn null,rn XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,rn null);rn if (objs.snapshotLength == 0)rn return null;rn var obj = objs.snapshotItem(0);rn return obj;rnrnrn//取得登陆用户名rnfunction getUserName()rnrn var user = getCookie("UserName");rn if (!user || (/^guest$/i).test(user))rn return null;rn return user;rnrnrn//取得某个用户的下一个回复rnfunction getNextReply(user)rnrn updateReplyItems();rn for (var i = 0; i < reply_items.length; i++) rn rn if (!reply_items[i].replyId) continue; // 非回复rn if (reply_items[i].username == user)rn return reply_items[i];rn rn return null;rnrnrn//添加一个 ComBoxrnfunction addComboBox()rnrn var selects = document.evaluate(rn "//DIV[@class='tit']/h1/cite/select",rn document,rn null,rn XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE,rn null);rn if (selects.snapshotLength == 0)rn return;rn var select = selects.snapshotItem(0);rn cbo = document.createElement("SELECT");rn option = document.createElement("OPTION");rn option.text = "全部";rn option.value = "v_all";rn cbo.add(option, null);rn rn option = document.createElement("OPTION");rn option.text = "只看楼主";rn option.value = "v_only_anthor";rn cbo.add(option, null);rn rn option = document.createElement("OPTION");rn option.text = "高亮楼主";rn option.value = "hl_anthor";rn cbo.add(option, null);rn rn option = document.createElement("OPTION");rn option.text = "只看自己";rn option.value = "v_only_self";rn cbo.add(option, null);rn rn option = document.createElement("OPTION");rn option.text = "高亮自己";rn option.value = "hl_self";rn cbo.add(option, null);rn rn option = document.createElement("OPTION");rn option.text = "取消高亮";rn option.value = "cancel_hl";rn cbo.add(option, null);rn rn cbo.addEventListener("change", OnCboChange, false);rn rn select.parentNode.insertBefore(cbo, select);rnrnrn//摘自 csdn 的脚本 t5.jsrnfunction getCookie(name) rn var re = new RegExp("(\;|^)[^;]*(" + name + ")\=([^;]*)(;|$)");rn var match = re.exec(document.cookie);rn return match != null ? unescape(match[3]) : null;rnrnrn//摘自 csdn 的脚本 t5.jsrnfunction updateReplyItems() rn if (!window.reply_items) rn var imgs = document.getElementsByTagName("img");rn window.reply_items = [];rn for (var i = 0; i < imgs.length; i++) rn var match = (/^grade\s+(\w+)$/i).exec(imgs[i].className);rn if (match) rn var table = imgs[i].parentNode;rn while (table && !(/^table$/i).test(table.tagName))rn table = table.parentNode;rn if (!table) continue;rn grade = match[1];rn var as = table.getElementsByTagName("a");rn var username = "";rn for (var j = 0; j < as.length; j++) rn match = (/^http\:\/\/hi\.csdn\.net\/(\w+)\/?$/i).exec(as[j].href);rn if (match) rn username = match[1].toLowerCase();rn break;rn rn rn var dfns = table.getElementsByTagName("dfn");rn var point = 0;rn for (j = 0; j < dfns.length; j++) rn var p = /得分:(\d+)/.exec(dfns[j].innerHTML);rn if (p) rn point = parseInt(p[1]);rn break;rn rn rnrn var ls = table.getElementsByTagName("li");rn var honor = null;rn for (j = 0; j < ls.length; j++) rn if (ls[j].getAttribute("name") == "honor") rn honor = ls[j];rn break;rn rn rn var tds = table.getElementsByTagName("td");rn var body = null;rn var replyId = "";rn var isdeleted = false;rn var tdReply = null;rn for (j = 0; j < tds.length; j++) rn if (/^r?body/.test(tds[j].getAttribute("csdnid"))) rn body = tds[j];rn var match = /(\d+)/.exec(tds[j].getAttribute("csdnid"));rn if (match) replyId = match[1];rn else if (/^rmodify_/.test(tds[j].getAttribute("csdnid"))) rn isdeleted = /删除/.test(tds[j].innerHTML);rn rn rn var divs = table.getElementsByTagName("div");rn var recommend = null;rn for (j = 0; j < divs.length; j++) rn if (divs[j].className == "rt") rn recommend = divs[j];rn break;rn rn rn reply_items.push(rn "grade": gradern , "table": tablern , "body": bodyrn , "username": usernamern , "point": pointrn , "honor": honorrn , "recommend": recommendrn , "replyId": replyIdrn , "isdeleted": isdeletedrn );rn rn rn rnrn[/code] 论坛

没有更多推荐了,返回首页