• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            posts - 200, comments - 8, trackbacks - 0, articles - 0

            (注:這篇文章轉(zhuǎn)自網(wǎng)絡(luò),雖然Linux從內(nèi)核2.6開(kāi)始,多線程已使用NPTL技術(shù),但是這篇文章對(duì)我們理解多線程技術(shù)還是挺有用的)

            Linux內(nèi)核對(duì)多進(jìn)程和多線程的支持方式:

                    線程機(jī)制支持并發(fā)程序設(shè)計(jì)技術(shù),在多處理器上能真正保證并行處理。而在linux實(shí)現(xiàn)線程很特別,linux把所有的線程都當(dāng)作進(jìn)程實(shí)現(xiàn)。linux下線 程看起來(lái)就像普通進(jìn)程(只是該進(jìn)程和其他進(jìn)程共享資源,如地址空間)。上述機(jī)制與Microsoft windows或是Sun Solaris實(shí)現(xiàn)差異很大。

                    Linux的線程實(shí)現(xiàn)是在核外進(jìn)行的,核內(nèi)提供的是創(chuàng)建進(jìn)程的接口do_fork()。內(nèi)核提供了兩個(gè)系統(tǒng)調(diào)用__clone()和fork(),最終都 用不同的參數(shù)調(diào)用do_fork()核內(nèi)API。 do_fork() 提供了很多參數(shù),包括CLONE_VM(共享內(nèi)存空間)、CLONE_FS(共享文件系統(tǒng)信息)、CLONE_FILES(共享文件描述符表)、 CLONE_SIGHAND(共享信號(hào)句柄表)和CLONE_PID(共享進(jìn)程ID,僅對(duì)核內(nèi)進(jìn)程,即0號(hào)進(jìn)程有效)。當(dāng)使用fork系統(tǒng)調(diào)用產(chǎn)生多進(jìn)程 時(shí),內(nèi)核調(diào)用do_fork()不使用任何共享屬性,進(jìn)程擁有獨(dú)立的運(yùn)行環(huán)境。當(dāng)使用pthread_create()來(lái)創(chuàng)建線程時(shí),則最終設(shè)置了所有這 些屬性來(lái)調(diào)用__clone(),而這些參數(shù)又全部傳給核內(nèi)的do_fork(),從而創(chuàng)建的”進(jìn)程”擁有共享的運(yùn)行環(huán)境,只有棧是獨(dú)立的,由 __clone()傳入。

                     即:Linux下不管是多線程編程還是多進(jìn)程編程,最終都是用do_fork實(shí)現(xiàn)的 多進(jìn)程編程,只是進(jìn)程創(chuàng)建時(shí)的參數(shù)不同,從而導(dǎo)致有不同的共享環(huán)境。Linux線程在核內(nèi)是以輕量級(jí)進(jìn)程的形式存在的,擁有獨(dú)立的進(jìn)程表項(xiàng),而所有的創(chuàng) 建、同步、刪除等操作都在核外pthread庫(kù)中進(jìn)行。pthread 庫(kù)使用一個(gè)管理線程(__pthread_manager() ,每個(gè)進(jìn)程獨(dú)立且唯一)來(lái)管理線程的創(chuàng)建和終止,為線程分配線程ID,發(fā)送線程相關(guān)的信號(hào),而主線程pthread_create()) 的調(diào)用者則通過(guò)管道將請(qǐng)求信息傳給管理線程。

            很多朋友都說(shuō)使用多線程的好處是資源占用少,其隱含之意就是說(shuō)進(jìn)程占用資源比線程多,對(duì)吧?但實(shí)際上Linux下多進(jìn)程是否就真的點(diǎn)用很多資源呢? 暫且不說(shuō)進(jìn)程是否比線程占用資源多,就進(jìn)程占用資源的多少情況而言,Linux確實(shí)是做得相當(dāng)節(jié)省的。產(chǎn)生一個(gè)多進(jìn)程時(shí)肯定是要產(chǎn)生的一點(diǎn)內(nèi)存是要復(fù)制進(jìn) 程表項(xiàng),即一個(gè)task_struct結(jié)構(gòu),但這個(gè)結(jié)構(gòu)本身做得相當(dāng)小巧。其它對(duì)于一個(gè)進(jìn)程來(lái)說(shuō)必須有的數(shù)據(jù)段、代碼段、堆棧段是不是全盤復(fù)制呢?對(duì)于多 進(jìn)程來(lái)說(shuō),代碼段是肯定不用復(fù)制的,因?yàn)楦高M(jìn)程和各子進(jìn)程的代碼段是相同的,數(shù)據(jù)段和堆棧段呢?也不一定,因?yàn)樵贚inux里廣泛使用的一個(gè)技術(shù)叫 copy-on-write,即寫時(shí)拷貝。copy-on-write意味著什么呢?意味著資源節(jié)省,假設(shè)有一個(gè)變量x在父進(jìn)程里存在,當(dāng)這個(gè)父進(jìn)程創(chuàng)建 一個(gè)子進(jìn)程或多個(gè)子進(jìn)程時(shí)這個(gè)變量x是否復(fù)制到了子進(jìn)程的內(nèi)存空間呢?不會(huì)的,子進(jìn)程和父進(jìn)程使用同一個(gè)內(nèi)存空間的變量,但當(dāng)子進(jìn)程或父進(jìn)程要改變變量x 的值時(shí)就會(huì)復(fù)制該變量,從而導(dǎo)致父子進(jìn)程里的變量值不同。父子進(jìn)程變量是互不影響的,由于父子進(jìn)程地址空間是完全隔開(kāi)的,變量的地址可以是完全相同的

                      Linux的”線程”和”進(jìn)程”實(shí)際上處于一個(gè)調(diào)度層次,共享一個(gè)進(jìn)程標(biāo)識(shí)符空間,這種限制使得不可能在Linux上實(shí)現(xiàn)完全意義上的POSIX線程機(jī) 制,因此眾多的Linux線程庫(kù)實(shí)現(xiàn)嘗試都只能盡可能實(shí)現(xiàn)POSIX的絕大部分語(yǔ)義,并在功能上盡可能逼近。Linux進(jìn)程的創(chuàng)建是非常迅速的。內(nèi)核設(shè)計(jì) 與實(shí)現(xiàn)一書中甚至指出Linux創(chuàng)建進(jìn)程的速度和其他針對(duì)線程優(yōu)化的操作系統(tǒng)(Windows,Solaris)創(chuàng)建線程的速度相比,測(cè)試結(jié)果非常的好, 也就是說(shuō)創(chuàng)建速度很快。由于異步信號(hào)是內(nèi)核以進(jìn)程為單位分發(fā)的,而LinuxThreads的每個(gè)線程對(duì)內(nèi)核來(lái)說(shuō)都是一個(gè)進(jìn)程,且沒(méi)有實(shí)現(xiàn)”線程組”,因 此,某些語(yǔ)義不符合POSIX標(biāo)準(zhǔn),比如沒(méi)有實(shí)現(xiàn)向進(jìn)程中所有線程發(fā)送信號(hào),README對(duì)此作了說(shuō)明。LinuxThreads中的線程同步很大程度上 是建立在信號(hào)基礎(chǔ)上的,這種通過(guò)內(nèi)核復(fù)雜的信號(hào)處理機(jī)制的同步方式,效率一直是個(gè)問(wèn)題。LinuxThreads 的問(wèn)題,特別是兼容性上的問(wèn)題,嚴(yán)重阻礙了Linux上的跨平臺(tái)應(yīng)用(如Apache)采用多線程設(shè)計(jì),從而使得Linux上的線程應(yīng)用一直保持在比較低 的水平。在Linux社區(qū)中,已經(jīng)有很多人在為改進(jìn)線程性能而努力,其中既包括用戶級(jí)線程庫(kù),也包括核心級(jí)和用戶級(jí)配合改進(jìn)的線程庫(kù)。目前最為人看好的有 兩個(gè)項(xiàng)目,一個(gè)是RedHat公司牽頭研發(fā)的NPTL(Native Posix Thread Library),另一個(gè)則是IBM投資開(kāi)發(fā)的NGPT(Next Generation Posix Threading),二者都是圍繞完全兼容POSIX 1003.1c,同時(shí)在核內(nèi)和核外做工作以而實(shí)現(xiàn)多對(duì)多線程模型。這兩種模型都在一定程度上彌補(bǔ)了LinuxThreads的缺點(diǎn),且都是重起爐灶全新設(shè) 計(jì)的。

                      綜上所述的結(jié)論是在Linux下編程多用多進(jìn)程編程少用多線程編程

                     IBM有個(gè)家伙做了個(gè)測(cè)試,發(fā)現(xiàn)切換線程context的時(shí)候,windows比linux快一倍多。進(jìn)出最快的鎖(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。當(dāng)然這并不是說(shuō)linux不好,而且在經(jīng)過(guò)實(shí)際 編程之后,綜合來(lái)看我覺(jué)得linux更適合做high performance server,不過(guò)在多線程這個(gè)具體的領(lǐng)域內(nèi),linux還是稍遜windows一點(diǎn)。這應(yīng)該是情有可原的,畢竟unix家族都是從多進(jìn)程過(guò)來(lái)的,而 windows從頭就是多線程的。

            如果是UNIX/linux環(huán)境,采用多線程沒(méi)必要。

            多線程比多進(jìn)程性能高?誤導(dǎo)!

            應(yīng)該說(shuō),多線程比多進(jìn)程成本低,但性能更低

            在UNIX環(huán)境,多進(jìn)程調(diào)度開(kāi)銷比多線程調(diào)度開(kāi)銷,沒(méi)有顯著區(qū)別,就是說(shuō),UNIX進(jìn)程調(diào)度效率是很高的。內(nèi)存消耗方面,二者只差全局?jǐn)?shù)據(jù)區(qū),現(xiàn)在內(nèi)存都很便宜,服務(wù)器內(nèi)存動(dòng)輒若干G,根本不是問(wèn)題。

            多進(jìn)程是立體交通系統(tǒng),雖然造價(jià)高,上坡下坡多耗點(diǎn)油,但是不堵車。

            多線程是平面交通系統(tǒng),造價(jià)低,但紅綠燈太多,老堵車。

            我們現(xiàn)在都開(kāi)跑車,油(主頻)有的是,不怕上坡下坡,就怕堵車。

            高性能交易服務(wù)器中間件,如TUXEDO,都是主張多進(jìn)程的。實(shí)際測(cè)試表明,TUXEDO性能和并發(fā)效率是非常高的。TUXEDO是貝爾實(shí)驗(yàn)室的,與UNIX同宗,應(yīng)該是對(duì)UNIX理解最為深刻的,他們的意見(jiàn)應(yīng)該具有很大的參考意義

            注:

            關(guān)于那個(gè)critical section和pthread_mutex_t,critical section本質(zhì)上是一個(gè)自旋鎖,短期鎖當(dāng)然快,要比也該是和pthread_spinlock_t比。

            mutex和critical section的確是不能比的。一個(gè)涉及到內(nèi)核,一個(gè)沒(méi)有涉及到內(nèi)核。


            轉(zhuǎn)自http://www.soft-bin.com/html/2010/07/09/%E5%A4%9A%E8%BF%9B%E7%A8%8Bvs%E5%A4%9A%E7%BA%BF%E7%A8%8B%EF%BC%8C%E4%B8%80%E4%B8%AA%E9%95%BF%E6%9C%9F%E7%9A%84%E4%BA%89%E8%AE%BA.html,貌似他也是轉(zhuǎn)別人的。 

            轉(zhuǎn)自:http://blog.chinaunix.net/uid-20556054-id-3068371.html
            欧美激情精品久久久久久久| 久久久国产精品亚洲一区| 国内精品伊人久久久久| 精品久久久久久国产潘金莲| 蜜臀久久99精品久久久久久| 人妻中文久久久久| 浪潮AV色综合久久天堂| 香港aa三级久久三级| 久久亚洲欧洲国产综合| 99精品久久精品| 97精品伊人久久久大香线蕉| 久久精品www人人爽人人| 日本亚洲色大成网站WWW久久| 99久久久国产精品免费无卡顿| 99久久精品免费看国产一区二区三区| 成人免费网站久久久| 久久WWW免费人成一看片| 日韩欧美亚洲综合久久影院Ds| 亚洲国产精品热久久| 久久91亚洲人成电影网站| 国内精品久久久久影院日本| 国产激情久久久久影院老熟女免费 | 亚洲精品无码专区久久久 | 亚洲狠狠婷婷综合久久久久| 久久中文精品无码中文字幕| 亚洲色欲久久久久综合网 | 久久久久国产| 亚洲中文字幕无码久久综合网 | 久久精品成人免费网站| 国产精品免费久久久久电影网| 国产精品午夜久久| 久久婷婷色综合一区二区| 久久夜色精品国产噜噜麻豆| 国产成人综合久久综合| 国产精品久久久久久久久久免费| 国产精品免费看久久久香蕉| 久久强奷乱码老熟女网站| 91麻精品国产91久久久久| 国产精品久久久久无码av| 欧美精品九九99久久在观看| 久久影院综合精品|