日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Ubuntu Linux---GNU libc庫(kù)( 四 )


(代碼)(P74第8行)
void _init(void);
void _fini(void);
當(dāng)一個(gè)庫(kù)通過(guò)dlopen()動(dòng)態(tài)打開(kāi)或以共享庫(kù)的形式打開(kāi)時(shí),如果_init在該庫(kù)中存在且被輸出出來(lái),則_init函數(shù)會(huì)被調(diào)用(注釋15) 。如果一個(gè)庫(kù)通過(guò)dlclose()動(dòng)態(tài)關(guān)閉或因?yàn)闆](méi)有應(yīng)用程序引用其符號(hào)而被卸載時(shí),_fini函數(shù)會(huì)在庫(kù)卸載前被調(diào)用 。當(dāng)使用你自己的_init和_fini函數(shù)時(shí),需要注意不要與系統(tǒng)啟動(dòng)文件一起鏈接 。可以使用GCC選項(xiàng)-nostartfiles做到這一點(diǎn) 。
上一頁(yè);;[1];[2];[3];[4][5];下一頁(yè)
;但是,使用上面的函數(shù)或GCC的-nostartfiles選項(xiàng)并不是很好的習(xí)慣,因?yàn)檫@可能會(huì)產(chǎn)生一些意外的結(jié)果 。相反,庫(kù)應(yīng)該使用__attribute__((constructor))和__attribute__((destructor))函數(shù)屬性來(lái)輸出它的構(gòu)造函數(shù)和析構(gòu)函數(shù) 。如下所示:
(代碼)(P74第21行)
void __attribute__((constructor)) x_init(void)
void __attribute__((destructor)) x_fini(void)
構(gòu)造函數(shù)會(huì)在dlopen()返回前或庫(kù)被裝載時(shí)(注釋16)調(diào)用 。析構(gòu)函數(shù)會(huì)在這樣幾種情況下被調(diào)用:dlclose()返回前,或main()返回后,或裝載庫(kù)過(guò)程中exit()被調(diào)用時(shí) 。
3.6 系統(tǒng)調(diào)用
系統(tǒng)調(diào)用是用戶(hù)程序請(qǐng)求內(nèi)核為調(diào)用線程或進(jìn)程提供具體服務(wù)的接口 。因?yàn)閁NIX平臺(tái)上的一些系統(tǒng)調(diào)用是與操作系統(tǒng)密切相關(guān)的,因此在Linux上可能不存在類(lèi)似的系統(tǒng)調(diào)用 。這種情況下,就需要在Linux上實(shí)現(xiàn)一個(gè)包裹函數(shù)(wrapper) 。
Linux上系統(tǒng)調(diào)用的列表位于/usr/include/asm/unistd.h中 。本書(shū)的附錄部分還對(duì)Linux和UNIX系統(tǒng)(如Solaris,HP-UX等)進(jìn)行了并列比較 。
3.7 大頁(yè)面支持
大頁(yè)面的應(yīng)用主要是用來(lái)提高應(yīng)用程序的性能,該類(lèi)應(yīng)用程序需要分配大塊內(nèi)存并且頻繁訪問(wèn)該內(nèi)存 。性能的提高主要是通過(guò)減少地址轉(zhuǎn)換緩沖器 (Translation Lookaside Buffer,簡(jiǎn)寫(xiě)作TLB,一塊虛擬地址到物理地址轉(zhuǎn)換的緩沖區(qū))的未命中次數(shù)來(lái)實(shí)現(xiàn)的 。當(dāng)TLB能夠映射更大的虛擬內(nèi)存范圍時(shí),即可減少TLB的未命中次數(shù) 。因?yàn)榇蟛糠脂F(xiàn)代的體系結(jié)構(gòu)支持多種頁(yè)面大小,上述方法也就可以實(shí)現(xiàn)了 。例如,Intel 32位架構(gòu)支持4KB和4MB(PAE模式時(shí)為2MB)的頁(yè)面;Itanium支持多種頁(yè)面大?。?K,8K,64K,256K,1M,4M,16M和256M;SUN UltraSPARC支持8K,64K,512K和4M的頁(yè)面;64位PowerPC(ppc64)支持4K,64K,16M和64G的頁(yè)面 。本節(jié)內(nèi)容將告訴應(yīng)用程序開(kāi)發(fā)人員如何使用Linux內(nèi)核提供的大頁(yè)面支持功能 。
Linux 2.6內(nèi)核包含有內(nèi)建的對(duì)hugetlbpage(Linux社區(qū)稱(chēng)呼大頁(yè)面的專(zhuān)用術(shù)語(yǔ))的支持 。內(nèi)核配置成支持hugetlbpage時(shí),命令cat /proc/meminfo的輸出會(huì)顯示出關(guān)于hugetlbpage的信息,如下例:
(代碼)(P75倒數(shù)第8行)
HugePages_Total : 20
HugePages_Free : 20
Hugepagesize: 16384 KB
一種類(lèi)型為hugetlbfs的文件系統(tǒng)也應(yīng)該會(huì)出現(xiàn)在/proc/filesystems中 。在用戶(hù)空間的應(yīng)用程序能夠使用hugetlbpage支持前,管理員應(yīng)該先在內(nèi)核中分配這些大頁(yè)面 。/proc/sys/vm/nr_hugepages的內(nèi)容顯示的是內(nèi)核中當(dāng)前配置的大頁(yè)面的個(gè)數(shù) 。如果要在系統(tǒng)上配置10個(gè)大頁(yè)面,可以用下面的命令:
(代碼)(P76第1行)
echo 10 > /proc/sys/vm/nr_hugepages
只有當(dāng)系統(tǒng)中存在足夠的連續(xù)物理內(nèi)存時(shí),分配請(qǐng)求才會(huì)成功;只有存在足夠多的能夠轉(zhuǎn)回到正常內(nèi)存池的空閑大頁(yè)面時(shí),釋放請(qǐng)求才會(huì)成功 。用作hugetlbpage的頁(yè)面在內(nèi)核中作為保留頁(yè)面而不能用作其他用途 。
應(yīng)用程序開(kāi)發(fā)人員有兩種方法可以使用hugetlbpage支持:
1. 系統(tǒng)V共享內(nèi)存系統(tǒng)調(diào)用(shmget,shmat)
2. mmap系統(tǒng)調(diào)用
同一個(gè)應(yīng)用程序也可以?xún)烧叨际褂?。
下面的示例程序中,我們給出了如何使用上述系統(tǒng)調(diào)用來(lái)獲得hugetlbpage支持 。這些程序來(lái)源于/usr/src/linux/Documentation/vm/hugetlbpage.txt 。

推薦閱讀