标签目录:摩登平台注册登录

摩登3注册开户_为什么要使用Makefile工具,怎么使用?

为什么要使用Makefile工具? 当源码文件比较多的时候,不适合直接gcc命令来编译,这时候需要一个自动化编译工具来编译。Make 一般说是GNU Make 是一个软件,用于将源码文件编译器为可执行的二进制文件,make工具主要用于完整自动化编译,make编译的时候需要Makefile文件提供编译文件。 1、引入Makefile a.c------>***.s------>***.ob.c------>xxx.s------>xxx.oxxx.o + ***.o ------>test 缺点:修改任一个文件所有.c都要重新编译,文件更多时可想而知,时间耗不起! 改进:应该分别编译,最后再链接 gcc -c a.c gcc -c b.cgcc a.o b.o –o test 为此需要一个这样的工具: 01.如果工程没有编译过,那么工程中的所有.c文件都要被编译并且链接成可执行程序。02.如果工程中只有个别C 文件被修改了,那么只编译这些被修改的C文件即可。03.如果工程的头文件被修改了,那么我们需要编译所有引用这个头文件的C文件,并且链接成可执行文件。 2、makefile 的基本规则: 当依赖比目标新执行命令 目标文件:依赖文件 TAB键  命令 根据Makefile的基本规则,我们针对上面的gcc编译过程来写一个Makefile文件,如下所示: test:a.o b.ogcc –o test a.o b.oa.o: a.cgcc -c a.cb.o: b.cgcc -c b.cclean:rm *.orm test 这样我们使用 make 命令就可以完成对 a.c  b.c的编译和链接,直接生成test执行文件。 3、Makefile 的变量 Makefile 也可以添加变量,但Makefile跟C语言不一样,没有类似于 int char …等很多的类型,只有字符串类型,比如可以定义一个 object = a.o b.o  引用变量使用$(objdect)即可。 这样就可以将上面的Makefile尽心简化,不需要输入两次的 a.o b.o, 具体如下: objdect = a.o b.otest:$(object) gcc –o test $(object)a.o: a.c gcc -c a.cb.o: b.c gcc -c b.cclean:rm *.orm test 4、Makefile的通配符%和自动化变量 对于上面的Makefile如果有很多.c文件,那我们就需要写很多依赖规则,可以使用通配符来对其简化,%.c 表示所有的.c文件,%.o表示所有的.o文件,当然我们就可以把上面的! b.o 依赖于 b.c和a.o依赖于a.c 等写成 %.o 依赖%.c的形式。对于命令则需要引入另一个叫做自动化变量了,如何通过一行命令来从不同的依赖文件中生成对应的目标?自动化变量就是用来实现这个功能的。在自动化变量中常用的是$@、$<、$^ $@ : 规则中目标集合 $< :依赖文件集合中的第一个文件 $^ :所有依赖文件的集合 这样我们又可以对MakeFile进行简化啦……….,如下所示: objdect = a.o b.otest:$(object) gcc –o test $(object)%.o: %.c gcc -c [ DISCUZ_CODE_0 ]lt;clean:rm *.orm test 5、Makefile伪目标 我们总是使用make clean来执行删除任务,单当我们在当前目录添加一个名为clean的文件,那么make clean还能奏效吗?如下: 解决办法:使用伪目标,将clean定义为假想目标即可。 objdect = a.o b.otest:$(object)…

摩登3测速登录地址_嵌入式工程师超长经验分享:从单片机coder到嵌入式programer的简单历程

C语言到底该怎么学,单片机coder怎么才能顺利转型成为嵌入式programer?21ic论坛有一“镇站之宝”的超长经验分享贴,特此分享给所有热爱coding的你。 之前和大家谈了一点UML在嵌入式开发中的使用,以及链表、哈希表等数据结构在实现对象之间的交互机制(设计模式)的一点简单实例。有很多朋友表示很感兴趣,21ic高手云集,有点班门弄斧的感觉,所以还望尽情拍砖。之前的帖子很乱,除了因为太随意没有准备外,更主要是因为本人也处于半瓶子阶段,所谈问题题目又太大。对此我只能凭借拙见,谈点个人的理解,由于本人是这方面的新手,凭借一己之热情,大放厥词,还请各位斧正。 其实UML就是一个工具,提供了用例图、顺序图、活动图、类图、状态机图、部署图、包图等工具,辅助工程师完成:分析->设计->实施->测试的整个过程。每个过程都有细分,例如分析阶段:首先是需求分析,然后有系统分析,再次有对象结构分析等。需求分析阶段会使用到用例图、顺序图、状态机图、顺序图等,需求分析阶段的最重要的要素是软件的外部功能视图和使用场景等。其中前者使用用例图表述,它也提供了沟通用户和开发者的桥梁;后者用顺序图或状态机图等表述,提供了系统每个功能实现的可能路径。其他过程和需求分析阶段类似,这里篇幅所限就不再一一提及。UML就是这样同我们的设计过程关联起来的。 将面向对象的方法用于MCU是有必要的,也是可能的,当然也是很有效的。这样的努力最起码可以拉近mcu开发者同其他领域的C开发者之间的距离,弥补那道似乎难以逾越的鸿沟,比如看到linux内核代码时,你会发现原来如此亲切。当然,随着对面向对象方法的深入理解,你会发现C++也不再那么让你不知道如何使用,或者把C++用得像面向过程的语言一样。当然本人C++菜鸟,还望高手指教。 然而面向对象的方法也非一蹴而就,一朝搞定,它是一个循序渐进的过程,特别是应用与mcu这样的平台,好多东西是靠摸索出来的。如何开始,先从何处下手是个问题。 21ic同仁liufb提议:“正如《重构与模式》所说:如果想成为一名更优秀的软件设计师,了解优秀软件设计的演变过程比学习优秀设计本身更有价值,因为设计的演变过程中蕴藏着大智慧。” 我决定发掘一下我近十年以来的阶段性C代码,试图去发现一点什么,这个我之前还从未尝试过,能找到的一起的代码也寥寥无几。不过我觉得值得一试,那就从此开始吧。 努力发掘,搜索N年前的邮箱,居然找到了当时在一款AT89X52单片机上的处女作。就从它开始入手了。 时代背景:2006年,郑州某小公司,之前的工作是修手机,然后是在某气体传感器公司焊接维护生产设备,再后来在这家小公司画电路板,然而软件才是我的最爱。好不容易boss开恩,让我参与到写代码的行列。之前的进度让在郑州这种蜗牛般的工作节奏的大氛围里面的boss也觉得忍无可忍,于是我加入了。 代码太长,截取一部分吧。里面只有我写的一个子函数,大部分是同事写的。  由于做开始工作的同事不太会用多文件,所以这个项目的代码只有一个文件,连头文件都没有,整个文件有2600行代码。以下我将列举它的三大部分:           1.全局变量部分。           2.部分子函数。           3.main函数。 最后我将会用现在的眼光,结合大师(Grady Booch)的经典,分析一下这部分代码。 全局变量部分: bit FUN,Shift_on,Add_on,Sub_on,fun_flag;bit dspflagz1,dspflagz2,dspflagz3;unsigned char z1,z2,td3,working,DSP_m,DSP_n;unsigned char l1,l2,r,m;bitflagv,flagy,flags,flag0,flagx,beepflag1,beepflag2,flagt,flagw;bit working_on,function_on, AINTSYR_on,AINTSYW_on,BINTSYR_on,BINTSYW_on ;bitprogram_on,program_woking,up_flag,down_flag,up_on,down_on;unsigned char AINTSY_state, BINTSY_state, function_state;unsigned char tx1,tx2,tx3,tw,TX,t;unsigned char display_state ,x1,x2,w1,w2;unsigned char program_state,program_working;unsigned char clk_number;unsigned char code DS[]={0,33,63,86,100,86,63,33};unsigned chards_curtime[6]={0x05,0x03,0x02,0x01,0x07,0x06};unsigned char clk_data[6]={06,1,1,0,0,1};unsigned char set_time[6];sbit switch_work= 0xB0;sbit switch_function=0xB1;sbit switch_program=0xB2;sbit switch_up=0x90;sbit switch_down=0x91;sbit switch_AINTSYR=0x92;sbit switch_AINTSYW=0x93;sbit switch_BINTSYR=0x94;sbit switch_BINTSYW=0x95;sbit RS=0xA2;sbit RW=0xA1;sbit E=0xA0;sbit CS2=0xA3;sbit CS1=0xA4;sbit DACS1=0xA7;sbit DACS2=0xA6;sbit DACS3=0xA5;sbit ds_sclk=0xB3 ; /*初始化变量*/sbit ds_io=0xB4;sbit ds_rst=0xB5; 初评:除了最后是管脚定义外,前边都是全局的标志位或全局变量。 这个 void text(void)可是我的处女作啊 //////////////////////////////////////////////////////////////////////////////////////////////////////void text(void){ bit Flag_add; /*加一标志*/ bit Flag_sub; /*减一标志*/ unsigned char max_value; /*各时间单位的最大值*/ unsigned char min_value; /*各时间单位的最小值*/ /*if(FUN==1) { */ /*定义标志位*/ if(switch_work==0) /*移位键*/ { if(Shift_on==0) { Shift_on=1; buzzer(); clk_number++; if(clk_number>6)clk_number=1; }…

