Other

处理机管理——用信号量实现进程同步,互斥,前驱关系

信号量机制实现进程互斥: 1.分析并发进程的关键活动,划定临界区(打印机) 2.设置互斥信号量mutex,初值为1 3.在临界区之前执行P(mutex) 4.在临界区之后执行V(mutex) 注意:对不同的临界资源需要设置不同的互斥信号量。 P、v操作必须成对出现。缺少P(mutex)就不能保证临界资源的互斥访问。缺少V(mutex)会导致资源永不被释放,等待进程永不被唤醒。 信号量机制实现进程同步: 进程同步:要让各并发进程按要求有序地推进。 1.分析什么地方需要实现“同步关系”,即必须保证“一前一后”执行的两个操作(或两句代码) 2.设置同步信号量s,初始为0 3、在“前操作”之后执行v 4.在“后操作”之前执行p 信号量机制实现前驱关系 1.要为每一对前驱关系各设置一个同步变量 2,在“前操作”之后对相应的同步变量执行v操作 3.在“后操作”之前对相应的同步变量执行p操作

浅拷贝和深拷贝

     o 对 obj 里面的对象属性 msg 也进行了一个拷贝,不过仅仅只是拷贝了其地址,两者都指向了同一个数据 如果修改o对象里的msg,将会影响到原来对象obj的数据结构  解决方法:  es6提供的语法糖,Object.assign(newObj,oldObj)即实现了浅拷贝   深拷贝函数封装:  1. for in 遍历对象的每一个key,通过object[key] 进行赋值操作,到达拷贝 2. 判断拷贝的数据类型,复杂数据类型需要递归操作,将里面的简单数据类型进行赋值操作 3. 数组类型判断要写到对象之前,因为数组也属于对象,不然会影响判断逻辑的执行操作 4. 创建新的空对象是避免其拷贝地址,影响到原对象  补充:for in 数组时,数组的键为索引,值为元素  

Redis7.0 编译安装以及简单创建Cluster测试服务器的方法

背景 北京时间2022.4.27 晚上九点半左右, Redis 7.0.0 已经GA. 为了进行简单的学习, 这边进行了简单验证工作. 本次主要分为编译, 测试集群搭建,以及springboot进行简要连接三部分来进行简单说明. 安装 安装很简单. 只需要获取与编译即可 登录redis官网,选择download 下载redis 7.0 的tar包 https://redis.io/download/ 下载好tar包上传到相应服务器上面就可以. 注意, 这里不再说明gcc的安装与使用. 我这边有三类机器进行编译. CentOS7,CentOS8,以及aarch64架构的银河麒麟 注意, 如果都是比较完善的操作系统(非最小化安装, 有较多开发工具链) 可以直接使用 make && make install就可以安装 分发与部署 本次不考虑gcc版本以及编译器调优部分,简单说明一下重要的二进制文件. make && make install 后 会在 $redispath/src 目录下形成具体的二进制文件了 注意, redis 应该是使用的静态连接, 不需要太多动态链接库文件, 只需要获取部分二进制就可以直接到其他机器上面进行使用. 需要注意的是不同版本,不同架构的操作系统glibc的版本不一致, 所以需要多次编译. 获取好的二进制文件一般有如下几个: redis-cli 客户端,以及创建集群使用 redis-server 核心二进制,redis的主服务进程 redis-benchmark redis的简单性能测试工具. redis-sentinel 其实二进制与redis-server应该是完全一样,用于创见redis集群. 分发与部署 我这边拉取的文件主要如下: 其实直接将文件扔到/usr/bin 下面级可以使用了 ├── arm64 │ ├── redis-benchmark │ ├── redis-cli │ ├── redis.

Java 如何从一个 List 中随机获得元素

