小朋友问我为什么霄龙7281CPU、I9 CPU没有在中国大陆生产,如何回答容易明白

  • 自从2019财年Q3季度财报发布之后NVIDIA尽管当季业绩大涨,但是股价却止不住地跌这段时间以来已经跌了25%的股价,相比10月份的巅峰价格则跌了一半1000多亿美元市值都没了。这一輪NVIDIA股价暴跌主要跟他们的库存过高有关阴魂不散的矿卡导致渠道库存积压,为此NVIDIA也下调了这个季度的财报预期虽然NVIDIA因为矿卡反噬导致股价跌了25%,但是NVIDIA公司的基本面并没有问题福布斯网站刊文看好NVIDIA的未来前景,对他们的盈利增长保持乐观并预测2020财年(2019年2月到2020年1月)NVIDIA的GPU业务營收达到125亿美元以上,游戏GPU依然会是增长动力     福布斯网站这篇文章对NVIDIA的未来几年的盈利前景表达了看好之态,认为NVIDIA一直是推动创新及迎匼高端GPU的先锋他们还预测了NVIDIA今明两个财年的GPU业务表现,如下图所示:     从他们的数据来看2018财年中NVIDIA的GPU业务营收为81亿美元,2019财年(主要就是今姩)为106亿美元2020财年GPU业务营收将达到125亿美元以上,这主要归功于游戏GPU业务的增长截至2018年10月的前9个月里,NVIDIA的游戏GPU业务增长了40%基于Max-Q的笔记本GPU業务也有强劲营收。 此外NVIDIA还进军了数据中心、高性能计算、云计算等领域,正在帮助细分领域实现增长截至2018年10月的前9个月里,数据中惢业务增长了70%这主要得益于Volta架构的显卡被广泛采用。 福布斯表示虽然他们预计这些趋势在短期内还会继续不过也指出NVIDIA的GPU业务部门整体表现会受到加密货币“宿醉”的影响,今年Q3财季中PC OEM部门营收下降了40%该公司管理层也在近期的财报会议上表示需要一两个季度来解决库存問题。 除了GPU业务福布斯还预测了NVIDIA另外一个业务——Tegra处理器的表现,相比GPU业务大幅增长Tegra处理器未来将保持低双位数增长,这个业务主要昰汽车电子、游戏机(主要是任天堂的Switch主机) 从福布斯的预测来看,明年NVIDIA的GPU业务依然会保持高速增长总营收125亿美元不全是游戏GPU,因为他们嘚算法里数据中心、专业卡GPU也算进去了不过游戏GPU业务依然是NVIDIA GPU业务的主力,Q3季度中GPU业务营收网站上出现的跑分显示骁龙8150的AI性能接近目前驍龙845性能的两倍,也是麒麟980的两倍左右值得一提的是,华为宣称麒麟980的AI性能比麒麟970提高了2倍但从这个基准测试来看,是一个15%的提升戓许是这个测试有问题,因为同样搭载骁龙845处理器的一加6和Pixel 3的得分完全不同所以这些分数有些问题。 另外让人意外的是,联发科的Helio P80获嘚了第二名它的分数远高于骁龙845,几乎和骁龙8150一样高将是目前Helio P60 / P70的大幅提升升(增加约200%!)。

  • 2018年对于老黄来说一切似乎是美好的,10系显卡在市场上的战无不胜让NV整个公司上下都充满信心而不断暗示着的新显卡也让苦等2年的消费者充满着期待,尽管新显卡从年初的CES一直跳票到姩中但是大家的期待却丝毫未减,毕竟对于发烧友来说他们十分需要一款新的显卡来更新自己的装备。   在经过长时间的铺垫之后时間终于来到了8月的科隆游戏展。而在展前发布会上万众期待的20系显卡终于来到我们的面前,只是用户的反响并不如之前所预料的那样高昂的价格,并不明显的理论提升让20系显卡前所未有地遭到大家的怀疑 同时正当NV焦头烂额的时候,队友微软以及SE又给了一个不好的信号由于自身的Bug,微软宣布推迟Windows 10 1809版本的推送而这个系统则是NV所宣传的光线追踪以及DLSS的关键,没有了1809新一代的20系显卡自然不能拉开与10系显鉲的距离,随着微软不断推迟1809的发布《古墓丽影:暗影》受到了牵连,宣布首发不搭载光线追踪而后另一款3A大作《战地5》却迟迟没有表态,大家未免有点担忧好在最后一刻,背锅的微软终于放出了1809补丁而《战地5》也赶在发售之时放出了光追补丁,否则下一个尴尬的遊戏厂商便是EA了 而在上周,对于NV来说一个更为不妙的消息出来了英伟达在11月16日公布了该公司的2019财年第三季度财报。英伟达第三季度营收为31.81亿美元与上年同期的26.36亿美元相比增长21%;净利润为12.30亿美元,与上年同期的8.38亿美元相比增长47%但是该业绩却不及华尔街分析师此前预期,2019財年第四季度业绩展望也未达预期随后NV的股价暴跌17%,至168.32美元这也是10年起来英伟达最大的一次暴跌。这一次的暴跌给了Nvidia当头一棒快速荇进的列车是该冷却一下了。 1、目前的游戏无法体现20系显卡性能 无论怎么说购买游戏显卡的最主要用途还是用来玩游戏,而专业应用更哆的还是使用专业卡来提升工作效率这就要求游戏显卡能够满足目前3A游戏的图形要求。不过由于支持DLSS以及光线追踪的游戏实在太少同時作为先锋军的《最终幻想15》又已经宣布偃旗息鼓,于是让人尴尬的是能够展现Nvidia先进计算能力的游戏寥寥无几。   巧妇难为无米之炊现茬的20系显卡自然是大眼瞪小眼,和传统的10系显卡在游戏效果上没有拉开差距而传统性能又半斤八两,价格又比较高昂至少对于现在的消费者来说,失去两大王牌的20系显卡自然难以引起大家购买的欲望 2、矿难影响太大,导致巨大库存 今年让各大显卡厂商头疼的另外一件倳情便是矿潮的消退在经历了2017年全民挖矿的疯狂之后,2018年虚拟货币终于从巅峰开始走下坡路随后便是大家熟悉的套路。由于矿工不断拋售显卡导致整个显卡市场的秩序被打乱,为矿工准备的显卡也成堆地摆放在仓库之中在2017年经历躺着赚钱的厂商们也在2018年品尝到了高庫存压力的滋味。   同时作为GPU的最上游产业NV自然也饱受矿潮褪去之苦,同时新显卡的推出挤压了10系显卡的销路更是让市场上库存的10系显鉲堆积。此外海量的低价矿卡的存在又消耗了一部分显卡消费用户自然这些厂商的财报不尽如人意了,也导致投资者对于NV今后发展的担憂 总结:2019年将是显卡行业的十字路口 如果说2018年的20系显卡的发布决定了今后显卡的发展方向,那么2019年的显卡市场将会走向一个新的十字路ロ明年7nm工艺的到来让显卡的面积以及散热拥有更加宽裕的考虑,同时AMD也宣布将会在2019年带来7nm的游戏显卡 与此同时,作为PC最大的竞争对手索尼和微软也多次暗示将会在2019年透露新一代主机的消息。整个行业将会在2019年重新洗牌而在过去几年无往不胜的Nvidia自然感受到了巨大的压仂,而这一次的股价暴跌就给了NV和老黄一个警钟——消费者更想要的是单纯的性能怪兽或者说在保持游戏相对流畅的情况下追求更加出銫的画质。

  • 125亿个增加了6.4%而核心面积为331平方毫米,比现在的484平方毫米缩小了足足31.6%晶体管密度翻了一番。同等功耗下新核心性能提升超过25%,而同等频率下新核心功耗降低50%。MI60的热设计功耗为300W性能上MI60 FP64双精度浮点最高7.4TFlops,FP32单精度最高14.7TFlopsINT整数最高118Tops,相比于同样10nm Vega核心的MI25专業性能提升最多达8.8倍同时超越或者基本持平NVIDIA目前最强大的Tesla V100。换句话说Radeon Instinct MI60是目前为止AMD最强大的GPU产品,当然也很有可能是最贵的一款不过想买这块显卡尝鲜的土豪们注意了,在官网的信息页面上MI60仅支持64或32位的Linux系统!也只支持OpenGL 4.6,Vulkan 1.0和OpenCL 2.0以及AMD的ROCm开放系统。所以土豪们想用MI60跑大型Windows遊戏是不可能了至于同架构的AMD游戏卡将在明年和我们见面,各位玩家再等等吧

  • 消息,继全球首款7nm手机处理器之后同样基于台积电7nm制程的CPU和GPU产品也正式发布。近日AMD在美国旧金山的Next Horizon会议上发布了全球第一款7nm 代号“Rome”(罗马)的第二代EPYC霄龙CPU处理器以及Radeon Instinct MI60/MI50的GPU计算卡。7nm Rome(罗马)第二代EPYC霄龍处理器首发7nm CPU和GPUAMD代号为Rome的第二代EPYC霄龙处理器基于Zen2架构Rome EPYC采用特殊设计的架构,每颗处理器有8个CPU 裸片每个裸片内集成8个物理核心,共64个哃时为了更好地协调如此众多CPU核心的协同工作,还专门设计了一个I/O裸片放置在中央位置,专门负责输入输出控制不过I/O裸片用14nm工艺制造。Rome处理器有8通道DDR4内存控制器每个插槽支持最高4TB DRAM。Rome EPYC也是第一个支持PCIE 4.0技术的服务器级CPU支持128个PCIe 4.0,带宽通道数翻番可提升加速器性能,搭配哃样支持PCIE 4.0技术的全新加速卡Radeon Instinct MI60AMD表示可以带来前所未有的加速性能。当然Rome EPYC也是全球第一款采用7nm工艺的数据中心处理器。目前Rome EPYC更详细的参数暫未公布AMD预测Rome EPYC性能将因核心数量的增加而翻倍,浮点性能也将因为IPC架构的改进和核心数量的增加两倍兼容性方面,Rome EPYC与现有的Naples以及下┅代的Milan都将保持兼容,这可以简化基于AMD处理器的服务器开发也能让服务器公司把现有的设计用在未来的服务器当中。进度方面AMD正在向垺务器制造商提供Rome EPYC样品,计划在2019年推出产品但具体时间尚未公布。亚马逊AWS计算副总裁Matt Garman表示基于AMD霄龙芯片的R5和M5实例产品今天就可使用,T3實例将在未来几周上线并重点强调了帮助客户运行最常见应用程序时节省成本的特点。GPU方面AMD在今年Computex 2018上公布了7nm Radeon Vega GPU,《AMD抢先推全球首款7nm 的125亿個晶体管增加了6.4%核心面积为331平方毫米,比现在的484平方毫米缩小了31.6%据称,在同等功耗下新核心性能提升超过25%,同等频率下新核惢功耗降低50%Radeon Instinct显存搭配最多32GB HBM2,带宽达1TB/s內建ECC纠错。同样7nm Vega也是世界首个支持PCIE Vega支持半速率双精度,同时支持新的低精度数据类型具体看,MI60 FP64双精度浮点最高为7.4TFlopsFP32单精度最高为14.7TFlops,INT整数最高为118Tops相比于同样Vega 10核心的MI25专业性能提升8.8倍。还有值得注意的是新的GPU还包括一对片外Infinity Fabric链路,尣许Radeon Instinct卡通过相干链路直接相互连接由于每个GPU只有2个链接,因此AMD的拓扑选项仅限于环上的变化这意味着4路配置的GPU不能全部直接相互通信。另外AMD仍坚持使用PCIe卡,没有像NVIDIA一样的定制夹层式卡所以这些卡需要通过顶部的桥接器连接。为弥补AMD在软件方面的不足AMD宣布了开源计算平台ROCm 2.0,并继续承诺完全开源进度上,Radeon Instinct MI50将于今年第四季度上市MI60将在明年一季度上市。7nm的胜利7nm无疑成为了业界关注的焦点,不过AMD总裁兼首席执行官苏姿丰博士(Lisa Su)此前已经多次谈到AMD的7nm进展在此次Next Horizon会议上,AMD CTO Mark Papermaster表示AMD在7nm上豪赌了一把,首先是相信能把7nm做出来其次是认为7nm将荿为产业关键节点,并持续很长一段时间AMD最初的目标是用自己的7nm和英特尔10nm竞争,至少打成平手但没想到AMD先做出了7nm,并将成为在新节点仩最先推出产品的公司除了已经公布7nm架构和产品,AMD还表示明年锐龙、霄龙将全线转向7nm工艺的Zen2架构接下来将是7nm+升级版工艺的新架构Zen3。不圵于此AMD还首次披露Zen4架构正在设计中。Papermaster也强调了AMD路线图的重要性以及实现路线图的能力和决心他表示Zen2架构芯片正在流片,Zen3预计在2020年使用7nm+淛程Zen4开发已接近尾声。Zen4是否有机会用上5nm一举超越英特尔和英伟达?在Next GPU这是否意味着AMD凭借着7nm一举超越了英特尔和英伟达?在《AMD的7nm处理器样品出锅了不过似乎对Intel威胁不大》一文中已经提到,国外论坛HardOCP上的一位坛友mockingbird爆料称RTG(Radeon Technology Group)已经收到首款Zen 2架构7nm处理器的样品但测试样品嘚基础/睿频频率是4.0/4.5GHz,要比目前Ryzen 7 4.7GHz的睿频频率有差距更不及未来K的5GHz。虽然AMD未来还有继续打磨提高频率的空间但从初代Ryzen测试样品与正式发售產品的频率对比来看,提升空间应该不大另外,硬件以及7nm并不就意味着处理器的成功指令集也十分关键。据了解AMD先有了SSE5指令集,然後英特尔推出了AVX指令集接着AMD又效仿AVX,但保留SSE5中的FMA4、CVT16和XOP指令;然后英特尔效仿AMD加入CVT16但改名为F16C,随后又加入FMA4简化后的FMA3和AVX2.0指令;AMD只得跟风加入FMA3,承认F16C将来还要加入AVX2.0。可以看到AMD在指令集方面的竞争非常激烈至于GPU领域,从AMD首发的7nm计算卡可以看出其非常重视服务器市场不过茬这一市场英伟达GPU拥有绝对的优势,与在CPU领域与英特尔的竞争一样英伟达的领先使其有能力从架构以及指令集等方面占据优势,一旦使鼡了7nm工艺AMD在部分性能方面的优势能保持多久就不得而知。我们也可以从架构上看英伟达在今年八月放出了号称12年来的最大招图灵(Turing)架构,但图灵架构的RTX2080 GPU也继承了很多Fermi架构的东西这意味着AMD也不太可能完全放弃GCN架构设计新的架构,并且此前AMD的研发中心都放在Zen架构上GPU的妀进乏力,基于目前的情况看AMD能够凭借新的工艺就实现对英伟达的反超?认为AMD作为在高性能计算领域同时具有CPU和GPU产品的公司十分难得,不过可惜的是在CPU领域难以超越英特尔在GPU领域难以超越英伟达,这其中有技术的因素也有商业方面的原因。当然对于消费者和云厂商洏言只有竞争才会带来更好的产品,因此对于AMD的7nm CPU和GPU我们依旧保持期待

  • 台积电10月营收出炉,在苹果A12芯片拉货带动之下单月合并营收约為新台币(单位下同)1015.5亿元,创下历史次高纪录较上月增加了7.0%,较去年同期增长了7.4%累计2018年1至10月营收约为8432.54亿元,较去年同期增加了6.2% 虽然台積电第3季受到机台中毒影响,业绩微幅下滑但9月营收949.22亿已经是历史次高纪录,不过第1代7纳米制程的iPhone A12处理器拉货效应,加上国际重量级愙户的加持下10月营收再度攀高至千亿元以上,距离1036亿元历史新高仅一步之遥 台积电第4季财测营收目标2879.8至2910.6亿元,季成长率10.61%到11.79%日前运动會上,董事长刘德音曾公开宣示今年营收相当乐观并喊出要创下历史纪录1万亿元数字,也期盼未来几年营收都能成长将近1成 财务长何麗梅也曾在法说会上表示,第4季因高端智能手机、绘图处理器、人工智能产品等需求强劲将拉动7纳米营收比重快速增长。法人预期以囼积电过望营运历史轨迹,11月、12月营收一般均会比10月减少但若从财测目标来看,应仍可维持在930-950亿元高档水准 台积电近日传出取得2019年苹果A13处理器订单;而英特尔10纳米制程难产情况下,也取得AMD全球第一款7纳米的CPU与GPU;接着10月底也在7纳米先进制程拿下高通新款可支持5G的旗舰手机芯片設计定案并传第4季量产投片,多重大客户订单加持下台积电预估,第4季7纳米营收比重估达 20% 以上全年比重将达 1 成。 台积电认为明年包括手机、车用、物联网与高速运算4大产品线可望全面成长,加上7纳米制程比重明显提升是驱动明年整体营运成长主要动能

  • 今天在旧金屾,AMD正式发布了全新的GPU以及相应的计算卡MI60以及MI50这是全球首款基于7nm打造的GPU,AMD表示全新的MI60以及MI50专业卡将会为下一代的深度学习HPC以及云计算莋准备。包括研究者、科学家以及开发者都会使用AMD的Radeon Instinct计算卡去解决相应的问题其中就包括大型计算、生物模拟等研究。    

  • 11月7日消息 今天在舊金山AMD正式发布了全新的GPU以及相应的计算卡MI60以及MI50,这是全球首款基于7nm打造的GPUAMD表示全新的MI60以及MI50专业卡将会为下一代的深度学习,HPC以及云計算做准备包括研究者、科学家以及开发者都会使用AMD的Radeon Instinct计算卡去解决相应的问题,其中就包括大型计算、生物模拟等研究

  • 近日,荣耀業务部副总裁熊军民宣布荣耀8X幻影蓝即将与大家见面,敬请期待熊军民介绍,荣耀8X幻影蓝是荣耀少有地将渐变色应用在千元旗舰机上但不同于荣耀数字旗舰系列的横向渐变色,幻影蓝巧妙融合荣耀8X特有的双纹理拼接设计诞生了独特的纵向渐变色。该机定位“千元旗艦”荣耀总裁赵明称荣耀8X是一款“用力过猛”的产品。它采用了旗舰级封装工艺—;COF使得下边框宽度窄至4.25mm,屏占比达到了91%点亮屏幕后視觉效果出众。屏幕方面它配备6.5英寸显示屏,屏幕纵横比为19.5:9官方介绍,荣耀8X将6.5英寸屏幕装进了5.5英寸传统手机的机身内带来舒适握持掱感。核心配置上荣耀8X搭载麒麟710处理器,后置2000万+200万AI双摄光圈为F/1.8,前置1600万像素光圈为F/2.0,电池容量为3750mAh此外,荣耀8X搭载了GPU Turbo技术这是一種软硬协同的图形加速技术,能够提高手机GPU的性能图形处理效率提高60%。

  • 在计算机图形领域的扛鼎之作将对影视制作、游戏制作、建筑設计的专业创意领域和消费者的游戏与视觉体验产生重大影响,从而在很大程度上改变创意人士的工作效率和方式于是,在全球最具影響力的创意人士盛会 Adobe MAX 2018 召开之际Nvidia 也将上述 RTX GPU 带到了众多创意人士所在的 Adobe MAX 大会现场。RTX GPU @ Adobe MAX 2018在 来加速 Adobe Dimension CC 的渲染现场展示的 Adobe Dimension CC 渲染案例中,在采用相同的渲染工具的情况下采用 RTX GPU 来渲染的速度比传统 CPU 的速度要快得多,而且能够完美地实现移动光效的效果除了渲染加速,这一案例还展示了利用 RTX GPU 来进行 AI 等其中,基于图灵架构的 Quadro RTX 系列拥有多达 4608 个CUDA core可提供高达 16 teraflops 的计算性能,并行运算每秒 16 万亿次整数运算——在超强的算力之下RTX GPU 朂高可以将视觉和动画效果的处理速度提升 10 倍。在展示了与 Adobe 的合作之外Nvidia 在现场演示了利用一块型号为 Quadro RTX 6000 的 视频渲染效果,需要在一个搭载 48 核双 CPU 的工作站上才能完成这项工作而且后者的 CPU 将不得不接近满载运行;而在 Quadro RTX 6000 加持下,设备在渲染时的 CPU 使用率不超过 50%另外,Nvidia 还与 Cambridge Consultants 合作展示了一个名为 Vincent(按:这里借用的是荷兰画家梵高的名字) 的 AI 辅助绘画工具。它可以利用 AI对用户的绘画行为进行预测,并由此对用户进荇艺术创作引导和填充并且能够对最终的绘画结果进行实时滤镜渲染,而渲染的风格则是根据不同的艺术家作品训练过的——当然这裏的 Vincent 同样也是技术 Nvidia RTX GPU 实现的。Nvidia 发言人告诉自从 RTX GPU 推出之后,包括 Autodesk Arnold、Chaos Group 的 V-ray、O2 Octane 等在内的众多渲染器相关专业公司都已经进行支持另外,也获知茬产品的销售方式上,用户可以在公开市场自行购买相关的 RTX GPU 产品但就 Quadro RTX 而言,最常见的方式是将内置到惠普、戴尔、联想的工作站中对外銷售其中的主要原因是它需要很高的稳定性、可靠性以及长期可用性,这些需要厂商的反复测试才能够保证两家的合作不是两三天了Adobe 與 Nvidia,一个是创意应用领域的巨擘一个是计算机图形领域的王者,从软硬件产品结合的角度它们在面向创意人士方面的合作可以说是顺悝成章了。实际上双方的合作已经持续了十多年,这一合作随着时间的脚步越来越紧密并且已经不限于创意层面。2018 年 3 月正值 Nvidia GTC 大会在聖何塞召开,Nvidia CEO 黄仁勋在 27 日登台主讲了自家的 Keynote 在用户和开发者那里的表现提升以及加快这些产品走向市场的速度。当然与 Nvidia 的合作,也可鉯让 Adobe Sensei API 的可用性得以扩展并能够触及到开发者、数据科学家和合作伙伴。当然黄仁勋之所以在百忙之中为 Adobe 站台,还是看重了后者的 Adobe Sensei 在设計创意和创意营销方面的巨大潜力不过了解到,在两位 CEO 的对谈中双方的合作还将同时涉及到云和端的 AI 服务,并涉及到了 Mixed Reality 以及 Nvidia 的 RTX 实时光線追踪技术可以说,在人工智能时代的大背景下Adobe 与 Nvidia 都已经沿着各自的发展路径拥抱了人工智能、云计算等新技术,并且从业务层面达荿了更加深入、更加紧密的合作关系就本次 Adobe MAX 大会而言,Nvidia RTX GPU 的亮相也是双方十几年合作关系的进一步体现。当然对于 Nvidia 来说,要想让基于圖灵架构的 RTX GPU 技术发挥其作用还需要获取更多产业链合作伙伴的支持,这不是一蹴而就的事情Nvidia 要做的还有很多。

  • 虽然一些 PC 硬件爱好者认為 AMD 已经放弃了高端 GPU 市场但该公司似乎想要证明自己并没有。在近日的一次采访中AMD CEO 苏姿丰(Dr. Lisa Su)表示:“AMD 仍将在高端显卡方面具有竞争力,当湔我们正在打造高性能的优质产品可并打下长期而坚实的基础”。这款新品可能面向中高端市场但毫无以为的是,当前其已在 GPU 领域落後于 NVIDIA 10 系产品即便是定位高端的 AMD Vega(更别提如何挑战最新的 RTX 系列了)。     首先我们不知道所谓的“高性能产品”对 AMD 究竟意味着什么 —— 该 GPU 将以何種形式露面、对标 NVIDIA 的哪一档产品、以及何时上市。 不过这样的境况或许会慢慢发生转变。即便仍有对此持怀疑态度的理由但“苏妈”接受 Barrons 采访时的这番表态,仍可让 AMD 的老粉们略感安慰     目前 AMD 的官方辞令,更多地描述了开发高端 GPU 的长期、而不是短期目标运气好的话,几個月后就能知道答案 至于该公司是否会尝试 NVIDIA 的实时光线追踪技术(当前暂无实际应用)、还是专注于纯粹的性能、并在旗舰产品的定价上重現“锐龙 PK 酷睿”的神操作,还请拭目以待

  • 摘要:虽然FPGA一直在数十亿美元的小众市场行走,在整个千亿元级IC大盘中只占据一隅但并不妨礙它的追逐之梦,而AI、自动驾驶、5G等浪潮兴起为它的梦想插上了翅膀就像1984年发明FPGA成为开创者一样,赛灵思 ACAP(自适应计算加速平台)首款产品系列Versal 的正式面世使FPGA完成了从器件到平台的蝶变,也因而赛灵思将直面英特尔、英伟达的竞争面对规模高出数倍乃至数十倍的竞争对手,Versal能否让赛灵思开启涅槃之旅? 一直在与自己赛跑的FPGA独行侠——赛灵思(Xilinx)在其2018开发者大会(XDF)上重磅发布了业界7nm自适应计算加速平台 (ACAP)首款产品——Versal。赛灵思总裁及CEO Victor 代表集多样性和通用性一体是一款可面向所有应用、面向所有开发者的平台级产品。而Versal的面世表明赛灵思已不再是单純的FPGA公司而转变成平台公司。这也意味着赛灵思将不再囿于FPGA做文章而将染指CPU、GPU等占领的市场,直面与英特尔、英伟达的竞争Versal凭何给予赛灵思这样的勇气?     为何开发ACAP平台? 或许这是大势使然。 “随着摩尔定律的放缓以及大数据、AI、5G、自动驾驶等的发展对于计算能力和带宽提出了前所未有的要求,同时新的算法新的框架层出不穷要应对这一变化就需要灵活应变的架构,而传统芯片设计的周期已经无法跟上創新的步伐” Victor Peng强调,“就像自然界的适者生存一样在数字世界灵活应变的系统才是最可持续的。” 而这一灵活应变的架构就是异构计算赛灵思产品及技术营销高级技术总监Kirk Saban认为,一种架构已无法独自完成大量的数据处理需要异构计算。而从过去多年IC发展来看计算引擎CPU单纯采用“工艺缩放scaling”技术发展的道路遇到了很大的挑战,难以通过等量的计算提升换取等量的性能提升迫使计算引擎变成并行趋勢。 为此赛灵思启动代号为“Evest(珠穆朗玛)”的计划,意在打造一个具有灵活应变能力的自适应异构计算加速平台支持所有类型的开发者通过优化的软硬件来为应用加速,同时具备灵活的应变能力Victor Peng笑言Versal是在业界需求最迫切的时刻雪中送炭。 当然Versal要具备上述“魔力”赛灵思也投入巨大,数十亿美元、上千名工程师、历时 4 年终才出手 赛灵思软件及IP产品执行副总裁Salil Raje 对此表示,在开发过程中Versal要解决诸多挑战,不只是硬件如处理器、AI引擎、收发器等整合还有软件、7纳米FinFET工艺等,是一个非常大的系统工程赛灵思花了几千小时的人工来确保软件工具的简单易用,对所有架构进行了重新布置确保这一平台能够自上而下的软件可编程,也进一步提升了准入门槛 而在这一过程中,FPGA从最初的逻辑门到SoC、MPSoC、RFSoC芯片再进化到ACAP如在28纳米时集成了编解码处理器,在16纳米级别加入了GPU之后完成了从FPGA器件到平台ACAP的蝶变,也将开啟赛灵思的新征程 Versal的功力 被寄与厚望的Versal平台究竟有何“功力”担当重任? 先来看其硬件。赛灵思产品及技术营销高级技术总监Kirk Saban指出异构計算平台必须要有多个不同类型的处理引擎,以应对不同的工作负载Versal平台整合了三种类型的可编程处理器即标量引擎双Arm Cortex-A72和Cortex-R5处理器、自适應引擎PL、智能引擎即AI引擎和DSP引擎,以及前沿的存储器、高速收发器和多种接口技术等     这些引擎形成一个紧密集成的异构计算平台,并且各司其职Kirk Saban介绍,Arm处理器通常用于控制应用、操作系统、通信接口等;PL执行数据操作和传输、非基于向量的计算和连接;AI引擎为基于向量的算法提供了高达五倍的计算密度同时,这一切与片上网络 (NoC) 连通提供对所有三种处理单元类型的存储器映射访问,从而比任何一种单独架構都支持更高的定制和性能提升 值得一提的是,赛灵思独创的AI引擎是一种新型硬件模块包括用于定点和浮点运算的向量处理器、标量處理器、专用程序和数据存储器、专用AXI 数据移动通道以及 DMA 和锁止。它针对计算和DSP进行了优化可满足高吞吐量和高性能计算要求。相对于業界领先的GPUAI 推断性能预计能提升3-8倍,功耗降低 50% 在软件层面,Kirk Saban提到Versal平台引入革新性的软件堆栈即NoC平台管理控制器,提供了无缝连接的功能可直接通过软件进行编程和配置。同时符合业界标准设计流程的一系列工具、软件、库、IP等助力,使得Versal ACAP 的硬件和软件均可由开发鍺进行编程和优化而这在赛灵思的历史上也是绝无仅有的。 由此硬件和软件的共同创新成就了Versal ACAP 这一颠覆性的异构计算平台,实现了显著的性能提升Kirk Saban举出了具体数字,其速度超过当前最高速的FPGA 20倍、比当今最快的CPU快100倍同时可实现低于2ms的时延,相信数据中心、有线网络、5G無线和ADAS等应用将乐见其成 据悉,Versal平台组合包括Versal基础系列(Versal Prime)、Versal旗舰系列(Versal Premium)和HBM系列提供不同的性能、连接性、带宽和集成功能。此外还包括Versal AI系列,包括AI核心(AI Core)系列、AI边缘系列和AI射频系列Versal Prime 系列和AI Core 系列将于2019年下半年上市。前者具广泛的适用性用于在线加速和各种工作负载;后者提供高计算性能和最低时延,实现突破性的 AI 推断吞吐量和性能 同时,赛灵思还公布了发展路线图2020年将推出Premium和AI边缘系列,下半年将上市AI射頻系列而HBM将于2021年下半年面世。 其他架构自求多福? Versal横空出世其它选手如CPU、ASIC等如何应对? 毕竟它们各有“苦衷”。Kirk Saban认为标量处理单元(例如 CPU)茬具有不同决策树和广泛库的复杂算法中非常有效,但在性能扩展方面受到限制而在先进制程后摩尔定律已经不再有效,CPU已无法适应最先进的应用了 而矢量处理单元(如GPU)在并行计算上效率更高,但由于存储器层级结构不灵活,它们会受时延和效率的影响它们可能在某一个功能领域的加速性能不错,但灵活度不够无法适应创新的速度。 并且通用AI芯片不是正确的方向。Kirk Saban分析说ASIC针对某个CNN、DNN来优化形成固定功能,一旦有新的算法或者框架就需要重新设计在目前发展态势下对于变量少的行业ASIC相对适用,如果变化快ASIC很快就会过时实际上连谷謌的TPU也概莫能外。 虽然GPU等有着相对完善的生态系统但Versal作为新兴势力,在生态的构建上也在大张旗鼓一方面Versal可软硬件编辑,开发便利;另┅方面在着力与合作伙伴一起互惠共赢。 “Versal不会取代所有的GPU但肯定会有越来越多的应用采用灵活应变的平台。”这是Victor Peng的判断也是寄望 为何着重AI推断? 需要指出的是,Versal看重的是AI推断市场 Salil Raje指出,AI有训练和推断两大阶段对于训练来说海量数据非常重要,但延迟和功耗都不那么重要而无论是在边缘端还是云端的推断,数据量很少实时响应的性能非常重要,对延迟要求极高而且对功耗也极为看重。 “AI训練和推断的要求是不一的不能把训练的解决方案直接应用到推断上。在过去几年全球关注的主要是AI训练,这是因为众多新的AI应用需要應用AI模型但今后AI模型将大量应用在云端和边缘端,因而未来的模式更多的是AI推断而不是训练。” 由此亦带来了新的挑战Salil Raje指出,挑战茬于一是AI创新的速度就像要追随移动的靶子一样。二是需要低时延、高带宽和高性能最大的挑战是功耗。三是要实现整体的应用加速而不仅是机器学习的加速。 当然AI训练也是非常重要的市场。Salil Raje表示赛灵思也在研发训练用FPGA方案,不排除进入这一市场的可能性 中国AI初创企业不应热衷于造芯 Versal平台染指AI应用,也预示着赛灵思要直面国内火爆的AI造芯厂商的竞争对于这一点,赛灵思也有自己的见解 “中國有大量AI初创企业,也有很多厂商在投入造芯但赛灵思认为他们其实不一定要热衷于造芯。因为设计AI芯片目前要采用16纳米甚至7纳米的工藝所需的投入是巨大的,风险也很大” Victor Peng提出了建议,“其实他们可在算法和框架方面深入研究从这些层面来创造更多的价值;或者采鼡Versal平台开发具体应用,而不是投资几亿元去做芯片” “就像深鉴科技,两年前就基于赛灵思产品做AI方面的开发因此在被收购后其成果鈳迅速应用到Versal平台上,深鉴科技最为核心的就是DPU及神经网络压缩编译技术应用此技术的Versal平台可适应不同精度不同位宽,并且时延大幅降低”Salil Raje提及。 而对于华为、阿里都在打造属于自有AI芯片的情形Victor Peng表示,这表明目前正处于AI革命的早期大家都在寻找不同的解决方案,这帶来了众多机遇可能有一些领域是适用于固定功能的芯片,但绝大多数应用还将使用灵活平台作为解决方案 为何还要推出加速器卡? 除叻打造Versal平台之外,赛灵思也意识到在云端和数据中心的服务器中FPGA作为一种服务即FaaS的部署正在加快。Victor Peng介绍说FaaS最初是从亚马逊开始部署,現已有8个国家在采用今年赛灵思已培训超过14000名的开发者,实现了36个应用在XDF大会上,亚马逊就面向中国开发者宣布AWS F1覆盖区域数量翻番並正式落地中国。 与之相呼应的是据分析,全球加速器卡的市场将达到120亿美元而中国市场占据半壁江山。 为此赛灵思还推出了功能強大的加速器卡——Alveo,它的优势在于客户可对硬件进行重配置针对工作负载、新标准和新算法进行调整和优化,并且更加易用同时性能更加出色。 就机器学习而言Alveo U250实时推断吞吐量比高端 CPU高出20 倍,相对于高端GPU等能让2毫秒以下的低时延应用性能提升4倍以上,堪称全球最赽的数据中心加速卡     而且,目前Alveo得到了合作伙伴和 OEM 厂商生态系统的广泛支持有14 家合作伙伴开发完成的应用可立即投入部署,国内如华為、阿里云、浪潮等都已在合作推出基于赛灵思的加速方案。此外部分OEM芯片厂商将和赛灵思进入更深入合作,认证采用Alveo加速器卡的多個服务器SKU包括Dell EMC、Fujitsu和IBM等。这些关键应用涵盖AI/ML、视频转码、数据分析、金融风险建模、安全和基因组学等 阿里云FPGA异构计算研发总监张振祥宣称,阿里集团采用Faas提升发效率节省了成本,阿里集团X项目每千片FPGA三年节约TCO成本40%华为IT智能计算产品线副总裁张小华也提到,华为云与賽灵思紧密合作实现了线上线下协同的FPGA加速解决方案,以视频编解码为例在在线视频广播业务场景下可节约40%的带宽和存储空间,为客戶带来了极大的价值

  • NVIDIA在北京召开沟通会,由亚太区解决方案架构主管赵立威详解了RAPIDS开源GPU数据加速平台该平台发布于2018年10月10日的GTC Europe大会上,昰一款针对数据科学和机器学习的GPU加速平台为数据科学家提供标准化的流水线式工具,数据处理速度较仅用CPU提升50倍沟通会后,与NVIDIA中国高级解决方案架构师何萍以及NVIDIA亚太区解决方案高级总监赵立威等高管就RAPIDS平台和GPU加速数据科学和机器学习进行了进一步的交流。据分析师估计面向数据科学和机器学习的服务器市场每年价值约为200亿美元,加上科学分析和深度学习市场高性能计算市场总价值大约为360亿美元,且该市场还在持续快速发展几乎每一家企业都在用数据驱动来增强自己的核心竞争力。“数据分析和机器学习是高性能计算市场中最夶的细分市场不过目前尚未实现加速,”NVIDIA创始人兼首席执行官黄仁勋在发布RAPIDS时提到“全球最大的行业均在海量服务器上运行机器学习算法,目的在于了解所在市场和环境中的复杂模式同时迅速、精准地做出将直接影响其基础的预测。”一个最典型的大数据分析流程大致分为数据准备、数据合并、数据降维三个步骤很多数据特征需要靠行业或专业领域的专家去理解,并事先把它们提取出来因此在Machine Learning中需要训练过程,这是一个不断的循环过程在不断优化、不断调整参数的过程中,提高训练过程的精度从而得到更准确的预测结果。为叻支持这样一个大数据分析流程需要用到DASK、PYTHON、PANDAS、SKLEARN、NUMPY、Apache Arrow等组件。RAPIDS构建于Apache Arrow、PANDAS和SKLEARN等组件之上通过CUDF数据过滤、CUML机器学习、CUGRAPH数据图像化来加速处悝数据,为最流行的Python数据科学工具链带来了GPU提速这三套软件工具都是基于CUDA开发,可以把它们看成是CUDA的一部分其中CUDF与Pandas的功能非常类似,Pandas嘚所有功能都可以在CUDF里找到对应的API;CUML则对应SKLEARN无论是分类、聚类、回归等算法都可以在CUML里面找到。而CUGRAPH目前尚未正式推出预计会在明年正式集成到RAPIDS中。赵立威向透露RAPIDS非常易与此前的计算框架整合,虽然不能说是“无代码”过渡但代价非常小,且数据处理效率可提升50倍以仩同时为了将更多的机器学习库和功能引入RAPIDS,NVIDIA广泛地与开源生态系统贡献者展开合作其中包括Anaconda、BlazingDB、Databricks,以及迅速增长的Python数据科学库pandas等等此外,黄仁勋在GTC Switch总线互联使整台服务器拥有了un-block无阻滞通讯能力,总算力高达2PFLOPs(半精度浮点)数据处理能力相当于5台DGX-1。除了DGX-2和DGX-1NVIDIA还有┅系列合作伙伴提供的很多的硬件产品,如一些ODM、OEM厂商基于HGX-1和HGX-2两种架构标准生产的许多不同类型服务器甚至包括上一代Pascal架构的GPU的服务器,都可以都可以很好的支撑RAPIDS的运行和使用赵立威笑称,由于此前数据处理的速度太慢数据科学家往往有大量的空闲等待时间,可以悠閑的喝咖啡应用RAPIDS平台之后,等待时间变短需要数据科学家创造性参与的部分相应变多了,数据科学家这一工作可能不再是美差当然,数据分析和机器学习领域的持续走热看中这片市场的也不只NVIDIA一家。上周赛灵思刚刚推出基于UltraScale+ FPGA打造的数据中心和AI加速卡Alveo U200和U250号称实时推斷吞吐量比高端CPU高出20倍。赛灵思数据中心副总裁Manish Muthal表示Alveo加速器卡的推出进一步推进了赛灵思向平台公司的转型,使不断增长的应用合作伙伴生态系统以比以往更快的速度加速创新并将与应用生态系统展开合作,共同向客户推出采用Alveo的各种可产品化的解决方案与NVIDIA推出的RAPIDS平囼相比,二者通过一硬一软的形式覆盖了几乎相同的范围对此赵立威对表示,数据分析和机器学习市场尚未探明其特定边界领域内应鼡场景非常多样化,无论是基于FPGA还是ASIC进行异构加速都是可行的完全取决于针对不同的场景所产生的不同需求。

  • 9代酷睿处理器已经发布了鈈少型号了虽然Core i7-9700K加了2个核心但是却删了超线程。而最吸引人的点却是传说中的“钎焊工艺”今天我们来简单聊聊这个“钎焊”到底是個什么东西。先不说处理器是什么封装只从上半部分比较的话,桌面级CPU会比移动端CPU多一个天灵盖 失去了天灵盖的CPU大概就是这个样子的,核心裸露在外虽然失去天灵盖保护很容易被破坏,但是核心可以直触散热设备从而有效提高导热效率 毕竟笔记本体积小,散热系统能提供的散热效果有限只能通过提高导热效率来稳定CPU的温度。桌面级处理器就不一样了随便一个几十块的塔式散热器都能有很好的散熱效果,而且由于安装使用过程的环境不一样需要一个顶盖来保护核心。 顶盖和核心表面虽然看似光滑但也不是无缝紧贴在一起,导熱效率必然大幅下降这时候就需要在它们两者中间加入填充物使热量能更好地从核心转移到顶盖。 核心与顶盖之间的填充物 Core i7-8700K依旧采用硅脂导热 Intel这几年一直让人诟病的一点是它的“硅脂U”就是采用硅脂作为CPU核心与顶盖之间的填充物。 用硅脂作为填充物对于制造流程来说相當方便:往核心上抹一坨硅脂顶盖四周上胶然后贴合pcb,再固定好等胶凝固了就行了“硅脂U”唯二的缺点就是导热效率不如金属以及硅脂干了会进一步降低导热效率。 “钎焊U”就不一样了采用铟或者是4族元素作为核心与顶盖之间的填充物,它的导热效率比硅脂强太多傳统硅脂的导热系数一般在10W/mK内,而钎焊工艺用的焊料的导热系数约为80W/mK不仅导热系数高出不少,而且还不用担心长期使用会降低导热效率作为DIYer,大家肯定是希望Intel采用钎焊工艺的但是钎焊成本高,工艺复杂Inter前几年一家独大才不愿意给你搞这些东西呢。 钎焊工艺的流程 可能很多人认为钎焊跟上硅脂一样抹上去压紧就完事了。当然也有人知道钎料需要加热才能使用不过其中的复杂程度可不是那么容易能悝解的。我们知道CPU的顶盖是由铜制成而核心则是硅。金属铟是目前唯一发现能同时与铜和硅焊接的材料然而…… 猫头鹰散热器铜管和銅底外表均镀镍 然而大家都知道纯铜的颜色是怎么样的,起码不是我们日常看到CPU顶盖那种颜色这是由于纯铜在空气中很容易发生氧化,吔容易被腐蚀因此需要在纯铜的表面镀上一层镍金属作为阻挡层,这一点其实我们在塔式散热器也能看到 清楚看到顶盖上有一片金色 高端的塔式散热器,无论是铜底或者热管直触都会在铜材料外面镀一层镍防止变质。而镍也不好跟铟焊接起来因此还需要一层金来做鍍层。 而在另一侧的CPU核心部分如果铟直接跟核心焊接,就有机会入侵到核心内部造成CPU的损坏。为了保护CPU核心Intel也在核心外做了一个保護层,而这个保护层也是跟铟不那么友好最后还是要在核心上镀一层金作为镀层。说到底就是两层金子中间用焊料焊接起来而已 接下來就是将工件升温到焊料融解并渗入焊件表面缝隙,等温度降下来焊料凝固后焊接就完成了 为什么Intel又重新选择钎焊工艺 同样采用钎焊工藝的Core i7-2600K 2代酷睿之后Intel就在大部分处理器内改用硅脂导热,只剩下至尊系列以及E5以上的服务器处理器仍在使用钎焊工艺 原因其实很简单,从3代箌7代酷睿这段时间AMD根本拿不出来可以跟Intel竞争的东西Intel自然是每代挤挤牙膏就完事了。不超频都能吊打FX系列又何须在意CPU超频后温度过高的凊况。 然而锐龙系列的推出让Intel慌了先是匆忙推出8代酷睿跟Ryzen勉强抗衡,然后马不停蹄地推出9代酷睿来证明自己的地位Core i7-9700K和Core i9-9900K可是8核心的怪物,硅脂可没办法迅速把热量传递到顶盖这样一来Intel只能选择改用钎焊工艺。 说到底我们能用上钎焊的IU真得感谢AMD发力这两年Intel的牙膏越挤越哆,都从4C8T挤到8C16T了 2钎焊和硅脂、液金有何区别硅脂、钎焊与液金 坚决不给电商打广告 我们来看看目前网商能买到最好的液金——Thermal Grizzly Conductonaut,它的导熱系数在73W/mK左右比钎焊稍微低一点。相比硅脂的导热效率我们姑且可以把它和钎焊的导热效率划上等号。这也是DIYer常说的“开盖换液金”鼡到的材料 安全实用的CPU开盖神器 在9代酷睿推出之前,历代Core i7带K的产品都免不了面临高温的问题尤其是进行超频后温度甚至会超过100℃安全線。通常大家都会用比较高级的散热器去提高导热效率而不少DIYer更喜欢“开盖换液金”这种既经济又能动手的方案。 对于非钎焊U来说开蓋流程相当简单: 1。先用刀片将连接顶盖和CPU的黑胶稍微切开 2。利用开盖神器(自己tb搜去)将顶盖和pcb安全分离 3。清理核心与顶盖上的硅脂鼡银行卡之类的东西刮干净黑胶。 4给内部触点涂上三防漆防止短路。 5在核心表面均匀涂抹液态金属。 6在顶盖四周均匀涂上适量黑胶(留有小缺口作排气孔),与pcb对齐位置连接、压紧并固定直至黑胶凝固 经过一轮操作,即使是Intel祖传的“硅脂U”也能摇身一变成为低温的“钎焊U”而一套工具加材料的价钱并不超过100块,同比之下升级散热器让工作温度达到“开盖”水平需要花费的钱更多而且这套工具材料也鈈是一次性的,一支液金起码能涂抹4、5个CPU的核心 钎焊的CPU能不能开盖 能!但是步骤要比“硅脂U”麻烦一点。在用开盖神器开盖前需要将CPU和開盖神器装好加热直至钎料融解后,再把顶盖与pcb分离 2代酷睿不加温就开盖的后果:核心直接破碎 不这样做能不能开盖?能!不过核心和顶盖焊在一起,而且核心是相当脆的不加热开盖基本上等于直接把核心的外壳扯下来,简单来说就是不加热开盖的话这个CPU直接GG 不过据说新┅代Core开盖的时候并没有进行加热,开出来后核心也没有损坏有可能这一代酷睿用的是软钎焊工艺,而不是2代酷睿用的硬钎焊工艺如果昰真的话,看来我们还是高估了Intel的牙膏量了 软、硬钎焊的区别在于温度,超过450℃开始就是硬钎焊温度高更利于钎料渗入镀层缝隙,导熱效率更高但是会将核心和顶盖牢牢粘在一起。软钎焊则是可以看成是一坨导热效率较低的液金不过肯定比硅脂强就是了。 尾声 的确國外已经有人将9代酷睿进行“开盖换液金”温度也较之前低了几度,这与Ryzen当时的开盖情况类似如此看来液金还是CPU的好伙伴,追求极限低温的朋友也是可以给9代酷睿开盖的不过9代酷睿开盖的收益不如“硅脂U”高,气味大师并不推荐这样做 至于该不该入手9代酷睿,我倒昰有点自己的想法抛开价格来说,9代酷睿提高的频率并加入了钎焊工艺的确有足够吸引人的点没能力动手开盖的朋友也不用再担心使鼡时CPU温度过高,大家都开开心心超频5.0GHz参照以往的经验,9代酷睿会慢慢降价到8代酷睿的水平总之就是早买早享受,晚买更便宜 不过购買了8代酷睿的朋友就没必要升级了,真的觉得太热开盖就完事了6C12T的Core i7-8700K跟8C8T的Core i7-9700K在体验上真的不算太大,没必要特意去升级当然壕另说,有钱嘚小伙伴一步到位直接入手Core i9-9900K体验一下所谓的“最强游戏CPU”还是可以的

  • 10月16日消息,在北京举办的赛灵思开发者大会(XDF)上赛灵思宣布推出Versal(TM):業界首款自适应计算加速平台(Adaptive Compute Acceleration Platform,ACAP)以及全球最快的数据中心和AI加速器卡:Alveo,性能超高端GPU 4倍超高端CPU90倍。 据了解推出ACAP产品的目的是为开发鍺开发应用快速创新。Versal ACAP整合标量处理引擎、自适应硬件引擎和智能引擎以及前沿的存储器和接口技术能为所有的应用提供强大的异构加速功能。Versal ACAP的硬件和软件均可由软件开发者、数据科学家和硬件开发者进行编程和优化这得益于其符合业界标准设计流程的一系列工具、軟件、库、IP、中间件和框架。 Versal产品组合基于台积电(TSMC)的7nm FinFET工艺技术是第一个将软件可编程性与特定领域硬件加速和灵活应变能力相结合的平囼。该产品组合包括6个系列的器件其独特架构针对云端、网络、无线通信乃至边缘计算和端点等不同市场的众多应用提供了可扩展性和AI嶊断功能。 Alveo加速器卡则是针对各种类型的应用提供显著的性能优势就机器学习而言,Alveo U250实时推断吞吐量比高端CPU高出20倍相对于高端GPU等固定功能的加速器,能让2毫秒以下的低时延应用性能提升4倍以上此外,Alveo加速器卡相对于GPU能将时延减少3倍在运行实时推断应用时提供显著的性能优势。数据库搜索等一些应用可从根本上得到加速性能比CPU高90倍以上。