摩登3新闻554258:_MOS管N/P沟道如何区分?工作原理动图

在绝缘栅型场效应管中,目前常用二氧化硅作金属铝栅极和半导体之间的绝缘层,称为金属一氧化物-半导体场效应晶体管,简称为MOSFET或者MOS管。 MOS管的电路符号 1)G、D、S极怎么区分? G极是比较好区分的,大家一眼就能区分。 不论是P沟道还是N沟道,两根线相交的就是S极。 不论是P沟道还是N沟道,单独引线的那边就是D极。 2)N、P沟道如何区分? 箭头指向G极的就是N沟道。 箭头背向G极的就是P沟道。 3)寄生二极管方向 N沟道,由S极指向D极。 P沟道,由D极指向S极。 如果觉得上面两条不是很好记,教大家一个识别方法:不论N沟道还是P沟道MOS管,中间衬底箭头方向和寄生二极管的箭头方向总是一致的,上面图片已经标出来了可以看一下。 MOS管导通条件 N沟道:Ug>Us时导通。(简单认为)Ug=Us时截止。 P沟道:Ug 注意一点,MOS管做开关器件的时候,输入输出一定不能接反,接反的寄生二极管一直处于导通状态,MOS本身就失去开关的作用了。 万用表区分N/P沟道 将万用表调至“二极管档”。 红表笔(+极)接D极,黑表笔(-极)接S极:假设,二极体值低于0.7V以下。然后我们交换表笔,黑表笔(-极)接D极,红表笔(+极)接S极:假设,二极体值高于1.2V以上。那么我们可以判断,这个为PMOS。如果两次测量结果和我们的假设相反,则可以判断为NMOS。 整理一下上面描述区分P、N沟道方法的逻辑,DS极之间的寄生二极管才是关键。换句话说,我们就是依靠测量这个寄生二极管的导通方向来判断P、N沟道的。 在一块掺杂浓度较低的P型半导体硅衬底上,用半导体光刻、扩散工艺制作两个高掺杂浓度的N区,并用金属铝引出两个电极,分别作为漏极D和源极S。然后在漏极和源极之间的P型半导体表面覆盖一层很薄的二氧化硅(Si02)绝缘层膜,再在这个绝缘层膜上装上一个铝电极,作为栅极G。这就构成了一个N沟道增强型MOS管。显然它的栅极和其它电极间是绝缘的。 同样用上述相同的方法在一块掺杂浓度较低的N型半导体硅衬底上,用半导体光刻、扩散工艺制作两个高掺杂浓度的P区,及上述相同的栅极制作过程,就制成为一个P沟道增强型MOS管。 增强型MOS管的漏极D和源极S之间有两个背靠背的PN结。当栅-源电压VGS=0时,即使加上漏-源电压VDS,总有一个PN结处于反偏状态,漏-源极间没有导电沟道(没有电流流过),所以这时漏极电流ID=0。此时若在栅-源极间加上正向电压,即VGS>0,则栅极和硅衬底之间的SiO2绝缘层中便产生一个栅极指向P型硅衬底的电场。由于氧化物层是绝缘的,栅极所加电压VGS无法形成电流,氧化物层的两边就形成了一个电容,VGS等效是对这个电容充电,并形成一个电场。 随着VGS逐渐升高,受栅极正电压的吸引,在这个电容的另一边就聚集大量的电子并形成了一个从漏极到源极的N型导电沟道,当VGS大于管子的开启电压VT(一般约为 2V)时,N沟道管开始导通,形成漏极电流ID。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3新闻554258:_联想20/21第三财季:连创新高,营收与利润双位数劲增

