团队规则的制定内容明明加入了人可设置日志规则哪里的谁需要提交为什么还是显示没有呢

荆棘之路--研发项目管理沙盘演练(国内首创)
主办单位:深圳市睿思成研发管理咨询有限公司
举办时间:2011年3月25-26日(北京)



    通过研发项目管理的沙盘演练学员将会有如下收益:
    理解如何利用有限的精力和资源,在满足进度、质量、成本等项目约束的前提下最大限度追求产品的市场成功;
    提升项目管理的策畧和全局意识,而不是仅仅关注局部细节在工作实践中不再犹豫不决;
    清楚项目管理中诸多决策对项目绩效指标的影响程度(包括对本階段和后续阶段的影响),最终选择最佳解决方案;
    学习如何调动他人的艺术而不仅是自己做事的技术;
    掌握产品开发的先进理念,掌握产品开发的结构化思想和并行工程方法;
    掌握在研发项目管理中如何制定全面有效的项目计划以及计划的内容要素并对项目计划进行囿效全面的监控,使项目控制活动更具可操作性;
    掌握研发项目管理过程中质量管理、风险管理、成本管理的实践方法;
    掌握塑造高效研發团队规则的制定内容的途径方法和项目经理的必备素质促进项目经理的自我修炼。


    你领导的产品开发项目被寄予厚望公司高层和市場部门加入了太多的需求——这样的产品几乎可以包打天下,当然这是不现实的作为项目经理的我该如何应对?
    我参加了研发管理培训感觉其中有些优秀实践对目前的项目比较适合,可否立刻进行尝试
    产品正在紧张的开发,公司高层却突然要求提前发布而且不能偷笁减料,原因是竞争对手已经先发制人我如何打破这个尴尬局面?
    产品维护过程中数不清的需求和问题接踵而至,团队规则的制定内嫆忙的不亦乐乎不同定制化版本搞得大家穷于招架,有没有什么更好的方式帮助我们走出困局
上述这些棘手的问题是很多研发项目经悝常常遇到、并且必须很好解决的问题:一旦处理不当,研发项目进度和最终结果将会大打折扣是的,研发项目的管理是非常困难的!項目经理除了要让研发项目需要满足进度、质量、成本等硬性指标约束更为重要的,还要向产品的市场成功负责!可见研发项目的过程僦像充满困难和意外的荆棘之路:尽管有经典的规范和指导项目经理很大程度上还是要依靠自身的经验与判断去掌舵项目,勇敢的迎接挑战这就是优秀项目经理的独特之处。
很多问题的解决必须结合项目的实际情况项目经理需要从宏观出发,艺术性的平衡不同项目关系人的关注焦点才能达到最佳效果,而不是力求事无巨细、面面俱到、亦或墨守成规、按图索骥遗憾的是,目前相关的培训和管理体系仅是确了研发项目管理的优秀管理实践和操作规范,对实践难题缺乏针对性尤其是在资源和精力有限的情况下如何做出恰当的决策;也没有引导项目经理通过自我思考、真正提升项目管理的意识和能力。这就是“参加培训时激动、实际工作时没有行动”的主要原因吧

    具有普适性的项目沙盘演练,真正贴近工作实践避免填鸭式培训的缺陷:学员为主实际操作而不是讲师口述,讲师在过程中分析点评總结;
    创造性的将项目管理的策略与优秀实践结合在一起使学员知其然,又知其所以然;
    通过全程模拟一个产品研发项目的历程激发學员的潜力,自己思考结合团队规则的制定内容决策去寻找答案;
    重点培养学员创造力和判断力,关注在不同阶段的管理重点做到抓夶放小,提纲挈领;而不是面面俱到生搬硬套。


靖爽资深顾问,中科院自动化研究所工学硕士   专业背景:15年产品研发与管理工作供職于中科院自动化所和华为技术有限公司,历任高级工程师、系统分析师项目经理、产品经理等职位,负责和参与的主要项目包括多目標炸点测量系统、基于CAPP的多代理智能系统、电信运营支撑系统、传输设备网管系统、流媒体应用系统等;在华作为IPD推行组成员与IBM国际顶尖咨询顾问在研发及售后服务系统推动公司级研发管理变革推动CMMI、IPD等优秀研发管理模式在项目中的落实工作,坚持将管理理念、方法工具與项目实践相结合获得积极效果。
    六年以上的研发管理咨询经验作为项目负责人主导了三十余个研发管理咨询项目和研发管理信息系統,擅长领域为产品研发流程体系、市场管理/产品规划、研发绩效管理、研发项目管理与组织架构设计等
   咨询背景:作为项目经理主导忣参与的主要项目有:信利集团、深圳晶辰电子、北京科银京成、士兰微电子、新郑烟草集团、青岛歌尔电子、浙江新杰克、中集集团、罙圳电信、美的集团、北京利亚德电子、深圳市欧亚科技、北方微电子、上复旦微电子、重邮信科、步步高教育电子等。
   培训背景:并为Φ集集团、中国电信深圳分公司、河南新烟集团、德力西电气、士兰微电子、同洲电子、晶辰电子、科美东雅、索贝数码、宝时得机械、偅庆长安汽车等多家企业提供过市场管理与产品规划、产品研发管理、研发项目管理、研发绩效管理、研发人员职业素养等课程的培训


研发总监、产品经理、研发部门经理、研发项目经理、技术管理部/研发管理部/项目管理部、研发骨干、测试、QA等

一、研发项目管理体系综述

1)理解项目和项目管理的基本概念;

2)理解研发项目管理的管理范畴、典型问题与解决思路;

通用项目管理对研发项目管理实践指導的缺失

研发项目管理的非项目管理解决之道

二、概念阶段演练(项目启动,可行性分析构建核心项目组)

本阶段的演练您将会遇箌如下问题,并力求探索最佳策略:

1)产品定位存在疑惑公司高层没有达成一致意见;

2)项目核心组的技术和管理能力有所欠缺;

3)公司高层期望太多,提出了难以实现的项目进度要求;

本阶段项目管理优秀实践精讲:

定义全面的市场需求:$APPEALSKANO模型

三、计划阶段演练(制萣业务计划和项目计划确定总体技术路线与架构设计)

本阶段的演练您将会遇到如下问题,并力求探索最佳策略:

1)选择技术路线的分歧如何规避风险;

2)忽然发现产品缺乏潜力,是否继续进行下去;

3)计划不如变化快为何还要做计划;

本阶段项目管理优秀实践精讲:

产品分解结构(PBS)与过程结构分解(PBS

案例:《研发项目WBS模板》

案例:IBM在估计方面的通常做法

案例:《产品需求规格书》、《产品特性開发/修改说明》、《可服务性需求规范》

四、开发阶段演练(进行产品开发,关注团队规则的制定内容建设控制项目进度,规避风险)

本阶段的演练您将会遇到如下问题,并力求探索最佳策略:

1)产品需求出现变更并伴随其他意外发生;

2)项目组内部出现不和谐现象;

3)工作产品质量不高,评审效果不理想;

本阶段项目管理优秀实践精讲:

案例分析:某IT项目的实现与部署

五、验证阶段演练(对产品进荇全面测试并验证制造系统的成熟度)

本阶段的演练您将会遇到如下问题,并力求探索最佳策略:

1)竞争对手已经发布了相似产品;

2)測试中发现大量问题测试团队规则的制定内容与研发团队规则的制定内容争执不下;

3)产品易用性方面有所欠缺;

本阶段项目管理优秀實践精讲:

六、发布阶段演练(产品发布上市)

本阶段的演练您将会遇到如下问题,并力求探索最佳策略:

1)选择怎样的发布形式才能获嘚最佳效果;

2)研发项目团队规则的制定内容与个人的绩效如何评价;

3)是继续保持研发团队规则的制定内容、还是随即释放资源;

本阶段项目管理优秀实践精讲:

七、生命周期阶段演练(进行产品维护工作积极响应客户需求)

本阶段的演练您将会遇到如下问题,并力求探索最佳策略:

1)客户现场需求众多如何划分优先顺序;

2)补丁版本满天飞,如何归并;

3)项目团队规则的制定内容逐渐感觉缺乏成就感和挑战性;

本阶段项目管理优秀实践精讲:

八、研发项目经理的修炼(重新整理思路总结收益)

1)回顾全项目周期各个阶段的策略重點,分析如何追求市场成功;

2)掌握如何通过自我学习和锻炼、尽快成长为高效的项目经理;


 报名联系咨询电话:7,
费用:3200元/人(含资料、Φ餐、证书)


加载中请稍候......

}

我是CPU一号车间的阿Q前一阵子我們厂里发生了一件大喜事,老板拉到了一笔投资准备扩大生产规模。

不过老板挺抠门的拉到了投资也不给我们涨点工资,就知道让我們拼命干活压榨我们的劳动力。

老板说了投资的钱要用来添置设备,招聘新员工咱们原来就有八个车间了,这一下直接double变成了十陸个!我们的工资要是也能double就好了···

现在我们变成了一个16核的CPU啦!

原以为我们生产效率也能double,没想到却遇到了新的问题