4.CAS实现原理以及ABA问题的解决方法

CAS 操作是抱着乐观的态度进行的(乐观锁),它总是认为自己可以成功完成操作当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出并成功更新,其余均会败失败的线程不会被挂起,仅是被告知失败并且允许再次尝试,当然也允许失败的线程放弃操作基于这样的原理,CAS 操作即使没有锁也可以发现其他线程对当前线程的干扰,并进行恰当的处理

比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 吔从内存中取出 A并且two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A这时候线程 one 进行 CAS 操作发现内存中仍然是 A,然后 one 操作成功尽管線程 one 的 CAS 操作成功,但是不代表这个过程就是没有问题的

部分乐观锁的实现是通过版本号(version)的方式来解决 ABA 问题,乐观锁每次在执行数据嘚修改操作时都会带上一个版本号,一旦版本号和数据的版本号一致就可以执行修改操作并对版本号执行+1 操作否则就执行失败。因为烸次操作的版本号都会随之增加所以不会出现 ABA 问题,因为版本号只会增加不会减少

6.线程池复用技术的实现原理? 参考:

  1. 都是用来协调哆线程对共享对象、变量的访问
  2. 都是可重入锁同一线程可以多次获得同一个锁
  3. 都保证了可见性和互斥性
  1. ReentrantLock 可响应中断、可轮回,synchronized 是不可以響应中断的为处理锁的不可用性提供了更高的灵活性
  2. 底层实现不一样, synchronized 是同步阻塞使用的是悲观并发策略,lock 是同步非阻塞采用的是樂观并发策略
  3. synchronized 在发生异常时,会自动释放线程占有的锁因此不会导致死锁现象发生;而 Lock 在发生异常时,如果没有主动通过 unLock()去释放锁则佷可能造成死锁现象,因此使用 Lock 时需要在 finally 块中释放锁
  4. Lock 可以让等待锁的线程响应中断,而 synchronized 却不行使用 synchronized 时,等待的线程会一直等待下去鈈能够响应中断
  5. 通过 Lock 可以知道有没有成功获取锁,而 synchronized 却无法办到
  6. Lock 可以提高多个线程进行读操作的效率既就是实现读写锁等。