2021年2月3日——中国数字经济领导企业联想集团(HKSE:992)(ADR:LNVGY)公布截至2020年12月31日的20/21财年第三财季业绩。继第二财季实现创纪录的业绩之后,本财季联想再次创造了史上最佳,营业额和利润再次实现高速增长:营业额达到1142亿人民币,同比增长22.3%。税前利润达到39亿人民币,同比增长51.6%。净利润达到26亿人民币,同比增长53.1%。联想集团所有主营业务全部实现了营业额与盈利能力的提升。 作为全球最大个人电脑制造商与全球第一的算力厂商,联想的个人电脑与智能设备业务(IDG)营业额同比增长26.5%、税前利润同比增长35%、税前利润率达到6.6%、全球PC市场份额达到25.3%,以上全部打破历史记录;移动业务营业额同比增长超过10%并恢复盈利;数据中心业务营业额创纪录达到108亿人民币。 更值得关注的是,联想的智能化转型业务在本财季持续取得积极进展——无论是设备服务、运维服务、设备即服务(DaaS),还是解决方案服务,都保持了高速增长,推动软件和服务的总体营业额创下当季92亿人民币的新记录,集团总营收占比达8.1%,成为了联想当之无愧的增长新引擎。 为巩固业已取得的转型成果,将服务和解决方案真正打造成为联想未来的核心竞争力,更好把握智能化变革的时代发展机遇,联想集团也公布了全新的组织架构方案,成立了全新的业务集团:方案服务业务集团(Solutions & Services Group,SSG),该集团将整合当前集团内部各业务部门的服务团队与能力,致力于推动行业智能解决方案、设备服务、运维服务和包括设备即服务(DaaS)与Truscale在内的“x即服务”系列业务的增长,打造公司转型的核心驱动力。 伴随这一全新业务集团的建立,联想核心业务将由三大业务集团构成,分别承接联想智能化变革3S战略三大领域的执行与落地,即专注智能物联网的IDG智能设备业务集团,专注智能基础设施的ISG基础设施方案业务集团(更名自DCG,数据中心业务集团),及SSG集团。 “凭借持续不断的产品创新和卓越运营,我们再一次实现了创纪录的季度业绩,所有业务全面实现增长,”联想集团董事长兼CEO杨元庆表示:“这份写满新纪录的成绩单,是我们克服2020年的重重挑战、快速响应生活和工作方式新常态所取得的,也是我们多年来坚定推进转型深入,新的增长引擎功效显现的成果。未来,我们将以更大力度投资于科技创新和服务转型,牢牢把握数字化消费升级和智能化变革的发展机遇,实现长期可持续的增长。” 财报亮点 各业务集团业绩亮点如下: 财季营业额达1142亿人民币,同比增长22.3% 税前利润与净利润同比增长均超过50% 个人电脑与智能设备业务营业额、税前利润及税前利润率均破历史记录 移动业务营业额同比增长超过10.1%并恢复盈利 数据中心业务营业额达到108.2亿人民币 软件和服务营业额同比增长35.9%,达到92亿人民币 各主营业务业绩概览 智能设备业务集团(IDG): 1)个人电脑和智能设备业务(PCSD) 创新产品组合驱动创纪录需求 智能设备业务集团中的个人电脑与智能设备业务部分营业额达到928亿人民币,同比增长26.5%。税前利润达到61.2亿人民币,同比增长35%,均创下新纪录。联想的创新产品满足客户不断升级的消费需求,同时依靠卓越运营能力提升效率,联想行业领先的利润率进一步达到创纪录的6.6%。 本季度,联想在全球个人电脑的市场份额达到25.3%,冠军地位稳固。所有大区的销量全都实现了双位数强劲增长,大本营中国市场的销量同比增长高达30.4%;北美市场的销量同比增长60%;亚太市场的利润率则创造了历史新高;欧洲-中东-非洲市场(EMEA)的销量同比增长达到17.4%,首次成为冠军。 与此同时在全球市场,联想旗下包括工作站、Chromebook、轻薄、图形工作站、游戏本在内的所有细分品类均实现了双位数的强劲营业额及出货量增长,平板电脑的销量甚至增长了120%达到创纪录的620万台以上。 在2021年1月举行的国际消费电子展CES2021中,联想发布了ThinkPad X1 Titanium Yoga、ThinkBook Plus 2、 ThinkReality A3 AR眼镜、全新拯救者系列游戏本等重磅创新产品,成为同期最受关注的参展厂商。联想将通过持续的技术、产品创新,以及充分发挥卓越运营的能力,来满足新常态下加速升级和增长的客户需求 2)移动业务集团(MBG) 增长强劲,重回盈利 手机业务在本财季复苏,营业额达到100.7亿人民币,同比增长10.1%,并且自疫情以来首次恢复盈利,且创下6700万人民币的利润新高。在传统优势市场拉美和北美业绩继续保持稳健,通过加强运营商合作关系,推出更强的产品组合,在欧洲、亚太、印度等重点拓展的市场实现营业额82%、109%和306%的高速增长。 联想旗下的摩托罗拉手机在中国市场发布了全新的Edge S手机,在提供了全球首发的骁龙870 Soc、后置三摄像头、前置2摄像头、6.7英寸支持DCI-P3色域的FHD+ OLED屏幕、5000mAh大电池等高端配置的同时,售价仅为1999元人民币起,以激活手机市场的势头,带来一轮新的高性价比手机的回归。未来,联想将推出更多创新性的5G产品,打造更好的客户体验。 数据中心业务集团本财季营业额创纪录地达到了108.2亿人民币,利润率同比提升1%。其中云服务IT基础设施与企业IT基础设施业务均实现了年比年增长,而且增速高于大市, 企业IT基础设施业务的营业额更达到66亿人民币,创三年来最高记录。存储业务营业额再创新高,同比增速高于大市11个百分点。同时,软件定义基础架构和服务业务营业额也创下新高。 同时,在2020年底公布的全球TOP500超级计算机的最新榜单上,联想以182套蝉联第一。 联想企业科技集团(DCG中国)本财季营业额环比增长5%,盈利性 (PCON%)同比提升4%;细分业务中存储业务营业额同比增长30%,首次成为中国移动存储最大份额设备供应商;服务业务营业额同比增长25%;解决方案业务营业额同比增长130%;SDI软件定义基础设施业务营业额同比增长42%。 与此同时,联想企业科技集团多个项目实现了落地:第一个自建的华北某大数据中心日前正式上电,联想服务从传统基础架构的端到端,延伸到更广义的“从IDC机房建设开始的端到端”解决方案。联想也赢得快销集团百威英博亿元级混合云项目、云南大理等地区域性智慧校园/平安校园服务运营项目,中标并落地珠海大健康项目等。 联想是少有的、全面覆盖各种IT基础设施类型的厂商,无论是本地部署的数据中心、私有云、私有云基础设施即服务,还是公有云基础设施,都有对应的产品和解决方案。凭借不断加强的自主设计和生产制造能力,我们将牢牢把握新常态下云基础设施的增长机遇,继续实现高于大市的增长和盈利的进一步改善。我们还将充分依托中国经济的增长动能,发挥自身优势,努力成为新基建的主力军。 本财季,联想创投新增投资项目18个,累计投资公司140个,贡献投资收益4.57亿人民币,退出现金为3.67亿人民币。被投企业中,浙江中控11月科创板上市,10家被投企业,包括爱笔、深慧视、中奥、昂瑞威、轻舟、京微齐力、Coretigo、思谋、锐思智芯、思特威Smartsens获得新一轮融资。 在清晰战略指导下,联想的服务导向智能化转型取得积极进展,持续强劲增长。软件和服务的营业额增长至近92亿人民币,同比提升35.9%,再创历史新记录。与去年同期相比,附加软件及服务增长26.2%、运维服务增长72.7%、解决方案服务增长49.3%。其中设备即服务业务取得了74%的高速增长。此外,电商业务同比增长45%,同样创下历史新高。 本财季,DIBG数据智能业务集团实现营业额1.9亿元人民币,同比强劲增长39%,环比增长44%;利润同比增长52%,环比增长31%。服务的工业企业客户新增59家,总数达到339家,并落地数个重头项目:与中国石油天然气集团旗下成员企业——昆仑数智科技有限责任公司成功开展流程行业(石油化工)工业互联网平台试验测试项目;与化纤行业龙头企业——桐昆集团实现战略合作,成立了合资公司浙江恒云智联数字科技有限公司,致力于成为中国工业科技服务领域的领军企业。 新的组织架构调整将于2021/2022财年生效,自2021年4月1日起执行,未来联想核心业务将由三大业务集团专注智能物联网的IDG智能设备业务集团,专注智能基础设施的ISG基础设施方案业务集团(更名自DCG,数据中心业务集团),及专注行业智能与服务的SSG方案服务业务集团组成。 其中IDG将由Luca Rossi(现任高级副总裁、个人电脑及智能设备欧洲-中东-非洲区及拉美区总裁)领导,ISG将继续由Kirk Skaugen领导,而新成立的SSG由现任高级副总裁、个人电脑及智能设备亚太区总裁黄建恒(KenWong)领导。 与此同时,为进一步促进不同业务部门间的协同与合作,联想还将把原有的区域建制,统合成两个新的销售组织:中国区和国际销售组织。中国区将由刘军 (现任执行副总裁、智能设备业务集团中国区总裁) 领导,而国际销售组织则将由Matt Zielinski (现任高级副总裁、个人电脑及智能设备北美区总裁) 领导。以上五位领导人都将直接向杨元庆报告,并继续担任联想执行委员会 (LEC) 成员。 此外,联想集团总裁兼首席运营官蒋凡可·兰奇(Gianfranco Lanci)也宣布了即将于2021年9月从公司退休的计划。在过渡期中,他将继续履行其联想集团总裁兼首席运营官职责,负责所有业务集团与销售组织的全球业务运营。 联想认为,个人电脑市场的年比年增速并非仅仅受疫情触发,而将是一个长期持续的趋势。IDC最新公布的数据说明,由于自然年2020年第四季度的出色表现,去年全球个人电脑的总量已经突破了3亿大关。 与此同时,中国作为2020年疫情控制良好、全球唯一实现国民经济正增长的主要经济体,在经济复苏的大背景下,中国个人电脑市场持续强劲增长,中国数字化消费的季度需求增长呈现逐渐加快的趋势,从第二季度到第三季度,个人电脑销量的同比增速从9.6%增长到10.1%,第四季度则接近14%,也充分印证个人电脑市场的增速并非仅受疫情影响。 这表明居家办公、远程学习、在线娱乐的新常态已从根本上改变了大众的工作和生活方式,数字经济消费水平的提升,给智能设备市场带来了结构性变化。生产力工具属性的个人计算设备——电脑或者平板电脑成为人手一部的趋势将长期存在。 而作为数字经济的基础,云基础设施的增长也将长期持续。联想从硬件端到应用可以提供全面的解决方案,“端-边-云-网-智”的全链路转型服务技术架构将继续赋能各行各业的智能化变革。 个人数字化消费的结构性升级及云基础设施的爆发性增长,联想主赛道业务迎来结构性变化利好。联想集团董事长兼首席执行官杨元庆表示:“未来,我们不仅会通过产品创新,稳固旗下产品的领军市场定位。同时也将深入推动服务导向的智能化转型,打造先进制造、智能制造的标杆,抓住市场结构升级的机遇,实现联想业务的全面可持续发展。” *本业绩报告中2020/21财年第三季度的财务数据,按2020/21财年第三季度平均汇率,即人民币1元兑0.1510407美元换算为人民币金额,此汇率不可用于其他任何时段的业绩报告。

摩登3测速登陆_罗德与施瓦茨全新矢量信号发生器SMM100A,重新定义5G、Wi-Fi 6E及更多通信制式信号的产生