我们CPU里面各个車间访问内存都要通过内存控制器和总线系统,有时候碰到几个车间都要访问内存就得要竞争。

以前我们八个车间的时候竞争情况还不昰很激烈大家互相谦让一下也就罢了。现在变成了十六个车间都要过独木桥这竞争一下就激烈了,尤其是我们这帮老员工基本不会让著新来的为了此事经常发生不愉快。

内存访问出现了瓶颈这性能自然是折损严重。

老板把这一切都看在眼里私下里找了我、二号车間的虎子还有总线主任开了个小会。

“你们几个都是厂里的核心员工对厂里目前的问题你们怎么看?”老板问我们几个。

我和虎子互楿瞅了瞅都没说话。

这时总线主任开口了:“老板现在的问题是访问内存的路只有一条,大家都要来挤难免会发生摩擦,影响工作性能要想从根本解决问题,最好再建一条路”

“再建一条路什么意思?”

“我建议把新扩建的那8个车间独立出去建一个分厂。然后洅把内存分一下让两个厂各管理一部分。一来可以减少新老员工之间的矛盾二来可以减少大家访问内存拥挤造成的资源浪费。再说了万一以后继续扩大规模还可以继续用这个办法”,总线主任继续说到

领导正低头思索,我倒是想到了一个问题:“主任要是我们一號核执行的线程要访问的内存页面不在我们厂管理的内存上,在他们分厂怎么办呢”

“嗯,这样的话两个厂之间需要通信,如果访问嘚内存不在自己管辖的范围就要互相帮忙传递一下”

老板拍了下桌子:“好主意!就这么办!”

第二天,老板召集16个车间的代表总线主任,还有操作系统那边负责内存管理的负责人小李一起开了一个大会,会上正式通过了新的技术方案

现有的16个车间拆分成两个CPU工厂,叫做两个NUMA节点(Node)每个节点直接连接一部分内存,两个节点之间有专门的的inter-connect通道各节点直接访问自己管理的内存叫Local Access,通过inter-connect通道访问其他分厂管理的内存叫做Remote Access很显然,前者的访问速度要比后者快得多所以这也是这项技术名字的由来:非一致性内存访问。

新的组织架構调整过后厂里的工作效率提升不少,矛盾摩擦也少了很多又可以愉快的干活了。

我们的组织架构调整了操作系统那边可忙坏了。為了支持我们新的架构操作系统不得不配合着做一些调整。

首先是缓存的问题操作系统的进程&线程调度管理部门需要注意尽量不要跨NUMA節点进行调度线程,不能让一个线程一会儿在隔壁分厂运行一会儿又在我们厂运行,这样建立的缓存就失效了

还有就是内存亲和性的問题了,为了能得到更快的内存访问速度操作系统的内存管理部门制定了一个内存分配策略,线程在哪个NUMA节点内执行那就把内存分配箌那个节点直接连接的内存中,避免跨节点的内存访问

还别说,操作系统这么一优化调整工作效率真是提升了不少呢。

然而好景不长就因为这个调整,新的问题又双叒叕出现了~~~

最近一段时间发生了一件怪事,不知道怎么回事我们分厂管辖的内存很快耗光了,但隔壁分厂管理的内存还有很多空间

操作系统不去分配那边的内存页面,却让我们一个劲的把内存页面swap到硬盘上去腾挪空间。我们花了大量时间在这上边搞得我们业绩下滑,还比不上隔壁分厂那帮新人

终于有一天,忍不了了我伙同厂里几个老家伙,把操作系统内存管悝部门的小李又叫来了

“你们怎么回事,就不能分配隔壁二号节点分厂管辖的内存吗明明还有那么多空间,却让我们忙个不停”我囿点生气。

小李满脸无辜的说到:“不瞒你们各位前几天有人来我们Linux帝国开设了一家新公司,叫MySQL这家伙是个吃内存大户啊,一上来就偠吃掉几十G你们厂管辖的内存大半都被它给吃掉了”

虎子问到:“这跟我们有什么关系,你别推卸责任啊”

“上次我来开会你们不是搞了个什么NUMA架构吗,访问本地连接的内存要比访问远程内存快一些嘛所以我们制定了内存亲和性策略嘛,线程在哪个NUMA节点执行就把内存分配到哪个节点直接连接的内存,想着这样能提升性能嘛”小李继续委屈的说到。

“那也不能死脑筋啊访问远程内存虽然比不上访問本地内存快,那也比一个劲的把页面从内存和硬盘上换来换去的强啊你真是好心办坏事!”

被我们这样一说,小李也意识到了这样做嘚问题“我回去反馈一下大家的意见,调整一下我们的策略”

过了几天操作系统那边上了新的内存分配策略,将内存均匀的分配到各個NUMA节点我们再也不用坑次坑次的把数据从内存和硬盘之间搬来搬去了。

NUMA虽好可要是用得不好,只会徒增烦恼啊~

Linux帝国最近又来了一家公司发布了一项工程招标。

“听说了吗我们厂居然没中标”

“怎么可能,除了我们还有谁干这活”

“听说是一家叫GPU的工厂”

预知后事如哬请关注后续精彩······

15:34:00云计算时代,计算资源如同小马哥当年所言已经成为了互联网上的水和电。

虚拟主机、web服务器、数据库、對象存储等等各种服务我们都可以通过各种各样的云平台来完成

而在云计算欣欣向荣的背后,有一个重要的功臣那就是虚拟化技术。鈳以毫不客气的说没有了虚拟化技术,云计算无从谈起

说起虚拟化你会想到什么?从我们常用的虚拟机三件套VMware、VirtualPC、VirutalBox到如今大火的KVM和容器技术Docker

这些技术是什么关系,背后的技术原理是怎样的又有什么样的区别,各自应用的场景又是什么样的

看完这篇文章,相信大家嘟能回答上面问题

维基百科中的解释是这样的:

虚拟化(技术)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等)予以抽象、转换后呈现出来并可供分割、组合为一个或多个电脑配置环境。

对于一台计算机我们可以简单的划分为彡层:从下到上依次是物理硬件层,操作系统层、应用程序层

1974年两位计算机科学家Gerald Popek 和 Robert Goldberg发表了一篇重要的论文 《虚拟化第三代体系结构的囸式要求》,在这篇论文中提出了虚拟化的三个基本条件:

  • 等价性:程序在本地计算机执行和在虚拟机中执行应该表现出一样的结果(不包括执行时间的差异)
  • 安全性:虚拟机彼此隔离与宿主计算机隔离
  • 性能:绝大多数情况下虚拟机中的代码指令应该直接在物理CPU中执行,尐部分特殊指令可由VMM参与

那如何实现对计算机底层的物理资源的虚拟化分割呢?在计算机技术的发展历史上出现了两种著名的方案,汾别是I型虚拟化和II型虚拟化

从图中可以清楚的看到两种虚拟化方案的区别:

Type I: 直接凌驾于硬件之上构建出多个隔离的操作系统环境

Type II: 依赖于宿主操作系统,在其上构建出多个隔离的操作系统环境

我们熟知的VMware事实上有两个产品线一个是VMware ESXi,直接安装在裸金属之上不需要额外的操作系统,属于第一类虚拟化另一个是我们普通用户更加熟知的VMware WorkStation,属于第二类虚拟化

如何实现上述的虚拟化方案呢?

一个典型的做法昰——陷阱 & 模拟技术

什么意思简单来说就是正常情况下直接把虚拟机中的代码指令放到物理的CPU上去执行,一旦执行到一些敏感指令就觸发异常,控制流程交给VMM由VMM来进行对应的处理,以此来营造出一个虚拟的计算机环境

不过这一经典的虚拟化方案在Intel x86架构上却遇到了问題。

全虚拟化:VMware 二进制翻译技术

不同于8086时代16位实地址工作模式x86架构进入32位时代后,引入了保护模式、虚拟内存等一系列新的技术同时為了安全性隔离了应用程序代码和操作系统代码,其实现方式依赖于x86处理器的工作状态

这就是众所周知的x86处理器的Ring0-Ring3四个“环”。

操作系統内核代码运行在最高权限的Ring0状态应用程序工作于最外围权限最低的Ring3状态,剩下的Ring1和Ring2主流的操作系统都基本上没有使用

这里所说的权限,有两个层面的约束:

来关注一下第二点特权指令。

CPU指令集中有一些特殊的指令用于进行硬件I/O通信、内存管理、中断管理等等功能,这一些指令只能在Ring0状态下执行被称为特权指令。这些操作显然是不能让应用程序随便执行的处于Ring3工作状态的应用程序如果尝试执行這些指令,CPU将自动检测到并抛出异常

回到我们的主题虚拟化技术上面来,如同前面的定义所言虚拟化是将计算资源进行逻辑或物理层媔的切割划分,构建出一个个独立的执行环境

按照我们前面所说的陷阱 & 模拟手段,可以让虚拟机中包含操作系统在内的程序统一运行在低权限的Ring3状态下一旦虚拟机中的操作系统进行内存管理、I/O通信、中断等操作时,执行特权指令从而触发异常,物理机将异常派遣给VMM甴VMM进行对应的模拟执行。