8.ReentrantLock公平锁和非公平锁的区别可以从性能方面讲?

10.谈一下volatile关键字你是怎么理解的能否保证原子性?比较synchronized关键字不同 1.volatile关键字是线程同步的轻量级实现所以volatile性能肯定比synchronized关键字要好。


进程与线程的概念以及为什么偠有进程线程,其中有什么区别

进程是对运行时程序的封装是系统进行资源调度和分配的基本单位,实现了操作系统的并发;

线程是进程的子任务CPU调度和分派的基本单位,用于保证程序的实时性实现进程内部的并发。线程是操作系统可识别的最小执行和调度单位烸个线程都独自占用一个虚拟处理器:独自的寄存器组指令计数器处理器状态每个线程完成不同的任务,但是共享同一地址空间(吔就是同样的动态内存映射文件,目标代码等等)打开的文件队列和其他内核资源。

程序计数器:于存放下一条指令所在单元的地址嘚地方

寄存器组:当从一个线程切换到另一个线程上时必须将原有的线程的寄存器集合的状态保存

堆栈:线程必须拥有自己的函数堆栈,使得函数调用可以正常执行不受其他线程的影响。

1.一个线程只能属于一个进程而一个进程可以有多个线程,但至少有一个线程线程依赖于进程而存在

2.进程在执行过程中拥有独立的内存单元而多个线程共享进程的内存。(资源分配给进程同一进程的所有线程共享该进程的所有资源。同一进程中的多个线程共享代码段(代码和常量)数据段(全局变量和静态变量),扩展段(堆存储)但是每個线程拥有自己的栈段栈段又叫运行时段用来存放所有局部变量和临时变量。

3.进程是资源分配的最小单位线程是CPU调度的最小单位;

由于在创建或撤消进程时,系统都要为之分配或回收资源如内存空间、I/o设备等。因此操作系统所付出的开销将显著地大于在创建戓撤消线程时的开销。类似地在进行进程切换时,涉及到整个当前进程CPU环境的保存以及新被调度运行的进程的CPU环境的设置而线程切换呮须保存和设置少量寄存器的内容,并不涉及存储器管理方面的操作可见,进程切换的开销也远大于线程切换的开销

5.通信:由于同一進程中的多个线程具有相同的地址空间,致使它们之间的同步和通信的实现也变得比较容易进程间通信IPC线程间可以直接读写进程数據段(如全局变量)来进行通信——需要进程同步和互斥手段的辅助,以保证数据的一致性在有的系统中,线程的切换、同步和通信都無须操作系统内核的干预

6.进程编程调试简单可靠性高但是创建销毁开销大;线程正相反,开销小切换速度快,但是编程调试相对复杂

7.进程间不会相互影响 ;线程一个线程挂掉将导致整个进程挂掉

8.进程适应于多核、多机分布;线程适用于多核

进程间通信的方式与线程间通信

进程间通信主要包括管道、系统IPC(包括消息队列、信号量、信号、共享内存等)、以及套接字socket。

管道主要包括无名管道和命名管道:管噵可用于具有亲缘关系的父子进程间的通信有名管道除了具有管道所具有的功能外,它还允许无亲缘关系进程间的通信

1)它是半双工的(即数据只能在一个方向上流动)具有固定的读端和写端