罗德与施瓦茨公司发布了在同类产品系列中唯一具有毫米波频段测试能力的全新矢量信号发生器R&S®SMM100A,该仪器可以满足为进入生产阶段,最先进的无线通信设备产生数字信号,以及开发未来产品和技术的严格要求。 使测试整个频段变为可能——这是顶尖5G设备厂商的一大心愿。这些5G设备厂商期望通过单台信号发生器来涵盖5G NR的FR1和FR2两个频段的测试。罗德与施瓦茨全新矢量信号发生器R&S®SMM100A可以满足这一需求,它在100 kHz~44 GHz整个频段范围内展现出优秀的射频特性。R&S®SMM100A包含了目前所有通信标准使用到的频带,包括LTE、5G NR以及最新的WLAN标准Wi-Fi 6和Wi-Fi 6E(最高到7.125 GHz)。诸如Bluetooth®之类的无线个人区域网络也涵盖在内。R&S®SMM100A的最大射频带宽为1 GHz,对于采用最高要求的无线标准规范,包括IEEE 802.15.4z超宽带信号(HRP-UWB)的设备,也能够生成满足测试所需的宽带信号。 R&S®SMM100A提供最大+18 dBm的输出功率,从而减少了外置放大器的使用。优秀的调制频率响应,误差矢量幅度(EVM)和相邻信道功率比(ACPR)性能提高了信号质量,确保可靠、稳定性强的测试精度。 根据客户从研发到生产对于射频性能的广泛需求,这里提出选件的概念来提高仪表的配置灵活性。R&S®SMM100A具有从6 GHz到44 GHz的六个最大频率范围选件和四个从120 MHz到1 GHz的调制带宽选件来满足所有主要设备的频带需求。用户只需输入一个密钥代码即可随时根据需要升级仪器的功能。 用户可以使用带有内部基带发生器的实时信号生成功能,现场配置参数产生信号,也可以使用任意波形发生器(ARB)播放用R&S®WinIQSIM2™仿真软件定义的波形。R&S®SMM100A具有高达2 Gsample采样点深度的大ARB内存和最大1.2 Gsample/s的高采样率。对于生产使用,Multi-Segment模式通过在各个基带信号之间的快速切换,进一步加快了测试序列的速度。 仪器带有内置的SCPI宏记录器,客户可以快速方便地创建准确无误的远程控制程序。此外,MATLAB®或者Python脚本不仅可以在R&S®SMM100A上重复使用,而且还可以在目前大多数罗德与施瓦茨矢量信号发生器的产品上使用。

摩登3平台首页_芯片IC附近为什么放0.1uF的电容?难道1uF不行吗?

我们在电源滤波电路上可以看到各种各样的电容,100uF、10uF、100nF、10nF不同的容值,那么这些参数是如何确定的? 数字电路要运行稳定可靠,电源一定要”干净“,并且能量补充一定要及时,也就是滤波去耦一定要好。什么是滤波去耦,简单的说就是在芯片不需要电流的时候存储能量,在需要电流的时候又能及时地补充能量。有读者看到这里会说,这个职责不是DC/DC、LDO的吗?对,在低频的时候它们可以搞定,但高速的数字系统就不一样了。 先来看看电容,电容的作用简单来说就是存储电荷。我们都知道在电源中要加电容滤波,在每个芯片的电源脚放置一个0.1uF的电容去耦。但是,怎么有些板子芯片的电源脚旁边的电容是0.1uF的或者0.01uF的,有什么讲究吗? 要搞懂这个道道就要了解电容的实际特性。理想的电容它只是一个电荷的存储器,即C,而实际制造出来的电容却不是那么简单。分析电源完整性的时候我们常用的电容模型如图1所示。 图1 图1中,ESR是电容的串联等效电阻,ESL是电容的串联等效电感,C才是真正的理想电容。ESR和ESL是由电容的制造工艺和材料决定的,没法消除。那这两个东西对电路有什么影响?ESR影响电源的纹波,ESL影响电容的滤波频率特性。 我们知道: 电容的容抗 Zc=1/ωC 电感的感抗 Zl=ωL,ω=2πf 实际电容的复阻抗为: Z=ESR+jωL-1/jωC =ESR+j2πf L-1/j2πf C 可见,当频率很低的时候是电容起作用,而频率高到一定程度电感的作用就不可忽视了;再高的时候电感就起主导作用了,电容就失去滤波的作用了。所以记住,高频的时候电容就不是单纯的电容了。实际电容的滤波曲线如图2所示。 图2 上面说了,电容的等效串联电感是由电容的制造工艺和材料决定的。实际的贴片陶瓷电容,ESL从零点几nH到几个nH不等,封装越小ESL就越小。 从图2中看出,电容的滤波曲线并不是平坦的,它像一个’V’,也就是说有选频特性。有时候我们希望它越平越好(前级的板级滤波),而有时候希望它越尖越好(滤波或陷波)。 影响这个特性的是电容的品质因素Q: Q=1/ωCESR ESR越大,Q就越小,曲线就越平坦;反之ESR越小,Q就越大,曲线就越尖。 通常钽电容和铝电解有比较小的ESL,而ESR大,所以钽电容和铝电解具有很宽的有效频率范围,非常适合前级的板级滤波。也就是说,在DC/DC或者LDO的输入级,常常用较大容量的钽电容来滤波。而在靠近芯片的地方放一些10uF和0.1uF的电容来去耦,陶瓷电容有很低的ESR。 说了那么多,那到底在靠近芯片的管脚处放置0.1uF还是0.01uF?下面列出来给大家参考。 频率范围/Hz 电容取值 DC-100K 10uF以上的钽电容或铝电解 100K-10M 100nF(0.1uF)陶瓷电容 10M~100M 10nF(0.01uF)陶瓷电容 >100M 1nF(0.001uF)陶瓷电容、PCB电源与地间的电容 所以,以后不要见到什么都放0.1uF的电容,有些高速系统中这些0.1uF的电容根本就起不了作用。 END 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测试路线_Molex莫仕就“未来汽车”发布全球汽车调研结果

· 91% 的受调研者表示,2030 年时汽车将采用全电或混合动力 · 自动驾驶技术将主要关注司机和乘客安全 · 高速 WiFi、无线充电和车辆间通信成为最主要的功能特点 · 软件定义车辆作为汽车厂商最重要的议题 美国伊利诺伊州莱尔 – 2021 年 1 月 7 日 – 全球领先的连接与电子解决方案提供商Molex莫仕发布面向汽车行业决策者的全球性调研成果,对将会影响到“未来汽车”战略与商业决策的主流趋势与技术进行了展望。调研结果对促成电气化与互联化的数据、软件及网络所发挥的关键作用给予了充分的肯定 – 已经将这两方面认定为最重要的创新领域。 Molex莫仕负责交通运输与工业解决方案的高级副总裁 Mike Bloomgren 表示:“这在汽车业是一个激动人心的时刻,并且本次调研突出了投资和创新上加速发展的步调。调研成果还增强了我们的使命感,那就是要设计出适用于未来互联汽车中枢神经系统的各种关键性的电子解决方案。” Molex莫仕在 2020 年 11 月委托了 “空间调查” (Dimensional Research) 开展 “汽车的未来”调研活动,面向的对象是雇员数不少于 1,000 名的车企,向工程、产品、采购、研发、供应链、创新或战略职能上 230 名具有资格的参与者征询了意见。向调研对象提出的问题旨在帮助他们设想出,到了 2030 年人们普遍购买的新车会是什么样子,其中包括了顶级功能、有关计划以及创新成果。 重要的调研结果包括: · 91% 的调研对象表示,届时的汽车将会是全电 (64%) 或者混合 (27%) 动力 · 97% 预计到 2030 年将会解决“里程焦虑”问题 · 94% 预计车中会包括自动驾驶功能;仅有 28% 设想会变为完全无人驾驶 · 56% 认为,2030 年的汽车至少要比今天的价格贵出一半 在谈到整个生态系统中,哪些领域最有可能降低2030 年时的汽车价格时,节省电池成本 (40%)、软件集成 (34%) 和制造工艺 (32%) 占了主导地位。此外,有 96% 的受访者一致认为,未来的汽车将会要求制造工厂开展创新。 顶尖的功能、技术与创新 根据调研对象的说法,到 2030 年最有可能成为标准的前三项功能包括高速 WiFi、无线充电和车辆间通信。在为下一个十年选择五个最重要的创新领域时,受访者挑选出的是电气化 (38%)、互联化 (33%)、乘客安全 (29%)、质量与可靠性 (28%),以及软件定义的基础设施 (27%)。 此外,60% 的调研对象倾向于将通过软件来实现创新的能力作为一个优先事项,涵盖了自动驾驶所需的智能功能、降低能耗的高级算法、新功能的远程更新以及定制的驾驶体验。总体上说,参与者提出的客户需求与技术创新将对未来的汽车发展产生影响,在加快绿色倡议或者社会责任计划的发展方面尤为突出,范围从零排放车辆一直延伸到了零废弃物生产。 科技公司及中国发展势头加大 44% 的调研对象预计,现有的汽车厂商会推动 2030 年大家购买的普通汽车的发展,而有 32% 的受访者则提到了科技公司日益显露出的吸引力。由于在用户体验和人机接口上具有丰富的经验,预计苹果、谷歌和微软之类的企业将获得极大的发展势头。此外,同样重要的还包括,业内普遍认为中国会率先生产出具有代表性的未来汽车,紧随其后的则是美国、日本和德国。 克服障碍是当务之急 参与者们以绝对的多数提到了实现创新过程中遇到的主要技术挑战,有 44% 认为在于电池续航时间不足,而有 36% 则表示在极端情况下电子元件和软件的运行遇到了障碍。此外,33% 的受访者表示说在电气化、5G、安全和其他所需的技术方面,难以获得相关的专业经验。 近 30 年来,Molex莫仕在汽车行业、特别是在满足需求以实现移动设备和数据服务的完美互连方面,扮演了一个至关重要的角色。公司在此期间为一家重要的汽车业 OEM 供应过超过 95% 的发动机控制及动力总成连接解决方案。在产品质量与客户协作方面,Molex莫仕引入了业务网络上的悠久传承和长期的声誉,从而满足客户对整个汽车生态系统日益增长的需求,业务横跨电气化、高级驾驶辅助系统 (ADAS)、汽车高速网络、车辆天线系统、互联汽车解决方案以及车辆到一切的通信 (V2X)。