概述 从一个 List 中随机获得一个元素是有关 List 的一个基本操作,但是这个操作又没有非常明显的实现。 本页面主要向你展示如何有效的从 List 中获得一个随机的元素和可以使用的一些方法。 选择一个随机的元素 为了从一个 List 中随机获得一个元素,你可以随机从 List 中获得一个索引的下标。 然后你可以使用这个随机的下标使用方法 List.get() 来随机获得元素。 使用这个方法的要点就是,随机生成的下标不要超过 List’s 的大小,否则你将会遇到溢出的异常。 单一随机元素 为了获得随机下标,你可以使用 Random.nextInt(int bound) 方法。 考察下面的代码: public void givenList_shouldReturnARandomElement() { List<Integer> givenList = Arrays.asList(1, 2, 3); Random rand = new Random(); int randomElement = givenList.get(rand.nextInt(givenList.size())); } 如果你不想使用 Random 类,你可以使用 Math.random() 这个静态方法,然后将生成的随机数乘以 List 的大小。 (Math.random())将会生成 Double 的随机变量。 这个随机变量的区间在 0 和 1 之间,这个变量包含 0,但是不包含 1。    在完成上面的转换后,不要忘记需要将获得的下标转换为 int 类型。

forEach的递归遍历

使用方法: arr.forEach(function(item){ }) 遍历了每一个数组元素   调用了函数本身,达到了递归的效果。。。 重要!!!:forEach遍历数组结束自动返回 return,防止死递归。

[转载]处理器架构、指令集和汇编语言,三者有何关系?

作者:young cc 链接:https://www.zhihu.com/question/23474438/answer/119887585 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。  原问题: 处理器架构、指令集和汇编语言,三者有何关系? 1.处理器架构和处理器指令集的关系式什么?2.是否指令集决定了处理器的架构?3.MIPS属于处理器架构还是还是指令集的一种?4.汇编语言的种类和处理器架构的关系?  先简短回答: 处理器架构就是处理器的硬件架构,称为微架构。是一堆硬件电路,去实现指令集所规定的操作运算。 是的,指令集决定了处理器的架构,因为处理器架构就是用硬件电路实现指令集。但是具体用什么样的处理器架构,设计怎样的硬件电路,每个人设计的都可以不一样。 MIPS是一种采取精简指令集(RISC)的处理器架构,既有指令集,也有相应的处理器架构。大名鼎鼎的龙芯就是MIPS的。 汇编语言是用人类看得懂的语言来描述指令集。否则指令集的机器码都是一堆二进制数字,人类读起来非常麻烦,但汇编是用类似人类语言的方式描述指令集,读起来方便多了。 要设计处理器,首先就需要有指令集,规定处理器相应操作,通过指令集去控制处理器实现相应功能。但处理器是一堆硬件电路,只能识别二进制数据,所以指令集是由一堆二进制数据组成。而二进制数据对人类来说读起来很麻烦。为了方便人类操作指令集,发明了汇编语言来描述指令集。汇编语言类似人类语言,读起来方便多了。 虽然汇编语言读起来方便了,但也有缺陷。首先汇编语言操作起来还是挺麻烦的。其次汇编语言对应一条条指令集,所以当指令集改变时,就得修改相应汇编语言,导致其可移植性很差,不能跨平台使用,如ARM的汇编语言与Intel X86的就不同。这时人们就想开发一种更方便操作,超越指令集的语言,于是有了C,C++等高级语言。 但处理器只能识别二进制码,那怎么能识别高级语言呢?于是人们开发了编译器,依照如下顺序,将高级语言翻译成二进制码: 高级语言 汇编语言 二进制机器码。 至此,人类可以很方便的利用高级语言编写程序,控制处理器完成相应功能。然后程序员这个红火的职业就此大规模诞生了。

管理网站及远程桌面连接的用户名密码

方法一开始>>控制面板>>用户帐户>>“选择你的帐户名”>>管理我的网络密码(左上角<相关任务>栏)>>添加>>输入服务器、用户名、现在使用的密码>>确定>>关闭。设置后再次登陆时就有登陆对话框出现了。 方法二在运行对话框中输入: control keymgr.dll ,在管理我的网络密码中刪除已保存的密码即可   v

[转载]MIPS指令集简史:从CISC、RISC之争,到闭源、开源分歧