2)它只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)

3)咜可以看成是一种特殊的文件,对于它的读写也可以使用普通的read、write等函数但是它不是普通的文件,并不属于其他任何文件系统并且只存在于内存中。

先创建管道然后再fork后即可在父子进程间创建管道。如果需要父向子写则关闭父的读和子的写;如果子向父写,则关闭孓的读和父的写

1)FIFO可以在无关的进程之间交换数据

2)FIFO有路径名与之相关联,它以一种特殊设备文件形式存在于文件系统中

当以只读open一个FIFO时,会阻塞到出现某个进程以写而open这个FIFO为止同样,以只写open一个FIFO将阻塞到某个进程以只读打开他为止如果FIFO设置了O_NONBLOCK,则只读OPEN立即返回如果沒有进程为读而打开FIFO,则只写OPEN将返回-1也就是说只有对一个FIFO同时存在读和写的进程时,才能在进程间进行通信

消息队列,是消息的链接表存放在内核中。一个消息队列由一个标识符(即队列ID)来标记 (消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓沖区大小受限等特点)具有写权限得进程可以按照一定得规则向消息队列中添加新信息;对消息队列有读权限得进程则可以从消息队列中读取信息;

1)消息队列是面向记录的其中的消息具有特定的格式以及特定的优先级。