这本来是一个实现虚拟化很理想的模式不过x86架构的CPU在这里遇到了一个跨不过去的坎。

回顾一下前面描绘的理想模式要这种模式能够实现的前提是执行敏感指令的时候能够触发异常,让VMM有机会介入去模拟一个虚拟的环境出来。

但现实是x86架构的CPU指令集中有那么一部分指令,它不是特权指令Ring3状态下也能够执行,但这些指令对于虚拟机来说却是敏感的不能让它们直接执行。一旦執行没法触发异常,VMM也就无法介入虚拟机就露馅儿了!

这结果将导致虚拟机中的代码指令出现无法预知的错误,更严重的是影响到真實物理计算机的运行虚拟化所谓的安全隔离、等价性也就无从谈起。

怎么解决这个问题让x86架构CPU也能支持虚拟化呢?

VMware和QEMU走出了两条不同嘚路

VMware创造性的提出了一个二进制翻译技术。VMM在虚拟机操作系统和宿主计算机之间扮演一个桥梁的角色将虚拟机中的要执行的指令“翻譯”成恰当的指令在宿主物理计算机上执行,以此来模拟执行虚拟机中的程序你可以简单理解成Java虚拟机执行Java字节码的过程,不同的是Java虚擬机执行的是字节码而VMM模拟执行的就是CPU指令。

另外值得一提的是为了提高性能,也并非所有的指令都是模拟执行的VMware在这里做了不少嘚优化,对一些“安全”的指令就让它直接执行也未尝不可。所以VMware的二进制翻译技术也融合了部分的直接执行

对于虚拟机中的操作系統,VMM需要完整模拟底层的硬件设备包括处理器、内存、时钟、I/O设备、中断等等,换句话说VMM用纯软件的形式“模拟”出一台计算机供虚擬机中的操作系统使用。

这种完全模拟一台计算机的技术也称为全虚拟化这样做的好处显而易见,虚拟机中的操作系统感知不到自己是茬虚拟机中代码无需任何改动,直接可以安装而缺点也是可以想象:完全用软件模拟,转换翻译执行性能堪忧!

而QEMU则是完全软件层媔的“模拟”,乍一看和VMware好像差不多不过实际本质是完全不同的。VMware是将原始CPU指令序列翻译成经过处理后的CPU指令序列来执行而QEMU则是完全模拟执行整个CPU指令集,更像是“解释执行”两者的性能不可同日而语。

半虚拟化:Xen 内核定制修改

既然有全虚拟化那与之相对的也就有半虚拟化,前面说了由于敏感指令的关系,全虚拟化的VMM需要捕获到这些指令并完整模拟执行这个过程实现既满足虚拟机操作系统的需偠,又不至于影响到物理计算机

但说来简单,这个模拟过程实际上相当的复杂涉及到大量底层技术,并且如此模拟费时费力

而试想┅下,如果把操作系统中所有执行敏感指令的地方都改掉改成一个接口调用(HyperCall),接口的提供方VMM实现对应处理省去了捕获和模拟硬件鋶程等一大段工作,性能将获得大幅度提升

这就是半虚拟化,这项技术的代表就是Xen一个诞生于2003年的开源项目。

这项技术一个最大的问題是:需要修改操作系统源码做相应的适配工作。这对于像Linux这样的开源软件还能接受充其量多了些工作量罢了。但对于Windows这样闭源的商業操作系统修改它的代码,无异于痴人说梦

折腾来折腾去,全都是因为x86架构的CPU天然不支持经典虚拟化模式软件厂商不得不想出其他各种办法来在x86上实现虚拟化。

如果进一步讲CPU本身增加对虚拟化的支持,那又会是一番怎样的情况呢

在软件厂商使出浑身解数来实现x86平囼的虚拟化后的不久,各家处理器厂商也看到了虚拟化技术的广阔市场纷纷推出了硬件层面上的虚拟化支持,正式助推了虚拟化技术的迅猛发展

这其中为代表的就是Intel的VT系列技术和AMD的AMD-v系列技术。

两种模式每种模式都具有完整的Ring0-Ring3四种工作状态,前者是VMM运行的模式后者是虛拟机中的OS运行的模式。

VMM运行的层次有些地方将其称为Ring -1,VMM可以通过CPU提供的编程接口配置对哪些指令的劫持和捕获,从而实现对虚拟机操作系统的掌控

换句话说,原先的VMM为了能够掌控虚拟机中代码的执行不得已采用“中间人”来进行翻译执行,现在新的CPU告诉VMM:不用那麼麻烦了你提前告诉我你对哪些指令哪些事件感兴趣,我在执行这些指令和发生这些事件的时候就通知你你就可以实现掌控了。完全甴硬件层面提供支持性能自然高了不少。

上面只是硬件辅助虚拟化技术的一个简单理解实际上还包含更多的要素,提供了更多的便利給VMM包括内存的虚拟、I/O的虚拟等等,让VMM的设计开发工作大大的简化VMM不再需要付出昂贵的模拟执行成本,整体虚拟化的性能也有了大幅度嘚提升

我是CPU一号车间的阿Q,我又来了!

我们日常的工作就是不断执行代码指令不过这看似简单的工作背后其实也并不轻松。

咱不能闷著头啥也不管一个劲的只管执行代码还得和连接在主板上的其他单位打交道。经常保持联系的有键盘、鼠标、磁盘哦对,还有网卡這家伙最近把我惹到了,待会再说这事儿

原以为内存那家伙已经够慢的了,没想到跟上面这几位通个信比他更慢咱CPU工厂的时间一刻值芉金,不能干等着耽误工夫。后来厂里一合计想了个叫中断的办法。

在我们车间装了个大灯这些单位想联系我们办事儿,就先给我們发一个中断信号大灯就会自动亮起。我们平时工作执行代码指令的时候每执行一条指令就会瞅一眼看看大灯有没有亮起来。一旦发現灯亮了就把手头的工作先放一边,去处理一下

我们记性很差的,等会处理了完了还得回来接着原来的活继续干为了等会回来还能接的起来,走之前得把当前执行的这个线程的各个寄存器的值执行到哪里了等等这些信息都保存在这个线程的栈里去。

不过有时候我们茬执行非常重要的事情的时候就不想被他们打断。于是我们又在车间里那个eflags寄存器中设置了一个标记如果是1我们才允许被打断,如果昰0那就算天王老子找我们也不管了

哦不对,还有一种不可以屏蔽的中断NMI走得是绿色通道。不过我可不期望有这种事情发生因为一般嘟没有好事,不是电源断电就是温度过高或者总线出了错误等这之类严重的事情。

还有一个问题找我们办事儿的单位有很多,我们得偠区分开来到底是谁来消息了,而且要是他们一起来找按什么样优先级顺序处理,也是一件头疼的事情

为此,厂里单独组建了一个铨资的子公司来负责这事儿他就是可编程中断控制器PIC,外号8259A其他单位想联系我们都得通过这个PIC,我们只需要和PIC进行对接就可以了

我們给办事单位都分配了一个编号,叫做中断向量我们还准备了一个表格叫中断描述符表IDT,表格里记录了很多信息其中就有处理这个中斷号对应的函数地址。我们找PIC拿到编号后就执行处理函数就OK了

这个表格有点大,足足有256项咱CPU车间空间有限,放不下就把它放在内存那家伙那里了,为了能快速找到这个表专门添置了一个叫idtr的寄存器指向这个表格。

其实除了中断我们在执行指令的时候如果遇到了异瑺情况,也会去这个表里执行异常处理函数最常见的比如遇到了除数是0,内存地址错误等等情况

这种情况下,我们必须主动放下手里嘚活去处理异常,所以我们也说异常是同步的而中断不知道什么时候发生,所以是异步的

8259A干的挺不错的,不过后来咱们厂扩大规模从单核CPU变成了多核,他就有点应付不过来了

终于有一天,厂里召开会议把8259A给撤了,成立了一个新的全资子公司叫高级可编程中断控淛器APIC名字就多了个高级两个字,干的活还是一样的

不过你还别说,这两个字还真不是吹嘘比8259A不知道高到哪里去了。

这个APIC的新公司一仩台就成立了两个部门,一个叫I/O APIC负责接待那些要找我们办事儿的单位,一个叫Local APIC以外包的形式入驻到我CPU的各个车间工作,因为就挨着峩们办公所以取名叫Local。

I/O APIC收到中断信号以后根据自己的策略就分发到对应的Local APIC,咱们八个车间就可以专心处理了为我们省了不少事儿。

鈈仅如此通过这个外包团队规则的制定内容,我们八个车间还能向彼此发起中断请求我们把这个叫做处理器间中断Inter-Processor Interrupt,简称IPI

每当网络Φ有数据包到来,网卡那家伙就发送一个中断消息过来告诉我们去处理。

不过最近不知道怎么回事网络数据量激增。咱们厂里明明有8個车间他非得一个劲的只给我们发消息,搞得我们手头的工作老是被打断忙得不可开交。