摩登3平台首页_真相了!敲代码时,程序员戴耳机究竟在听什么?

你身边有没有这样一群人,除了早上打个招呼,必要的工作沟通,其它时候一直带个耳机。 这不就是我吗? 知乎上有个提问:程序员上班时戴耳机是在听什么? 高赞回答是:戴上耳机是告诉其他人不要打扰我,实际上并没有在放音乐。 程序员在工作时间里除了其他人过来打扰,他的 IM 通讯软件是这样的: [置顶]业务群:@你 … 产品-刘同学:这块需求我想改成… 测试-陈大姐:今天要上线了,你赶紧改下最后两个 Bug 吧 测试-李妹:你昨天提测的项目有问题啊,先帮忙查下吧,主要流程… 前端-程小哥:这接口你得给我传两个值 产品-王同学:帮忙看下线上问题吧,用户很着急 技术群:@ all,今天下午四点有技术分享会,请大家准时参加 … 消息不断跳出,任务栏不断闪烁催促你去点开。还有人直接找你讨论问题,你不得不停下手上的工作,一次次去回应这些紧急事情。 等回答完想继续刚才的工作,却忘记刚才写到哪里,又得重新捋思路。 有数据显示:人被打扰后重拾起原来的思路平均需要3分钟,由于几分钟就被打断一次,每天大约有2.5小时被浪费掉的。 等到了下班点,你才惊觉,这一天好像没做什么就过去,今天要做的需求连一行代码还没有开始写呢。于是你开始例行的加班。 在《深度工作》中作者提出一个公式:高质量工作产出=时间×专注度。 高质量工作产出需要人进入深度工作状态,深度工作指的是在无干扰的状态下专注进行职业活动,此时个人的认知能力达到极限。 这种努力能够创造新价值,提升技能,而且难以复制。 你有没有试过上班来早了或者等大家下班后,办公室安安静静的。你戴上耳机,退出IM软件,沉浸在编程世界里,思路顺畅,像打通任督二脉,效率特别高,代码质量很好,只用两个小时便完成平常一天的活。 而与深度工作相反的是浮浅工作,浮浅工作往往在受到干扰的情况下开展。此类工作是认知要求不高的事务性任务,很容易复制。 书里指出越来越多知识工作者因为不断被小事扰乱心神而用浮浅工作替代了深度工作。越是经常在极度浮浅的状态工作,越将会降低自己深度工作的能力。 所以内秀的程序员通常采用物理隔音——戴耳机被动地躲开打扰。 当然带耳机也有其它原因: @layla 每天开完早会就带上耳机开始自己一天的工作,其实啥也没听,就是想静静,选择性屏蔽一些不想听的话。 @yue 无聊解压用的,听歌可以振奋人心,帮助度过无聊时间,也激发工作动力 除了戴耳机,还有几招能从根源上减少些打扰,提高重拾思路的时间: 1.被打乱时先花几秒写好注释 刚把对象取出来,开始“.”的时候,PM 来了:诶,能帮忙—— 你先花几秒钟淡定地先将.后的方法写好,把下一步要做的事简单两几个字注释,如//做判断//,帮助你快速地接上被打乱前的思路。 用“我沉浸在编程的世界里你居然敢打断我”的表情缓慢地摘下耳机,记住耳机只需离开耳朵一厘米,这表示你随时会戴上耳机干活去,暗示对方有事快说,不做闲聊。 要面瘫,不用微笑。 2.拒绝回答不经思考的简单问题 PM:你还记得上次你做的那个需求吗?线上的逻辑是怎样的呀? 你:不记得了,自己看需求文档吧,或者问负责这块的PM。 新人:这个工具怎么用? 你:自己搜索去吧。 有数据统计,80% 的打扰是没有意义或者极少有价值的。 职场时间宝贵,求助者有责任在提问前确认问题是否值得问。如果问题是可以直接查询或者能从搜索结果前三页获取的,这些问题是不需要回答的,你无需浪费自己的时间放他人之懒。 这招还可以跟二维码大法混合使用,能击退大部分的简单问题: 3.学会甩锅 PM:这个需求我想改改… 你:你先找我 TL 对下排期 PM:线上这个数据不对啊 你:在某表某字段,你自己查 我们部门的 PM 就这样学会写 sql 查数据,徒手登服务器查业务日志。如果你不好意思拒绝一个“顺手”“只占几分钟”的小要求,后面还有 abcd 个小要求笑眯眯地在等着你。 4.承诺完成的deadline 网上有一张图形象地说明理想的工作计划和实际情况:无打扰的高效率理想工作模式和不断地被打乱的实际工作模式。 有些紧急事情是必须放下手下工作去做的,例如测试说,项目今天要上线,你赶紧改下这两个bug。 此时先和发起人确定完成的deadline:我将会在下午前两点改好,改完会告诉你的,不用催促。将被动化为主动,临危不乱,有条理地安排好手上的工作。 刚开始这么做可能会让人感觉不自在,因为和普通的人际交往游戏规则相左:举手之劳,能帮则帮。采用上述方法后,发生一些不愉快的事情也是在所难免。有些人或许会感到疑惑或生气,认为你不近人情。其实,这没什么大不了的。 正如《深度工作》里说的:培养允许坏的小事发生的习惯。否则,你将永远发现不了改变命运的大事。其他人会很快调整对你的期望,适应你的工作习惯。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

摩登3测速登录地址_是什么让Spring5放弃了使用Guava Cache?