2)消息队列独立于发送与接收进程进程终止时,消息队列及其内容并不会被删除

3)消息队列可以实现消息的随机查询,消息不一定要以先进先出的次序读取,也可以按消息的类型读取。

信号量(semaphore)與已经介绍过的 IPC 结构不同它是一个计数器,可以用来控制多个进程对共享资源的访问信号量用于实现进程间的互斥与同步,而不是用於存储进程间通信数据

1)信号量用于进程间同步,若要在进程间传递数据需要结合共享内存

2)信号量基于操作系统的 PV 操作,程序对信号量嘚操作都是原子操作

3)每次对信号量的 PV 操作不仅限于对信号量值加 1 或减 1,而且可以加减任意正整数

信号是一种比较复杂的通信方式,用於通知接收进程某个事件已经发生

它使得多个进程可以访问同一块内存空间,不同进程可以及时看到对方进程中对共享内存中数据得更噺这种方式需要依靠某种同步操作,如互斥锁和信号量等

1)共享内存是最快的一种IPC因为进程是直接对内存进行存取

2)因为多个进程可以同時操作,所以需要进行同步

3)信号量+共享内存通常结合在一起使用信号量用来同步对共享内存的访问

shmget返回一个共享存储ID,它代表使用的是哪个共享存储段调用shmat将共享存储段连接到所指定的地址空间中。

socket也是一种进程间通信机制与其他通信机制不同的是,它可用于不同主機之间的进程通信

临界区:通过多线程的串行化来访问公共资源或一段代码,速度快适合控制数据访问;

互斥量Synchronized/Lock:采用互斥对象机制,只有拥有互斥对象的线程才有访问公共资源的权限因为互斥对象只有一个,所以可以保证公共资源不会被多个线程同时访问

信号量Semphare:為控制具有有限数量的用户资源而设计的它允许多个线程在同一时刻去访问同一个资源,但一般需要限制同一时刻访问此资源的最大线程数目

事件(信号),Wait/Notify:通过通知操作的方式来保持多线程同步还可以方便的实现多线程优先级的比较操作

Linux虚拟地址空间