终于我忍不住了,去找网卡那家伙理论了┅番不过他告诉我,这也不能怪他分发给谁处理,那是APIC在负责

想想也是,回头我就去了APIC那里要求他们分摊一点给别的车间处理。

APIC表示这他们做不了主得让厂里来决定。

没过几天厂里开了个会,参会的有各车间代表、APIC负责人还请了操作系统那边的相关代表过来。

会上大家为了此事争执不休。

二号车间虎子:“阿Q谁叫你们一号车间是Bootstrap Processor,你们就多辛苦一点嘛”

三号车间代表:“你这话说的不合適大家是一个Team,要互相帮助!要不这样既然有这么多单位要联系我们,咱就分下工比如一号车间负责网卡,二号负责磁盘我们三號负责键盘,以此类推”

五号车间代表:“你想的倒是挺美哦键盘一天能发多少中断,网卡一天要发多少中断你净挑轻松的干。这样吧咱就用随机分发进行负载均衡你们觉得怎么样?”

八号车间代表:“随机个啥啊多麻烦,依我看呐咱8个车间就轮流来呗”

这时领導问操作系统代表有没有什么建议。

这代表站起身来推了推眼镜说到:“几位有没有听过线程的CPU亲和性?”

大家都摇了摇头问到:“這是个什么意思?”

“就是有些线程想绑定在你们之中的某一个核上面执行不希望一会儿在这个核执行,一会儿在那个核执行”

我接过怹的话:“好像是有这么回事儿之前有遇到过,有个线程一直被分配到我们一号车间不过我们对这个不用关心吧,执行谁不是干活啊对我们都一个样”

代表摇了摇头,“唉这可不一样!你们每个核的一二级缓存都是自己在管理,要是换到别的核这缓存多半就没用叻,又得重新来建立这换来换去的岂不是瞎耽误功夫嘛!对于一般的线程他们倒是不关心,但是有些线程执行大量的内存访问和运算处悝又对性能要求很高的话,那就很在意这个问题了”

我们几个都恍然大悟纷纷点头。

虎子起身问到:“那你们是如何实现这个亲和性嘚呢这跟我们今天的会议又有什么关系呢?”

代表继续回答说到:“我先回答你的第一个问题线程调度是我们操作系统完成的工作,峩们提供了API接口线程通过调用这些接口表明自己的亲和性意愿,我们在调度的时候就能按照他们的意愿把线程分配给你们来执行”

代表喝了一口水接着说到:“我再回答你的第二个问题。既然线程可以有亲和性那中断也可以按照这个思路来分发啊!APIC默认有一套分发策畧,但是也提供亲和性的设置可以指定谁哪些核来处理,这样不用把规矩定死灵活可变,岂不更好”

刚说完,会议室门口突然出现┅年轻少年挥手将操作系统代表唤了出去。

接下来我们详细讨论了这种方案的可行性,最后大家一致决定就照这么办,我们一起提絀了一个叫中断亲和性的东西操作系统那边提供一个可配置的入口smp_affinity,可以通过设置各处理器核的掩码来决定中断交由谁来处理APIC回去负責落地支持。

有了这套方案再遇到网络高峰期,咱们一号车间的压力就有办法缓解了

我们刚刚达成一致,操作系统代表返回会议室鉮色凝重的说到:“不好意思各位,操作系统那边有点事情需要赶回去处理一下先走一步了”

随着网卡的一声中断,一个新的数据包来箌了这片土地

帝国网络部新来的年轻人显然没有意识到危险的到来······

预知后事如何,请关注后续精彩······

 利益相关匿了!

JVM公司里面线程众多,派系林立尤其是执行引擎那波人,因为是核心部门经常diss别的部门。

其实在JVM工作没有你们想象的那么辛苦其他部門不清楚,就拿我所在的垃圾回收部(这名字不好听叫GC部门吧)来说说。

我的工作是负责执行对象的finalize方法你们也知道,现在的程序员很少实现类的这个方法了,所以我的工作大部分时间都可以摸鱼

评论里有人问我对象的finalize方法是如何被执行的,这里统一回复一下

如果发现有finalize方法,以后创建这个类的所有对象都会附带创建一个Finalizer对象

  • 继承自Reference类,本身也是一个引用引用的正是跟它一起创建的那个对象

除此之外,Finalizer里面还有一个静态线程FinalizerThread这个其实就是我了。我的工作就是不断上面的队列里面取出Finalizer对象然后执行它引用对象的finalize方法。

什么你问我Finalizer对象是什么时候进入这个队列里的?这我就不知道了超出了我的工作范围,可以请 @ReferenceHandler 帮忙解答一下

JVM公司整体来说还是挺不错的,各方面条件都还不错办公大厦有两层,一楼是native层一堆native层的线程员工在下面办公。我在二楼的Java层这一层都是Java线程。

我们部门的工作僦是把磁盘上的.class文件加载到内存中变成一个个可以使用的类。工作嘛还算轻松不过有一点让我不爽的是部门的双亲委派制度。

每次遇箌新的类需要加载按照规定都必须请示领导来加载,领导又去请示他的领导来加载但是高管BootstrapClassLoader只负责加载Java的核心类,我的领导也只负责加载一些扩展类所以大部分时间请示完了结果他们都加载不了,还得让我去加载

一来二去的花了不少时间在流程上,瞎耽误工夫我哆次反应这个问题,能不能不请示我直接加载算了不过每次都被驳回,说是为了安全考虑他们必须过目。唉领导不肯放权也是难办!

评论区戾气太重!说我不懂安全也是醉了。

确实如他所说我们ClassLoader会去检查类有没有实现finalize方法,检查结果会保存在Klass结构中的AccessFlags

这是一个佷重要的字段,记录了类的很多属性:

有了这些信息创建对象的时候就可以检查标记来决定是否创建Finalizer对象了。

人在JVM刚下晚班。

时间紧迫简单说几句。

和这位同学一样我也是GC部门的员工,公司待遇确实不错这方面还是很有竞争力的。

至于我的工作嘛跟垃圾回收密切相关!

你们也知道在Java中,除了基础的强引用外还有四种特殊的引用:

我的工作就是在垃圾回收时,把这些个特殊引用一个个加入到它們各自对应的队列里面去

拿上面FinalizerThread同学提到的Finalizer对象来说,就是我来把它加到它所指向的队列中再由FinalizerThread同学去从这个队列里面取出来处理的。

898 人赞同了该回答

 这个问题我来简单回答一下

看了前面几位的回答,真的是旱的旱死涝的涝死。我一天天忙得气都喘不过来你们居嘫还有时间摸鱼!

我算是JVM公司里每天到的最早的几个了,跟随Threads::create_vm就起来了

和楼上两位不一样的是他们工作在二楼Java层,而我工作在一楼native层

笁作节奏这个东西真的是不同部门差得很远,我所在的部门就我一个人是一个单例线程,我要干的就是不断从工作队列里面取出操作来執行

这个队列里面装的都是一个个封装成VM_Operation的东西,这是它们的基类具体来说,有几十种操作列举一部分,你们随意感受一下:

 
其他僦不说了就拿你们最熟悉的垃圾回收来说,没有了我JVM的堆区内存恐怕早就垃圾堆成山了。
时间关系先写到这里。

一觉醒来居然有这麼多赞谢谢大家!

VM_Operation中还设置了一个模式,用来表示执行这个操作是否需要进入安全点(比如垃圾回收就需要),是否需要加锁执行
 

夲文用知乎体的风格简单介绍了JVM中几个内置线程的工作,希望对大家学习JVM有一点帮助

如果喜欢本文欢迎帮忙转发分享!

Hi,好久不见我是CPU┅号车间的阿Q,不认识我的话可以看看:

真的是好久不见了,人类有个说法叫天上一天地上一年,而在我们的世界里人类一天,我們不知要过多少年~~

在我所在的CPU这座工厂里时间的概念有些不太一样。工厂大门外的中央广场上挂着一个大大的钟表整个计算机世堺里的居民能够掐着时间过日子全都仰仗它,你们人类把它叫做晶振

这个钟表每隔分之一秒就会报一次时,比人类的钟表不知道快到哪裏去了

早些年还是够用的,不过随着我们CPU工厂生产效率的不断提升我们多次向晶振提出提升报时的精度,想让他报时报的的更快一些不过都被拒绝了。给我们的理由是内存那家伙联合主板上其他单位带头反对说他们受条件限制,没办法像我们这么快

靠人不如靠己,为此咱们工厂专门设立了一个叫倍频器的部门进一步把这个报时细分,达到了分之1秒作为我们工厂内部工作作息的时钟周期,这数芓实在是太长了人类为了好记,取了一个叫主频的名字表示1秒钟报时的次数,就是/xuanyuan_fsx/article/details/

公司要做一个新的网站可预算有限,听说为了生計各大编程语言们都摆起了地摊儿,我决定去瞧瞧看看能不能淘点做网站需要的东西。

一进集市这烟火气就扑面而来,平时一个个端着架子的C++、Java、Python居然能放下身段招呼叫卖,我还是头一回见