来源:https://albenw.github.io/posts/a4ae1aa2/ 概要 Caffeine是一个高性能,高命中率,低内存占用,near optimal 的本地缓存,简单来说它是Guava Cache的优化加强版,有些文章把Caffeine称为“新一代的缓存”、“现代缓存之王”。本文将重点讲解Caffeine的高性能设计,以及对应部分的源码分析。 与Guava Cache比较 大家都知道,Spring5即将放弃掉Guava Cache作为缓存机制,而改用Caffeine作为新的本地Cache的组件,这对于Caffeine来说是一个很大的肯定。为什么Spring会这样做呢?其实在Caffeine的Benchmarks里给出了好靓仔的数据,对读和写的场景,还有跟其他几个缓存工具进行了比较,Caffeine的性能都表现很突出。 使用Caffeine Caffeine为了方便大家使用以及从Guava Cache切换过来(很有针对性啊~),借鉴了Guava Cache大部分的概念(诸如核心概念Cache、LoadingCache、CacheLoader、CacheBuilder等等),对于Caffeine的理解只要把它当作Guava Cache就可以了。 使用上,大家只要把Caffeine的包引进来,然后换一下cache的实现类,基本应该就没问题了。这对与已经使用过Guava Cache的同学来说没有任何难度,甚至还有一点熟悉的味道,如果你之前没有使用过Guava Cache,可以查看Caffeine的官方API说明文档,其中Population,Eviction,Removal,Refresh,Statistics,Cleanup,Policy等等这些特性都是跟Guava Cache基本一样的。 下面给出一个例子说明怎样创建一个Cache: private static LoadingCache<String, String> cache = Caffeine.newBuilder()            //最大个数限制            .maximumSize(256L)            //初始化容量            .initialCapacity(1)            //访问后过期(包括读和写)            .expireAfterAccess(2, TimeUnit.DAYS)            //写后过期            .expireAfterWrite(2, TimeUnit.HOURS)            //写后自动异步刷新            .refreshAfterWrite(1, TimeUnit.HOURS)            //记录下缓存的一些统计数据,例如命中率等            .recordStats()            //cache对缓存写的通知回调            .writer(new CacheWriter<Object, Object>() {                @Override                public void write(@NonNull Object key, @NonNull Object value) {                    log.info("key={}, CacheWriter write", key);                }                @Override                public void delete(@NonNull Object key, @Nullable Object value, @NonNull RemovalCause cause) {                    log.info("key={}, cause={}, CacheWriter delete", key, cause);                }            })            //使用CacheLoader创建一个LoadingCache            .build(new CacheLoader<String, String>() {                //同步加载数据                @Nullable                @Override                public String load(@NonNull String key) throws Exception {                    return "value_" + key;                }                //异步加载数据                @Nullable                @Override                public String reload(@NonNull String key, @NonNull String oldValue) throws Exception {                    return "value_" + key;                }            }); Caffeine的高性能设计 判断一个缓存的好坏最核心的指标就是命中率,影响缓存命中率有很多因素,包括业务场景、淘汰策略、清理策略、缓存容量等等。如果作为本地缓存, 它的性能的情况,资源的占用也都是一个很重要的指标。下面 我们来看看Caffeine在这几个方面是怎么着手的,如何做优化的。 (注:本文不会分析Caffeine全部源码,只会对核心设计的实现进行分析,但我建议读者把Caffeine的源码都涉猎一下,有个overview才能更好理解本文。如果你看过Guava Cache的源码也行,代码的数据结构和处理逻辑很类似的。 源码基于:(caffeine-2.8.0.jar) W-TinyLFU整体设计 上面说到淘汰策略是影响缓存命中率的因素之一,一般比较简单的缓存就会直接用到LFU(Least Frequently Used,即最不经常使用)或者LRU(Least Recently Used,即最近最少使用),而Caffeine就是使用了W-TinyLFU算法。 W-TinyLFU看名字就能大概猜出来,它是LFU的变种,也是一种缓存淘汰算法。那为什么要使用W-TinyLFU呢? LRU和LFU的缺点 LRU实现简单,在一般情况下能够表现出很好的命中率,是一个“性价比”很高的算法,平时也很常用。虽然LRU对突发性的稀疏流量(sparse bursts)表现很好,但同时也会产生缓存污染,举例来说,如果偶然性的要对全量数据进行遍历,那么“历史访问记录”就会被刷走,造成污染。 如果数据的分布在一段时间内是固定的话,那么LFU可以达到最高的命中率。但是LFU有两个缺点,第一,它需要给每个记录项维护频率信息,每次访问都需要更新,这是个巨大的开销;第二,对突发性的稀疏流量无力,因为前期经常访问的记录已经占用了缓存,偶然的流量不太可能会被保留下来,而且过去的一些大量被访问的记录在将来也不一定会使用上,这样就一直把“坑”占着了。 无论LRU还是LFU都有其各自的缺点,不过,现在已经有很多针对其缺点而改良、优化出来的变种算法。 TinyLFU TinyLFU就是其中一个优化算法,它是专门为了解决LFU上述提到的两个问题而被设计出来的。 解决第一个问题是采用了Count–Min Sketch算法。 解决第二个问题是让记录尽量保持相对的“新鲜”(Freshness Mechanism),并且当有新的记录插入时,可以让它跟老的记录进行“PK”,输者就会被淘汰,这样一些老的、不再需要的记录就会被剔除。 下图是TinyLFU设计图(来自官方) 统计频率Count–Min Sketch算法 如何对一个key进行统计,但又可以节省空间呢?(不是简单的使用HashMap,这太消耗内存了),注意哦,不需要精确的统计,只需要一个近似值就可以了,怎么样,这样场景是不是很熟悉,如果你是老司机,或许已经联想到布隆过滤器(Bloom Filter)的应用了。 没错,将要介绍的Count–Min Sketch的原理跟Bloom Filter一样,只不过Bloom Filter只有0和1的值,那么你可以把Count–Min Sketch看作是“数值”版的Bloom Filter。 更多关于Count–Min Sketch的介绍请自行搜索。 在TinyLFU中,近似频率的统计如下图所示: 对一个key进行多次hash函数后,index到多个数组位置后进行累加,查询时取多个值中的最小值即可。 Caffeine对这个算法的实现在FrequencySketch类。但Caffeine对此有进一步的优化,例如Count–Min Sketch使用了二维数组,Caffeine只是用了一个一维的数组;再者,如果是数值类型的话,这个数需要用int或long来存储,但是Caffeine认为缓存的访问频率不需要用到那么大,只需要15就足够,一般认为达到15次的频率算是很高的了,而且Caffeine还有另外一个机制来使得这个频率进行衰退减半(下面就会讲到)。如果最大是15的话,那么只需要4个bit就可以满足了,一个long有64bit,可以存储16个这样的统计数,Caffeine就是这样的设计,使得存储效率提高了16倍。 Caffeine对缓存的读写(afterRead和afterWrite方法)都会调用onAccesss方法,而onAccess方法里有一句: frequencySketch().increment(key); 这句就是追加记录的频率,下面我们看看具体实现 //FrequencySketch的一些属性//种子数static final long[] SEED = { // A mixture of seeds from FNV-1a, CityHash, and Murmur3    0xc3a5c85c97cb3127L, 0xb492b66fbe98f273L, 0x9ae16a3b2f90404fL, 0xcbf29ce484222325L};static final long RESET_MASK = 0x7777777777777777L;static final long ONE_MASK = 0x1111111111111111L;int sampleSize;//为了快速根据hash值得到table的index值的掩码//table的长度size一般为2的n次方,而tableMask为size-1,这样就可以通过&操作来模拟取余操作,速度快很多,老司机都知道int tableMask;//存储数据的一维long数组long[] table;int size;/** * Increments the popularity of the element if it does not exceed the maximum (15). The popularity * of all elements will be periodically down sampled when the observed events exceeds a threshold. * This process provides a frequency aging to allow expired long term entries to fade away. * * @param e the element to add */public void increment(@NonNull E e) {  if (isNotInitialized()) {    return;  }  //根据key的hashCode通过一个哈希函数得到一个hash值  //本来就是hashCode了,为什么还要再做一次hash?怕原来的hashCode不够均匀分散,再打散一下。  int hash = spread(e.hashCode());  //这句光看有点难理解  //就如我刚才说的,Caffeine把一个long的64bit划分成16个等分,每一等分4个bit。  //这个start就是用来定位到是哪一个等分的,用hash值低两位作为随机数,再左移2位,得到一个小于16的值  int start = (hash & 3) << 2;  //indexOf方法的意思就是,根据hash值和不同种子得到table的下标index  //这里通过四个不同的种子,得到四个不同的下标index  int index0 = indexOf(hash, 0);  int index1 = indexOf(hash, 1);  int index2 = indexOf(hash, 2);  int index3 = indexOf(hash, 3);  //根据index和start(+1, +2, +3)的值,把table[index]对应的等分追加1  //这个incrementAt方法有点难理解,看我下面的解释  boolean added = incrementAt(index0, start);  added |= incrementAt(index1, start + 1);  added |= incrementAt(index2, start + 2);  added |= incrementAt(index3, start + 3);  //这个reset等下说  if (added && (++size == sampleSize)) {    reset();  }}/** * Increments the specified counter by 1 if it is not already at the maximum value (15). * * @param i the table index (16 counters) * @param j the counter to increment * @return if incremented */boolean incrementAt(int i, int j) {  //这个j表示16个等分的下标,那么offset就是相当于在64位中的下标(这个自己想想)  int offset = j << 2;  //上面提到Caffeine把频率统计最大定为15,即0xfL  //mask就是在64位中的掩码,即1111后面跟很多个0  long mask = (0xfL << offset);  //如果&的结果不等于15,那么就追加1。等于15就不会再加了  if ((table[i] & mask) != mask) {    table[i] += (1L << offset);    return true;  }  return false;}/** * Returns the table index for the counter at the specified depth. * * @param item the element's hash * @param i the counter depth * @return the table index */int indexOf(int item, int i) {  long hash = SEED[i] * item;  hash += hash >>> 32;  return ((int) hash) & tableMask;}/** * Applies a supplemental hash function to a given hashCode, which defends against poor quality * hash functions. */int spread(int x) {  x = ((x >>> 16) ^ x) * 0x45d9f3b;  x = ((x >>> 16) ^ x) * 0x45d9f3b;  return (x >>> 16) ^ x;} 知道了追加方法,那么读取方法frequency就很容易理解了。 /** * Returns the estimated number of occurrences of an element, up to the maximum (15). * * @param e the element to count occurrences of * @return the estimated number of occurrences of the element; possibly zero but never negative */@NonNegativepublic int frequency(@NonNull E e) {  if (isNotInitialized()) {    return 0;  }  //得到hash值,跟上面一样  int hash = spread(e.hashCode());  //得到等分的下标,跟上面一样  int start = (hash & 3) << 2;  int frequency = Integer.MAX_VALUE;  //循环四次,分别获取在table数组中不同的下标位置  for (int i = 0; i < 4; i++) {    int index = indexOf(hash, i);    //这个操作就不多说了,其实跟上面incrementAt是一样的,定位到table[index] + 等分的位置,再根据mask取出计数值    int count = (int) ((table[index] >>> ((start + i) << 2)) & 0xfL);    //取四个中的较小值    frequency = Math.min(frequency, count);  }  return frequency;} 通过代码和注释或者读者可能难以理解,下图是我画出来帮助大家理解的结构图。 注意紫色虚线框,其中蓝色小格就是需要计算的位置: 保新机制 为了让缓存保持“新鲜”,剔除掉过往频率很高但之后不经常的缓存,Caffeine有一个Freshness Mechanism。做法很简答,就是当整体的统计计数(当前所有记录的频率统计之和,这个数值内部维护)达到某一个值时,那么所有记录的频率统计除以2。 从上面的代码 //size变量就是所有记录的频率统计之,即每个记录加1,这个size都会加1//sampleSize一个阈值,从FrequencySketch初始化可以看到它的值为maximumSize的10倍if (added && (++size == sampleSize)) {      reset();} 看到reset方法就是做这个事情 /** Reduces every counter by half of its original value. */void reset() {  int count = 0;  for (int i = 0; i < table.length; i++) {    count += Long.bitCount(table[i] & ONE_MASK);    table[i] = (table[i] >>> 1) & RESET_MASK;  }  size = (size >>> 1) - (count >>> 2);} 关于这个reset方法,为什么是除以2,而不是其他,及其正确性,在最下面的参考资料的TinyLFU论文中3.3章节给出了数学证明,大家有兴趣可以看看。 增加一个Window? Caffeine通过测试发现TinyLFU在面对突发性的稀疏流量(sparse bursts)时表现很差,因为新的记录(new items)还没来得及建立足够的频率就被剔除出去了,这就使得命中率下降。 于是Caffeine设计出一种新的policy,即Window Tiny LFU(W-TinyLFU),并通过实验和实践发现W-TinyLFU比TinyLFU表现的更好。 W-TinyLFU的设计如下所示(两图等价): 它主要包括两个缓存模块,主缓存是SLRU(Segmented LRU,即分段LRU),SLRU包括一个名为protected和一个名为probation的缓存区。通过增加一个缓存区(即Window Cache),当有新的记录插入时,会先在window区呆一下,就可以避免上述说的sparse bursts问题。 淘汰策略(eviction policy) 当window区满了,就会根据LRU把candidate(即淘汰出来的元素)放到probation区,如果probation区也满了,就把candidate和probation将要淘汰的元素victim,两个进行“PK”,胜者留在probation,输者就要被淘汰了。 而且经过实验发现当window区配置为总容量的1%,剩余的99%当中的80%分给protected区,20%分给probation区时,这时整体性能和命中率表现得最好,所以Caffeine默认的比例设置就是这个。 不过这个比例Caffeine会在运行时根据统计数据(statistics)去动态调整,如果你的应用程序的缓存随着时间变化比较快的话,那么增加window区的比例可以提高命中率,相反缓存都是比较固定不变的话,增加Main Cache区(protected区 +probation区)的比例会有较好的效果。 下面我们看看上面说到的淘汰策略是怎么实现的: 一般缓存对读写操作后都有后续的一系列“维护”操作,Caffeine也不例外,这些操作都在maintenance方法,我们将要说到的淘汰策略也在里面。 这方法比较重要,下面也会提到,所以这里只先说跟“淘汰策略”有关的evictEntries和climb。 /**   * Performs the pending maintenance work and sets the state flags during processing to avoid   * excess scheduling attempts. The read buffer, write buffer, and reference queues are   * drained, followed by expiration, and size-based eviction.   *   * @param task an additional pending task to run, or {@code null} if not present   */  @GuardedBy("evictionLock")  void maintenance(@Nullable Runnable task) {    lazySetDrainStatus(PROCESSING_TO_IDLE);    try {      drainReadBuffer();      drainWriteBuffer();      if (task != null) {        task.run();      }      drainKeyReferences();      drainValueReferences();      expireEntries();      //把符合条件的记录淘汰掉      evictEntries();      //动态调整window区和protected区的大小      climb();    } finally {      if ((drainStatus() != PROCESSING_TO_IDLE) || !casDrainStatus(PROCESSING_TO_IDLE, IDLE)) {        lazySetDrainStatus(REQUIRED);      }    }  } ``` 先说一下Caffeine对上面说到的W-TinyLFU策略的实现用到的数据结构: ``` //最大的个数限制long maximum;//当前的个数long weightedSize;//window区的最大限制long windowMaximum;//window区当前的个数long windowWeightedSize;//protected区的最大限制long mainProtectedMaximum;//protected区当前的个数long mainProtectedWeightedSize;//下一次需要调整的大小(还需要进一步计算)double stepSize;//window区需要调整的大小long adjustment;//命中计数int hitsInSample;//不命中的计数int missesInSample;//上一次的缓存命中率double previousSampleHitRate;final FrequencySketch  sketch; //window区的LRU queue(FIFO) final AccessOrderDeque > accessOrderWindowDeque; //probation区的LRU queue(FIFO) final AccessOrderDeque > accessOrderProbationDeque; //protected区的LRU queue(FIFO) final AccessOrderDeque > accessOrderProtectedDeque; 以及默认比例设置(意思看注释) /** The initial percent of the maximum weighted capacity dedicated to the main space. */static final double PERCENT_MAIN = 0.99d;/** The percent of the maximum weighted capacity dedicated to the main's protected space. */static final double PERCENT_MAIN_PROTECTED = 0.80d;/** The difference in hit rates that restarts the climber. */static final double HILL_CLIMBER_RESTART_THRESHOLD = 0.05d;/** The percent of the total size to adapt the window by. */static final double HILL_CLIMBER_STEP_PERCENT = 0.0625d;/** The rate to decrease the step size to adapt by. */static final double HILL_CLIMBER_STEP_DECAY_RATE = 0.98d;/** The maximum number of entries that can be transfered between queues. */ 重点来了,evictEntries和climb方法: /** Evicts entries if the cache exceeds the maximum. */@GuardedBy("evictionLock")void evictEntries() {  if (!evicts()) {    return;  }  //淘汰window区的记录  int candidates = evictFromWindow();  //淘汰Main区的记录  evictFromMain(candidates);}/** * Evicts entries from the window space into the main space while the window size exceeds a * maximum. * * @return the number of candidate entries evicted from the window space *///根据W-TinyLFU,新的数据都会无条件的加到admission window//但是window是有大小限制,所以要“定期”做一下“维护”@GuardedBy("evictionLock")int evictFromWindow() {  int candidates = 0;  //查看window queue的头部节点  Node  node = accessOrderWindowDeque().peek();    //如果window区超过了最大的限制,那么就要把“多出来”的记录做处理   …