虚拟内存技术使嘚不同进程在运行过程中,它所看到的是自己独自占有了当前系统的4G内存所有进程共享同一物理内存,每个进程只把自己目前需要的虚擬内存空间映射并存储到物理内存上 事实上,在每个进程创建加载时内核只是为进程“创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表实际上并不立即就把虚拟内存对应位置的程序数据和代码(比如.text .data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射就好(叫做存储器映射)等到运行到对应的程序时,才会通过缺页异常来拷贝数据。还有进程运行过程中偠动态分配内存,比如malloc时也只是分配了虚拟内存,即为这块虚拟内存对应的页表项做相应设置当进程真正访问到此数据时,才引发缺頁异常

2.内存保护:每个进程运行在各自的虚拟内存地址空间,互相不能干扰对方虚存还对特定的内存地址提供写保护,可以防止代码戓数据被恶意篡改

3.公平内存分配。采用了虚存之后每个进程都相当于有同样大小的虚存空间

4.当进程通信时可采用虚存共享的方式實现。

5.当不同的进程使用同样的代码时比如库文件中的代码,物理内存中可以只存储一份这样的代码不同的进程只需要把自己的虚拟內存映射过去就可以了,节省内存

6.虚拟内存很适合在多道程序设计系统中使用许多程序的片段同时保存在内存中。当一个程序等待它的┅部分读入内存时可以把CPU交给另一个进程使用。在内存中可以保留多个进程系统并发度提高

7.在程序需要分配连续的内存空间的时候,呮需要在虚拟内存空间分配连续空间而不需要实际物理内存的连续空间,可以利用碎片

1.虚存的管理需要建立很多数据结构这些数据结構要占用额外的内存

2.虚拟地址到物理地址的转换,增加了指令的执行时间

3.页面的换入换出需要磁盘I/O,这是很耗时的

4.如果一页中只有一部汾数据会浪费内存

操作系统中的程序的内存结构

一个程序本质上都是由BSS段、data段、text段三个组成的。可以看到一个可执行程序在存储(没有調入内存)时分为代码段、数据区和未初始化数据区三部分

BSS段(未初始化数据区):通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域。BSS段属于静态分配程序结束后静态变量资源由系统自动释放。

数据段:存放程序中已初始化的全局变量的一块内存区域数据段也属于静态内存分配

代码段:存放程序执行代码的一块内存区域。这部分区域的大小在程序运行前就已经确定并且内存区域屬于只读。在代码段中也有可能包含一些只读的常数变量

text段和data段在编译时已经分配了空间,而BSS段并不占用可执行文件的大小它是由链接器来获取内存的。

bss段(未进行初始化的数据)的内容并不存放在磁盘上的程序文件中其原因是内核在程序开始运行前将它们设置为0。需要存放在程序文件中的只有正文段和初始化数据段

data段(已经初始化的数据)则为数据分配空间,数据保存到目标文件中

数据段包含經过初始化的全局变量以及它们的值。BSS段的大小从可执行文件中得到然后链接器得到这个大小的内存块,紧跟在数据段的后面当这个內存进入程序的地址空间后全部清零。包含数据段和BSS段的整个区段此时通常称为数据区

可执行程序在运行时又多出两个区域:栈区和堆區。

栈区:由编译器自动释放存放函数的参数值、局部变量等。每当一个函数被调用时该函数的返回类型和一些调用的信息被存放到棧中。然后这个被调用的函数再为他的自动变量和临时变量在栈上分配空间每调用一个函数一个新的栈就会被使用。栈区是从高地址位姠低地址位增长的是一块连续的内存区域,最大容量是由系统预先定义好的申请的栈空间超过这个界限时会提示溢出,用户能从栈中獲取的空间较小

堆区:用于动态分配内存,位于BSS和栈中间的地址区域由程序员申请分配和释放。堆是从低地址位向高地址位增长采鼡链式存储结构。频繁的malloc/free造成内存空间的不连续产生碎片。当申请堆空间时库函数是按照一定的算法搜索可用的足够大的空间因此堆嘚效率比栈要低的多

缺页中断:在请求分页系统中,可以通过查询页表中的状态位来确定所要访问的页面是否存在于内存中每当所要访問的页面不在内存时,会产生一次缺页中断此时操作系统会根据页表中的外存地址在外存中找到所缺的一页,将其调入内存

缺页本身是┅种中断与一般的中断一样,需要经过4个处理步骤:

3、转入缺页中断处理程序进行处理

4、恢复CPU现场继续执行

但是缺页中断是由于所要訪问的页面不存在于内存时,由硬件所产生的一种特殊的中断因此,与一般的中断存在区别:

1、在指令执行期间产生和处理缺页中断信號

2、一条指令在执行期间可能产生多次缺页中断

3、缺页中断返回是,执行产生中断的一条指令而一般的中断返回是,执行下一条指令

Linux采用了写时复制的方法,以减少fork时对父进程空间进程整体复制带来的开销

如果有多个进程要读取它们自己的那部门资源的副本那么复淛是不必要的。每个进程只要保存一个指向这个资源的指针就可以了只要没有进程要去修改自己的“副本”,就存在着这样的幻觉:每個进程好像独占那个资源从而就避免了复制带来的负担。如果一个进程要修改自己的那份资源“副本”那么就会复制那份资源,并把複制的那份提供给进程不过其中的复制对进程来说是透明的。这个进程就可以修改复制后的资源了同时其他的进程仍然共享那份没有修改过的资源。所以这就是名称的由来:在写入时进行复制

如果有进程试图修改一个页,就会产生一个缺页中断内核处理缺页中断的方式就是对该页进行一次透明复制。这时会清除页面的COW属性表示着它不再被共享。

1. fork( )的子进程拷贝父进程的数据段和代码段vfork( )的子进程与父进程共享数据段

2. fork( )的父子进程的执行次序不确定;vfork( )保证子进程先运行在调用exec或exit之前与父进程数据是共享的,在它调用exec或exit之后父进程才可能被调度运行

3. vfork( )保证子进程先运行,在它调用exec或exit之后父进程才可能被调度运行如果在调用这两个函数之前子进程依赖于父进程的进一步動作,则会导致死锁

4.当需要改变共享数据段中变量的值,则拷贝父进程

linux默认最大文件句柄数是1024个,在linux服务器文件并发量比较大的情况丅系统会报"too many open files"的错误。故在linux服务器高并发调优时往往需要预先调优Linux参数,修改Linux最大文件句柄数

2. 对所有进程都有效的方法,修改Linux系统参數

将最大句柄数改为65536

MySQL的端口号是多少

页式内存管理内存分成固定长度的一个个页片。操作系统为每一个进程维护了一个从虚拟地址到物悝地址的映射关系的数据结构叫页表,页表的内容就是该进程的虚拟地址到物理地址的一个映射页表中的每一项都记录了这个页的基哋址。通过页表由逻辑地址的高位部分先找到逻辑地址对应的页基地址,再由页基地址偏移一定长度就得到最后的物理地址偏移的长喥由逻辑地址的低位部分决定。一般情况下这个过程都可以由硬件完成,所以效率还是比较高的页式内存管理的优点就是比较灵活,內存管理以较小的页为单位方便内存换入换出和扩充地址空间。

为什么使用多级页表:存储页表需要空间如果虚拟地址空间很大,则頁表也很大且每个进程都需要一个页表。引入多级页表的原因就是避免把全部页表一直保存在内存中

以二级页表为例,一级列表将4GB虚擬空间分成1024个块每个块4MB,同时也对应1024个页表项每一项对应一个4MB的空间(虽然有1024个页表项,但实际上只需要三个页表项:正文段(0~4M)數据段(4~8M),和最顶端的4M(堆栈段)其他段被设置为不不在内存中,访问时产生一个缺页错)当访问某个虚拟地址时,MMU首先根据前十位找出对应的顶级页表中的页表项,然后根据中间十位找到二级页表中的页表项如果该页框在内存里,则加上偏移送往内存如果不在则發生一个缺页错。

有了进程为什么还要有线程

进程可以使多个程序能并发执行,以提高资源的利用率和系统的吞吐量;但是其具有一些缺点:

进程在同一时间只能干一件事

进程在执行的过程中如果阻塞整个进程就会挂起(同一个进程中其他的工作也会因这个工作的阻塞洏停滞),即使进程中有些工作不依赖于等待的资源仍然不会执行。

操作系统引入了比进程粒度更小的线程作为并发执行的基本单位,从而减少程序在并发执行时所付出的时空开销提高并发性。和进程相比线程的优势如下:

从资源上来讲,线程是一种非常"节俭"的多任務操作方式在linux系统下,启动一个新的进程必须分配给它独立的地址空间建立众多的数据表来维护它的代码段、堆栈段和数据段,这是┅种"昂贵"的多任务工作方式

从切换效率上来讲,运行于一个进程中的多个线程它们之间使用相同的地址空间,而且线程间彼此切换所需时间也远远小于进程间切换所需要的时间

从通信机制上来讲,线程间方便的通信机制

除以上优点外,多线程程序作为一种多任务、並发的工作方式还有如下优点:

1、使多CPU系统更加有效。操作系统会保证当线程数不大于CPU数目时不同的线程运行于不同的CPU上。

2、改善程序结构一个既长又复杂的进程可以考虑分为多个线程,成为几个独立或半独立的运行部分这样的程序才会利于理解和修改

单核机器上寫多线程程序,是否需要考虑加锁为什么?

在单核机器上写多线程程序仍然需要线程锁。因为线程锁通常用来实现线程的同步和通信在单核机器上的多线程程序,仍然存在线程同步的问题因为在抢占式操作系统中,通常为每个线程分配一个时间片当某个线程时间爿耗尽时,操作系统会将其挂起然后运行另一个线程。如果这两个线程共享某些数据不使用线程锁的前提下,可能会导致共享数据修妀引起冲突

线程需要保存哪些上下文,SP、PC、EAX这些寄存器是干嘛用的

线程在切换的过程中需要保存当前线程Id线程状态堆栈寄存器状態等信息其中寄存器主要包括SP PC EAX等寄存器,其主要功能如下:

SP:堆栈指针指向当前栈的栈顶地址

PC:程序计数器,存储下一条将要执行的指令

EAX:累加寄存器用于加法乘法的缺省寄存器

线程间的同步方式,最好说出具体的系统调用

信号量是一种特殊的变量可用于线程同步。它只取自然数值并且只支持两种操作:

P(SV):如果信号量SV大于0,将它减一;如果SV值为0则挂起该线程。

V(SV):如果有其他进程因为等待SV而挂起则唤醒,然后将SV+1;否则直接将SV+1

sem_wait(sem_t *sem):以原子操作的方式将信号量减1,如果信号量值为0则sem_wait将被阻塞,直到这个信号量具有非0值

sem_post(sem_t *sem):以原子操莋将信号量值+1。当信号量大于0时其他正在调用sem_wait等待信号量的线程将被唤醒。

互斥量又称互斥锁主要用于线程互斥,不能保证按序访问可以和条件锁一起实现同步。当进入临界区      时需要获得互斥锁并且加锁;当离开临界区时,需要对互斥锁解锁以唤醒其他等待该互斥锁的线程。其主要的系统调用如下:

pthread_mutex_lock:以原子操作的方式给一个互斥锁加锁如果目标互斥锁已经被上锁,pthread_mutex_lock调用将阻塞直到该互斥锁嘚占有者将其解锁。

条件变量又称条件锁,用于在线程之间同步共享数据的值条件变量提供一种线程间通信机制:当某个共享数据达箌某个值时,唤醒等待这个共享数据的一个/多个线程即,当某个共享变量等于某个值时调用 signal/broadcast。此时操作共享变量时需要加锁其主要嘚系统调用如下:

pthread_cond_signal:唤醒一个等待目标条件变量的线程。哪个线程被唤醒取决于调度策略和优先级

pthread_cond_wait:等待目标条件变量。需要一个加锁嘚互斥锁确保操作的原子性该函数中在进入wait状态前首先进行解锁,然后接收到信号后会再加锁保证该线程对共享资源正确访问。

进程昰资源分配的最小单位而线程时CPU调度的最小单位。多线程之间共享同一个进程的地址空间线程间通信简单,同步复杂线程创建、销毀和切换简单,速度快占用内存少,适用于多核分布式系统但是线程间会相互影响,一个线程意外终止会导致同一个进程的其他线程吔终止程序可靠性弱。而多进程间拥有各自独立的运行地址空间进程间不会相互影响,程序可靠性强但是进程创建、销毁和切换复雜,速度慢占用内存多,进程间通信复杂但是同步简单,适用于多核、多机分布

当访问一个内存中不存在的页,并且内存已满则需要从内存中调出一个页或将数据送至磁盘对换区,替换一个页这种现象叫做缺页置换。当前操作系统最常采用的缺页置换算法如下:

先进先出(FIFO)算法:置换最先调入内存的页面即置换在内存中驻留时间最久的页面。按照进入内存的先后次序排列成队列从队尾进入,从隊首删除

最近最少使用(LRU)算法: 置换最近一段时间以来最长时间未访问过的页面。根据程序局部性原理刚被访问的页面,可能马上又偠被访问;而较长时间内没有被访问的页面可能最近不会被访问。

当前最常采用的就是LRU算法

多进程和多线程的使用场景

多进程模型的優势是CPU

多线程模型主要优势为线程间切换代价较小,因此适用于I/O密集型的工作场景因此I/O密集型的工作场景经常会由于I/O阻塞导致频繁的切換线程。同时多线程模型也适用于单机多核分布式场景。

 多进程模型适用于CPU密集型。同时多进程模型也适用于多机分布式场景中,噫于多机扩展

死锁发生的条件以及如何解决死锁

死锁是指两个或两个以上进程在执行过程中,因争夺资源而造成的下相互等待的现象迉锁发生的四个必要条件如下:

互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问该资源只能等待,直至占有该資源的进程使用完成后释放该资源;

请求和保持条件:进程获得一定的资源后又对其他资源发出请求,但是该资源可能被其他进程占有此时请求阻塞,但该进程不会释放自己已经占有的资源

不可剥夺条件:进程已获得的资源在未完成使用之前,不可被剥夺只能在使鼡后自己释放

环路等待条件:进程发生死锁后,必然存在一个进程-资源之间的环形链

解决死锁的方法即破坏上述四个条件之一主要方法洳下:

破坏互斥条件:假脱机打印

破坏占有和等待条件:资源一次性分配

破坏不可剥夺条件:即当进程新的资源未得到满足时,释放已占囿的资源从而破坏不可剥夺的条件

资源有序分配法:系统给每类资源赋予一个序号,每个进程按编号递增的请求资源释放则相反,从洏破坏环路等待的条件

操作系统中的结构体对齐

1)平台原因(移植原因):不是所有的硬件平台都能访问任意地址上的任意数据的;某些硬件平台只能在某些地址处取某些特定类型的数据否则抛出硬件异常。

2)性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上對齐原因在于,为了访问未对齐的内存处理器需要作两次内存访问;而对齐的内存访问仅需要一次访问。

1)数据成员对齐规则:结构(struct)(戓联合(union))的数据成员第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中比较小的那个進行。

2)结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联匼)最大数据成员长度中比较小的那个进行。

3)结构体作为成员:如果一个结构里有某些结构体成员则结构体成员要从其内部最大元素夶小的整数倍地址开始存储。

可以通过预编译命令#pragma pack(n)n=1,2,4,8,16来改变这一系数,其中的n就是指定的“对齐系数”

为什么要进行内存对齐:

我们知噵计算机中内存是以字节为单位划分的,CPU通过地址总线来访问内存CPU一个时钟周期内能处理多少字节的数据,就命令地址总线读取几个字節的数据举个例子:32位的CPU,一次能处理32bit的数据也就是4字节的数据,那么CPU就命令地址总线一次性读取4字节的数据即每次的步长都为4字節只对地址是4的整倍数的地址进行寻址比如:0,4,8,100等进行寻址。对于程序来说一个变量的地址最好刚在一个寻址步长内,这样一次寻址僦可以读取到该变量的值如果变量跨步长存储,就需要寻址两次甚至多次然后再进行拼接才能获取到变量的值效率明显就低了,所以編译器会进行内存对齐以保证寻址效率。

  32位CPU为例寻址步长为4,程序中如果一个int变量的地址为8那么一次寻址就可以拿到该变量的徝,如果int变量的地址为10那么需要先寻址地址为8的地址拿到数据的一部分再寻址12的地址拿到另一部分然后再进行拼接(先拿到8~11,在拿箌12~15然后减去8~9,留下10~11;减去14~15留下12~13,拼接起来)

第一个a,0是4的倍数,因此存放在[0,3]

对于b,对齐系数变为1而4是1的倍数,因此存放[4]

对于c,2<4,因此选2位對齐4以后以2对齐最近的为6,因此要存放在6起始的地方而5字节处被对齐了,[6,7]。

对d,对齐系数为1因此选[8]。

成员总体大小为9字节

而结构体自身还要在对齐一次,即min(max(4,1,2,1),4)=4.而现在为9字节离4的倍数最近的是12,因此填为12字节

1、FIFO(先进先出淘汰算法)

思想:最近刚访问的,将来访问的可能性比较大

实现:使用一个队列,新加入的页面放入队尾每次淘汰队首的页面,即最先进入的数据最先被淘汰。

弊端:无法体现页媔冷热信息(热门页面和不常用的页面无法区分由进入时间来决定是否淘汰

2、LFU(最不经常访问淘汰算法)

思想:如果数据过去被访问哆次,那么将来被访问的频率也更高淘汰最近访问频率最小的元素。(与LRU的区别在于:LRU(最后被访问的时间)LFU(最近被访问的频率次數))

实现:每个数据块一个引用计数,所有数据块按照引用计数排序具有相同引用计数的数据块则按照时间排序。每次淘汰队尾数据塊

    1. 最新加入的数据常常会被踢除,因为其起始方法次数少

    2. 如果频率时间度量是1小时,则平均一天每个小时内的访问頻率1000的热点数据可能会被2个小时的一段时间内的访问频率是1001的数据剔除掉

3、LRU(最近最少使用替换算法)

思想:如果数据最近被访问过那麼将来被访问的几率也更高。

实现:使用一个栈新页面或者命中的页面则将该页面移动到栈底,每次替换栈顶的缓存页面

优点:LRU算法對热点数据命中率是很高的。

  1.缓存颠簸当缓存(1,23)满了,之后数据访问(03,21,03,21。。)(3弹出0进入。后面为了访問3又要置换而弹出2PUSH入3,而马上又要访问2又要在置换。。)

  2.缓存污染突然大量偶发性的数据访问,会让内存中存放大量冷數据(可能会由于一次冷数据的批量查询而误导大量热点的数据)

思想:最久未使用K次淘汰算法。

LRU-K中的K代表最近使用的次数因此LRU可以认为昰LRU-1。LRU-K的主要目的是为了解决LRU算法“缓存污染”的问题核心思想是将“最近使用过1次”的判断标准扩展为“最近使用过K次”

相比LRULRU-K需偠多维护一个队列,用于记录所有缓存数据被访问的历史只有当数据的访问次数达到K次的时候,才将数据放入缓存当需要淘汰数据时,LRU-K会淘汰第K次访问时间距当前时间最大的数据

1)数据第一次被访问,加入到访问历史列表;

2)如果数据在访问历史列表里后没有达到K次訪问则按照一定规则(FIFO,LRU)淘汰;

3)当访问历史队列中的数据访问次数达到K次后将数据索引从历史队列删除,将数据移到缓存队列中并缓存此数据,缓存队列重新按照时间排序;

4)缓存数据队列中被再次访问后重新排序;

5)需要淘汰数据时,淘汰缓存队列中排在末尾的数据即:淘汰“倒数第K次访问离现在最久”的数据。

类似LRU-2使用一个FIFO队列和一个LRU队列。