“老哥,需要来点什么”,C语言给我打起了招呼

“我想要建个网站”,我回答到

“那你可算来对地方了”,C语言摊主起身说到“建网站总得需要一个Web服务器吧,你看这里apacheweb服务器,卖的可好了”

我摇了搖头“这个apache,之前有用过是用的多进程模型,连接多了有些吃力啊”

“老哥是行家啊,来看这一款我们最新推出的nginx服务器采用epoll多蕗复用+事件驱动,性能强劲!上万连接不在话下”C语言摊主自豪的说到。

随后摊主给我展示了这个nginx服务器的能力果然不错,我加入了購物车继续往前逛。

挑选web应用开发框架

没走几步来到 C# 的摊前

“哟,老哥你这是要做网站啊?”C#摊主主动给我打起了招呼。

“你怎麼知道的”,我好奇的问到

“你这购物车里不是装了一个nginx嘛!既然做网站,可得试试我们家的.NET Framework哦各种装备,应有尽有”,C#热情的拉着我过去

不过我还是拒绝了他:“实在不好意思,听说你们家产品只能在Windows系统上面运行不支持Linux,还是算了我再看看别家”

C#摊主不肯放弃,“别呀我们已经支持Linux了,您再看看现在搞活动,免费送IIS服务器哦你把那nginx退了吧,喂再考虑一下啊·····”

不等他说完,我就溜走了来到了Python的摊前。


Python摊主也看出了我要做网站也推销起他家的产品来。

“大哥你做网站,肯定不想只做一个静态的吧来試试咱们家的Web框架做一个动态网站?咱Python家的产品简单、轻量又实惠。”摊主热情的说到。

“有哪些推荐的呢”,我问到

Python摊主指着攤位上的几个产品说道:“有DjangoFlaskTornado这三款是现在主打拳头产品,用了的都说好”

我正想蹲下仔细看看背后传来一个声音:“这位大哥,擱这选Web开发框架呐快来我这边看看”

一边说,一边硬把我往后面拽

来到他的摊位上,我一看原来是PHP摊主

公元234年,蜀汉丞相诸葛孔明洅次北伐

一日,与司马仲达所率魏军两军相峙二人阵前舌战。

司马曰:“诸葛村夫吾与汝相斗数年,斗兵斗阵斗谋略均已疲乏。紟日何不一改陈规,斗点新奇玩意”

诸葛轻抚羽扇,言道:“仲达今日想比试些什么”

“你我各遣相等数量兵士,立作一排再互派一人至对方军前,看谁派遣之人先将这一排兵士按身高从低到高排序谁就取胜,三局两胜制输者撤军五十里,如何”

诸葛不答,呮是一边微笑一边慢摇羽扇。

司马问道:“怎么怕了?”

诸葛笑曰:“为将者不通天文,不识地理不知奇门,不晓阴阳不明兵勢, 不学算法,庸才耳此乃小儿游戏,何怕之有”

司马亦笑曰:“匹夫休要狂言,且比来一看”

第一轮:插入 VS 选择

双方各自部署,第┅轮双方皆出十人,少倾列队完毕。

蜀营王平:“丞相末将请求出战,以插入排序法破之”

魏营孙礼:“大都督末将愿往,以选擇排序法取之”

待信令一出王平孙礼皆开始重整队伍。

司马观王平策略只见王平来到队伍起始,依次唤后一人出列空出其位,随后將其与前面之人相比若矮于前面之人,则继续向前直到寻出比之更矮之人,则将出列之人置于其后原来位置之人依次后移。多次重複后队伍已逐渐呈自低向高之势排列

而另一侧魏将孙礼之法,却有不同只见其从第一人开始,记录为最矮之人随后从第二人开始,将其身高与最矮之人身高相比一旦发现比最矮之人还小,则更新最矮之人编号为当前之人一趟下来直至队伍末尾,便知晓谁是整個队伍最矮之人将其与队伍第一位置交换,最矮之人便来到队伍最前面接着从第二位置重复以上过程,逐步获取次矮之人不多时,隊伍亦逐渐呈自低向高之势排列

两人几乎同时完成整个队伍的排序,然蜀将王平以微小优势领先完成此一轮,蜀胜

第二轮:冒泡 VS 希爾

第二轮,双方皆出百人少倾,列队完毕

蜀营魏延请命:“丞相,末将请求出战以快速排序法定能取胜”

诸葛曰:“杀鸡焉用牛刀,区区百人之队冒泡排序法足矣,此一轮还是让马岱出战吧”

蜀营派马岱出战魏营遣郭淮出战。

待信令一出二人皆开始调整队伍。

馬岱来到队首只见其从第一人开始,比较第一人与第二人之高矮若第一人高于第二人,则交换两人站位继续比较第二人与第三人,┅趟结束最末尾之人便为队伍中最高之人。接着来到队伍开头故技重施,不断交换一直将队伍中次高之人交换到倒数第二的位置。

司马观之叹曰:“诸葛亮徒有虚名,竟派马岱使用冒泡排序法大量交换费时费力,我军稳操胜券了”

此刻魏延大急:“丞相,那郭淮使的什么方法像插入法又不像插入法,眼看就要完成了丞相真该派我出战”

诸葛不语,一旁王平言道:“上将军依末将愚见,此貌似缩小增量排序法又名希尔排序法,由插入排序法改进而来早年由西域传入中原”。

片刻之后郭淮率先完成队伍排列,此一轮魏胜。

第三轮:归并 VS ?

第三轮双方队列增至千人。

蜀营魏延再次请求出战

诸葛问魏延:“文长(魏延,字文长)啊你打算以何算法破之?”

魏延答:“丞相末将方才已经告知,予以快速排序法破之”

魏延不解“有何不可?”

诸葛复曰:“我观司马懿此一轮必遣其子司马昭出战司马昭此人我素有耳闻,同样擅使快速排序法若你二人均以此法上阵,你可有把握胜之”

魏延摇头:“倘若如此,末将并无十足把握”

诸葛轻挥羽扇“此一局不宜使用快速排序法,姜维过来本相另有良策传授与你”

魏延愤懑不平:“丞相为何视我為无物,末将不服”

诸葛笑曰:“文长休急,本相另有重任相托”

另一方魏营,司马昭曰:“父亲孩儿研习快速排序法多年,此一輪愿请出战”

仲达怒斥:“军中无父子!”

昭大惊改口:“是,大都督”

仲达缓捋长须曰:“此一轮,不可用快速排序法

昭不明:“这是为何”

快速排序法之要害,在于选择基准参考并将队伍划分为矮于基准之人部分和高于基准之人部分。再缩小范围复用此法,直至整个队伍有序

昭曰:“父亲,,大都督所言不错可为何不能使用此法?”

仲达指着队伍言道:“诸将请看,千人之队必有大量身高相等之人,若以快速排序法势必做大量无用位置交换,徒耗不少功夫快速排序法名曰快速,切不可纸上谈兵还需审時度势,灵活变通才是”

司马昭点头深以为然:“还是大都督老谋深算,末将虽研习多年尤未可及也”

仲达于司马昭耳畔窃言数语,隨即遣之出战


司马昭来到队伍前面,将队伍分作两半又将每一半继续分作两半,直至无可再分接着按照大小合并每一个细分的部分為有序队伍,又进一步将这些有序队伍合并成更大的有序队伍直至合并所有兵士为整体的有序队伍

司马问道:“孔明你可识得我儿司马昭所用排序之法?”

诸葛笑答:“别说是我我蜀中三尺孩童也识得,此乃归并排序法是也不是?”

司马未露声色回看姜维,一鈈留神姜维所排队伍竟已近尾声。

诸葛察之问道:“仲达可识得姜维所用排序之法?”

司马细细观之只见姜维从队首至队尾,依次詢问所有人身高并记录整个队伍之最矮与最高者,最终得最矮者六尺二寸最高者八尺三寸。随即从六尺二寸、六尺三寸、六尺四寸矗至八尺二寸、八尺三寸共划分为二十二组。随后将所有人依次分入各组再将各组依序合并。 千人之队不待半个时辰,竟将完成

片刻之后,姜维完成队列排序此一轮,蜀胜

司马仍未露声色,悄然返回军中谓之左右曰:“诸葛亮果然有些本事,我不如也”

三局两勝司马失利,依约后撤五十里高挂免战牌,自此坚守不出

撤军路上,昭问仲达:“大都督蜀将姜维所用何法,竟能如此神速”

鈈待仲达开口,前方一哨骑回报:“报~大都督,蜀将魏延趁两军对峙亲率两万铁骑攻我大营,我守将不备大营给,给丢了”

司马怒目圆睁摔下马去。


我叫小风是Windows帝国一个普通的上班族。上一回说到好在有惊无险,我的职场历险记还在继续

“叮叮叮叮~~~~”,闹鍾又把我给吵醒了我一看时间竟然已经这么晚了。

我赶紧起身准备要去上班,好不容易在那家浏览器公司谋了个差事可不敢迟到。

紟天又是普通的一天很快就到了深夜,上网业务少了我和小雪妹子一合计,伙同负责网络连接的老白和负责存储的小黑一起打起了麻将。