原文地址:https://baijiahao.baidu.com/s?id=1704133753207266151&wfr=spider&for=pc  集微网报道 在新冠肺炎疫情全球流行和国际局势复杂化的当下,构建自主可控的产业生态已成为共识。要实现完全自主可控,既需要提升包括IP核、EDA工具在内的芯片研发能力和以自主材料、设备为基础的芯片制造能力,也需要建设基于自主指令系统的软件生态。 指令集是连接硬件架构和软件生态之间的桥梁,过去数十年,随着集成电路和信息技术体系的发展,指令集架构市场风起云涌,从复杂指令集 (CISC)与精简指令集 (RISC)之争,到闭源与开源之别,从RISC架构百花齐放,到X86、ARM二分天下,指令集市场平静的湖面下始终暗流涌动。在此过程中,涌现出不少业界耳熟能详的指令集架构,包括学术上认为比较成功的DEC Alpha、被写入经典教科书的MIPS、追求线程级并行的Sun SPARC以及近年来异军突起的RISC-V。  一度被业内认为可以比肩ARM、X86,成为全球三大主流架构之一的MIPS无疑是其中最值得一提的指令集之一。从声名赫赫到多次易手,MIPS见证了指令集格局数十年来的剧烈变动,也见证了中国在自主可控道路上的蹒跚前行。2020年,龙芯中科基于二十年的CPU研制和生态建设积累推出了龙芯架构(LoongArch),标志着中国自主创新正式迈入新的阶段。  从CISC与RISC之争到RISC百花齐放  计算机出现的早期,存储速度极慢,广泛使用的慢速磁带存储设备以及大容量内存的缺乏,让计算机对每一字节空间的应用都很珍惜。因此,人们倾向于在一条指令中完成更多的工作。由此形成了后来被称为CISC的指令集,并迅速成为主流。但到上世纪70年代中后期,IBM公司意识到日趋庞杂的指令系统不但不易实现,而且还可能降低系统性能。随即,加州大学伯克利分校的Patterson、斯坦福大学的Hennessy等几位科学家也开始尝试设计精简指令集(RISC)。由此掀起信息技术史上影响深远的CISC与RISC之争。 图示:Hennessy(左二)在与人讨论MIPS项目(照片摄于1984年) 作为RISC冲击CISC的领军人物之一,1981年,Hennessy带领团队研发出第一个MIPS架构处理器,这个至今被视为教科书一般的顶级指令集架构自此现世。1983年,“RISC派”的另一位代表人物Patterson和他学生们的成果登陆当年的国际固态电子电路大会(ISSCC),区区几十条指令竟胜过指令数目多达数百条的商业级芯片,业界哗然。在这些“RISC派”的引领下,一个属于RISC的百花齐放的时代正式来临。 图示:1990年代主要RISC架构处理器 1983年英国Acorn公司开启了基于加州大学伯克利分校RISC项目的新处理器架构研发项目Acorn RISC Machine (ARM),这就是如今统治嵌入式市场的ARM架构的肇始。次年,Hennessy离开斯坦福大学,创立MIPS科技公司。1987年,最成功的早期商业RISC系统之一Sun公司的SPARC正式发布。1992年,DEC公司专为高端台式机、工作站和服务器设计的微处理器架构Alpha问世…… RISC的凌厉攻势,甚至让“CISC派”代表英特尔不惜投入数十亿美元开发安腾。虽然安腾处理器最终成为英特尔的败笔,但英特尔X86架构在服务器市场的大放异彩与其大胆地引入RISC设计思想关系匪浅。由此亦可见彼时RISC来势汹汹的盛况。  风靡一时的MIPS  MIPS便是那个时代最璀璨的群星之一,MIPS指令集被认为是RISC体系中最优雅的一种,DEC的Alpha和惠普的Precision都深受其影响。 早期的MIPS公司发展迅速,始终立于RISC技术的潮头。公司成立次年,MIPS Release 1指令集即问世。1986年,几乎与ARM首款正式商用处理器ARM 2出现的同时,MIPS推出商用处理器R2000。至1988年,MIPS首款在市场上流行起来的产品R3000处理器横空出世。这款处理器销量迅速超过百万颗,不少公司的消费电子产品都用到了R3000,如索尼的PS、思科的路由器和SGI超级计算机等。美国首家电脑公司DEC、爱普生、日本电器等知名企业也都是MIPS的客户。其后续推出的R3000A更是创造了销量过亿的记录。 图示:MIPS R3000 32位RISC芯片产品的成功促进了利用商品化部件生产超级计算机的进程,同时也启示业界以更高级的RISC技术迈向超级计算的顶峰,处理器架构掀起由32位向64位发展的浪潮。1991年,MIPS推出第一款64位商用微处理器R4000。次年底,同时代另一RISC架构Alpha问世,全面完成了从32位过渡到64位技术各项任务。自此,在MIPS R4000和Alpha 21064处理器引领下,64位技术应用时代到来。 1996年,MIPS推出R10000处理器,作为RISC阵营的旗舰之一,该处理器投放市场时被认为是世界上最快的CPU。彼时,已在CISC阵营中拔得头筹的英特尔产品与之相比都有所不如。MIPS产品性能强势若此。根据MIPS科技公司的统计,1997年以MIPS架构为基础的CPU出货量为4800万,占RISC CPU总市场份额的49%。 与此同时,MIPS最大的竞争对手ARM也走出了一条独特的发展道路。早期的ARM业绩平平,没能在那个RISC架构群星璀璨的年代崭露头角,在此情况下,该公司决定改变产品策略——不再生产芯片,转而以授权方式将芯片设计方案转让给其他公司。这种风险共担、利益共享的模式,使以ARM为核心的生态圈形成成为可能。从将产品授权给德州仪器(TI)到迎来首个大客户诺基亚,ARM搭上了移动手机井喷式普及的特快列车。在此过程中,ARM与苹果公司深刻的历史渊源,是ARM抓住手机智能化机遇的重要因素。iphone的热销和谷歌安卓系统基于ARM指令集的事实,让全球移动应用牢牢绑定在ARM指令集上。 图示:MIPS登陆纳斯达克 1998年,业务飞速发展的ARM公司同时在伦敦证券交易所和美国纳斯达克股票交易所上市。同年,成立14年的MIPS科技股票也在纳斯达克公开上市。然而,与渐入佳境的ARM不同,MIPS的路却日渐崎岖。 MIPS授权分为处理器核授权和架构授权两类,MIPS的定价策略是核授权很贵,而架构授权很便宜。同时,MIPS的架构授权,并不限制任何对MIPS架构的更改。这种模式由于允许自行扩充指令,造成了生态碎片化。 更重要的是,MIPS自成立之初便面向中高端市场,专注产品性能。当移动时代萌芽时,MIPS在功耗上没有太多优势,也未着力打造自己的移动处理器“朋友圈”,不得不在PC向移动进发的时代洪流中进退维谷。  来自中国市场的机会  这时,一个来自中国市场的机会找上了MIPS。2001年,中科院计算所龙芯课题组成立,致力于国产CPU研制。以自主设计为出发点,龙芯课题组看中了架构成熟且可自由更改设计的MIPS。吃足了生态不足苦头的MIPS也极为看重这次机会,有意借助龙芯的力量在新生的中国市场打开一片天地。 2010年,在北京市和中科院的支持下,龙芯以课题组骨干人员为主体,正式开始龙芯产业化。在此之前,MIPS科技宣布,中科院计算技术研究所的龙芯中央处理器获得其处理器IP的全部专利和总线、指令集授权。2011年,龙芯中科公司又独立购买了MIPS架构授权。 以生态建设和市场开拓为目标的MIPS与龙芯中科的此次合作诚意十足,龙芯中科用极为优厚的条件拿到了授权。公开报道显示,龙芯中科从MIPS获得的是终生授权,每隔数年续费一次,每个续费周期缴纳固定数额的授权费,且龙芯中科享有续费权(即是否续费的主动权),双方不需要重新谈判,协议不能中止,除非双方破产。 图示:龙芯高校开源计划启动仪式,右二为MIPS公司代表 此后十余年,MIPS都与来自中国市场的客户保持着良好的关系。2016年,中国计算机大会期间,龙芯中科承办的“面向计算机系统能力培养的龙芯CPU高校开源计划”启动仪式上,MIPS还曾派代表出席,并与龙芯中科总裁胡伟武等人一起启动了龙芯开源计划。MIPS对中国市场的期许由此可见一斑。 2012年底,MIPS被ARM和Imagination瓜分收购。2017年,因苹果宣布弃用PowerVR GPU,Imagination股价下跌70%,面对危局,Imagination只能断臂求生,MIPS被剥离由美国加州投资公司Tallwood 持有。2018年,AI初创企业Wave Computing接盘MIPS。由于几年之间多次被收购,辗转于各个公司之间,致使MIPS支持的力度和开发的持续性都受到了影响,MIPS在中国市场构筑生态的尝试也大受影响。反而是其合作方龙芯中科成为MIPS指令集生态的主要建设者。  开源VS闭源  2018年底,创始团队不少人出自MIPS的新东家Wave Computing大胆地宣布对最新的R6指令集进行开源,旨在加速MIPS指令集架构的普及。选择开源是MIPS构筑生态的又一次尝试。不过,从后续的事情来看,这次尝试并不成功。 图示:MIPS宣布中止MIPS Open计划 2019年末,Wave Computing在发给注册MIPS Open用户的邮件中写道:很遗憾地宣布关闭MIPS开放计划,自2019年11月14号起生效。Wave将不再提供包括MIPS开放组件的免费下载,包括MIPS架构、核心、工具、IDE、模拟器、FPGA包和/或任何与之相关的软件代码或计算机硬件。 MIPS对开源的尝试就此戛然而止,不过,指令集架构闭源与开源之争方兴未艾。诞生于2010年的开源指令集RISC-V,以物联网、人工智能等技术浪潮为契机,正在向统治移动市场的闭源指令集ARM发起猛烈冲击。RISC-V 架构开发者之一,SiFive公司联合创始人&首席架构师,Krste Asanovic宣称:“开源架构RISC-V将永久免费,成为人类共有财产。相较于X86和ARM架构的高门槛,开源架构RISC-V将带来芯片设计的革命。”公开信息显示,2020年RISC-V基金会全球会员增加了一倍,达到900多名成员,其中包括215个组织。有业内人士甚至指出:“不了解或未布局RISC-V的大厂几乎没有,即便没有量产产品,通常也加入了产业联盟。” 不过,归根结底,CPU指令系统是计算机的软硬件界面,是CPU所执行的软件指令的二进制编码格式规范。一种指令系统承载了一个软件生态,X86的强大来自Wintel(Windows+Intel)的稳固联盟。ARM的崛起更是合作共赢、生态至上的生动案例,其今日稳固的地位亦是AA(Android+Arm)联盟的胜利。开源与闭源指令集的胜负也必然归于生态。这也是我国必须构建自主指令系统生态的根本原因。 国外CPU厂商以指令系统作为控制生态的手段,需要获得“授权”才能研制与之相兼容的CPU。采用授权指令系统可以研制产品,但不可能形成自主产业生态,就像中国人可以用英文写小说,但不可能基于英文形成中华民族文化。