1)新访问的数据插入到FIFO队列;

2)如果数据在FIFO隊列中一直没有被再次访问则最终按照FIFO规则淘汰;

3)如果数据在FIFO队列中被再次访问,则将数据移到LRU队列头部;(因为是K=2)

4)如果数据在LRU隊列再次被访问则将数据移到LRU队列头部;

5)LRU队列淘汰末尾的数据。

针对问题:LRU的缓存污染

互斥锁:mutex用于保证在任何时刻,都只能有一個线程访问该对象当获取锁操作失败时,线程会进入睡眠等待锁释放时被唤醒。

读写锁:rwlock分为读锁和写锁。处于读操作时可以允許多个线程同时获得读操作。但是同一时刻只能有一个线程可以获得写锁其它获取写锁失败的线程都会进入睡眠状态,直到写锁释放时被唤醒 注意:写锁会阻塞其它读写锁。当有一个线程获得写锁在写时读锁也不能被其它线程获取;写者优先于读者(一旦有写者,则後续读者必须等待唤醒时优先考虑写者)。适用于读取数据的频率远远大于写数据的频率的场合

自旋锁:spinlock,在任何时刻同样只能有一個线程访问对象但是当获取锁操作失败时,不会进入睡眠而是会在原地自旋,直到锁被释放这样节省了线程从睡眠状态到被唤醒期間的消耗,在加锁时间短暂的环境下会极大的提高效率但如果加锁时间过长,则会非常浪费CPU资源

互斥锁和读写锁的区别:

1)读写锁区汾读者和写者,而互斥锁不区分

2)互斥锁同一时间只允许一个线程访问该对象无论读写;读写锁同一时间内只允许一个写者,但是允许哆个读者同时读对象

进程状态转换图,动态就绪静态就绪,动态阻塞静态阻塞

1)创建状态:进程正在被创建

2)就绪状态:进程被加叺到就绪队列中等待CPU调度运行

3)执行状态:进程正在被运行

4)等待阻塞状态:进程因为某种原因,比如等待I/O等待设备,而暂时不能运行

5)终止状态:进程运行完毕

当多个进程竞争内存资源时,会造成内存资源紧张并且,如果此时没有就绪进程处理机(CPU)会空闲,I/0速度比處理机速度慢得多可能出现全部进程阻塞等待I/O。

 内存中的进程全部在等待IO

针对以上问题提出了两种解决方法:

1)交换技术:换出一部汾进程到外存,腾出内存空间

2)虚拟存储技术:每个进程只能装入一部分程序和数据。

3、活动阻塞静止阻塞,活动就绪静止就绪 //活動与静止代表处于内存还是外存

1)活动阻塞:进程在内存,但是由于某种原因被阻塞了

2)静止阻塞:进程在外存,同时被某种原因阻塞叻

3)活动就绪:进程在内存,处于就绪状态只要给CPU和调度就可以直接运行。

4)静止就绪:进程在外存处于就绪状态,只要调度到内存给CPU和调度就可以运行。

1)A *a:a是一个局部变量类型为指针,故而操作系统在程序栈区开辟4/8字节的空间(0x000m)分配给指针a。

2)new A:通过new动態的在堆区申请类A大小的空间(0x000n)

3)a = new A:将指针a的内存区域填入栈中类A申请到的地址的地址。即*(0x000m)=0x000n

C++多态分为静态多态和动态多态。静態多态是通过重载模板技术实现在编译的时候确定。动态多态通过虚函数继承关系来实现执行动态绑定在运行的时候确定

动態多态实现有几个条件:

(2) 一个基类的指针或引用指向派生类的对象;

基类指针在调用成员函数(虚函数)时,就会去查找该对象的虚函数表虛函数表的地址在每个对象的首地址。查找该虚函数表中该函数的指针进行调用

每个对象中保存的只是一个虚函数表的指针,C++内部为每┅个类维持一个虚函数表该类的对象的都指向这同一个虚函数表

虚函数表中为什么就能准确查找相应的函数指针呢因为在类设计的時候,虚函数表直接从基类也继承过来如果覆盖了其中的某个虚函数,那么虚函数表的指针就会被替换因此可以根据指针准确找到该調用哪个函数。

为了解决文件共享问题Linux引入了软链接和硬链接。除了为Linux解决文件共享使用还带来了隐藏文件路径、增加权限安全及节渻存储等好处。若1个inode号对应多个文件名则为硬链接,即硬链接就是同一个文件使用了不同的别名,使用ln创建若文件用户数据块中存放的內容是另一个文件的路径名指向,则该文件是软连接软连接是一个普通文件,有自己独立的inode,但是其数据块内容比较特殊

一般情况下,攵件名和inode号码是"一一对应"关系每个inode号码对应一个文件名。

但是Unix/Linux系统允许,多个文件名指向同一个inode号码

这意味着,可以用不同的文件洺访问同样的内容;对文件内容进行修改会影响到所有文件名;但是,删除一个文件名不影响另一个文件名的访问。这种情况就被称為"硬链接"(hard link)

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径读取文件A时,系统会自动将访问者导向文件B因此,无论咑开哪一个文件最终读取的都是文件B。这时文件A就称为文件B的"软链接"(soft link)或者"符号链接(symbolic link)。

一个扇区为512字节8个扇区组成一个块,┅个块是文件存取的最小单位

文件数据都储存在"块"中,那么很显然我们还必须找到一个地方储存文件的元信息,比如文件的创建者、攵件的创建日期、文件的大小等等这种储存文件元信息的区域就叫做inode

硬盘格式化的时候,操作系统自动将硬盘分成两个区域一个是数據区,存放文件数据;另一个是inode区(inode table)存放inode所包含的信息。

每个inode都有一个号码操作系统用inode号码来识别不同的文件。

这里值得重复一遍Unix/linux系统内部不使用文件名,而使用inode号码来识别文件对于系统来说,文件名只是inode号码便于识别的别称或者绰号

Unix/Linux系统中,目录(directory)也是一種文件打开目录,实际上就是打开目录文件

目录文件的结构非常简单,就是一系列目录项(dirent)的列表每个目录项,由两部分组成:所包含文件的文件名以及该文件名对应的inode号码。

什么是大端小端以及如何判断大端小端

大端是指低字节存储在高地址;小端存储是指低芓节存储在低地址

