文件描述符
http://blog.csdn.net/cywosp/article/details/38965239
- 概念
文件描述符(file descriptor)是內(nèi)核為了高效管理已被打開的文件所創(chuàng)建的索引誓斥,其是一個非負(fù)整數(shù)(通常是小整數(shù))朋腋,用于指代被打開的文件锻全,所有執(zhí)行I/O操作的系統(tǒng)調(diào)用都通過文件描述符屈暗。 - 文件描述符限制
- 文件描述符跟打開的文件之間的關(guān)系
每一個文件描述符會與一個打開文件相對應(yīng)扶供,同時玻侥,不同的文件描述符也會指向同一個文件店雅。相同的文件可以被不同的進(jìn)程打開也可以在同一個進(jìn)程中被多次打開阵子。系統(tǒng)為每一個進(jìn)程維護(hù)了一個文件描述符表思杯,該表的值都是從0開始的,所以在不同的進(jìn)程中你會看到相同的文件描述符,這種情況下相同文件描述符有可能指向同一個文件色乾,也有可能指向不同的文件誊册。具體情況要具體分析,要理解具體其概況如何暖璧,需要查看由內(nèi)核維護(hù)的3個數(shù)據(jù)結(jié)構(gòu)案怯。- 進(jìn)程級的文件描述符表
- 系統(tǒng)級的打開文件描述符表
- 文件系統(tǒng)的i-node表
進(jìn)程級的描述符表的每一條目記錄了單個文件描述符的相關(guān)信息。
- 控制文件描述符操作的一組標(biāo)志澎办。(目前嘲碱,此類標(biāo)志僅定義了一個,即close-on-exec標(biāo)志)
- 對打開文件句柄的引用
內(nèi)核對所有打開的文件的文件維護(hù)有一個系統(tǒng)級的描述符表格(open file description table)局蚀。有時麦锯,也稱之為打開文件表(open file table),并將表格中各條目稱為打開文件句柄(open file handle)琅绅。一個打開文件句柄存儲了與一個打開文件相關(guān)的全部信息扶欣,如下所示:
- 當(dāng)前文件偏移量(調(diào)用read()和write()時更新,或使用lseek()直接修改)
- 打開文件時所使用的狀態(tài)標(biāo)識(即奉件,open()的flags參數(shù))
- 文件訪問模式(如調(diào)用open()時所設(shè)置的只讀模式宵蛀、只寫模式或讀寫模式)
- 與信號驅(qū)動相關(guān)的設(shè)置
- 對該文件i-node對象的引用
- 文件類型(例如:常規(guī)文件、套接字或FIFO)和訪問權(quán)限
- 一個指針县貌,指向該文件所持有的鎖列表
- 文件的各種屬性,包括文件大小以及與不同類型操作相關(guān)的時間戳
下圖展示了文件描述符凑懂、打卡文件句柄(文件指針)煤痕、打開文件以及i-node之間的關(guān)系,其中接谨,三個進(jìn)程擁有多個打開的文件描述符摆碉。
在進(jìn)程A中,文件描述符1和30都指向了同一個打開的文件句柄(標(biāo)號23)脓豪。這可能是通過調(diào)用dup()巷帝、dup2()、fcntl()或者對同一個文件多次調(diào)用了open()函數(shù)而形成的扫夜。
進(jìn)程A的文件描述符2和進(jìn)程B的文件描述符2都指向了同一個打開的文件句柄(標(biāo)號73)楞泼。這種情形可能是在調(diào)用fork()后出現(xiàn)的(即,進(jìn)程A笤闯、B是父子進(jìn)程關(guān)系)堕阔,或者當(dāng)某進(jìn)程通過UNIX域套接字將一個打開的文件描述符傳遞給另一個進(jìn)程時,也會發(fā)生颗味。再者是不同的進(jìn)程獨自去調(diào)用open函數(shù)打開了同一個文件超陆,此時進(jìn)程內(nèi)部的描述符正好分配到與其他進(jìn)程打開該文件的描述符一樣。
此外浦马,進(jìn)程A的描述符0和進(jìn)程B的描述符3分別指向不同的打開文件句柄时呀,但這些句柄均指向i-node表的相同條目(1976)张漂,換言之,指向同一個文件谨娜。發(fā)生這種情況是因為每個進(jìn)程各自對同一個文件發(fā)起了open()調(diào)用航攒。同一個進(jìn)程兩次打開同一個文件,也會發(fā)生類似情況瞧预。
下圖展示了文件描述符屎债、打開的文件句柄以及i-node之間的關(guān)系,圖中垢油,兩個進(jìn)程擁有諸多打開的文件描述符盆驹。
此外:
其中:
Process 1中,文件描述符3和21都指向了同一個文件a滩愁,這可能是通過dup()躯喇、dup2()、fcntl()或?qū)ν粋€文件多次調(diào)用open()函數(shù)形成的;
Process 1文件描述符21和Process 2中文件描述符35都指向文件a绍移,但是卻對應(yīng)兩個不同打開文件句柄(文件指針)净响,二者打開模式不同(O_RDONLY與O_WRDONLY)。這種情形可能是調(diào)用fork()后創(chuàng)建子進(jìn)程正压,或某個進(jìn)程通過UNIX套接字將一個打開的文件描述符傳遞給另一個進(jìn)程,或兩個獨立的進(jìn)程分別open()打開同一個文件责球。
Process 1和Process 3中文件描述符3分別對應(yīng)文件a和文件b焦履。
同步/異步,阻塞/非阻塞
圖解能很清楚的明白:http://www.cnblogs.com/Anker/p/3254269.html
實際上同步與異步是針對應(yīng)用程序與內(nèi)核的交互而言的雏逾。同步過程中進(jìn)程觸發(fā)IO操作并等待或者輪詢的去查看IO操作是否完成嘉裤。異步過程中進(jìn)程觸發(fā)IO操作以后,直接返回栖博,做自己的事情屑宠,IO交給內(nèi)核來處理,完成后內(nèi)核通知進(jìn)程IO完成
當(dāng)進(jìn)程調(diào)用一個阻塞的系統(tǒng)函數(shù)時仇让,該進(jìn)程被置于睡眠(Sleep)狀態(tài)典奉,這時內(nèi)核調(diào)度其它進(jìn)程運行,直到該進(jìn)程等待的事件發(fā)生了(比如網(wǎng)絡(luò)上接收到數(shù)據(jù)包妹孙,或者調(diào)用sleep指定的睡眠時間到了)它才有可能繼續(xù)運行
進(jìn)程的狀態(tài)
http://blog.csdn.net/nilxin/article/details/7437671
linux內(nèi)核調(diào)度算法
上篇:http://www.cnblogs.com/parrynee/archive/2010/05/16/1736679.html
下篇:http://www.cnblogs.com/parrynee/archive/2010/05/16/1736682.html
另一個秋柄,linux調(diào)度分析(代碼講的比較多)
https://www.ibm.com/developerworks/cn/linux/kernel/l-kn26sch/
內(nèi)核的調(diào)度算法是基于優(yōu)先級和時間片的,而且會根據(jù)每個進(jìn)程的運行情況動態(tài)調(diào)整它的優(yōu)先級和時間片蠢正,讓每個進(jìn)程都能比較公平地得到機(jī)會執(zhí)行