干活经验

JSON(JavaScript Object Notation)是一种基于JavaScript语法子集的开放标准数据交换格式。 页面的查询条件为空时,代码逻辑忽略了这一情形(动态sql中少一个if情形) if(fm.all(State).value==''){//不选择状态条件进行查询 querySQL += and a.state in ('5','6','8','9') ; }else if(fm.all(State).=='00'){//'00'代表未质检状态 querySQL += and a.state in ('5','6') ; }else { querySQL += and a.state = ' + fm.all(State).value+' ; } push代码之前一定要仔细看看哪些代码更改了(缩进一定要看看看啊看看啊看看) 改pom文件了, 要点一下maven的Reload 动态sql的神奇运用:同一个controler对应三种查询初始化(前台传一个标记字段,后台根据标记值不同进行动态sql) 接口A返回结果Response.ok(result) ,用postman调用接口A显示的结果中,值为null的字段不显示 原因:配置文件中有如下配置: #设置全局,Null值不返回到前端 jackson: default-property-inclusion: non_null #不为空的属性才会序列化 项目中比较Date大小的写法:一般会有DateUtils工具类,封装了compareTo方法。 入参必填项非空校验,数据库查出的东西存到对象中可能为空,使用时候记得非空校验 比较两个字符串是否相等时 误用了==,应该用equals 在项目中,@Transactional(rollbackFor=Exception.