乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      從Java看多核并發(fā)編程的2.0趨勢(shì)

       奶奶熊 2010-02-13

        2.0時(shí)代的軟件空前地活躍在人類生活的方方面面,從而帶來(lái)了更多的計(jì)算量。因此2.0不可避免地對(duì)計(jì)算提出了新的需求、引發(fā)了新的思考,在這其中,多核帶來(lái)的并行計(jì)算和并發(fā)編程無(wú)疑是最為深刻的一點(diǎn)。

        我們都能依稀記得,在2005年Sun發(fā)布了代號(hào)為Tiger的Java 5。在其眾多的特性之中, JVM的改進(jìn)和java.util.concurrent包的出現(xiàn)無(wú)疑非常引人注目。改進(jìn)后的JVM可以使用低層機(jī)器指令取代鎖,精化了互斥訪問(wèn)的粒度,提高了系統(tǒng)的可伸縮性和活性。而concurrent包提供了大量線程和鎖之上的并發(fā)抽象,比如線程池、閉鎖、信號(hào)量、關(guān)卡等。這些可以幫助開(kāi)發(fā)者快速地構(gòu)建出高效、可伸縮的系統(tǒng)來(lái)。就在同一年,還發(fā)生了另一件影響深遠(yuǎn)的事件:AMD首次發(fā)布了其雙核CPU,從而打響了AMD與Intel兩大芯片廠商的多核之爭(zhēng)。

        當(dāng)Java遇到多核

        早在十多年前,IBM、Sun與HP就已經(jīng)設(shè)計(jì)出了雙核處理器,比如IBM于2001年推出的基于雙核的POWER4處理器和Sun的 UltraSPARC芯片,但這些雙核處理器都是用于高端的RISC領(lǐng)域,價(jià)格高昂,被大眾使用的X86并沒(méi)有享受到它帶來(lái)的性能優(yōu)勢(shì)。直到Intel和 AMD相繼推出自己的雙核處理器后,X86領(lǐng)域才算是有了自己的多核架構(gòu)。

        所謂雙核處理器,簡(jiǎn)單地說(shuō)就是在一塊CPU基板上集成兩個(gè)處理器核心,并通過(guò)并行總線將各處理器核心連接起來(lái)。多核并不是一個(gè)新概念,而只是 CMP(Chip Multi Processors,單芯片多處理器)中最基本、最簡(jiǎn)單、最容易實(shí)現(xiàn)的一種類型。其實(shí)在RISC處理器領(lǐng)域,多核都早已經(jīng)實(shí)現(xiàn)。

        多核與單核的區(qū)別在于,前者可以讓程序真正地“同時(shí)”執(zhí)行,而不是多個(gè)進(jìn)程輪流使用CPU,從而給用戶造成“多個(gè)程序正在同時(shí)執(zhí)行”的假象。簡(jiǎn)單地說(shuō),“ 并發(fā)”就是為了讓程序運(yùn)行得更快。在以前,達(dá)到這個(gè)目的的手段通常是依賴CPU時(shí)鐘頻率的提升。然而普通單核心處理器的頻率難于提升,性能沒(méi)有質(zhì)的飛躍。由于頻率難于提升,Intel在發(fā)布3.8GHz的產(chǎn)品以后只得宣布停止4GHz的產(chǎn)品計(jì)劃;而AMD在實(shí)際頻率超過(guò)2GHz以后也無(wú)法大幅度提升,3GHz成為了AMD無(wú)法逾越的一道坎。因此,CPU內(nèi)部開(kāi)始出現(xiàn)了兩個(gè)、四個(gè)甚至更多的內(nèi)核。

        為了充分發(fā)揮每一個(gè)核的效用,應(yīng)用程序需要多個(gè)線程同時(shí)運(yùn)行來(lái)保持CPU核的忙碌。Java可以幫助你在多核系統(tǒng)上構(gòu)建良好的應(yīng)用程序。它可以方便地、相對(duì)便宜地創(chuàng)建線程,這非常重要。如果創(chuàng)建線程的開(kāi)銷比線程完成工作的開(kāi)銷還要大,那么并發(fā)將變得毫無(wú)意義。concurrent包中提供的并發(fā)構(gòu)建塊非常豐富,幾乎覆蓋了所有并發(fā)編程中用到的工具。不僅如此,Java還在快速地演變著,以適應(yīng)更高并發(fā)性系統(tǒng)的構(gòu)建,例如,Java 7中即將加入ForkJoin框架,按照Doug Lea的描述,它專門適用于“>32個(gè)CPU(內(nèi)核)的系統(tǒng)”。

        除了這些API層面的支持外,Java在并發(fā)編程上的底層平臺(tái)上顯得更加野心勃勃,因?yàn)镴ava有自己的存儲(chǔ)模型,這個(gè)存儲(chǔ)模型早在Java 1.1時(shí)代就存在了,盡管當(dāng)時(shí)還不完善,但綷-過(guò)多次修補(bǔ)和改進(jìn),已綷-變得非常成熟了。Java存儲(chǔ)模型可以抹平不同硬件平臺(tái)提供的存儲(chǔ)模型的差異,嚴(yán)格地定義了線程間通訊的規(guī)范。例如,對(duì)于C語(yǔ)言來(lái)說(shuō),相同的代碼在X86和PowerPC上會(huì)有不同的語(yǔ)義。

        細(xì)心的讀者可能注意到,Java不過(guò)是這場(chǎng)變革的一個(gè)突出的代表而已。很多語(yǔ)言都在不同程度上調(diào)整自己,以適應(yīng)2.0計(jì)算時(shí)代對(duì)并發(fā)的需要。在不久,當(dāng)有人問(wèn)C#之父Anders Hejlsberg,“未來(lái)幾年內(nèi)語(yǔ)言的發(fā)展方向在何處”時(shí),Anders表示“要處理好多核的問(wèn)題,并提供一個(gè)更好的并發(fā)模型”。Erlang語(yǔ)言最近也受到越來(lái)越多的關(guān)注,這說(shuō)明人們迫切需要一個(gè)強(qiáng)大而又充分簡(jiǎn)單的工具來(lái)解決并發(fā)編程的挑戰(zhàn)。

        以Java語(yǔ)言為代表的編程語(yǔ)言在面對(duì)并發(fā)時(shí)代所做出的努力是令人激動(dòng)的,但是相比于硬件,軟件的發(fā)展總是滯后的,人們總是等意識(shí)到軟件出現(xiàn)問(wèn)題了才開(kāi)始著手改進(jìn)。2.0時(shí)代的并發(fā)計(jì)算正在向桌面和客戶端轉(zhuǎn)移,但是有多少人做好準(zhǔn)備了?于是有人開(kāi)始驚呼:狼來(lái)了?

        關(guān)于“狼來(lái)了”的討論,最好的結(jié)論就是無(wú)論狼是否真的會(huì)來(lái),羊圈的籬笆仍然都要修理。這里的“籬笆”就是指并發(fā)編程技術(shù)。由于是底層的計(jì)算平臺(tái)正在發(fā)生變化,因此不僅僅是開(kāi)發(fā)者,包括需求分析人員、設(shè)計(jì)者、程序員和測(cè)試者都應(yīng)該在工作時(shí)考慮到并發(fā)帶來(lái)的影響。比如:

        我們經(jīng)常要思考,如何才能獲得一個(gè)最佳的程序粒度,同時(shí)保證它們最大限度地彼此隔離,從而可以簡(jiǎn)單地分配到不同的處理器單元上?線程間通訊的內(nèi)容有哪些?等等。要想很好地回答這些問(wèn)題,僅靠程序員或者設(shè)計(jì)者是不夠的。它需要從獲取需求開(kāi)始,就著力對(duì)任務(wù)進(jìn)行劃分。系統(tǒng)對(duì)于并發(fā)性的要求,很難在開(kāi)發(fā)的中后期通過(guò)“重構(gòu)”來(lái)引入,因此必須在設(shè)計(jì)之初就給予關(guān)注。評(píng)價(jià)軟件有很多標(biāo)準(zhǔn),比如可擴(kuò)展性、模塊化、松耦合等等,今天還要考慮軟件是否有足夠的并發(fā)性,以充分利用底層的計(jì)算資源。它必將成為衡量軟件質(zhì)量的重要標(biāo)準(zhǔn)之一。

        編寫并發(fā)程序需要面對(duì)很多挑戰(zhàn)。尤其是多核的流行,它使程序中可以有多個(gè)線程真正地 “同時(shí)”運(yùn)行。因此開(kāi)發(fā)者要面對(duì)的一個(gè)最大挑戰(zhàn)是劃分任務(wù)。也許你需要對(duì)數(shù)據(jù)進(jìn)行劃分,清晰地識(shí)別出任務(wù)邊界,還要盡可能地讓每個(gè)任務(wù)在執(zhí)行時(shí)只使用自己的數(shù)據(jù)。如果不同的線程要共享數(shù)據(jù),問(wèn)題將迅速變得復(fù)雜。你無(wú)法再像以前那樣,只要等上幾個(gè)月,就可以換上更強(qiáng)勁的處理器,從而讓你的程序運(yùn)行的更快。今天,“免費(fèi)的午餐”已經(jīng)結(jié)束了。能不能把并行化的工作完全交給操作系統(tǒng)和編譯器呢?這是一個(gè)充滿誘惑力的愿景-但是,并行化的工作現(xiàn)在無(wú)法自動(dòng)實(shí)現(xiàn),未來(lái)也只能在一定程度上有所緩解,而不可能全部交由機(jī)器完成。并行化過(guò)程的重點(diǎn)在于分解程序的任務(wù)流和執(zhí)行流,這最終被歸結(jié)為數(shù)學(xué)問(wèn)題——一個(gè)無(wú)解的數(shù)學(xué)問(wèn)題!面對(duì)多核,我們固然不能停止讓機(jī)器變得更聰明的努力,但是對(duì)于大多數(shù)人來(lái)說(shuō),更重要的還是充實(shí)自己的知識(shí)儲(chǔ)備,適應(yīng)新的思維方式,就像當(dāng)年從過(guò)程化編程過(guò)渡到面向?qū)ο缶幊虝r(shí)所做的那樣。

        并發(fā)程序難以開(kāi)發(fā)是事實(shí),同時(shí)測(cè)試與調(diào)試更加困難。因?yàn)椴l(fā)錯(cuò)誤通常更加隱蔽,它們只有在高負(fù)荷和一些特定時(shí)序下才會(huì)出現(xiàn),而且難以再現(xiàn)。因此,并發(fā)程序的測(cè)試需要更多的投入、更好的工具、更精巧的測(cè)試策略。通常,并行程序要對(duì)需要測(cè)試兩個(gè)要點(diǎn):性能與安全性。安全性包括程序是否“做了該做的事”、以及是否“沒(méi)做不該做的事”兩個(gè)方面。而性能是指是否在規(guī)定的時(shí)間里做了正確的事。完整的測(cè)試計(jì)劃應(yīng)該包括:測(cè)試計(jì)劃、單元測(cè)試、代碼審查和靜態(tài)分析等。測(cè)試計(jì)劃應(yīng)該確保后期的測(cè)試行為得以貫徹,同時(shí)還要衆(zhòng)-調(diào)測(cè)試過(guò)程中需要的各種資源。并發(fā)程序測(cè)試的難度遠(yuǎn)遠(yuǎn)高于串行程序測(cè)試。以單元測(cè)試為例,我們幾乎無(wú)法只使用唯一的線程完成并發(fā)測(cè)試,至少需要兩個(gè)線程。然而在JUnit框架,只能識(shí)別其自身的線程,對(duì)于其他線程拋出的斷言失敗或異常,毫無(wú)察覺(jué)。因此,測(cè)試者在編寫時(shí)就要編寫大量衆(zhòng)-調(diào)線程的代碼,這本身就會(huì)帶來(lái)新的bug,更糟糕的是,不良的測(cè)試還會(huì)掩蓋被測(cè)代碼中的錯(cuò)誤。

        并發(fā),釋放2.0的力量

        2.0時(shí)代是軟件空前繁榮的時(shí)代,軟件將幫助越來(lái)越多的人完成越來(lái)越多工作。我們也一直在探討解決2.0時(shí)代的計(jì)算方法。那么,無(wú)限度地提升CPU核的時(shí)鐘頻率或者在一個(gè)CPU內(nèi)加入更多的內(nèi)核,就是2.0時(shí)代的計(jì)算方法了么?不是。2.0時(shí)代的計(jì)算方法不僅要有強(qiáng)勁的計(jì)算硬件做基礎(chǔ),也要有更優(yōu)秀、更復(fù)雜的軟件做后盾。單靠硬件的發(fā)展是無(wú)法滿足計(jì)算量的激增的,軟件也必須做出相應(yīng)的調(diào)整。

        在多核系統(tǒng)上進(jìn)行并發(fā)編程仍然很困難,它不符合人類的思維方式。縱觀計(jì)算機(jī)軟件開(kāi)發(fā)的歷史,總是伴隨著新技術(shù)推出、開(kāi)發(fā)者學(xué)習(xí)消化的旋律。從最早的幾十個(gè)機(jī)器指令,到今天的結(jié)構(gòu)化語(yǔ)言、面向?qū)ο蟆OP--

        2.0時(shí)代的另一個(gè)效應(yīng)是,它把并行計(jì)算和并發(fā)編程擺在了更多的程序員面前。以前,并發(fā)編程還是計(jì)算機(jī)科學(xué)家的專利,很多開(kāi)發(fā)者都將它視為“禁地”。如今,除了復(fù)雜的商業(yè)應(yīng)用和龐大的科學(xué)計(jì)算外,桌面端、各種終端都在逐漸地走向高并發(fā)的運(yùn)行環(huán)境。我們可以學(xué)習(xí)新的技術(shù)、新的思路或者新的語(yǔ)言,比如,在上世紀(jì)80年代誕生于愛(ài)立信實(shí)驗(yàn)室的Erlang語(yǔ)言,近期就表現(xiàn)出極大的活力。在Erlang中,如果要訪問(wèn)共享數(shù)據(jù),就需要向數(shù)據(jù)的擁有者發(fā)送一條消息并等待回應(yīng),這種方法在構(gòu)造高可用的并發(fā)系統(tǒng)時(shí)已綷-取得了極大的成功。尤其是我們已經(jīng)習(xí)慣了基于對(duì)象的抽象。要讓并發(fā)變得容易,就要放棄一些抽象。在此我們不去討論什么是正確的取舍,但是我們正在苦于這樣的幻想:“能不能不做任何取舍呢?”

        相對(duì)于Web2.0和企業(yè)2.0的波濤洶涌來(lái)說(shuō),計(jì)算2.0顯得有些波瀾不驚。但是,這種處于底層的深刻變化,將會(huì)徹底改變上層應(yīng)用的面貌。多核的普及,將使并行/并發(fā)的大行其道,企業(yè)或者個(gè)人只有快速抓住這個(gè)趨勢(shì),才能順利地暢游于軟件的2.0時(shí)代。

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多