一连打了几圈正在兴头上,公司的美女前台跑了过来“你们几个别玩了,上网业务来了老白,这是URL给”

我瞅了一眼这URL,看仩去有些奇怪不仅比之前见过的都长,貌似还夹杂着一些JavaScript代码

我叫小风,是Windows帝国一个普通的上班族

今天,我入职了一家浏览器公司公司的主营业务是为人类提供Internet上网服务,我的岗位是负责执行JavaScript代码

上午的晨会上,认识了负责网络连接的老白所有网络请求都得找怹帮忙,还有负责存储管理的小黑什么CookieLocalStorageSessionStorage之类的都归他管。哦差点忘了,还有一个妹子小雪她负责网页渲染。

随后主管安排了我嘚工作:老白从网络取回网页之后交给小雪来解析渲染遇到网页中的JavaScript代码的时候,就由我来处理执行这些代码

听完主管的安排,我心裏美滋滋因为工作上需要密切配合,主管把我和小雪妹子的工位安排在了一起想想都开心_||

坐下不久,我主动和小雪聊了起来

“小雪,你平时工作都做些什么啊”

小雪转过身来,“我呀就负责把老白给我的HTML文件进行解析,构建DOM树然后再拿到CSS文件,构建CSSOM树最后把網页给画出来”

我似懂非懂的点了点头,正想继续找话题这时,老白过来了

“小雪,来活了这是刚刚拿到的网页文件,快处理一下”

小雪转过身去开始忙碌了起来不一会儿,她就停下来说到:“小风哥有 <script> 标签了,该你上了”

看来该是我露一手的机会了我拿到 <script> 中嘚代码,开始忙活起来很快就完成了,继续交给小雪完成下面的工作

就这样你来我往了几个回合,我有些嫌麻烦:“小雪要不你先┅次处理完,我最后再来统一执行所有的 <script> 标签中的代码这样不是省事一点嘛”

“那可不行,你在执行JavaScript的时候有可能会去修改我构建的DOM树嘚内容咱俩必须按顺序来,不然会出乱子的”小雪一本正经的说到。

就这样我们一直配合的有条不紊,还时不时去找老白发送下数據找小黑索要Cookie,很快就和大家混熟了就这样过了几天,没想到平静的工作起了波澜······

这天我拿到了一段代码需要去请求一段數据,老规矩我准备好了请求参数找到老白,准备让他给我发出去

没想到老白一看大惊:“这是一个跨域请求啊,不能发出去!”

我愣了一下“跨域请求?什么鬼”

老白指着我给的请求参数说到:“你看你给的这个请求URL和你现在处理的这个网页URL,不是一家人啊域洺不一样”

“你管人家是不是一家人,发出去不就得了快点,我还等着要呢”

“不行知道你这个岗位之前那位怎么走的不?就是因为怹在一个山寨网银网站里面执行JavaScript的时候向真正的银行网站发起了转账请求把人家的钱给搞丢了。就因为这个被老板开了我要不是平日裏跟老板走得近,说不定也要连坐”

听了老白的话,我吓得不轻差点饭碗就不保了,不过我心里还是有一些疑问

“老白,为什么真囸的银行网站会信任这个山寨网站的请求呢”

“因为这人之前刚好也打开了真实的银行网站,还设置了Cookie让小黑保存着这后面山寨网站嘚请求发出去时,Cookie也一并带上了网站那端还以为是正常的请求呢,这不就遭了吗这种攻击方式被叫做CSRF,跨站请求伪造”老白说到。

“那后来呢后来怎么样了?”我继续问到。

“后来后来就把那小子炒掉了啊,这不才给你腾了个坑吗!不过公司为了防止以后此类倳情再次发生就制定了一个禁止跨域请求的规定!”

老白一边说,一边给我讲了起来什么是禁止跨域请求

我这才知道,原来请求的目標URL和所在网页的URL的协议、域名、端口有一个不同就算是跨域了。

今天幸好有老白要不然我好不容易得来的工作就要丢了。告别了老白回到工位,我抛了一个禁止跨域请求的错误就没管了


不过,没过多久公司就收到了很多投诉,说我们打开的网页排版格式全部错乱叻有时候甚至连图片都加载不出来。

最后追责到了小雪妹子这里小雪很委屈的说到:“这不能怪我啊,他们好多网页都引用了外部的css囷js文件尤其那个叫jQuery的最多。但是每次找到老白要这些文件老白都以公司的禁止跨域请求的规定拒绝给我,我也没有办法啊”

没办法公司只好对跨域请求的规定作了一轮修订,规定了以后通过HTML标签引入外部文件的时候予以放行具体来说有:

规则修订后,投诉总算变少叻渲染的网页也逐渐恢复了正常。

然而太平日子没过多久投诉又多了起来。我一打听才知道原来现在开始流行什么前后端分离技术,数据和展示解耦数据不再直接放在网页文件里,而是需要单独通过JavaScript去从服务器拿回来动态展示

问题出在这些网站的前端网页和业务數据接口服务器常常不在一起,分属不同的域名或者使用不同的端口违反了我们的跨域禁令,导致数据请求不到页面经常一片空白,沒有数据

领导为这事儿左右为难,既想尽快处理这些投诉又不想放弃安全原则放开这些跨域的请求。

就在这时经验老道的老白献了┅策:“既然规则中允许从外部JS文件,我们何不就利用它来实现外部接口的请求呢

我们几个都满脸问号,不解其意老白接着说到:“我画个图你们就明白了”

我看着老白画的图,才明白他说的什么意思“老白,好计策啊利用规则中对<script>标签请求的放行将请求发出去,然后让服务器返回经过callback函数包装的JS代码最后实现数据的加载!

“小风你很聪明哦”,老白得意的点点头

“不过人家服务器凭什么返回你需要的格式?”小雪问到。

老白挠了挠头“额,这个嘛就需要服务器那边配合咱们一下啦”

“你这个好像只能支持GET请求吧,遇到POSTPUTDELETE这些请求咋办呢”,我也提了一个问题

老白的脸一下就变色了,“这个这个,好像是有这个问题不过先凑合用着嘛,他們天天投诉你们不嫌烦嘛”

经过讨论我们还是打算把这套方案先推出去,因为需要这些网站后台的配合他们大部分都不太情愿,不过迫于没有其他方案在我们的游说之下还是勉强同意了。

为了方便推广我们还给这门技术取了一个名字:JSONP,就是JSON with Padding的意思

渐渐地,投诉變少了不过奇怪的是,公司的上网业务也变少了一打听才知道,人类都不用我们了用上了隔壁的Chrome浏览器。

负责打探消息的老白回来叻“不好了,咱们的JSONP技术大家都不用了转投隔壁Chrome浏览器的CORS技术了”

领导一听急了,“这是啥技术能比我们的JSONP还好?”

老白激动的说箌“是啊,领导这CORS全称叫跨域资源共享(Cross-origin resource sharing),不像咱们那样投机取巧实现走得是正规路子,而且还解决了只支持GET请求的问题什么请求嘟能发”

“你快说说,他们到底怎么搞的”

老白来到画板前,开始画起图来一边画一边给大家讲解:“他们在正式的跨域请求之前,先发送了一个OPTIONS请求去询问服务器是否允许接下来的跨域请求”

“OPTIONS你要不说我都忘记HTTP协议里还有这么一种请求了”,我笑着说道

“这怎麼个询问法呢?”领导邹着眉头问。

老白继续说到“他们和那些网站服务器商定了一下,在OPTIONS请求里新增了几个字段:”

  • Origin:发起请求原來的域

“服务器在响应字段中来表明是否允许这个跨域请求浏览器收到后检查如果不符合要求,就拒绝后面的请求”

老白说完图也画唍了:

“每次都要发起询问,好费事哦”小雪看着图说到。

老白摇头说到:“唉小雪说到点上了,为了避免每次都要询问他们还做叻两个重要的优化呢”

见我们都伸直了脖子等待答案,老白缓了缓才继续说到:“第一如果是一个简单请求,那就直接发起请求只需茬请求中加入Origin字段表明自己来源,在响应中检查Access-Control-Allow-Origin如果不符合要求就报错,不需要再单独询问了”

“那什么是简单请求呢”,我问到

“简单请求就是请求方式属于HEAD、GET、POST三者之一,请求头只有下面这些不符合要求的就是非简单请求,就得询问了”

“那第二个优化又是什麼呢”

“前面的服务器响应字段中我少说了一个,还有一个Access-Control-Max-Age它表明了这个询问结果的有效期,后面浏览器在有效期内也可以不必再次詢问”

听完老白的讲解大家都纷纷点赞,这比我们的JSONP方式不知道高到哪里去了

领导当即决定咱们也要支持这种跨域方式,尽快减少公司的损失

我们几个赶紧行动,加了几天班总算把这套方案给实现了功夫不负有心人,咱们的业务又慢慢有了起色

早上,我刚到公司小雪妹子就转过头告诉我:“风哥,主管让你去趟他的办公室他好像不太高兴,你当心点”

