資源描述:
《基于smp結(jié)構(gòu)的linux內(nèi)核進程調(diào)度的研究》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、基于SMP結(jié)構(gòu)的linux內(nèi)核進程調(diào)度的研究:在給定的時間里,CPU能達到的最高速度總是給定的,再要提高速度就要設法增加其并行度,就是在計算機中使用多個處理器,即使用SMP對稱多處理器技術(shù).作為一種開源的操作系統(tǒng),,linux提供了對SMP結(jié)構(gòu)很好的支持,SMP系統(tǒng)中最關鍵的技術(shù)是如何更好地解決多個處理器的相互通訊和協(xié)調(diào)問題以及l(fā)inux內(nèi)核對于SMP結(jié)構(gòu)的進程調(diào)度問題. 關鍵詞:SMPlinux進程 ?。篢P316.8:A:1007-9416(2011)11-0089-02 Linux操作系統(tǒng)作為UNIX操作系
2、統(tǒng)的一種克隆系統(tǒng)最初是由LinuasTorvalds編寫,后來借助InterX絡,在全世界計算機愛好者的共同努力下稱為一款優(yōu)秀的開源操作系統(tǒng)。linux起初是為單處理機設計的.隨著并行計算的發(fā)展,通過SMP所獲得的性能要比幾臺獨立的機器組合起來更加的便宜和簡單,因此使其得到快速的發(fā)展。linux內(nèi)核從2.0版本就開始支持SMP系統(tǒng)。文中以Linux2.4.0版為基礎,分析闡述了Linux內(nèi)核是如何支持SMP體系結(jié)構(gòu)的以及SMP對linux內(nèi)核進程調(diào)度的處理機制。 1、SMP系統(tǒng)模型 SMP是指在一個計算機上匯集了一組
3、處理器(多CPU),它們通常物理上也采用同一種CPU,所有的CPU通過同一條總線共享同一個內(nèi)存以及所有的外設,為了減少訪問內(nèi)存的沖突,SMP結(jié)構(gòu)中的各個CPU通常都有自己的高速緩存。 在SMP結(jié)構(gòu)中,高速緩存的作用比在單處理器結(jié)構(gòu)中更為重要,不僅可以提高取指令和讀寫數(shù)據(jù)的速度,還有利于減少多個CPU在訪問內(nèi)存時的沖突。如果內(nèi)存在同一時間內(nèi)受到多個CPU的訪問,每個CPU把自己的高速緩沖存滿之后,就可以運行相當長的時間而無需經(jīng)常地讀、寫物理上的內(nèi)存。 linux內(nèi)核要支持SMP,必須修改基于UP的內(nèi)核代碼以適應SMP,
4、主要涉及部分就是基于SMP的啟動和進程調(diào)度問題?! ?、linux內(nèi)核在SMP結(jié)構(gòu)系統(tǒng)的引導 操作系統(tǒng)內(nèi)核的映像必須存儲在不揮發(fā)的介質(zhì)中.當系統(tǒng)開機加電時.CPU從某個特殊的地址開始執(zhí)行指令,這段指令就是引導加載程序,負責將linux內(nèi)核的映像從Flash或EPROM中加載入內(nèi)存,這段程序有三部分,用匯編寫成:bootsect.S,setup.S,video.S.對i386的CPU而言,源碼放在linux系統(tǒng)的arch/i386/boot目錄下,從線性地址0xffff0執(zhí)行這段程序之后,將linux內(nèi)核的映像裝入內(nèi)存,
5、CPU通過一條長線程轉(zhuǎn)移指令轉(zhuǎn)到映像代碼段開頭的入口startup_32,關鍵啟動代碼如下: ENTRY(stext) ENTRY(_stext); startup_32: cld movl$(__KERNEL_DS),%values movl陎,%ds movl陎,%es ......... #ifdefCONFIG_SMP orp_init()進行SMP結(jié)構(gòu)的初始化,并創(chuàng)建起多個進程,從而可以由多個處理器同事參與處理時,才啟動所有的”應用處理器”,讓他們在完成自身的初始化以后投入運行。一旦各個AP
6、都已投入運行,這種暫時的主次關系便結(jié)束,從此之后便一律平等了,smp_init()函數(shù)的代碼如下: staticvoid__initsmp_init(void) { mp_boot_cus(); smp_threads_ready=1; mp_mence(); } 3、linux內(nèi)核在SMP結(jié)構(gòu)中的進程調(diào)度 3.1SMP結(jié)構(gòu)進程的互斥 linux系統(tǒng)中,進程間的互斥通信是一個必須要考慮的問題,在單處理器結(jié)構(gòu)中,各個進程間實際上同一時間點上只有一個進程在運行。但在SMP結(jié)構(gòu)中,由于多個處理器在獨立的運行,
7、即使在單條指令中完成的操作也有可能受到干擾,有些在單處理器中的“原子操作”不再是原子了。 在linux內(nèi)核中使用自旋鎖的方式來實現(xiàn)多個進程通信之間的互斥問題。關鍵代碼如下: inlineintspin_trylock(spinlock_t*lock) { charoldval; __asm____volatile__( “xchgb