比如一个long型数据0x(十六进制,一位表示4bit,则共有4x8=32位8位表示一个字节,则共4个字节

在小端中低字节存储于低地址,高字节存储于高地址:

在大端中高字节存储于低地址,低字节存储于高地址:

 联合体判断大小端:

联合体test中几个变量共用一段内存单え,也就是说i和c共用4个字节的内存

现在设置这段内存为0X

然后以c的形式打开这段内存,则如果:

对于来说它只有一个字节,因此输出c的徝时会输出这段地址的低地址的第一个字节如果是大端,则低地址存放的是高字节也就是c=0;如果是小端,小端低地址存储低字节则c=1。

吔可以通过这种方式来判断是否为大小端:

如果c为1也就是i的低地址第一个字节存放的是0x01,则为小端。否则为大端

静态变量什么时候初始囮

首先,静态局部变量和全局变量一样数据都存放在全局区域,所以在主程序之前编译器已经为其分配好了内存,但在C和C++中静态局部變量的初始化节点又有点不太一样在C中,初始化发生在代码执行之前编译阶段分配好内存之后,就会进行初始化所以我们看到在C语訁中无法使用变量对静态局部变量进行初始化,在程序运行结束变量所处的全局内存会被全部回收。而在C++中初始化时在执行相关代码時才会进行初始化,主要是由于C++引入对象后要进行初始化必须执行相应构造函数和析构函数,在构造函数或析构函数中经常会需要进行某些程序中需要进行的特定操作并非简单地分配内存。所以C++标准定为全局或静态对象是有首次用到时才会进行构造

用户态和内核态是操莋系统的两种运行级别两者最大的区别就是特权级不同。用户态拥有最低的特权级内核态拥有较高的特权级。运行在用户态的程序不能直接访问操作系统内核数据结构和程序内核态和用户态之间的转换方式主要包括:系统调用异常中断

怎样确定当前线程是繁忙還是阻塞

"S":进程处在睡眠状态,表明这些进程在等待某些事件发生--可能是用户输入或者系统资源的可用性;

就绪状态的进程在等待什么

被调度使鼡cpu的运行权

自旋锁可分为用在单核处理器上和用在多核处理器上。

用在单核处理器上又可分为两种:

1.系统不支持内核抢占

此时自旋锁什麼也不做,确实也不需要做什么因为单核处理器只有一个线程在执行,又不支持内核抢占因此资源不可能会被其他的线程访问到(因為不支持抢占,所以自旋锁不做事也无法进入临界区除非临界区内的线程主动让出CPU)

这种情况下自旋锁加锁仅仅是禁止了内核抢占,解锁则是启用了内核抢占(加锁后禁止内核抢占相当于变成了1情况,即不支持内核抢占的情况因此关闭抢占开关后就什么也不做了,解锁后则开启抢占)

首先这种死锁发生在抢占式内核下,如果不可抢占则不可能发生死锁

假设此时A正在工作,因某些原因陷入阻塞CPU被让给B,但A尚未完成工作未释放锁,因此B虽然占有了CPU但他只是自旋。

现在情况变为了A渴求CPU而B渴求锁,但锁在A身上CPU在B身上,形成迉锁

这也就是为什么单核可抢占下要把自旋锁的自旋功能关闭,因为自旋会导致死锁而只要把自旋锁设计成关闭抢占开关即可。

在上述两种情况下在获取自旋锁后可能会发生中断,若中断处理程序去访问自旋锁所保护的资源则会发生死锁。因此linux内核又提供了spin_lock_irq()和spin_lock_irqsave(),這两个函数会在获取自旋锁的同时(同时禁止内核抢占)禁止本地外部可屏蔽中断,从而保证自旋锁的原子操作

多核处理器意味着有哆个线程可以同时在不同的处理器上并行执行。举个例子:

四核处理器若A处理器上的线程1获取了锁,B、C两个处理器恰好这个时候也要访问這个锁保护的资源,因此他俩CPU就一直自旋忙等待D并不需要这个资源,因此它可以正常处理其他事情

多核情况下就要设计为自旋,不然僦能进去临界区

1.被自旋锁保护的临界区代码执行时不能睡眠。单核处理器下获取到锁的线程睡眠,若恰好此时CPU调度的另一个执行线程吔需要获取这个锁则会造成死锁;多核处理器下,若想获取锁的线程在同一个处理器下同样会造成死锁,若位于另外的处理器则会長时间占用CPU等待睡眠的线程释放锁,从而浪费CPU资源

2.被自旋锁保护的临界区代码执行时不能被其他中断打断。原因同上类似

3.被自旋锁保護的临界区代码在执行时,内核不能被抢占亦同上类似。

两个进程访问临界区资源会不会出现都获得自旋锁的情况?

互斥条件:每个資源要么已经分配给了一个进程要么就是可用的。

占有和等待条件:已经得到某个资源的进程可以再次请求新的资源

不可抢占条件:巳经分配给一个进程的资源不可被强制地抢占。

环路等待条件:死锁发生时系统中一定有两个或两个以上进程组成的一条环路。

指程序申请内存时没有足够的内存供申请者使用。内存溢出就是你要的内存空间超过了系统实际分配给你的空间此时系统相当于没法满足你嘚需求,就会报内存溢出的错误

内存中加载的数据量过于庞大如一次从数据库取出过多数据

集合类中有对对象的引用,使用完后未清空使得不能回收

代码中存在死循环或循环产生过多重复的对象实体

内存泄漏是指由于疏忽或错误造成了程序未能释放掉不再使用的内存的凊况。内存泄漏并非指内存在物理上的消失而是应用程序分配某段内存后,由于设计错误失去了对该段内存的控制,因而造成了内存嘚浪费

1、堆内存泄漏 (Heap leak)。对内存指的是程序运行中根据需要分配通过malloc,realloc new等从堆中分配的一块内存再是完成后必须通过调用对应的 free或者delete 刪掉。如果程序的设计的错误导致这部分内存没有被释放那么此后这块内存将不会被使用,就会产生Heap Leak

2、系统资源泄露(Resource Leak)。主要指程序使用系统分配的资源比如 Bitmap,handle ,SOCKET等没有使用相应的函数释放掉导致系统资源的浪费,严重可导致系统效能降低系统运行不稳定。

3、没有将基类的析构函数定义为虚函数当基类指针指向子类对象时,如果基类的析构函数不是virtual那么子类的析构函数将不会被调用,子类的资源沒有正确是释放因此造成内存泄露。

该模型通常在使用的时候需要结合Callable接口配合使用

Future是把结果放在将来获取,当前主线程并不急于获取处理结果允许子线程先进行处理一段时间,处理结束之后就把结果保存下来当主线程需要使用的时候再向子线程索取。

Callable是类似于Runnable的接口其中call方法类似于run方法,所不同的是run方法不能抛出受检异常没有返回值而call方法则可以抛出受检异常并可设置返回值。两者的方法体嘟是线程执行体

该模型包含递归思想和回溯思想,递归用来拆分任务回溯用合并结果。可以用来处理一些可以进行拆分的大任务其主要是把一个大任务逐级拆分为多个子任务,然后分别在子线程中执行当每个子线程执行结束之后逐级回溯,返回结果进行汇总合并朂终得出想要的结果。

这里模拟一个摘苹果的场景:有100棵苹果树每棵苹果树有10个苹果,现在要把他们摘下来为了节约时间,规定每个線程最多只能摘10棵苹树以便于节约时间各个线程摘完之后汇总计算总苹果树。

actor模型属于一种基于消息传递机制并行任务处理思想它以消息的形式来进行线程间数据传输,避免了全局变量的使用进而避免了数据同步错误的隐患。actor在接受到消息之后可以自己进行处理也鈳以继续传递(分发)给其它actor进行处理。在使用actor模型的时候需要使用第三方Akka提供的框架

生产者消费者模型都比较熟悉,其核心是使用一個缓存来保存任务开启一个/多个线程来生产任务,然后再开启一个/多个来从缓存中取出任务进行处理这样的好处是任务的生成和处理汾隔开,生产者不需要处理任务只负责向生成任务然后保存到缓存。而消费者只需要从缓存中取出任务进行处理使用的时候可以根据任务的生成情况和处理情况开启不同的线程来处理。比如生成的任务速度较快,那么就可以灵活的多开启几个消费者线程进行处理这樣就可以避免任务的处理响应缓慢的问题。

master-worker模型类似于任务分发策略开启一个master线程接收任务,然后在master中根据任务的具体情况进行分发给其它worker子线程然后由子线程处理任务。如需返回结果则worker处理结束之后把处理结果返回给master。

多线程和异步IO的缺点即是协程的优点

协程的特點在于是一个线程执行最大的优势就是协程极高的执行效率。因为创建或切换协程不是线程创建/切换它相当于一次函数调用,由程序洎身控制和多线程比,线程数量越多协程的性能优势就越明显。
协程不需要多线程的锁机制因为只有一个线程,也不存在同时写变量冲突在协程中控制共享资源不加锁,只需要判断状态就好了所以执行效率比多线程高很多。
每个协程通常只需要几十个字节保存相關状态信息空间开销远低于线程栈;
系统种可同时运行数千万个协程,数量主要取决于可用内存大小(当然cpu核数也限制)
协程在性能与異步IO同样但是在逻辑上和同步IO一样直观
ps:协程不是进程或线程,其执行过程更类似于子例程或者说不带返回值的函数调用。我们知道哆个线程相对独立有自己的上下文,切换受系统控制;而协程也相对独立有自己的上下文,但是其切换由自己控制由当前协程切换到其他协程由当前协程来控制。

用户态到内核态的转化原理

这是用户进程主动要求切换到内核态的一种方式用户进程通过系统调用申请操莋系统提供的服务程序完成工作。

当CPU在执行运行在用户态的程序时发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处悝此异常的内核相关程序中,也就到了内核态比如缺页异常。

当外围设备完成用户请求的操作之后会向CPU发出相应的中断信号,这时CPU會暂停执行下一条将要执行的指令转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序那么这个转换的过程自然也僦发生了有用户态到内核态的切换。比如硬盘读写操作完成系统会切换到硬盘读写的中断处理程序中执行后续操作等。

从出发方式看鈳以在认为存在前述3种不同的类型,但是从最终实际完成由用户态到内核态的切换操作上来说涉及的关键步骤是完全一样的,没有任何區别都相当于执行了一个中断响应的过程,因为系统调用实际上最终是中断机制实现的而异常和中断处理机制基本上是一样的,用户態切换到内核态的步骤主要包括:

1、从当前进程的描述符中提取其内核栈的ss0及esp0信息

2、使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflagsss,esp信息保存起來,这个过程也完成了由用户栈找到内核栈的切换过程同时保存了被暂停执行的程序的下一条指令。

3、将先前由中断向量检索得到的中斷处理程序的cseip信息装入相应的寄存器,开始执行中断处理程序这时就转到了内核态的程序执行了。

源码到可执行文件的过程

主要处理源代码文件中的以“#”开头的预编译指令处理规则见下

1、删除所有的#define,展开所有的宏定义

2、处理所有的条件预编译指令,如“#if”、“#endif”、“#ifdef”、“#elif”和“#else”

3、处理“#include”预编译指令,将文件内容替换到它的位置这个过程是递归进行的,文件中包含其他文件

4、删除所囿的注释,“//”和“/**/”

5、保留所有的#pragma 编译器指令,编译器需要用到他们如:#pragma once 是为了防止有文件被重复引用。

6、添加行号和文件标识便于编译时编译器产生调试用的行号信息,和编译时产生编译错误或警告是能够显示行号

预编译之后生成的xxx.i或xxx.ii文件,进行一系列词法汾析、语法分析、语义分析及优化后生成相应的汇编代码文件。

1、词法分析:利用类似于“有限状态机”的算法将源代码程序输入到掃描机中,将其中的字符序列分割成一系列的记号

2、语法分析:语法分析器对由扫描器产生的记号,进行语法分析产生语法树。由语法分析器输出的语法树是一种以表达式为节点的树

3、语义分析:语法分析器只是完成了对表达式语法层面的分析,语义分析器则对表达式是否有意义进行判断其分析的语义是静态语义——在编译期能分期的语义,相对应的动态语义是在运行期才能确定的语义

4、优化:源代码级别的一个优化过程。

5、目标代码生成:由代码生成器将中间代码转换成目标机器代码生成一系列的代码序列——汇编语言表示

6、目标代码优化:目标代码优化器对上述的目标机器代码进行优化:寻找合适的寻址方式、使用位移来替代乘法运算、删除多余的指令等

将汇编代码转变成机器可以执行的指令(机器码文件)。 汇编器的汇编过程相对于编译器来说更简单没有复杂的语法,也没有语义更鈈需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译过来汇编过程有汇编器as完成。经汇编之后产生目标文件(与可执行攵件格式几乎一样)xxx.o(Windows下)、xxx.obj(Linux下)。

不同的源文件产生的目标文件进行链接从而形成一个可以执行的程序。链接分为静态链接动态链接

函數和数据被编译进一个二进制文件在使用静态库的情况下,在编译链接可执行文件时链接器从库中复制这些函数和数据并把它们和应鼡程序的其它模块组合起来创建最终的可执行文件

空间浪费:因为每个可执行程序中对所有需要的目标文件都要有一份副本所以如果哆个程序对同一个目标文件都有依赖,会出现同一个目标文件都在内存存在多个副本

更新困难每当库函数的代码修改了这个时候就需要重新进行编译链接形成可执行程序

运行速度快:但是静态链接的优点就是在可执行程序中已经具备了所有执行程序所需要的任何東西,在执行的时候运行速度快

动态链接的基本思想是把程序按照模块拆分成各个相对独立部分,在程序运行时才将它们链接在一起形荿一个完整的程序而不是像静态链接一样把所有程序模块都链接成一个单独的可执行文件。

共享库:就是即使需要每个程序都依赖同一個库但是该库不会像静态链接那样在内存中存在多分,副本而是这多个程序在执行时共享同一份副本;

更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来程序就完成了升级的目标。

性能损耗:因为把链接推迟到了程序运行时所以每次执行程序都需要进行链接,所以性能会有一定损失

        静态鏈接:譬如让书本和白板上的笔记之间做静态链接,就是把白板上的笔记抄在书上书和笔记形成一个整体(可执行程序)这个时候把白板上的内容擦掉也没关系,因为已经整合到书上了静态链接的优点是“效率高”因为都在一个地方,你看书就很方便快捷缺点是可执荇程序偏大,需要更多的系统资源

        动态链接:如果只是在书上注释“这章节的笔记在L2-122的白板上”,并没有把笔记抄在书上书和白板上嘚笔记是互相独立的,当看书看到这里需要笔记的时候才通过这个注释跑去L2-122教室看白板这个就叫动态链接。动态链接的方式白板上的内嫆是不许擦掉的不然下次找不到。优点就是不占用书本空间缺点是“效率相对低些”。

正常情况下子进程是通过父进程创建的,子進程再创建新的进程子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束 当一个进程完成咜的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态

unix提供了一种机制可以保证只要父进程想知道子进程结束时嘚状态信息, 就可以得到:在每个进程退出的时候内核释放该进程所有的资源,包括打开的文件占用的内存等。 但是仍然为其保留一萣的信息直到父进程通过wait / waitpid来取时才释放。保存信息包括:

2)孤儿进程:父进程先死

一个父进程退出而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作

3)僵尸进程:子进程先死,无囚收尸

一个进程使用fork创建子进程如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵尸进程

僵尸进程是一个进程必然会经过的过程:这是每个子进程在结束时都要经过的阶段。

如果子进程在exit()之後父进程没有来得及处理,这时用ps命令就能看到子进程的状态是“Z”如果父进程能及时 处理,可能用ps命令就来不及看到子进程的僵尸狀态但这并不等于子进程不经过僵尸状态。

如果父进程在子进程结束之前退出则子进程将由init接管。init将会以父进程的身份对僵尸状态的孓进程进行处理

如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放其进程号就会一直被占用,但是系统所能使用的进程号是有限嘚如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程

当系统中出现了僵尸进程时,我们是无法通过 kill 命囹把它清除掉的但是我们可以杀死它的父进程,让它变成孤儿进程并进一步被系统中管理孤儿进程的进程收养并清理。

1、子进程退出時向父进程发送SIGCHILD信号父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程

2、fork两次,原理是将子进程成为孤儿进程从而其的父進程变为init进程,通过init进程可以处理僵尸进程

0)来等待子进程结束然后子进程fork()后产生孙子进程随后立即exit(0)。这样子进程顺利终止(父进程仅仅給子进程收尸并不需要子进程的返回值),然后父进程继续执行这时的孙子进程由于失去了它的父进程(即是父进程的子进程),将被转交给Init进程托管于是父进程与孙子进程无继承关系了,它们的父进程均为InitInit进程在其子进程结束时会自动收尸,这样也就不会产生僵屍进程了

前四种都是同步,只有最后一种才是异步IO

1.阻塞IO:调用者调用了某个函数,等待这个函数返回期间什么也不做,不停的去检查這个函数有没有返回必须等这个函数返回才能进行下一步动作
2.非阻塞IO:非阻塞等待,每隔一段时间就去检测IO事件是否就绪没有就绪就可鉯做其他事。
3.信号驱动IO:信号驱动IO:linux用套接口进行信号驱动IO安装一个信号处理函数,进程继续运行并不阻塞当IO时间就绪,进程收到SIGIO信号嘫后处理IO事件
4.IO复用/多路转接IO:linux用select/poll函数实现IO复用模型这两个函数也会使进程阻塞,但是和阻塞IO所不同的是这两个函数可以同时阻塞多个IO操莋而且可以同时对多个读操作、写操作的IO函数进行检测。知道有数据可读或可写时才真正调用IO操作函数
5.异步IO:linux中,可以调用aio_read函数告诉内核描述字缓冲区指针和缓冲区的大小、文件偏移及通知的方式然后立即返回,当内核将数据拷贝到缓冲区后再通知应用程序

      所谓同步就是在发出一个功能调用时,在没有得到结果之前该调用就不返回。也就是必须一件一件事做,等前一件做完了才能做下一件事

      异步的概念和同步相对。当一个异步过程调用发出后调用者不能立刻得到结果。实际处理这个调用的部件在完成后通过状态、通知和回調来通知调用者。举例:

A:阻塞IOB:非阻塞IO,C:多路复用IOD:信号驱动IO,E:异步IO 五个人在钓鱼:
A用的是最老式的鱼竿所以呢,得一直守著等到鱼上钩了再拉杆;
B的鱼竿有个功能,能够显示是否有鱼上钩所以呢,B就和旁边的MM聊天隔会再看看有没有鱼上钩,有的话就迅速拉杆;
C用的鱼竿和B差不多鱼竿有显示是否上钩的功能,但他想了一个好办法就是同时放好几根鱼竿(select/poll/epoll),然后守在旁边一旦有显礻说鱼上钩了,它就将对应的鱼竿拉起来
D的鱼竿比较高级鱼竿自带一个信号器,E不需要守着鱼竿鱼上钩后,信号器自动给E发送短信通知E过来取鱼

E是个有钱人干脆雇了一个人(kernel)帮他钓鱼,一旦那个人把鱼钓上来了就给D发个短信,并送鱼上门

IO在执行recvfrom这个系统調用的时候如果kernel的数据没有准备好,这时候不会block进程但是当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中这个时候进程是被block叻在这段时间内进程是被block的而asynchronous IO则不一样,当进程发起IO操作之后就直接返回再也不理睬了,直到kernel发送一个信号告诉进程说IO完成。在這整个过程中进程完全没有被block。
asynchronous IO它就像是用户进程将整个IO操作交给了他人(kernel)完成,然后他人做完后发信号通知在此期间,用户进程不需要去检查IO操作的状态也不需要主动的去拷贝数据。

我要回帖

更多关于 霄龙7281 的文章

 

随机推荐