??xml version="1.0" encoding="utf-8" standalone="yes"?> 开放才是未?/strong> 早在2012q_AMD高调宣布要设计Z64-bit ARM架构的处理器Q而ؓ了在2014q处理器问世前打造一条完整的软硬件生态链QAMD更是同ARM一h立了HSA基金会(异构pȝ架构基金会)。HSA基金会倡导的是一U更单、开放,同时q可以涵盖PC与移动设备(不光是跨 OSQ的标准。目的在于通过ZGPU的ƈ行运来提升处理器的表现。比如图像处理器不仅仅用于囑փ、游戏等斚wQ普通的d和应用也可以用到它?/p>
图:HSA帮助从服务器端到Ud端提升效率、降低功?br style="padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; padding-right: 0px" /> “虽然用OpenCLq个工业标准已经能达到这U效果,但这L做法仍旧太复杂,而且L的开发者也不容易接受。NVIDIA虽然大力推进自己的CUDAq算架构Q不qCUDA和OpenCL是同一层面的技术,而基于私有架构的开发栈l将没落?#8221; AMD中国开发合作与解决Ҏ中心ȝ楚含q坦aQ目前AMD所有做的事情都是ؓ来某一D|间品集中爆发做技术上pȝ储备。在HSA基金会中Q其中的厂商从服务器到PC到手机厂商都会有QAMD帮助各个伙伴更好的去驱动Y件生态系l,促软g里面的工兗Y仉面的库、Y仉面的开发环境让更多的h更容易的M用?/p>
“其次Q我们将一直致力于降低功耗,q两q我们会把生态链去闭环运营。在中国来说Q我们有一个开发团队会帮助国内的开发h员能够学会如何在GPU上进行编E;而在技术层面上Q我们更希望能够向着qx电脑q个方向q行q度?最l目的是在低功耗上推出AMD的一pd产品Qx86和ARM双核q行战略?#8221; 而从市场的直接反馈结果来看,AMD拥抱开放技术的{略也受C开发者的一致欢q?/p>
作ؓ软g开发h员尤其是学生开发h,是AMD首先取悦的h,在前不久举行的异构编E大赛上QAMD收到?0多个作品Q从开发者的xҎ看,他们也正向着云计、多媒体、移动互联网应用q些深层ơ的产品优化的方向,同目前的行业热点是有很好的契合点的。ƈ且在相当多的参赛作品中,无论是学生本人,q是在导师的带领下,q些行业q是都比较容易生有创意或者是有深度有质量的Y件实现的法或者品的核心技术,而这些注定是未来软g公司差异化的核心?/p>
从作品的cd来看Q有数据搜烦和数据的作品Q也有算法优化方面的内容。而在多媒体、图形图像方面,比如损失囑փ的修复、二l图像的三维化、图像的拼接以及l化和分Ԍq些Q技术)在很多领域无论是Udq是多媒体领域有着p的意义?/p>
对于此次大赛的结果,楚含q表C,“大赛只是AMD对异构编E技术的一个普及推qŞ式。根据以往的大赛经验,在作品的推广中,学生是不利的。一般参赛的大部人是q轻人,q轻人有q劲Q但是他们有时只见树木不见森林。如果把大赛中学生的每一件作品拿出来Q稍加深化补充,都可以成Z个很好的分子。但是把分子作ؓ一个品还要花一D|间的。所以AMD一直在思考能不能把学生做的引擎收集v来,不论是计划上的还是部分实C的,让他们能够沿着q个方向更好的研I下去,产生一些有影响力的Q不论是论文q是实际案例Q抑或在他们自己的品中能够把它延到自qI的领域?#8221; “因此Q从AMD帮助学生开发技术提高来看,会做三g事,W一是与CSDN一h探讨利用学生的自w优势和他们本n已经完成的工作,l箋能够指导他们做一些成果出来。我们不是只针对TOP10Q甚xTOP20。第二种是扶植学生能够真正的发布自己的作品,以及针对于当前工作真正有用的。我们给予他们业务层面的指导。还有一U想法是把他们的某一些业务成果提交给我们的客Pq样能把他们转化为真正的生力。第三点是我们希望能够与CSDN形成一个比较切实的ZGPU的异构开发h,然后把一些作品放在开源的C来进行一些补充。这个项目本w不会成Z个独立运行的h某种功能的品模块,但是我们希望q开源社区的力量Q把q些产品形成一U相Ҏ说比较独立通用的一个库Qƈ提供相应的访问接口。这P来多的h׃dҎ的用它Q而且q样可以真正的培d发h员尤其学生的软g产品意识?#8221; AMDl盟ARM, 横跨x86和ARM架构Q?/strong> 目前的芯片市场,实际上是有两大芯片阵营,ARM与x86两大阵营在博弈。在手机出现之前Q是通用处理器的天下Q这U通用处理器包括ARM、x86。实际上更多领域用的q是通用处理器,通用处理器时代,CPU的设计是个门槛,军_q个公司的成败。但随着手机和移动互联的大量实现Q决定这个公司的未来是是否具有设计CPU以及设计多核CPU的能力?/p>
“通用处理器的设计已经不再是门槛了Q因为ARM已经把整个CPU体系帮你设计完成了。第二,Intel的x86处理器通用处理器也׃开始受C机的云应用的影响。用户会问,问什么要用通用处理器来做这U非通用的应用?l我一个理由,q会是一个很大的问题?#8221;从技术层面,q背后其实系l和产品设计日益差异化需求的问题。?/p>
在未来的CPU发展势上也许我们可以看到几个趋势:一、像Facebook、Google已经把精力放在整个架构上Q希望他们自q服务器作业标准化Q个性定制化Q开发化Q所谓的标准化就是说不需要限定在某种通用处理器,而是需要针对自己应用和pȝ架构构徏专属pȝ。二、在Ud领域Q芯片设计的势是从通用处理器到SoCQ而从SoC又逐渐是往专属领域有独特要求的处理器演变。这U情况下Q生产通用处理器的公司会受到非帔R常大的挑战,那么来的局面会是,M一个行业里面的M一个公司所生出来的芯片不会是万能的,应该是在本行业里有独特的特点Q符合行业的势和需求。比如做手机的核心一定是通信功能Q做游戏的核心一定是游戏的引擎,做服务器的核心一定是数据处理能力和带宽和在某个领域具有处理特定需求的能力?/p>
“AMD对于GPU的发展技术上有很独创的见解,在游戏以及图形图像处理上非常的专注,所以这是AMD能够走SoC和将来走可定制化专用服务器领域的一个信?#8221;Q楚含进表示?/p>
可以看到Q目前x86上很多的开源项目是集成在服务器领域里面Q而传l的ARM则是集中在手机领域。两者本质的区别是x86的开源是集中在通用处理器上Q而ARM在完善了Z以linux内核为核心的一套开源系l之后,更多的会布置在专用的领域上,比如ZARM的多媒体应用、基于ARM的编译器Q以及很多开源项目。随着开源的目来多Q在q个领域׃形成一定的技术门槛,其是Y件技术门槛,所以x86面的问题就是开发者ؓ什么要用通用处理器去做非通用的事情。在q种大的背景下,如果所有的开源都是ؓ通用服务的话Qؓ什么还要用通用的Y件去搭徏一个需要特定处理能力的q_Q所以在目标不一致、指导思想不一致的情况下,研发人员在做开源项目的整个方向׃一栗D个例子,比如开源项目UbuntuQ它在PC上的用户体验与在手机上完全不一P虽然都是同一套LinuxQ都是开源搭出来的。它桌面的Xwindowpȝ都已l不再用在手Z了。如果你把Xwindow攑֜手机上,你所产生的成本,以及所占用的资源都会是很大的。那么在未来QARM服务器和手机更交融的情况来看QARM和x86两种开源社Z会出C融的情况Q这U交融会带来更多独创的开源项目。比如在ARM上运行的底层软gQ能不能实时的在x86上运行,x86上运行的软g能不能不改动M代码放到手Zq行Q现在已l有一些好的开源项目在开始做了,比如LLVM目?/p>
ARM和x86在服务器市场的争夺将愈演愈烈 另一个值得x的领域在于服务器Q标志性的事g是,以Facebook、百度ؓ首的互联|企业已l在服务器端开始大量采用ARM架构作ؓ存储服务器?/p>
ҎQ楚含进认ؓQ如果把web接入、存储服务器{高q发但轻量应用作ؓ当前云计重要的落地形式Q则云计反而是ARM服务器在服务器的主要切入炏V而在大数据、科学计等领域QARM要走的\很长。毕竟通用处理器在高性能计算Q尤其是密集型计中q是占有得天独厚的优势,包括其Y件。但qƈ不妨大家看刎ͼ在移动终端硬件竞争和服务器硬件竞争上面,实际上服务器q是属于蓝v?/p>
“癑ֺ用ARM不完全是Zh的考虑Q而是Z未来癑ֺ把自q软g按照专属领域的业务特点然后来配备相应的硬件而做的规划,q种规划会自己从供应链、Y件、硬件的生态系l当中变得标准化和开放,同时也会降低整个的成本。毕竟百度是以Y件ؓ生存的一个公司,而ARM的服务器也只是有限的部v在在癑ֺ的某些服务领域,占很的一部分?#8221; 那么未来服务器芯片领域的格局是什么呢Q以前服务器领域传统的格局只会是HP、DELL、IBMq些公司Q而ARM服务器的出现会得芯片公司有Z在设计服务器Q或者说是类服务器的技术门槛降低。因为原来只能在x86服务器上做的东西现在有可能用低成本的ARM服务器来替代。而对于芯片厂商来_会许多原来认ؓ“在x86领域做服务器门槛很高”的企业进入这个领域。这也对以前老牌的服务器厂家提出了巨大的挑战Q也是说他如何去面对现在终端和云端q种怺的格局下能够定位自q产品。第二,在移动端Q有着很深厚背景的公司Q比如某些移动芯片制造公司,他们q入服务器领域也是有可能的,因ؓ他们本n对ARM的技术ƈ不缺乏,而且对自己所做的业务也很熟悉QY件能力也很成熟,唯一~Z的是刉服务器芯片的一颗芯。其实,很多公司已经刉出了具有服务器功能的ARM架构芯片Q可是我们要看到Q这q不代表他们能够刉出真正意义上的ZARM服务器和打造完整的ARM服务器Y件生态系l?/p>
“很多ARM的服务器要考虑的不仅仅是功能上的,q有背板ȝ、内存技术、主板布|技术、电源布|技术等Q这都是做服务器厂家和做Ud端厂家不同的地方。现在ARM的服务器刚刚开始,原来的服务器一家独大的场面会逐渐变得市场l分Q会使更多的芯片厂商q入服务器领域中来尝试走qUv到另外一个蓝领域中扩大自己的阵营,AMD是有限的h刉服务器芯片和打造服务器生态链的基因的公司Q这一Ҏ其他厂家无可比拟的,对于AMD 的ARM服务器未来一定会引v产业的格局变化” 从公司的长远技术趋势来看,AMD肯定不会攑ּx86的;ARM短期内在U学计算{高性能领域可能不大有很好的作ؓQ因为其指o集架构和应用生态系l不是完全ؓq方面服务的。那么AMDZARM的异构和x86的异构在未来会不会在高性能领域成ؓd呢? 楚含q表C,未来ZAPU的服务器Q不是ARM异构q是x86异构Q一定会为高性能领域带来非常非常重大的媄响,会在很多在非l构化数据处理方面能够生非常深的媄响。因为在现在大数据的前提下,一些非l构化数据的处理Q有的时候不能完全靠CPU的处理能力,要靠GPU和CPU的协同处理能力才能更好的有效的完成。目前中国有很多客户对异构服务器都非常感兴趣。而其实APU服务器的出现Qƈ不是单的CPU和GPU的合成,而是整个pȝ框架的变化,是主板布局的变化,最重要的是业务模型Q编E模型的变化Q整个业务的部v也会随着在不同别服务器的部|生很大的变化。这些都会ؓ业界带来很好的机会。至于下一代高性能计算的趋势,我认Z是简单的CPU的编E或是GPU的编E,而是要看业务Q而且业务应该是与云计绑定在一L。开发h员与业务人员会去考虑是单U的利用CPUq是异构服务器?/p>
而在高性能计算领域QGPU现在q是作ؓCPU的协作处理器存在Q通过PCIE传输数据Q对异构计算而言Q这g是一个严重的瓉?/p>
楚含q认为,GPU现在有两个问题。第一Q硬件瓶颈问题,是GPU与CPU之间的通讯和数据搬q造成成性能功耗的问题。第二,GPU作ؓ一个协处理器或者将来作Z个可~程处理器,如何让用hҎ~程Q这是GPU如何作ؓ通用处理器的W二个瓶颈?/p>
“AMD目前做了两g事情Q公司的大策略是低功耗,包括嵌入式,所做的一切都是ؓ了低功耗。APU实际上是把CPU和GPUl合h做了一个架构叫做Heterogeneous System Architecture(HSA)Q这是一个异构的架构。目前LG、三星、高通都已经和AMD在加入HSA基金会之力于异构pȝl构的标准化Q涵盖服务器l端到桌面的领域。这个架构最大的解决了两个问题,W一Q把CPU与GPUq行更紧密的l合Q不仅在实际上减了数据在CPU和GPU之间传输时生的功耗,更对很多E序来说是莫大的帮助Q第二,我们在HSA上ؓGPU开发出一套非常容易让高层的编E语a人员能够使用的工Pq个工具不用太多的考虑GPU里专有的~程语言。我们立于希望q些开发h员利用这U工兯够对自己的业务了解即可,而不用考虑GPUQ而最l把GPU变成通用~程的模型。ؓ了做到这一点,我们提供了HSA~译工具、可调式的工兗基于开源的中间件?#8221; “在未来,我们真正的基于HSA的APU产品出来之后Q你会看到对GPU的编E模型会d的改变。因为在CPU和GPU的通讯架构上做了很d的改变,而得CPU和GPU的数据的传输可以不通过内存拯Q这也就辑ֈ了省电和低功耗的目的。AMD把这U技术作为长的发展Q这U技术会用在我们的服务器领域Q也会用在未来的PC机领域,同时也会用到低功耗的产品领域?#8221;同时不要忘了Q当我们说异构,不单单是指GPU和CPUQAMD的APU的SoC内同旉成了如入视频~码Q解码,音频处理Q内容安全等专用的处理模块,同时提供特定的编E接口,q也是异构的表现?/p>
l开发h员的Q如何避免同质化开发? 在中国,好的开发h员非常多Q这一点从异构大赛可以看出Q有些品的创意Q性能和应用领域都非常有商业和学术价|好的产品规划师也很多。但是中国做出来的品同质化非常严重Q针Ҏ一应用领域做出自己专属产品的框架前提的指导下,以前只要掌握~程可能p开发出应用Q但是现在就不一样了。楚含进认ؓQ对目前的中国Y件开发h员而言Q目前的市场大环境对他们提出了几个方面的需求: 首先Q架构h员应该有全局观,不但要对业务领域有所熟悉Q而且更需要拓展与此专业领域相关的知识领域Q要惛_法利用现有的各种技术来时自׃品在性能Q特性生差异化和提高技术门槛,从硬Ӟ软gQ算法,性能l合考虑Q而不是单U吧怸产品功能实现可以。这样就能你们的品变得与众不同?/p>
W二Q要有原创精,培养自己内功Q现在的技术,派太多了,软g人员一辈子也学完,{你学会了这个,l果新的潮流来了Q好像L落伍。有一个例子,大家都去学hadoop, 我问了很多hdHadoopq什么,居然没有几个回答我,只是觉得q个东西很热Q所以去看看Q盲从的心理不会产生好的软g产品。所以我要对自己学习的东西有所判断Q要x新的技术生,Ҏ技术要敏感Q用于尝试。现在的代码E序员太多,思想成员太少了?/p>
最后,对于软g人员Q我特别希望无论你是应用层还是底层的开发h员, 都应该去了解计算Zpȝ构,了解CPU和GPU的方向。CPU和GPU一定是未来g的两大Y件承载核心,所谓先知者先行。以前GPU很多停留在游戏行业,但是随着异构计算的到来,GPU和CPU融合产生应用的变化,很多有前L的软g人员早已开始涉x领域来占领先机。(?谭茂 责编/包研Q?/p> 一?nbsp; CPU+GPU协同计算模式 CPU+GPU异构协同计算集群如图1所C,CPU+GPU异构集群可以划分成三个ƈ行层ơ:节点间ƈ行、节点内CPU与GPU异构q行、设备(CPU或GPUQ内q行。根据这三个层次我们可以得到CPU+GPU异构协同计算模式为:节点间分布式+节点内异构式+讑֤内共享式?/p> 1 节点间分布式 CPU+GPU异构协同计算集群中,各个节点之间的连接与传统CPU集群一P采用|络q接Q因此,节点间采用了分布式的计算方式Q可以采用MPI消息通信的ƈ行编E语a?/p> 2 节点内异构式 CPU+GPU异构协同计算集群中,每个节点上包含多核CPU和一块或多块GPU卡,节点内采用了异构的架构,采用M式的~程模型Q即每个GPU卡需要由CPUq程/U程调用?/p> ׃每个节点上,CPU核数也比较多Q计能力也很大Q因此,在多数情况下QCPU也会参与部分q行计算Q根据CPU是否参与q行计算Q我们可以把CPU+GPU异构协同计算划分成两U计模式: 1) CPU/GPU协同计算QCPU只负责复杂逻辑和事务处理等串行计算QGPU q行大规模ƈ行计; 2) CPU+GPU共同计算Q由一个CPUq程/U程负责复杂逻辑和事务处理等串行计算Q其它CPUq程/U程负责部分ƈ行计,GPU负责大部分ƈ行计?/p> ׃CPU/GPU协同计算模式比CPU+GPU共同计算模式单,下面的介l中Q我们以CPU+GPU共同计算模式Zq行展开介绍各种~程模式?/p> 在CPU+GPU共同计算模式下,我们把所有的CPUl称Z个设备(deviceQ,如双?核CPU共有16个核Q我们把q?6个核l称成一个设备;每个GPU卡成Z个设备。根据这U划分方式,我们可以采用MPIq程或OpenMPU程控制节点内的各设备之间的通信和数据划分?/p> 3 讑֤内共享式 1) CPU讑֤Q每个节点内的所有多核CPU采用了共享存储模型,因此Q把节点内的所有多核CPU看作一个设备, 可以采用MPIq程或OpenMPU程、pThreadU程控制q些CPU核的q行计算?/p> 2) GPU讑֤QGPU讑֤内有自己独立的DRAM存储QGPU讑֤也是׃n存储模型Q在GPU上采用CUDA或OpenCL~程控制GPU众核的ƈ行计。CUDA~程模式只在NVIDIA GPU上支持,OpenCL~程模式在NVIDIA GPU和AMD GPU都支持?/p> Ҏ前面对CPU+GPU异构协同计算模式的描qͼ我们可以得到CPU+GPU异构协同计算的编E模型(以MPI和OpenMPZQ如?所C?/p> ? CPU+GPU异构协同计算架构 ? CPU+GPU异构协同计算~程模型 节点间分布式 节点内异构式 讑֤内共享式 CPU GPU 模式1 MPI OpenMP OpenMP CUDA/OpenCL 模式2 MPI MPI OpenMP CUDA/OpenCL 模式3 MPI MPI MPI CUDA/OpenCL 二?nbsp; CPU+GPU协同计算负蝲均衡性设?/p> 下面以模?Z单介l多节点CPU+GPU协同计算d划分和负载均衡,模式2的进E和U程与CPU核和GPU讑֤对应关系如图2所C。若采用M式MPI通信机制Q我们在节点0上多起一个进E(0可E)作ؓ主进E,控制其它所有进E。每个节点上启动3个计进E,其中两个控制GPU讑֤Q一个控制其余所有CPU核的q行Q在GPU内采用CUDA/OpenCLq行Q在CPU讑֤内采用OpenMP多线Eƈ行?/p> ׃CPU+GPU协同计算模式分ؓ3个层ơ,那么负蝲均衡性也需要在q?个层ơ上分别设计。在模式2的编E方式下Q节点内和节炚w均采用MPIq程Q合二ؓ一Q设计负载均衡时Q只需要做到进E间Q设备之_的负载均衡和CPU讑֤内OpenMPU程负蝲均衡、GPU讑֤内CUDAU程负蝲均衡卛_?/p> 对于讑֤内,采用的是׃n存储器模型,CPU讑֤上的OpenMPU程可以采用schedule(static/ dynamic/ guided )方式QGPU讑֤上只要保证同一warp内的U程负蝲均衡卛_?/p> 对于CPU+GPU协同计算Q由于CPU和GPU计算能力相差很大Q因此,在对d和数据划分时不能lCPU讑֤和GPU讑֤划分相同的Q?数据量,q就增加了CPU与GPU讑֤间负载均衡的隑ֺ。CPU与GPU之间的负载均衡最好的方式是采用动态负载均衡的ҎQ然而有些应用无法用动态划分而只能采用静态划分的方式。下面我们分别介l动态划分和静态划分?/p> 1) 动态划分:对于一些高性能计算应用E序Q在CPU与GPU之间的负载均衡可以采用动态负载均衡的优化ҎQ例如有N个Q?数据Q一个节点内?个GPU卡,即三个设备(CPU?个GPUQ,动态负载均衡的Ҏ是每个设备先获取一个Q?数据q行计算Q计之后立卌取下一个Q务,不需要等待其他设备,直到N个Q?数据计算完成。这U方式只需要在集群上设定一个主q程Q负责给各个计算q程分配d/数据?/p> 2) 静态划分:在一些应用中Q无法采用动态划分的方式Q需要静态划分方法,然而静态划分方法异构讑֤间的负蝲均衡变得困难Q有时甚x法实现。对于一些P代应用程序,我们可以采用学习型的数据划分ҎQ如先让CPU和GPU分别做一ơ相同计量的计,然后通过各自的运行时间计出CPU与GPU的计能力比例,然后再对数据q行划分?/p> ? CPU+GPU协同计算C意图(以每个节?个GPUZQ?/p> 三?nbsp; CPU+GPU协同计算数据划分CZ 假设某一应用的数据特点如?所C,从输出看Q结果中的每个值的计算需要所有输入数据的信息Q所有输出值的计算之间没有M数据依赖性,可以表示成outj=Q从输入看,每个输入值对所有的输出值都产生影响Q所有输入数据之间也没有M数据依赖性。从数据特点可以看出Q该应用既可以对输入q行q行数据划分也可以对输出q行数据划分。下面我们分析CPU+GPU协同计算时的数据划分方式?/p> ? q行数据CZ 1 按输入数据划?/p> 假设按输入数据划分,我们可以采用动态的方式l每个CPU或GPU讑֤分配数据Q做到动态负载均衡,然而这U划分方式,使所有的U程向同一个输Z|保存结果,Z正确性,需要所有的U程Ҏ个结果进行原子操作,q样会严重影响性能Q极端情况下Q所有线E还是按序执行的。因此,q种方式效果很差?/p> 2 按输出数据划?/p> 按输出数据划分的话可以让每个U程做不同位|的l果计算Q计完全独立,没有依赖性。如果采用静态划分的方式Q由于CPU和GPU计算能力不同Q因此,很难做到负蝲均衡。采用动态的方式可以做到负蝲均衡Q即把结果每ơ给CPU或GPU讑֤一块,当设备计完本次之后Q立卛_主进E申请下一个分块,q样可以做到完全负蝲均衡。按输出数据划分Q无论采用静态划分还是动态划分,都会带来另外一个问题,׃每个l果的计都需要所有输入信息,那么所有进E(讑֤Q都需要读取一遍所有输入数据,动态划分时q不只一ơ,其对于输入数据很大Ӟq将会对输入数据的IO产生很大的媄响,很有可能使IOE序性能瓉?/p> 3 按输入和输出同时划分 ׃按输入或按输出划分都存在不同的缺点,我们可以采用输入和输出同时划分的方式q行数据划分Q如?所C?/p> 从输度,让所有的计算q程Q设备)都有一份计结果,讑֤内的U程对结果进行ƈ行计,每个讑֤都有一份局部的计算l果Q所有设备都计算完毕之后Q利用MPIq程Ҏ有设备的计算l果q行规约Q规U最后的l果x最l的l果?/p> 从输入角度,按输入数据动态划分给不同的计进E(讑֤Q,q样可以满所有的计算q程负蝲均衡?/p> ? CPU+GPU协同计算数据划分CZ
http://mobile.51cto.com/android-220033_1.htm
在一个Android应用中,主要是由四种lgl成的,q四U组件可参?#8220;Android应用的构?#8221;?/span>
而这四种lg是独立的Q它们之间可以互相调用,协调工作Q最l组成一个真正的Android应用?/span>
在这些组件之间的通讯中,主要是由Intent协助完成的?/span>
Intent负责对应用中一ơ操作的动作、动作涉及数据、附加数据进行描qͼAndroid则根据此Intent的描qͼ负责扑ֈ对应的组Ӟ?Intent传递给调用的组Ӟq完成组件的调用?/span>
因此QIntent在这里v着一个媒体中介的作用Q专门提供组件互相调用的相关信息Q实现调用者与被调用者之间的解耦?/span>
例如Q在一个联pMhl护的应用中Q当我们在一个联pMh列表屏幕(假设对应的Activity为listActivity)上,点击某个联系人后Q希望能够蟩出此联系人的详细信息屏幕(假设对应的Activity为detailActivity)
Z实现q个目的QlistActivity需要构造一?IntentQ这个Intent用于告诉pȝQ我们要?#8220;查看”动作Q此动作对应的查看对象是“某联pMh”Q然后调用startActivity (Intent intent)Q?/span>
构造的Intent传入Q系l会Ҏ此Intent中的描述Q到ManiFest中找到满xIntent要求的ActivityQ系l会调用扑ֈ?ActivityQ即为detailActivityQ最l传入IntentQdetailActivity则会Ҏ此Intent中的描述Q执行相应的操作?/span>
一、抽象描q要描述什?/strong>
在Android参考文中Q对Intent的定义是执行某操作的一个抽象描q?实很抽?。我们先来看看这里的抽象描述Q到底描qC什么?/span>
首先Q是要执行的动作(action)的一个简要描qͼ如VIEW_ACTION(查看)、EDIT_ACTION(修改){,Android为我们定义了一套标准动作:
MAIN_ACTION
VIEW_ACTION
EDIT_ACTION
PICK_ACTION
GET_CONTENT_ACTION
DIAL_ACTION
CALL_ACTION
SENDTO_ACTION
ANSWER_ACTION
INSERT_ACTION
DELETE_ACTION
RUN_ACTION
LOGIN_ACTION
CLEAR_CREDENTIALS_ACTION
SYNC_ACTION
PICK_ACTIVITY_ACTION
WEB_SEARCH_ACTION
此外Q我们还可以Ҏ应用的需要,定义我们自己的动作,q可定义相应的Activity来处理我们的自定义动作?/span>
其次Q是执行动作要操作的数据QdataQ,Android中采用指向数据的一个URI来表C,如在联系人应用中Q一个指向某联系人的URI可能为:content://contacts/1?/span>
q种URI表示Q通过 ContentURIq个cL描述Q具体可以参考android.net.ContentURIcȝ文?/span>
以联pMh应用ZQ以下是一些action / data对,及其它们要表辄意图Q?/span>
VIEW_ACTION content://contacts/1-- 昄标识Wؓ"1"的联pMh的详l信?/span>
EDIT_ACTION content://contacts/1-- ~辑标识Wؓ"1"的联pMh的详l信?/span>
VIEW_ACTION content://contacts/-- 昄所有联pMh的列?/span>
PICK_ACTION content://contacts/-- 昄所有联pMh的列表,q且允许用户在列表中选择一个联pMhQ然后把q个联系回给父activity。例如:电子邮g客户端可以用这个IntentQ要求用户在联系人列表中选择一个联pMh
另外Q除了action和dataq两个重要属性外Q还有一些附加属性:
categoryQ类别)Q被执行动作的附加信息。例?LAUNCHER_CATEGORY 表示Intent 的接受者应该在Launcher中作为顶U应用出玎ͼ而ALTERNATIVE_CATEGORY表示当前的Intent是一pd的可选动作中的一个,q些动作可以在同一块数据上执行?/span>
typeQ数据类型)Q显式指定Intent的数据类型(MIMEQ。一般Intent的数据类型能够根据数据本w进行判定,但是通过讄q个属性,可以强制采用昑ּ指定的类型而不再进行推对{?/span>
componentQ组ӞQ指定Intent的的目标lg的类名称。通常 Android会根据Intent 中包含的其它属性的信息Q比如action、data/type、categoryq行查找Q最l找C个与之匹配的目标lg。但是,如果 componentq个属性有指定的话Q将直接使用它指定的lgQ而不再执行上q查找过E。指定了q个属性以后,Intent的其它所有属性都是可选的?/span>
extrasQ附加信息)Q是其它所有附加信息的集合。用extras可以为组件提供扩展信息,比如Q如果要执行“发送电子邮?#8221;q个动作Q可以将电子邮g的标题、正文等保存在extras里,传给电子邮g发送组件?/span>
MQaction?data/type、category和extras 一起Ş成了一U语a?/span>
q种语言使系l能够理解诸?#8220;查看某联pMh的详l信?#8221;之类的短语?/span>
随着应用不断的加入到pȝ中,它们可以d新的action?data/type、category来扩展这U语a?/span>
应用也可以提供自qActivity来处理已l存在的q样?#8220;短语”Q从而改变这?#8220;短语”的行为?/span>
二、Android如何解析Intent
在应用中Q我们可以以两种形式来用IntentQ?/span>
直接IntentQ指定了component属性的Intent(调用setComponent(ComponentName)或者setClass(Context, Class)来指?。通过指定具体的组件类Q通知应用启动对应的组件?/span>
间接IntentQ没有指定comonent属性的Intent。这些Intent需要包含够的信息Q这Ll才能根据这些信息,在在所有的可用lg中,定满此Intent的组件?/span>
对于直接IntentQAndroid不需要去做解析,因ؓ目标lg已经很明,Android需要解析的是那些间接IntentQ通过解析Q将 Intent映射l可以处理此Intent的Activity、IntentReceiver或Service?/span>
Intent解析机制主要是通过查找已注册在AndroidManifest.xml中的所有IntentFilter及其中定义的IntentQ最l找到匹配的Intent。在q个解析q程中,Android是通过Intent的action、type、categoryq三个属性来q行判断的,判断Ҏ如下Q?/span>
如果Intent指明定了actionQ则目标lg的IntentFilter的action列表中就必须包含有这个actionQ否则不能匹?
如果Intent没有提供typeQ系l将从data中得到数据类型。和action一P目标lg的数据类型列表中必须包含Intent的数据类型,否则不能匚w?/span>
如果Intent中的数据不是content: cd的URIQ而且Intent也没有明指定它的typeQ将ҎIntent中数据的scheme (比如 http: 或者mailto: ) q行匚w。同上,Intent 的scheme必须出现在目标组件的scheme列表中?/span>
如果Intent指定了一个或多个categoryQ这些类别必d部出现在l徏的类别列表中。比如Intent中包含了两个cdQLAUNCHER_CATEGORY ?ALTERNATIVE_CATEGORYQ解析得到的目标lg必须臛_包含q两个类别?/span>
三、应用例?br style="word-wrap: break-word;" />
以下Q以Android SDK中的便笺例子来说明,Intent如何定义及如何被解析。这个应用可以让用户览便笺列表、查看每一个便W的详细信息?nbsp;
复制代码
例子中的W一个Activity是com.google.android.notepad.NotesListQ它是应用的d口,提供了三个功能,分别׃?intent-filterq行描述Q?/span>
1、第一个是q入便笺应用的顶U入口(action为android.app.action.MAINQ。类型ؓandroid.app.category.LAUNCHER表明q个Activity在Launcher中列出?/span>
2、第二个是,当type为vnd.android.cursor.dir/vnd.google.noteQ保存便W录的目录Q时Q可以查看可用的便笺Qaction为android.app.action.VIEWQ,或者让用户选择一个便Wƈq回l调用者(action?android.app.action.PICKQ?/span>
3、第三个是,当type为vnd.android.cursor.item/vnd.google.noteӞq回l调用者一个用户选择的便W(action为android.app.action.GET_CONTENTQ,而用户却不需要知道便WZ哪里d的。有了这些功能,下面?Intent׃被解析到NotesListq个activityQ?/span>
{ action=android.app.action.MAIN }Q与此Intent匚w的ActivityQ将会被当作q入应用的顶U入口?/span>
{ action=android.app.action.MAIN, category=android.app.category.LAUNCHER }Q这是目前Launcher实际使用?IntentQ用于生成Launcher的顶U列表?/span>
{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes }Q?/span>
昄"content://com.google.provider.NotePad/notes"下的所有便W的列表Q用者可以遍历列表,q且察看某便W的详细信息?/span>
{ action=android.app.action.PICK data=content://com.google.provider.NotePad/notes }Q?/span>
昄"content://com.google.provider.NotePad/notes"下的便笺列表Q让用户可以在列表中选择一个,然后选择的便W的 URLq回l调用者?/span>
{ action=android.app.action.GET_CONTENT type=vnd.android.cursor.item/vnd.google.note }Q和上面的action为pick的IntentcMQ不同的是这个Intent允许调用者(在这里指要调用NotesList的某?ActivityQ指定它们需要返回的数据cdQ系l会Ҏq个数据cd查找合适的 ActivityQ在q里pȝ会找到NotesListq个ActivityQ,供用户选择便笺?/span>
W二个Activity是com.google.android.notepad.NoteEditorQ它为用hCZ条便W,q且允许 用户修改q个便笺?/span>
它定义了两个intent-filterQ所以具有两个功能?/span>
W一个功能是Q当数据cd?vnd.android.cursor.item/vnd.google.noteӞ允许用户查看和修改一个便{(action?android.app.action.VIEW和android.app.action.EDITQ?/span>
W二个功能是Q当数据cd?vnd.android.cursor.dir/vnd.google.noteQؓ调用者显CZ个新ZW的界面Qƈ新建的便笺插入CW列表中Qaction为android.app.action.INSERTQ?/span>
有了q两个功能,下面的Intent׃被解析到NoteEditorq个activityQ?/span>
{ action=android.app.action.VIEW data=content://com.google.provider.NotePad/notes/{ID}} Q向用户昄标识?ID的便W?/span>
{ action=android.app.action.EDIT data=content://com.google.provider.NotePad/notes/{ID}}Q允许用L辑标识ؓID的便W?/span>
{ action=android.app.action.INSERT data=content://com.google.provider.NotePad/notes }Q在“content://com.google.provider.NotePad/notes”q个便笺列表中创Z个新的空便笺Qƈ允许用户~辑q个便签。当用户保存q个便笺后,q个CW的URI会q回l调用者?/span>
最后一个Activity是com.google.android.notepad.TitleEditorQ它允许用户~辑便笺的标题?/span>
它可以被实现Z个应用可以直接调用(在Intent中明设|component属性)的类Q不q这里我们将Z提供一个在现有的数据上发布可选操作的Ҏ?/span>
在这?Activity的唯一的intent-filter中,拥有一个私有的actionQ?com.google.android.notepad.action.EDIT_TITLEQ表明允许用L辑便W的标题?/span>
和前面的view和edit 动作一P调用q个Intent 的时候,也必L定具体的便笺Qtype为vnd.android.cursor.item/vnd.google.noteQ。不同的是,q里昄和编辑的只是便笺数据中的标题?/span>
除了支持~省cdQandroid.intent.category.DEFAULTQ,标题~辑器还支持另外两个标准cdQ?android.intent.category.ALTERNATIVE?/span>
android.intent.category.SELECTED_ALTERNATIVE?/span>
实现了这两个cd之后Q其?Activity可以调用queryIntentActivityOptions(ComponentName, Intent[], Intent, int)查询q个Activity提供的actionQ而不需要了解它的具体实玎ͼ
或者调用addIntentOptions(int, int, ComponentName, Intent[], Intent, int, Menu.Item[])建立动态菜单。需要说明的是,在这个intent-filter中有一个明的名称Q通过android:label= "@string/resolve_title"指定Q,在用h览数据的时候,如果q个Activity是数据的一个可选操作,指定明确的名U可以ؓ用户提供一个更好控制界面?/span>
有了q个功能Q下面的Intent׃被解析到TitleEditorq个ActivityQ?/span>
{ action=com.google.android.notepad.action.EDIT_TITLE data=content://com.google.provider.NotePad/notes/{ID}}Q显Cƈ且允许用L辑标识ؓID的便W的标题?/span>
]]>
]]>
一?span href="tools/ajax.aspx?t=topicswithsametag&tagid=819" style="word-wrap: break-word; border-bottom-width: 1px; border-bottom-style: solid; border-bottom-color: #ff0000; cursor: pointer; white-space: nowrap;">Handler的定?
主要接受?/span>U程发送的数据, q用此数据配合主U程更新UI.
解释: 当应用程序启动时Q?/span>Android首先会开启一个主U程 (也就是UIU程) , ȝEؓ理界面中的UI控gQ进行事件分? 比如? 你要是点M?Button ,Android会分发事件到Button上,来响应你的操作?nbsp; 如果此时需要一个耗时的操作,例如: 联网d数据Q?nbsp; 或者读取本地较大的一个文件的时候,你不能把q些操作攑֜ȝE中Q,如果你放在主U程中的话,界面会出现假ȝ? 如果5U钟q没有完成的话,Q会收到Androidpȝ的一个错误提C?nbsp; "强制关闭". q个时候我们需要把q些耗时的操作,攑֜一个子U程?因ؓ子线E涉及到UI更新Q,AndroidȝE是U程?/span>安全的,也就是说Q更新UI只能在主U程中更斎ͼ子线E中操作是危险的. q个时候,Handler出C.,来解册个复杂的问题 , ׃Handlerq行在主U程?UIU程?, 它与子线E可以通过Message对象来传递数? q个时候,Handler承担着接受子线E传q来?子线E用sedMessage()Ҏ传弟)Message对象Q?里面包含数据) , 把这些消息放入主U程队列中,配合ȝE进行更新UI?/span>
二、Handler一些特?/strong>
handler可以分发Message对象和Runnable对象CU程? 每个Handler实例,都会l定到创Z的线E中(一般是位于ȝE?,
它有两个作用: (1): 安排消息或Runnable 在某个主U程中某个地Ҏ? (2)安排一个动作在不同的线E中执行
Handler中分发消息的一些方?/span>
post(Runnable)
postAtTime(Runnable,long)
postDelayed(Runnable long)
sendEmptyMessage(int)
sendMessage(Message)
sendMessageAtTime(Message,long)
sendMessageDelayed(Message,long)
以上postcL法允怽排列一个Runnable对象CU程队列?
sendMessagecL? 允许你安排一个带数据的Message对象到队列中Q等待更?
三、Handler实例
(1) 子类需要承Hendlerc,q写handleMessage(Message msg) Ҏ, 用于接受U程数据
以下Z个实例,它实现的功能?: 通过U程修改界面Button的内?/span>
]]>嵌入式linux入门学习规划
嵌入式Linux操作pȝ及其上应用Y件开发目标:
Q?Q?nbsp;掌握L嵌入式微处理器的l构与原理(初步定ؓ arm9Q?
Q?Q?nbsp;必须掌握一个嵌入式操作pȝ Q初步定为uclinux或linux,版本待定Q?nbsp;
Q?Q?nbsp;必须熟悉嵌入式Y件开?程q至做一个嵌入式软g目?nbsp;
从事嵌入式Y件开发的好处是:
Q?Q目前国内外q方面的人都很稀~。这一领域入门门槛较高Q所以非 专业IT人员很难切入q一领域Q另一斚wQ是因ؓq一领域较新Q目前发展太快,大多Ch无条件接触?nbsp;
Q?Q与企业计算{应用Y件不同,嵌入式领 域h才的工作强度通常低一些(但收入不低)?nbsp;
Q?Q哪天若惛_业,搞自已的产品Q嵌入式不像应用软g那样Ҏ被盗版。硬件设计一般都是请其它?司给订做Q这?#8220;贴牌”QOEMQ,都是通用的硬Ӟ我们只管设计软g变成自q产品了?nbsp;
Q?Q兴所在,q是最主要的?nbsp;
从事嵌入 式Y件开发的~点是:
Q?Q入门v点较高,所用到的技术往往都有一定难度,若Yg基础不好Q特别是操作pȝUY件功底不深,则可能不适于?行?nbsp;
Q?Q这斚w的企业数量要q少于企业计类企业?nbsp;
Q?Q有数公司l常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多 数公怹q无此要求,只要有经验即可?nbsp;
Q?Q^C托强Q换q_比较辛苦?nbsp;
兴趣的由来:
1、成功观念不同,不虚度此生,?是我的成功?nbsp;
2、喜Ƣ思考,挑战逻辑思维?nbsp;
3、喜ƢC
C是一U能发挥思维极限的语a。关于C的精的一些方面可以被概述?短句如下Q?nbsp;
怿E序员?nbsp;
不要LE序员做那些需要去做的?nbsp;
保持语言短小_ֹ?nbsp;
一U方法做一个操作?nbsp;
?得它q行的够快,管它ƈ不能保证是可移植的?nbsp;
4、喜Ƣ底层开发,讨厌vbcd发工Pq不是说vb不好Q?nbsp;
5、发展前景好Q适合 创业Q不惌pM的时候还是一个工E师?nbsp;
Ҏ步骤Q?nbsp;
1、基知识Q?nbsp;
目的Q能看懂g工作原理Q但重点在嵌入式软gQ特 别是操作pȝUYӞ那将是我的优ѝ?nbsp;
U目Q数字电路、计机l成原理、嵌入式微处理器l构?nbsp;
汇编语言、C/C++、编译原理、离?数学?nbsp;
数据l构和算法、操作系l、Y件工E、网l、数据库?nbsp;
ҎQ虽U目众多Q但都是较简单的基础Q且大部分已掌握。不一定全学,?Ҏ需要选修?nbsp;
L书籍Qthe c++ programming languageQ一直没旉读)、数据结?C2?nbsp;
2?学习linuxQ?nbsp;
目的Q深入掌握linuxpȝ?nbsp;
ҎQ用linux—〉linxupȝ~程开?#8212;〉驱动开发和分析 linux内核。先看深Q那主讲原理。看几遍后,看情景分析,对照qQ两本交叉,深是UԌ情是目。剖析则?.11版,适合学习。最后深入代码?nbsp;
?Mc:linux内核完全剖析、unix环境高~程、深入理解linux内核、情景分析和源代?nbsp;
3、学习嵌入式linuxQ?nbsp;
?的:掌握嵌入式处理器其及pȝ?nbsp;
ҎQ(1Q嵌入式微处理器l构与应用:直接arm原理及汇~即可,不要重复x86?nbsp;
Q?Q嵌 入式操作pȝc:ucOS/II单,开源,可供入门。而后深入研究uClinux?nbsp;
Q?Q必L块开发板Qarm9以上Q,有条件可?加培训(q步快,能认识些朋友Q?nbsp;
L书籍Q毛h的《嵌入式pȝ》及其他arm9手册与arm汇编指o{?nbsp;
4、深?学习Q?nbsp;
A、数字图像压~技术:主要是应掌握MPEG、mp3{编解码法和技术?nbsp;
B、通信协议及编E技术:TCP/IP 协议?02.11QBluetoothQGPRS、GSM、CDMA{?nbsp;
C、网l与信息安全技术:如加密技术,数字证书CA{?nbsp;
D、DSP技术:Digital Signal ProcessQDSP处理器通过g实现数字信号处理法?nbsp;
说明Q太多细节未说明Q可Ҏ实际情况调整。重点在??Q不必完全按照顺序作。对于学习c++Q理由是c++不只是一U语aQ一U工P她还是一 U艺术,一U文化,一U哲学理c但不是拿来炫耀得东ѝ对于linux内核Q学习编E,M些优U代码也是有必要的?nbsp;
注意Q 要学?举一反多Q有强大的基Q很多东西简单看看就能会。想成ؓ合格的程序员Q前提是必须熟练臛_一U编E语aQƈh良好的逻辑思维。一定要理论l合实践?nbsp;
不要一味钻研技术,虽然挤出旉是很隑ց到的Q但q是要留点余地去完善其他的爱好,比如宇宙Q素描、机械、管理,心理学、游戏、科qȝ影。还有一些不 愿意做但必须要做的!
技术是通过~程~程在编E编出来的。永q不要梦想一步登天,不要做Qw的人,不要觉得路途O上。而是要编E编E在~?E,完了在编E,在编E!{机会来了在创业Q不要相信有奇迹发生Q盲目创业很难成功,即便成功了发展空间也不一定很大)?nbsp;
嵌入?书籍推荐
Linux基础
1、《Linux与Unix Shell ~程指南?nbsp;
C语言基础
1、《C Primer PlusQ?th Edition》【美】Stephen Prata着
2?《The C Programming Language, 2nd Edition》【美?Brian W. Kernighan David M. RithieQK & RQ着
3?《Advanced Programming in the UNIX EnvironmentQ?nd Edition》(APUEQ?nbsp;
4、《嵌入式Linux应用E序开发详解?nbsp;
Linux内核
1、《深入理解Linux内核》(W三版)
2、《Linux内核源代码情景分析》毛h 胡希明著
研发方向
1?《UNIX Network Programming》(UNPQ?nbsp;
2、《TCP/IP详解?nbsp;
3、《Linux内核~?E?nbsp;
4、《Linux讑֤驱动开发》(LDDQ
5、《Linux高E序设计?nbsp;杨宗徯
g基础
1、《ARM体系l构与编E》杜春雷着
2、S3C2410 Datasheet
p基础
1、《计?Z通信专业p?nbsp;
pȝ教程
1、《嵌入式pȝ――体系l构、编E与设计?nbsp;
2、《嵌入式pȝ――采用公开 源代码和StrongARM/Xscale处理器》毛h 胡希明着
3?《Building Embedded Linux Systems》
4、《嵌入式ARMpȝ原理与实例开发?nbsp;杨宗徯
理论基础
1、《算法导论?nbsp;
2、《数据结构(C语言版)?nbsp;
3、《计机l织与体pȝ?性能分析?nbsp;
4、《深入理解计机pȝ》【美】Randal E. Bryant David O''Hallaron着
5、《操作系l:_N?设计原理?nbsp;
6、《编译原理?nbsp;
7、《数据通信与计机|络?nbsp;
8、《数据压~原理与应用?nbsp;
C语言书籍推荐
1. The C programming language 《EE序设计语言?nbsp;
2. Pointers on C 《E和指针?nbsp;
3. C traps and pitfalls 《E陷阱与缺陗?nbsp;
可能多的编码,要学好CQ不能只注重C本n。算法,架构方式{都很重要?/span>
]]>
]]>



]]>
]]>
]]>
]]>
]]>