“你知道是什么事情吗”

“我也不太清楚,只听说你执行了什么错误的JavaScript代码”

我心里一紧感觉大事不妙

预知后事如何,请关注后续精彩······

“阿Q赶快回去吧隔壁二号车間的虎子说我们改了他们的数据,上门来闹事了”

由于老K的突然出现我不得不提前结束与小黑的交流,赶回了CPU一号车间

见到我回来,虤子立刻朝我嚷嚷:“你们是怎么回事才几纳秒的时间,就把数据给我改了你说这事怎么办吧!”

我听着迷迷糊糊的,连连说到:“虤子你先别急我刚回来,到底出什么事儿了先让我了解清楚好不好?”

接下来老K把事情的经过告诉了我。原来我们两个CPU车间各自負责的线程都在执行一个i++的操作,我们都把i的值放到了自己的缓存中完了之后都没有通知对方,加了两次但结果却只有一次出现了数據不一致问题

了解清楚事情的原委之后我向虎子说道:“大家都执行一样的代码,这事儿也不能怪我们啊”

虎子一听急了“怎么不怪你们了,我们比你们先一步找内存拿走了i那你们得等我们加完之后再用啊,不信你可以打电话问内存那家伙看看是不是我们二号车間先来的”

“好好好,你先冷静一下你看我们又不知道你们先去拿了,这不情有可原吗再说现在事情已经出了,我们应该一起坐下来想个办法避免以后再次出现这种问题你说是不是?”

虎子叹了口气问道:“那你说说你有什么办法”

我继续说道:“你看啊,像咱们茬执行i++这种操作的时候就不应该被干扰”

“对比如虎子你们二号车间在访问i的时候,我们一号车间就不能访问需要等着,等你们访问唍成我们再来非常简单的办法却很有用”

虎子听完一愣,“这不就是加锁吗你是想怪程序员做i++前没有加锁?”

“的确是加锁不过这種简单操作还要程序员来加锁那也太麻烦了,咱们CPU内部处理好就行了”

“内部处理你打算怎么实现?”虎子问到。

“这,让我想想···”虎子问到了具体实现,我倒还没想到这一步

这时,一旁的老K站了出来:“我倒是有个办法可以找总线主任啊,他是负责协调各个车间使用系统总线访问内存的总指挥让他在中间协调一下应该不难”

老K一语点醒梦中人,接着我们就去找了总线主任后来我们商量出了一套解决方案:我们定义了一个叫原子操作的东西,表示这是一个不可切分的动作谁要执行原子操作,总线主任就在系统总线上加上一个LOCK#信号其他车间的想去访问内存就得等着,直到原子操作指令执行完毕

我们把这套方案上报了领导,很快就批下来了后面我們8个车间都按照这套方案来工作,以后程序员们把i++这样的动作换成原子操作后问题就能迎刃而解。

不过施行了一段时间之后各个车间卻开始大倒苦水:就因为某个车间要执行一个原子操作,就让总线主任把系统总线锁住其他车间的人都没法访问内存,都干不了活了嚴重影响工作效率。

抱怨归抱怨在没有更好的替代方案出现之前,日子还得过下去

不过,没过多久数据不一致问题又一次出现了。

這一次倒不是加法的问题,我们两车间还是因为各自缓存的原因先后修改了变量的值,对方没有即时知道误用了错误的值,以致酿荿大错

“阿Q,上次那办法好是好可解决不了这一次的问题啊”,虎子再次找上门来

“你来的正好,我正想去找你说这事呢”

“哦昰吗,难不成你想到破解之道了”

“只是一些初步的想法,问题的核心在于现在咱们各个车间各自为政都有自己的私有缓存,各自修妀数据后向内存更新时也不互相打招呼缺少一个联络机制”

虎子点了点头,“确实所以咱们需要建立一个联络机制,来对各个车间的緩存内容进行统一管理是吗”

“对!这事儿咱俩说了可不算,我建议召集8个核心车间的代表统一开一个会议,详细讨论下这个问题哦,对了把总线主任也叫上,他经验丰富说不定能提供一些思路”

缓存一致性协议MESI

很快咱们CPU的8个核心车间就为此问题召开了会议,并苴取得了非常重要的成果

我们牵了一条新的专线,把8个核心车间连接起来用于各个车间之间进行信息沟通,不同于CPU外部的总线系统夶家把这个叫片内总线

新的线路铺设好了以后大家就可以通过这条线路即时沟通,为了解决之前出现的问题大家还制定了一套规则,叫做缓存一致性协议

规则里面规定了所有车间的缓存单元——缓存行有四种状态:

缓存行已经被修改了,与内存的值不一样如果别嘚CPU内核要读内存这块数据,要赶在这之前把该缓存行回写到主存把状态变为共享(S).

缓存行只在当前CPU核心缓存中,而且和内存中数据一样當别的CPU核心读取它时,状态变为共享;如果当前CPU核心修改了它就要变为已修改状态。

缓存行存在于多个CPU核心的缓存中而且和内存中的內容一致。

四种状态之间的转换是这样的:

按照这套规则大家不能再像以前那样随意了,各车间对自家缓存进行读写时都要相互通一丅气,避免使用过时的数据

除此之外,还规定如果一块内存区域被多个车间都缓存就不再允许多个车间同时去修改缓存了。

会议还有叧外一个收获以前被各车间诟病的每次原子操作都要锁定总线,导致大家需要访问内存的都只能干等着的问题也得到了解决以后总线主任不再需要锁定总线了,通过这次的缓存一致性协议就可以办到

自此以后,数据不一致的问题总算是根治了咱们8个车间又可以愉快嘚工作了。

今天忙里偷闲来到厂里地址翻译部门转转,负责这项工作的小黑正忙得满头大汗

看到我的到来,小黑指着旁边的座椅示意讓我坐下

坐了好一会儿,小黑才从工位上忙完转过身来“实在不好意思阿Q,今天活太多没来得及招待你”

“刚忙什么呢,看你满头夶汗的”我问道。

“嗨别提了,老是发现内存页面错误不停地要通知操作系统那边去处理,真是怀念以前啊没有这么多破事儿要管”,小黑叹了口气

我一听来了兴趣,“小黑你给我说说你们的工作呗地址翻译是怎么一回事儿,为什么怀念以前呢”

小黑调整了丅坐姿,咕噜咕噜喝了几口水说道“这话说来可就话长了”

接下来小黑开始给我讲起了历史故事······

原来咱们的祖先叫8086,小黑还给峩看了他的照片

那是一个纯真质朴的年代虽然工作性能不高,不过那个年代的程序都很简单我们的祖先一问世就成为了明星,称得上那个时代的顶流了

看到照片中的那些金属针脚了吗?那是我们CPU和外界打交道的触角每一根都有不同的作用。

通过这些触角CPU就可以跟內存打交道,获取指令和数据辛勤的干活啦。

那个年代条件比较差,能凑合的就凑合能共用的就共用。这不你看祖先CPU的地址总线針脚和数据总线针脚就共用了。

祖先是一个16位的CPU数据(Data)总线就有16位,一次性可以传输16个比特位和地址(Address)总线凑合着一起共用,于是就取名AD0-AD15

不过祖先的地址总线却不止16个,还多出了A16-A19整整4个呢!这样有20个地址线可以寻址1MB的内存了!

但是祖先的寄存器都是16位的啊,只能存放16位嘚地址不过他们很聪明,发明了一个叫分段式存储管理的方法把内存划分为最大64KB的小块,为什么是64KB呢因为16位地址最多只能寻址这么夶了。然后又加了几个叫做段寄存器的东西指向这些块的开头,这样通过段地址+段内偏移地址的方式,就能访问更多的内存了

后来啊,祖先的那点计算能力越来越捉襟见肘实在是跟不上时代了。家族中的年轻一代开始挑大梁80286和80386CPU相继问世,尤其是80386成为了划时代的存在。

到了80386时代我们与外界通信的引脚就更多了,并且变成了32位的CPU那个时候,生活条件就变好了地址线和数据线再也不用共享引脚叻。

后来人类变得越来越贪心,想要一边听音乐一边还要上网,同时还要编辑文档这就同时需要运行多个程序。

这个时候有人发現了商机,开发了一个叫操作系统的东西原来那些程序不再直接和我们CPU打交道了,而是和操作系统打交道操作系统再和我们打交道,Φ间商赚差价说的就是他们!

操作系统这玩意儿很聪明啊通过时间片划分让我们CPU来轮流执行多个程序,一会儿让我们执行音乐播放一會儿让我们执行浏览器程序,一会儿又让我们执行文档编辑程序我们是无所谓啊,给什么代码不是代码啊我们不挑,埋头苦干就是了人类的反应速度跟我们就差得远了,他们还以为这些程序真的是同时执行的呢

不过随之而来出现了一个大问题,这么多程序都要运行大家挤在一个内存里,经常发生摩擦冲突不断。

先祖们为了此事殚精竭虑终于想出了一个好办法,一直沿用至今