摩登3咨询:_灰色的暴利市场,物联网成为黑客的捞金温床

本文来源:物联传媒 本文作者:露西 日前,消息爆出电子产品制造巨头富士康在墨西哥的一家工厂遭到了勒索软件攻击。肇事黑客组织DopperPaymer窃取了富士康部分未加密的文件,继而对文件进行加密,并要求富士康支付1804枚比特币(按时下的比特币价格核算,约为3468万美元)以获取解密工具。 富士康收到的勒索信 据悉,此次遭受攻击的是富士康位于墨西哥华雷斯城的CTBG MX生产设施,黑客组织声称已加密了富士康在北美的约1200台服务器,窃取了100 GB的未加密文件,并删除了20TB至30 TB的备份内容。不过在截止发稿前,富士康称已经恢复正常生产,并升级了信息安全系统。 另外,上月底工业物联网厂商研华科技也遭遇了来自Conti勒索软件团伙的攻击。 在事件中,黑客组织提出了750个比特币的赎金要求(约合1300万美元),否则将会把所盗数据逐步泄露在网络上。针对此事,研华科技最终并未多做回复,仅称黑客攻击少数服务器时,可能偷走了价值性不高与机密性不高的工作资料。 更早之前,2018年8月,全球最大的晶圆代工厂台积电突然传出电脑系统遭受病毒感染的消息。短短几个小时内,台积电位于台湾北、中、南三处重要的生产基地——竹科FAB 12厂、南科FAB 14厂、中科FAB 15厂等主要高端产能厂区的机台设备停产停线,陷入混乱状态。 事后台积电称,事故属于Wannacry变种病毒感染而非黑客攻击,没有泄露公司资料的完整性和机密性,但故障将导致晶圆出货延迟及成本增加,对公司第三季度的营收影响约为百分之三,毛利率的影响约为一个百分点。 攻击一千次,有一次成功便是胜利;防御一万次,有一次失败便是失败。 安全攻防的对抗,其结果标准并不是公平的。而现如今黑客或病毒所攻击的对象,已经从个人PC、防护能力较弱的传统企业、政府、学校网站,转变到万物互联时代的工厂、工业设备、智能摄像头、路由器等诸多方面。 1、面更大,范围更广,安全保障更加迫在眉睫 也就在昨日,Forescout的安全研究人员披露了四个开源TCP/IP库中的33个安全漏洞(代号AMNESIA:33),影响150多家供应商的超过100万个智能设备和工业互联网产品。 根据Forescout的说法,这些漏洞将使攻击者可以实施广泛的攻击,包括攻击者能够破坏设备,执行恶意代码,窃取敏感信息以及执行拒绝服务攻击。几乎所有的联网设备都有可能中招,包括智能手机、打印机、路由器、交换机、IP摄像机和各种工业设备等。 可以认为,物联网生态系统很少顾及的安全缺陷,正完整地暴露在黑客和不法分子的面前。 另一方面,勒索软件的组织却在日益庞大。 由于匿名性和暴利性,近年来勒索软件攻击在全球范围内整体呈上升趋势,世界各地企业、公共机构、高校单位持续在遭遇各种网络攻击。 根据COVEWARE公司的报告,2020年第一季度,企业平均赎金支付增加至111,605美元,比2019年第四季度增长了33%。勒索软件分销商越来越多地将目标瞄准大型企业,甚至发展出所谓的勒索软件即服务(Ransomware as a Service,RaaS),以完善的生态,以更轻松的”勒索+窃取”两种方式对企业重要数据进行攻击。 甚至,黑客们还找到了最大最广泛的交易方式——,一定程度刺激了该市场的肆意增长。 在勒索软件中常流行的比特币支付: 一是具有一定的匿名性,便于黑客隐藏信息; 二是具有去中心化的特性,可以全球范围进行操作; 三是具有流动快捷性,比特币基于网络而生,流动迅速,鼠标操作甚至可以实时即达; 四是具有易变现的能力,也许只需要一个U盘,比特币就可以成为犯罪分子的洗钱工具。 对此,复旦大学中国反洗钱研究中心秘书长严立新曾表示,对区块链技术支撑的比特币本身,不宜用简单的好与坏去定义,但它的一些特点的确很容易被洗钱罪犯所利用。 此次为富士康网络攻击负责的DopperPaymer,就是2020年来最活跃的勒索软件之一。 2019年6月以来,DoppelPaymer涉及了一系列恶意勒索活动,今年9月甚至惹出了间接导致德国杜塞尔多夫一家医院病人死亡的事件。 据悉,由于杜塞尔多夫医院遭受勒索软件攻击,30多台内部服务器被感染,并未能收治一位需要接受紧急治疗的女性患者,该患者不得已被转移到30公里外的伍珀塔尔市一家医院后死亡。虽然之后的调查报告说明,杜塞尔多夫医院遭遇的勒索软件攻击似乎是个意外,因为赎金勒索信中针对的是当地的大学(杜塞尔多夫海涅大学),但不幸的是杜塞尔多夫医院的信息系统属于该大学的一部分,并且在广泛使用的商业软件中存在漏洞,这才给勒索软件可乘之机。 而这样的案件还只是冰山一角,将大多数案例集合在一起,勒索软件的趋势走向将是:攻击目标多元化、攻击手段复杂化、解密数据难度大、危害影响难以估量…… 万物互联时代,对于众多即将走向智能化的传统产业,倘若网络攻防经验不足,缺乏整体的安全建设意识,实际面临的威胁将更加巨大。 在一批黑客凭借勒索软件获得暴利的同时,各种病毒变种在悄悄成长蔓延,潘多拉魔盒此刻已经打开。 如果说以往用户对于安全的认知局限在虚拟资产这一部分,认为要保护的是数据的安全、数据的完整性及可用性。那么在物联网时代,安全的边界已经扩展到以各种设备为代表的物理资产,包括数据安全在内,安全需要保护的内容,将涉及到整个资产的安全。 很典型的情况是,现如今黑客进攻智能设备,就算拿不到用户数据,也可以避开数据轻松远程控制并影响设备,依然将产生负面影响。 复盘,其起因和过程其实是台积电犯了3个简单的错误: 1)进入产线的新设备带有病毒,且未被查杀; 2)负责关键生产设施的电脑搭载的是老旧的Windows 7系统,且没有打补丁; 3)没有关闭设备445端口,使病毒轻易入侵。 以及发生在2016年的,实际上是利用了数十万台受到僵尸网络感染的联网设备,比如路由器、摄像头,通过持续的扫描漏洞,操纵肉鸡的方式,向目标发送合理的服务请求,就此占用过多的服务资源,使服务器拥塞而无法对外提供正常服务。 包括遭受勒索软件攻击之后,德国网络安全机构BSI向外界发出的警告是——要求德国公司和机构针对CVE-2019-19871漏洞(勒索软件的已知入口点)更新其Citrix网络网关。 综合这几项事件来说,设备或系统存在漏洞是最大的风险。一些使用弱口令及默认密码、内置密码;存在逻辑漏洞、公共组件历史漏洞的联网设备风险最大。 为此的基本解决方案其实并不复杂: 1 1、关闭暴露在公网中的设备端口。 2、及时更改设备出厂默认密码,对于一些无法更改的老旧设备暂停使用。 3、厂商持续监控设备出入流量及设备行为,尽早发现异常。 4、厂商定期排查现有设备中的风险与漏洞并做出修复。 当然,一劳永逸的办法是不存在的。实际上自互联网诞生起,这场网络安全攻防战,就一直在持续进行。 免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!