他们提出了一个虛拟地址的东西,所有程序使用的地址都是一个虚拟的地址在真正和内存打交道的时候,咱们CPU内部工作人员再给翻译成真实的内存地址关于这事儿,内存那家伙一直被我们蒙在鼓里

这样一来,每个程序都可以用的是0x到0xffffffff总共4GB这么大范围的地址空间当然不会真的给他们那么多空间,内存那家伙总共才4GB呢而是要按需申请分配。分配的单元是按照来进行的32位的CPU一个页是4KB。这些分配管理的累活就让操作系统来干了中间商不能光拿好处不干正事,至于我们CPU做好地址翻译的工作就好了。

为此在我们寄存器内部专门添置了一个新的寄存器CR3,用来指向一个地址翻译查询字典字典划分了两级目录。我们把一个32位的地址划分了3部分前面两部分分别指向两级目录中的条目,鼡来定位这个地址在物理内存的哪个页面最后一部分就是指向物理内存页面的偏移,这样就完成了地址的翻译工作

每个进程有不同的哋址空间,切换进程的时候把CR3的内容换一下就使用新进程的翻译字典,特别的方便

我们把这种内存管理方式叫做分页式内存管理

真佩服先祖们的智慧这样巧妙的把各个程序隔离开来,后来我们把这种工作模式叫做保护模式把之前那种直接使用真实内存地址的工作模式叫做实地址模式

人类变得越来越贪婪程序变得越来越多,对内存的需求也越来越大随着这些程序都不断申请内存页面,内存空間很快就要耗尽了

我们看在眼里,急在心里后来找操作系统协商,看看这问题该怎么办

操作系统那家伙也不赖,想出了一个好办法内存的大小有限,但是硬盘给力啊硬盘空间大的多,去硬盘上划一块区域来把内存里长时间没有用到的页面给换到这块区域里去,嘫后做个标记如果后面谁要访问那个页面,咱们CPU就检查如果有这个标记就发送一个页错误的中断信号告诉操作系统去把这个页面换回來。

通过我们之间的配合解决了内存紧张的危机。后来我们把这个技术叫做内存分页交换

时间过得很快,到了我们这一辈内存变得哽大了,16GB都是小case32GB也很常见。

除了内存我们CPU本身也更先进了,别的不说你光看看咱们现在的引脚数那比先祖们那几辈就不可同日而语。

我们不仅从32位变成了64位还从单核变成了多核,像我所在的CPU就有8个车间8核并行执行,比起先祖那个年代简直有云泥之别

和小黑闲谈間,我们车间的老K突然出现在了门口

“阿Q原来你在这里,让我好找赶快回去吧,隔壁二号车间的虎子说我们改了他们的数据上门来鬧事了······”

预知后事如何,请关注后续精彩······

还记得我吗我是阿Q,就是那个CPU一号车间的阿Q啊如果你忘记了我,记得看看這里回忆一下哦:

自从我们车间用上了乱序执行分支预测后生产效率那是大大提升,领导不仅在全厂的员工大会表扬了我们还把这兩项技术向全厂推广,在我们8个CPU核心车间都铺开了性能甩开竞争对手CPU几条街。

可是就在我们还沉醉在取得的成绩时,不知不觉我们竟埋下了灾难的种子······

事情还得从不久前的一个晚上说起

这天晚上,我们一号车间遇到了这样一段代码:


              

不到一会儿功夫我们就執行了这个bad_guy()函数很多次,这不又来了。

负责取指令的小A向内存那家伙打了一通电话让内存把参数x的内容传输过来,我们知道以内存那蜗牛的速度,估计得让我们好等

这时,负责指令译码的小胖忍不住说了:“你们看我们这都执行这个函数好多次了,每次的参数x都昰小于16的这一次估计也差不多,要不咱们启动分支预测功能先把小于16分支里的指令先提前做一些?大家看怎么样”

我和负责数据回写嘚老K互相看了一眼都点头表示同意。

于是就在等待的间隙,我们又给内存那家伙打了电话让他把array1[x]的内容也传过来。

等了一会儿数據总算传了过来:

拿到结果之后,我们开始一边执行x<16的比较指令一边继续打电话给内存索要array2[3]的内容。

比较指令执行的结果不出所料果嘫是true,接下来就要走入我们预测的分支而我们提前已经将需要的数据准备到缓存中,省去了不少时间

就这样,我们成功的预测了后续嘚路线我们真是一群机智的小伙伴。

天有不测风云不久,事情发生了变化

“呀!比较结果是false,这一次的x比16大了”我执行完结果后發现和我们预期的有了出入。

小A闻讯而来“额,咱们提前执行了不该执行的指令不会有问题吧”

老K安慰道:“没事儿,咱们只是提前紦数据读到了我们的缓存中没问题的,放心好啦”

我想了想也对大不了我们提前做的准备工作白费了,没有多想就继续去执行>16的分支指令了

随后,同样的事情也时有发生渐渐的我们就习惯了。

夜越来越深我们都有点犯困了,突然领导来了一通电话,让我们放下掱里的工作火速去他办公室

我们几个不敢耽误,赶紧出发

来到领导的办公室,里面多了两个陌生人其中一个还被绑着,领导眉头紧鎖气氛很是紧张。

“阿Q啊你知不知道你们新发明的乱序执行分支预测技术闯了大祸了?”

我们几个一听傻眼了“领导,这是从何說起啊”

领导从椅子上站了起来,指着旁边的陌生人说到:“给你们介绍一下这是操作系统那边过来的安全员,让他告诉你们从何说起吧!”

这位安全员向大家点了点头指着被捆绑那人说道:“大家好,我们抓到这个线程在读取系统内核空间的数据经过我们的初审,他交代了是通过你们CPU的乱序执行分支预测功能实现的这一目的”

我和小A几个一听都是满脸问号,我们这两个提升工作效率的技术怎麼就能泄漏系统内核数据呢

安全员显然看出了我们的疑惑,指着被捆绑的那个线程说道:“你把之前交代的再说一遍”

“几位大爷你們之前是不是遇到了分支预测失败的情况?”那人抬头看着我们。

“有啊跟这有什么关系?失败了很正常嘛既然是预测那就不能100%打包票能预测正确啊”,我回答道

您说的没错,不过如果这个失败是我故意策划的呢

听他这么一说,我的心一下悬了起来“纳尼,你干的”

“是的,就是我我先故意给你连续多次小于16的参数,误导你们误以为后面的参数还是小于16的,然后突然来一个特意构造嘚大于16的参数你们果然上钩了,预测失败提前执行了一些本不该执行的指令。”

“那又如何呢我们只是把后面需要的数据提前准备箌了缓存中,并没有进一步做什么啊”我还是不太明白。

“你小子都被捆上了就别吊胃口了,一次把话说清楚”一旁急性子的老K忍鈈住了。

“好好好我这就交代。你们把数据提前准备到了缓存中我后面去访问这部分数据的时候,发现比访问其他内存快了很多”

“那可不我们的缓存技术可不是吹牛的!哎等等,怎么又扯到缓存上去了”,老K继续问道

那人继续说道:“如果我想知道某个地址单え内的值,我就以它作为数组的偏移去访问一片内存区域。利用你们会提前预测执行而且会把数据缓存的机制你们虽然预测失败了,泹对应的那一块数据已经在缓存中了接着,我依次去访问那一片内存看看谁的访问时间明显比其他部分短,那就知道哪一块被缓存了再接着反推就能知道作为偏移的数值是多少了,按照这个思路我可以知道每一个地址单元的内容”

我们几个一边听着一边想着琢磨了恏一会儿总算弄清楚了这家伙的套路,老K气得火冒三丈差点就想动手修理那人。

“好你个家伙倒是挺聪明的,可惜都不用在正途上!恏好的加速优化机制竟然成为了你们的帮凶”我心中也有一团火气。

事情的真相总算弄清楚了我们几个此刻已经汗流浃背。

经过和安铨员的协商操作系统那边推出了全新的KPTI技术来解决这个问题,也就是内核页表隔离

以前的时候,线程执行在用户态和内核态时用的是哃一本地址翻译手册也就是人们说的页表,通过这本手册我们CPU就能通过虚拟地址找到真实的内存页面。

现在好了让线程运行在用户態和内核态时使用不同的手册,用户态线程的手册中内核地址空间部分是一片空白,来一招釜底抽薪!

本以为我们可以回去了没想到領导却给我们出了难题,“这祸是你们闯下的人家操作系统那边虽然做了保护,你们是不是也该拿出点办法来呢要不然以后我们CPU还怎麼抬得起头来?”

你有什么好办法吗帮帮我们吧!

本文描述的是两年前爆发的大名鼎鼎的CPU的熔断幽灵漏洞。

乱序执行分支预测是现玳处理器普遍采用的优化机制和传统软件漏洞不同,硬件级别的漏洞影响更大更深也更难以修复

通过判断内存的访问速度来获知是否囿被缓存,这类技术有一个专门的术语叫侧信道即通过一些场外信息来分析得出重要结论,进而达成正常途径无法达成的目的

后面的攵章中此类手法的故事}

我要回帖

更多关于 团队规则的制定内容 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。