計(jì)算機(jī)基礎(chǔ)知識—Linux操作系統(tǒng)

2018-11-06

這一塊操作系統(tǒng)主要分為兩個部分敬锐,一個部分是書本上操作系統(tǒng)的知識,還有一部門是linux的相關(guān)知識:

linux相關(guān)知識


(1) Linux中同步異步、阻塞非阻塞的區(qū)別(超級重要)

首先是同步異步晶密、阻塞非阻塞的區(qū)別:

同步:所謂同步鱼喉,就是在發(fā)出一個功能調(diào)用時秀鞭,在沒有得到結(jié)果之前,該調(diào)用就不返回蒲凶。也就是必須一件一件事做,等前一件做完了才能做下一件事气筋。

例如普通B/S模式(同步):提交請求->等待服務(wù)器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事

異步:異步的概念和同步相對。當(dāng)一個異步過程調(diào)用發(fā)出后旋圆,調(diào)用者不能立刻得到結(jié)果宠默。實(shí)際處理這個調(diào)用的部件在完成后,通過狀態(tài)灵巧、通知和回調(diào)來通知調(diào)用者搀矫。

例如 ajax請求(異步): 請求通過事件觸發(fā)->服務(wù)器處理(這是瀏覽器仍然可以作其他事情)->處理完畢

阻塞:阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當(dāng)前線程會被掛起(線程進(jìn)入非可執(zhí)行狀態(tài)刻肄,在這個狀態(tài)下瓤球,cpu不會給線程分配時間片,即線程暫停運(yùn)行)敏弃。函數(shù)只有在得到結(jié)果之后才會返回卦羡。

有人也許會把阻塞調(diào)用和同步調(diào)用等同起來,實(shí)際上他是不同的。對于同步調(diào)用來說绿饵,很多時候當(dāng)前線程還是激活的欠肾,只是從邏輯上當(dāng)前函數(shù)沒有返回,它還會搶占cpu去執(zhí)行其他邏輯,也會主動檢測io是否準(zhǔn)備好拟赊。

非阻塞:非阻塞和阻塞的概念相對應(yīng)刺桃,指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當(dāng)前線程吸祟,而會立刻返回瑟慈。

再簡單點(diǎn)理解就是:

1. 同步,就是我調(diào)用一個功能屋匕,該功能沒有結(jié)束前葛碧,我死等結(jié)果。

2. 異步炒瘟,就是我調(diào)用一個功能吹埠,不需要知道該功能結(jié)果,該功能有結(jié)果后通知我(回調(diào)通知)

3. 阻塞疮装,就是調(diào)用我(函數(shù))缘琅,我(函數(shù))沒有接收完數(shù)據(jù)或者沒有得到結(jié)果之前,我不會返回廓推。

4. 非阻塞刷袍,就是調(diào)用我(函數(shù)),我(函數(shù))立即返回樊展,通過select通知調(diào)用者

同步IO和異步IO的區(qū)別就在于:數(shù)據(jù)拷貝的時候進(jìn)程是否阻塞

阻塞IO和非阻塞IO的區(qū)別就在于:應(yīng)用程序的調(diào)用是否立即返回

綜上可知呻纹,同步和異步,阻塞和非阻塞,有些混用,其實(shí)它們完全不是一回事,而且它們修飾的對象也不相同。

(2)linux中五種IO模型:

阻塞I/O(blocking I/O)
非阻塞I/O (nonblocking I/O)
I/O復(fù)用(select 和poll) (I/O multiplexing)
信號驅(qū)動I/O (signal driven I/O (SIGIO))
異步I/O (asynchronous I/O (the POSIX aio_functions))
*其中前4種都是同步专缠,最后一種才是異步雷酪。

1. 阻塞I/O:

應(yīng)用程序調(diào)用一個IO函數(shù),導(dǎo)致應(yīng)用程序阻塞涝婉,等待數(shù)據(jù)準(zhǔn)備好哥力。 如果數(shù)據(jù)沒有準(zhǔn)備好死讹,一直等待….數(shù)據(jù)準(zhǔn)備好了斟湃,從內(nèi)核拷貝到用戶空間,IO函數(shù)返回成功指示虾攻。

阻塞I/O模型圖:在調(diào)用recv()/recvfrom()函數(shù)時宪卿,發(fā)生在內(nèi)核中等待數(shù)據(jù)和復(fù)制數(shù)據(jù)的過程。

當(dāng)調(diào)用recv()函數(shù)時牵辣,系統(tǒng)首先查是否有準(zhǔn)備好的數(shù)據(jù)陨闹。如果數(shù)據(jù)沒有準(zhǔn)備好扑浸,那么系統(tǒng)就處于等待狀態(tài)引矩。當(dāng)數(shù)據(jù)準(zhǔn)備好后梁丘,將數(shù)據(jù)從系統(tǒng)緩沖區(qū)復(fù)制到用戶空間侵浸,然后該函數(shù)返回。在套接應(yīng)用程序中兰吟,當(dāng)調(diào)用recv()函數(shù)時通惫,未必用戶空間就已經(jīng)存在數(shù)據(jù),那么此時recv()函數(shù)就會處于等待狀態(tài)混蔼。

2. 非阻塞I/O

非阻塞IO通過進(jìn)程反復(fù)調(diào)用IO函數(shù)(多次系統(tǒng)調(diào)用,并馬上返回)珊燎;在數(shù)據(jù)拷貝的過程中惭嚣,進(jìn)程是阻塞的

我們把一個SOCKET接口設(shè)置為非阻塞就是告訴內(nèi)核,當(dāng)所請求的I/O操作無法完成時悔政,不要將進(jìn)程睡眠晚吞,而是返回一個錯誤。這樣我們的I/O操作函數(shù)將不斷的測試數(shù)據(jù)是否已經(jīng)準(zhǔn)備好谋国,如果沒有準(zhǔn)備好槽地,繼續(xù)測試,直到數(shù)據(jù)準(zhǔn)備好為止芦瘾。在這個不斷測試的過程中捌蚊,會大量的占用CPU的時間。

3. IO復(fù)用

主要是select和epoll近弟;對一個IO端口缅糟,兩次調(diào)用,兩次返回祷愉,比阻塞IO并沒有什么優(yōu)越性窗宦;關(guān)鍵是能實(shí)現(xiàn)同時對多個IO端口進(jìn)行監(jiān)聽; I/O復(fù)用模型會用到select二鳄、poll赴涵、epoll函數(shù),這幾個函數(shù)也會使進(jìn)程阻塞订讼,但是和阻塞I/O所不同的的髓窜,這兩個函數(shù)可以同時阻塞多個I/O操作。而且可以同時對多個讀操作躯嫉,多個寫操作的I/O函數(shù)進(jìn)行檢測纱烘,直到有數(shù)據(jù)可讀或可寫時,才真正調(diào)用I/O操作函數(shù)祈餐。

IO復(fù)用模型會用到select擂啥、poll、epoll函數(shù)帆阳,這幾個函數(shù)也會使進(jìn)程阻塞哺壶,但是和阻塞I/O所不同的是屋吨,這兩個函數(shù)可以同時阻塞多個I/O操作。而且可以同時對多個讀操作山宾、多個寫操作的I/O函數(shù)進(jìn)行檢測至扰,直到有數(shù)據(jù)可讀或者可寫時(注意不是全部數(shù)據(jù)可讀或者可寫),才真正的調(diào)用I/O操作函數(shù)资锰。

4. 信號驅(qū)動IO

首先我們允許套接口進(jìn)行信號驅(qū)動I/O,并安裝一個信號處理函數(shù)敢课,進(jìn)程繼續(xù)運(yùn)行并不阻塞。當(dāng)數(shù)據(jù)準(zhǔn)備好時绷杜,進(jìn)程會收到一個SIGIO信號直秆,可以在信號處理函數(shù)中調(diào)用I/O操作函數(shù)處理數(shù)據(jù)。

5. 異步IO

當(dāng)一個異步過程調(diào)用發(fā)出后鞭盟,調(diào)用者不能立刻得到結(jié)果圾结。實(shí)際處理這個調(diào)用的部件在完成后,通過狀態(tài)齿诉、通知和回調(diào)來通知調(diào)用者的輸入輸出操作

6. 總結(jié)比較下五種IO模型:


(2) 文件系統(tǒng)的理解(EXT4筝野,XFS,BTRFS)

  1. Ext4 文件系統(tǒng)

ext4 還有一些明顯的限制粤剧。最大文件大小是 16 tebibytes(大概是 17.6 terabytes)歇竟,這比普通用戶當(dāng)前能買到的硬盤還要大的多。使用 ext4 能創(chuàng)建的最大卷/分區(qū)是 1 exbibyte(大概是 1,152,921.5 terabytes)俊扳。通過使用多種技巧途蒋, ext4 比 ext3 有很大的速度提升。類似一些最先進(jìn)的文件系統(tǒng)馋记,它是一個日志文件系統(tǒng)号坡,意味著它會對文件在磁盤中的位置以及任何其它對磁盤的更改做記錄√菪眩縱觀它的所有功能宽堆,它還不支持透明壓縮、重復(fù)數(shù)據(jù)刪除或者透明加密茸习。技術(shù)上支持了快照畜隶,但該功能還處于實(shí)驗(yàn)性階段。

  1. XFS 文件系統(tǒng)

XFS 文件系統(tǒng)是擴(kuò)展文件系統(tǒng)(extent file system)的一個擴(kuò)展号胚。XFS 是 64 位高性能日志文件系統(tǒng)籽慢。對 XFS 的支持大概在 2002 年合并到了 Linux 內(nèi)核,到了 2009 年猫胁,紅帽企業(yè)版 Linux 5.4 也支持了 XFS 文件系統(tǒng)箱亿。對于 64 位文件系統(tǒng),XFS 支持最大文件系統(tǒng)大小為 8 exbibytes弃秆。XFS 文件系統(tǒng)有一些缺陷届惋,例如它不能壓縮髓帽,刪除大量文件時性能低下。目前RHEL 7.0 文件系統(tǒng)默認(rèn)使用 XFS脑豹。

  1. trfs 文件系統(tǒng)

btrfs 有很多不同的叫法郑藏,例如 Better FS、Butter FS 或者 B-Tree FS瘩欺。它是一個幾乎完全從頭開發(fā)的文件系統(tǒng)必盖。btrfs 出現(xiàn)的原因是它的開發(fā)者起初希望擴(kuò)展文件系統(tǒng)的功能使得它包括快照、池化(pooling)击碗、校驗(yàn)以及其它一些功能筑悴。雖然和 ext4 無關(guān),它也希望能保留 ext4 中能使消費(fèi)者和企業(yè)受益的功能稍途,并整合額外的能使每個人,尤其是企業(yè)受益的功能砚婆。對于使用大型軟件以及大規(guī)模數(shù)據(jù)庫的企業(yè)械拍,讓多種不同的硬盤看起來一致的文件系統(tǒng)能使他們受益并且使數(shù)據(jù)整合變得更加簡單。刪除重復(fù)數(shù)據(jù)能降低數(shù)據(jù)實(shí)際使用的空間装盯,當(dāng)需要鏡像一個單一而巨大的文件系統(tǒng)時使用 btrfs 也能使數(shù)據(jù)鏡像變得簡單坷虑。

用戶當(dāng)然可以繼續(xù)選擇創(chuàng)建多個分區(qū)從而無需鏡像任何東西」∧危考慮到這種情況迄损,btrfs 能橫跨多種硬盤,和 ext4 相比账磺,它能支持 16 倍以上的磁盤空間芹敌。btrfs 文件系統(tǒng)一個分區(qū)最大是 16 exbibytes,最大的文件大小也是 16 exbibytes垮抗。


(3) 文件處理grep,awk,sed這三個命令必知必會

  1. grep氏捞、sed和awk都是文本處理工具,雖然都是文本處理工具單卻都有各自的優(yōu)缺點(diǎn)冒版,一種文本處理命令是不能被另一個完全替換的液茎,否則也不會出現(xiàn)三個文本處理命令了。只不過辞嗡,相比較而言捆等,sed和awk功能更強(qiáng)大而已,且已獨(dú)立成一種語言來介紹续室。

  2. grep:文本過濾器栋烤,如果僅僅是過濾文本,可使用grep猎贴,其效率要比其他的高很多班缎;

  3. sed:Stream EDitor蝴光,流編輯器,默認(rèn)只處理模式空間达址,不處理原數(shù)據(jù)蔑祟,如果你處理的數(shù)據(jù)是針對行進(jìn)行處理的,可以使用sed沉唠;

  4. awk:報(bào)告生成器疆虚,格式化以后顯示。如果對處理的數(shù)據(jù)需要生成報(bào)告之類的信息满葛,或者你處理的數(shù)據(jù)是按列進(jìn)行處理的径簿,最好使用awk。


(4) IO復(fù)用的三種方法(select,poll,epoll)深入理解嘀韧,包括三者區(qū)別篇亭,內(nèi)部原理實(shí)現(xiàn)?

1. IO復(fù)用的了解:

select锄贷,poll译蒂,epoll都是IO多路復(fù)用的機(jī)制。I/O多路復(fù)用就通過一種機(jī)制谊却,可以監(jiān)視多個描述符柔昼,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進(jìn)行相應(yīng)的讀寫操作炎辨。但select捕透,poll,epoll本質(zhì)上都是同步I/O碴萧,因?yàn)樗麄兌夹枰谧x寫事件就緒后自己負(fù)責(zé)進(jìn)行讀寫乙嘀,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負(fù)責(zé)進(jìn)行讀寫勿决,異步I/O的實(shí)現(xiàn)會負(fù)責(zé)把數(shù)據(jù)從內(nèi)核拷貝到用戶空間乒躺。

此時需知道兩個概念:

所謂阻塞方式block,顧名思義低缩,就是進(jìn)程或是線程執(zhí)行到這些函數(shù)時必須等待某個事件的發(fā)生嘉冒,如果事件沒有發(fā)生,進(jìn)程或線程就被阻塞咆繁,函數(shù)不能立即返回讳推。

所謂非阻塞方式non-block,就是進(jìn)程或線程執(zhí)行此函數(shù)時不必非要等待事件的發(fā)生玩般,一旦執(zhí)行肯定返回银觅,以返回值的不同來反映函數(shù)的執(zhí)行情況,如果事件發(fā)生則與阻塞方式相同坏为,若事件沒有發(fā)生究驴,則返回一個代碼來告知事件未發(fā)生镊绪,而進(jìn)程或線程繼續(xù)執(zhí)行,所以效率較高洒忧。

2. select 分析

select()的機(jī)制中提供一fd_set的數(shù)據(jù)結(jié)構(gòu)蝴韭,實(shí)際上是一long類型的數(shù)組, 每一個數(shù)組元素都能與一打開的文件句柄(不管是Socket句柄熙侍,還是其他 文件或命名管道或設(shè)備句柄)建立聯(lián)系榄鉴,建立聯(lián)系的工作由程序員完成, 當(dāng)調(diào)用select()時蛉抓,由內(nèi)核根據(jù)IO狀態(tài)修改fd_set的內(nèi)容庆尘,由此來通知執(zhí)行了select()的進(jìn)程哪一Socket或文件可讀或可寫。主要用于Socket通信當(dāng)中巷送。

select使用:它能夠監(jiān)視我們需要監(jiān)視的文件描述符的變化情況——讀寫或是異常驶忌。準(zhǔn)備就緒的描述符數(shù),若超時則返回0笑跛,若出錯則返回-1位岔。
1.如果一個發(fā)現(xiàn)I/O有輸入,讀取的過程中堡牡,另外一個也有了輸入,這時候不會產(chǎn)生任何反應(yīng).這就需要你的程序語句去用到select函數(shù)的時候才知道有數(shù)據(jù)輸入杨刨。
2.程序去select的時候晤柄,如果沒有數(shù)據(jù)輸入,程序會一直等待(阻塞時)妖胀,直到有數(shù)據(jù)為止芥颈,也就是程序中無需循環(huán)和sleep。

函數(shù)分析:

#include <sys/types.h>
#include <sys/times.h>
#include <sys/select.h>
int select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)

函數(shù)返回結(jié)果:當(dāng)readfds或writefds中映象的文件可讀或可寫或超時赚抡,本次select()就結(jié)束返回爬坑。程序員利用一組系統(tǒng)提供的宏在select()結(jié)束時便可判斷哪一文件可讀或可寫,對Socket編程特別有用的就是readfds涂臣。
注:不同的timeval設(shè)置使select()表現(xiàn)出超時結(jié)束盾计、無超時阻塞和輪詢?nèi)N特性(timeval可精確至百萬分之一秒)。

select詳細(xì)執(zhí)行步驟:

(1)使用copy_from_user從用戶空間拷貝fd_set到內(nèi)核空間

(2)注冊回調(diào)函數(shù)__pollwait

(3)遍歷所有fd赁遗,調(diào)用其對應(yīng)的poll方法(對于socket署辉,這個poll方法是sock_poll,sock_poll根據(jù)情況會調(diào)用到tcp_poll,udp_poll或者datagram_poll)

(4)以tcp_poll為例岩四,其核心實(shí)現(xiàn)就是__pollwait哭尝,也就是上面注冊的回調(diào)函數(shù)。

(5)__pollwait的主要工作就是把current(當(dāng)前進(jìn)程)掛到設(shè)備的等待隊(duì)列中剖煌,不同的設(shè)備有不同的等待隊(duì)列材鹦,對于tcp_poll來說逝淹,其等待隊(duì)列是sk->sk_sleep(注意把進(jìn)程掛到等待隊(duì)列中并不代表進(jìn)程已經(jīng)睡眠了)。在設(shè)備收到一條消息(網(wǎng)絡(luò)設(shè)備)或填寫完文件數(shù)據(jù)(磁盤設(shè)備)后桶唐,會喚醒設(shè)備等待隊(duì)列上睡眠的進(jìn)程栅葡,這時current便被喚醒了。

(6)poll方法返回時會返回一個描述讀寫操作是否就緒的mask掩碼莽红,根據(jù)這個mask掩碼給fd_set賦值妥畏。

(7)如果遍歷完所有的fd,還沒有返回一個可讀寫的mask掩碼安吁,則會調(diào)用schedule_timeout是調(diào)用select的進(jìn)程(也就是current)進(jìn)入睡眠醉蚁。當(dāng)設(shè)備驅(qū)動發(fā)生自身資源可讀寫后,會喚醒其等待隊(duì)列上睡眠的進(jìn)程鬼店。如果超過一定的超時時間(schedule_timeout指定)网棍,還是沒人喚醒,則調(diào)用select的進(jìn)程會重新被喚醒獲得CPU妇智,進(jìn)而重新遍歷fd滥玷,判斷有沒有就緒的fd。

(8)把fd_set從內(nèi)核空間拷貝到用戶空間巍棱。

從以上工作流程可得到select特點(diǎn):

a.所監(jiān)視的每種事件描述符個數(shù)有上限惑畴;

printf("%d\n",sizeof(fd_set));

我的linux系統(tǒng)所能關(guān)心事件應(yīng)為128字節(jié)*8=1024個描述符

b.調(diào)用前后輪詢;

使用select函數(shù)航徙,必須使用輔助數(shù)組保存關(guān)心的描述符如贷,因?yàn)閟elect函數(shù)中描述符集是輸入輸出型參數(shù),故在調(diào)用前應(yīng)輪詢數(shù)組重置描述符集到踏,調(diào)用后得輪詢描述符集判斷關(guān)心事件是否就緒杠袱。

c.系統(tǒng)與用戶數(shù)據(jù)拷貝:使用copy_from_user從用戶空間拷貝fd_set到內(nèi)核空間。

d.調(diào)用前需重置(描述符集是輸入輸出型參數(shù))窝稿。

3. poll分析

poll的實(shí)現(xiàn)和select非常相似楣富,只是描述fd集合的方式不同,poll使用pollfd結(jié)構(gòu)而不是select的fd_set結(jié)構(gòu)伴榔,其他的都差不多纹蝴。

#include <poll.h>
int poll(struct pollfd fds[], nfds_t nfds, int timeout);

監(jiān)視描述符事件選項(xiàng):

fds:是一個struct pollfd結(jié)構(gòu)類型的數(shù)組潮梯,用于存放需要檢測其狀態(tài)的Socket描述符骗灶;每當(dāng)調(diào)用這個函數(shù)之后,系統(tǒng)不會清空這個數(shù)組秉馏,操作起來比較方便耙旦;特別是對于socket連接比較多的情況下,在一定程度上可以提高處理的效率;這一點(diǎn)與select()函數(shù)不同免都,調(diào)用select()函數(shù)之后锉罐,select()函數(shù)會清空它所檢測的socket描述符集合,導(dǎo)致每次調(diào)用select()之前都必須把socket描述符重新加入到待檢測的集合中绕娘;因此脓规,select()函數(shù)適合于只檢測一個socket描述符的情況,而poll()函數(shù)適合于大量socket描述符的情況险领;與select()十分相似侨舆,當(dāng)返回正值時,代表滿足響應(yīng)事件的文件描述符的個數(shù)绢陌,如果返回0則代表在規(guī)定時間內(nèi)沒有事件發(fā)生挨下。如發(fā)現(xiàn)返回為負(fù)則應(yīng)該立即查看 errno,因?yàn)檫@代表有錯誤發(fā)生脐湾。

注:如果沒有事件發(fā)生臭笆,revents會被清空。

poll特點(diǎn):

  1. 監(jiān)視描述符個數(shù)無上限秤掌;最大描述符+1愁铺,個數(shù)由fds數(shù)組決定。

2.監(jiān)視事件與返回后事件狀態(tài)反生分離闻鉴,調(diào)用前后不需重置茵乱。

3.調(diào)用后輪詢檢測監(jiān)視事件是否發(fā)生。

4.系統(tǒng)與用戶數(shù)據(jù)拷貝:使用copy_from_user從用戶空間拷貝fds到內(nèi)核空間

4. epoll分析

epoll是linux內(nèi)核為處理大批量文件描述符而作了改進(jìn)的poll孟岛,是Linux下多路復(fù)用IO接口select/poll的增強(qiáng)版本似将,它能顯著提高程序在大量并發(fā)連接中中只有少量活躍的情況下的系統(tǒng)CPU利用率。另一點(diǎn)原因就是獲取事件的時候蚀苛,它無須遍歷整個被偵聽的描述符集,只要遍歷那些被內(nèi)核IO事件異步喚醒而加入Ready隊(duì)列的描述符集合就行了玷氏。epoll除了提供select/poll那種IO事件的水平觸發(fā)(Level Triggered)外堵未,還提供了邊緣觸發(fā)(Edge Triggered),這就使得用戶空間程序有可能緩存IO狀態(tài)盏触,減少epoll_wait/epoll_pwait的調(diào)用渗蟹,提高應(yīng)用程序效率。

epoll特點(diǎn):

1.epoll和select和poll的調(diào)用接口上的不同赞辩。

select和poll都只提供了一個函數(shù)——select或者poll函數(shù)雌芽。而epoll提供了三個函數(shù),epoll_create,epoll_ctl和epoll_wait辨嗽,epoll_create是創(chuàng)建一個epoll句柄世落;epoll_ctl是注冊要監(jiān)聽的事件類型;epoll_wait則是等待事件的產(chǎn)生糟需。

2.使用mmap加速內(nèi)核與用戶空間的消息傳遞屉佳。

對于select和poll函數(shù)的系統(tǒng)與內(nèi)核每次調(diào)用時的數(shù)據(jù)拷貝:epoll是通過內(nèi)核與用戶空間mmap同一塊內(nèi)存實(shí)現(xiàn)的谷朝,在epoll_ctl函數(shù)中:每次注冊新的事件到epoll句柄中時(在epoll_ctl中指定EPOLL_CTL_ADD),會把所有的fd拷貝進(jìn)內(nèi)核武花,而不是在epoll_wait的時候重復(fù)拷貝圆凰。epoll保證了每個fd在整個過程中只會拷貝一次。

3.調(diào)用后不需輪詢判斷描述符事件是否就緒体箕。

對于select和poll函數(shù)每次調(diào)用后輪詢檢測事件是否發(fā)生:epoll的解決方案不像select或poll一樣每次都把current輪流加入fd對應(yīng)的設(shè)備等待隊(duì)列中专钉,而只在epoll_ctl時把current掛一遍(這一遍必不可少)并為每個fd指定一個回調(diào)函數(shù),當(dāng)設(shè)備就緒累铅,喚醒等待隊(duì)列上的等待者時跃须,就會調(diào)用這個回調(diào)函數(shù),而這個回調(diào)函數(shù)會把就緒的fd加入一個就緒鏈表)争群。epoll_wait的工作實(shí)際上就是在這個就緒鏈表中查看有沒有就緒的fd(利用schedule_timeout()實(shí)現(xiàn)睡一會回怜,判斷一會的效果)。

4.監(jiān)視描述符沒有個數(shù)上限换薄。

epoll沒有這個限制玉雾,它所支持的FD上限是最大可以打開文件的數(shù)目,這個數(shù)字一般遠(yuǎn)大于2048,注:在1GB內(nèi)存的機(jī)器上大約是10萬左右轻要,具體數(shù)目可以cat /proc/sys/fs/file-max察看,一般來說這個數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大复旬。

5.IO效率不隨FD數(shù)目增加而線性下降。

傳統(tǒng)的select/poll另一個致命弱點(diǎn)就是當(dāng)你擁有一個很大的socket集合冲泥,不過由于網(wǎng)絡(luò)延時驹碍,任一時間只有部分的socket是“活躍”的,但是select/poll每次調(diào)用都會線性掃描全部的集合凡恍,導(dǎo)致效率呈現(xiàn)線性下降志秃。但是epoll不存在這個問題,它只會對“活躍”的socket進(jìn)行操作---這是因?yàn)樵趦?nèi)核實(shí)現(xiàn)中epoll是根據(jù)每個fd上面的callback函數(shù)實(shí)現(xiàn)的嚼酝。只有“活躍”的socket才會主動的去調(diào)用 callback函數(shù)浮还,其他idle狀態(tài)socket則不會。

拓展:系統(tǒng)維護(hù)一顆紅黑樹(平衡搜索二叉樹:穩(wěn)定)存儲監(jiān)視描述符闽巩,和一張鏈表存儲就緒的描述符钧舌。當(dāng)每次注冊或修改,刪除新的文件描述符到epoll句柄中時涎跨,就會增加一個描述符到這課紅黑樹中(增刪改查簡單)洼冻,當(dāng)返回時檢測鏈表上是否有節(jié)點(diǎn),有節(jié)點(diǎn)則拷貝到用戶傳給它的那個描述符數(shù)組中隅很。

epoll對于select和poll相比撞牢,顯著優(yōu)點(diǎn)是:

(1)select,poll實(shí)現(xiàn)需要自己不斷輪詢所有fd集合,直到設(shè)備就緒普泡,期間可能要睡眠和喚醒多次交替播掷。而epoll其實(shí)也需要調(diào)用epoll_wait不斷輪詢就緒鏈表,期間也可能多次睡眠和喚醒交替撼班,但是它是設(shè)備就緒時歧匈,調(diào)用回調(diào)函數(shù),把就緒fd放入就緒鏈表中砰嘁,并喚醒在epoll_wait中進(jìn)入睡眠的進(jìn)程件炉。雖然都要睡眠和交替,但是select和poll在“醒著”的時候要遍歷整個fd集合矮湘,而epoll在“醒著”的時候只要判斷一下就緒鏈表是否為空就行了斟冕,這節(jié)省了大量的CPU時間。這就是回調(diào)機(jī)制帶來的性能提升缅阳。

(2)select磕蛇,poll每次調(diào)用都要把fd集合從用戶態(tài)往內(nèi)核態(tài)拷貝一次,并且要把current往設(shè)備等待隊(duì)列中掛一次十办,而epoll只要一次拷貝秀撇,而且把current往等待隊(duì)列上掛也只掛一次(在epoll_wait的開始,注意這里的等待隊(duì)列并不是設(shè)備等待隊(duì)列向族,只是一個epoll內(nèi)部定義的等待隊(duì)列)呵燕。這也能節(jié)省不少的開銷。

5. 總結(jié):

poll和epoll適用于關(guān)心描述符個數(shù)多的應(yīng)用程序件相。其中epoll對于每次只有很少描述符就緒很有優(yōu)勢(采用回調(diào)機(jī)制監(jiān)測描述符就緒)再扭。

綜上:epoll是上面三個函數(shù)中效率最高的。


(5) Epoll的ET模式和LT模式(ET的非阻塞)

  1. LT(level triggered)是缺省的工作方式夜矗,并且同時支持block和no-block socket.在這種做法中泛范,內(nèi)核告訴你一個文件描述符是否就緒了,然后你可以對這個就緒的fd進(jìn)行IO操作紊撕。如果你不作任何操作敦跌,內(nèi)核還是會繼續(xù)通知你的,所以逛揩,這種模式編程出錯誤可能性要小一點(diǎn)。傳統(tǒng)的select/poll都是這種模型的代表.

  2. ET(edge-triggered)是高速工作方式麸俘,只支持no-block socket辩稽。在這種模式下,當(dāng)描述符從未就緒變?yōu)榫途w時从媚,內(nèi)核通過epoll告訴你逞泄。然后它會假設(shè)你知道文件描述符已經(jīng)就緒,并且不會再為那個文件描述符發(fā)送更多的就緒通知,直到你做了某些操作導(dǎo)致那個文件描述符不再為就緒狀態(tài)了(比如喷众,你在發(fā)送各谚,接收或者接收請求,或者發(fā)送接收的數(shù)據(jù)少于一定量時導(dǎo)致了一個EWOULDBLOCK 錯誤)到千。


(6) 查詢進(jìn)程占用CPU的命令(注意要了解到used昌渤,buf,cache代表意義)

很常見TOP命令憔四,里面的參數(shù)分析如下:

used:已經(jīng)使用物理內(nèi)存的大小
total:總的物理內(nèi)存
free:空閑的物理內(nèi)存
buffers:用于內(nèi)核緩存的內(nèi)存大小
cache:緩沖的交換空間的大小

buffers于cached區(qū)別:buffers指的是塊設(shè)備的讀寫緩沖區(qū)膀息,cached指的是文件系統(tǒng)本身的頁面緩存。他們都是Linux系統(tǒng)底層的機(jī)制了赵,為了加速對磁盤的訪問潜支。


(7) linux的其他常見命令(kill,find柿汛,cp等等)

  1. kill命令用來刪除執(zhí)行中的程序或工作冗酿。kill可將指定的信息送至程序
kill 3268
  1. find命令用來在指定目錄下查找文件。任何位于參數(shù)之前的字符串都將被視為欲查找的目錄名络断。如果使用該命令時裁替,不設(shè)置任何參數(shù),則find命令將在當(dāng)前目錄下查找子目錄與文件妓羊。并且將查找到的子目錄和文件全部進(jìn)行顯示胯究。
find /home -name "*.txt"
  1. cp命令用來將一個或多個源文件或者目錄復(fù)制到指定的目的文件或目錄。它可以將單個源文件復(fù)制成一個指定文件名的具體的文件或一個已經(jīng)存在的目錄下躁绸。cp命令還支持同時復(fù)制多個文件裕循,當(dāng)一次復(fù)制多個文件時,目標(biāo)文件參數(shù)必須是一個已經(jīng)存在的目錄净刮,否則將出現(xiàn)錯誤剥哑。
cp file /usr/men/tmp/file1

(8) shell腳本用法

  1. Shell是一種腳本語言,那么淹父,就必須有解釋器來執(zhí)行這些腳本株婴。linux中最常見的解釋器就是bash。

  2. 腳本語言是不需要編譯的暑认,是一種解釋型語言困介,可以直接通過解釋器解釋運(yùn)行。


(9) 硬連接和軟連接的區(qū)別

  1. 硬連接指通過索引節(jié)點(diǎn)來進(jìn)行連接蘸际。在Linux的文件系統(tǒng)中座哩,保存在磁盤分區(qū)中的文件不管是什么類型都給它分配一個編號,稱為索引節(jié)點(diǎn)號(Inode Index)粮彤。在Linux中根穷,多個文件名指向同一索引節(jié)點(diǎn)是存在的姜骡。比如:A是B的硬鏈接(A和B都是文件名),則A的目錄項(xiàng)中的inode節(jié)點(diǎn)號與B的目錄項(xiàng)中的inode節(jié)點(diǎn)號相同屿良,即一個inode節(jié)點(diǎn)對應(yīng)兩個不同的文件名圈澈,兩個文件名指向同一個文件,A和B對文件系統(tǒng)來說是完全平等的尘惧。刪除其中任何一個都不會影響另外一個的訪問康栈。

  2. 另外一種連接稱之為符號連接(Symbolic Link),也叫軟連接褥伴。軟鏈接文件有類似于Windows的快捷方式谅将。它實(shí)際上是一個特殊的文件。在符號連接中重慢,文件實(shí)際上是一個文本文件饥臂,其中包含的有另一文件的位置信息。比如:A是B的軟鏈接(A和B都是文件名)似踱,A的目錄項(xiàng)中的inode節(jié)點(diǎn)號與B的目錄項(xiàng)中的inode節(jié)點(diǎn)號不相同隅熙,A和B指向的是兩個不同的inode,繼而指向兩塊不同的數(shù)據(jù)塊核芽。但是A的數(shù)據(jù)塊中存放的只是B的路徑名(可以根據(jù)這個找到B的目錄項(xiàng))囚戚。A和B之間是“主從”關(guān)系,如果B被刪除了轧简,A仍然存在(因?yàn)閮蓚€是不同的文件)驰坊,但指向的是一個無效的鏈接。


(10) 文件權(quán)限怎么看(rwx)

r:表示的是讀哮独,4
w:表示的是寫拳芙,2,
x:表示的是執(zhí)行皮璧,1
組合:通過4舟扎、2、1的組合悴务,得到以下幾種權(quán)限: 0(沒有權(quán)限) 4(讀取權(quán)限) 5(4+1 | 讀取+執(zhí)行) 6(4+2 | 讀取+寫入) 7(4+2+1 | 讀取+寫入+執(zhí)行)

從左至右:

  • 1-3位數(shù)字代表文件所有者的權(quán)限
  • 4-6位數(shù)字代表同組用戶的權(quán)限
  • 7-9數(shù)字代表其他用戶的權(quán)限
  • 例如chmod 777 a,

(11) 文件的三種時間(mtime, atime睹限,ctime),分別在什么時候會改變

一個文件也有三種時間讯檐,分別是:訪問時間atime羡疗、修改時間mtime、狀態(tài)時間ctime别洪,分別為Access time叨恨、Modify time、Change time

  1. 訪問時間:對文件進(jìn)行一次讀操作蕉拢,它的訪問時間就會改變特碳。例如像:cat、more等操作晕换,但是像之前的state還有l(wèi)s命令對atime是不會有影響的午乓;

  2. 修改時間:文件的內(nèi)容被最后一次修改的時間,我們經(jīng)常用的ls -l命令顯示出來的文件時間就是這個時間闸准,當(dāng)用vim對文件進(jìn)行編輯之后保存益愈,它的mtime就會相應(yīng)的改變;

  3. 狀態(tài)時間:當(dāng)文件的狀態(tài)被改變的時候夷家,狀態(tài)時間就會隨之改變蒸其,例如當(dāng)使用chmod、chown等改變文件屬性的操作是會改變文件的ctime的库快。


(12) Linux監(jiān)控網(wǎng)絡(luò)帶寬的命令摸袁,查看特定進(jìn)程的占用網(wǎng)絡(luò)資源情況命令

  1. 監(jiān)控總體帶寬使用――nload、bmon义屏、slurm靠汁、bwm-ng、cbm闽铐、speedometer和netload

  2. 監(jiān)控總體帶寬使用(批量式輸出)――vnstat蝶怔、ifstat、dstat和collectl

  3. 每個套接字連接的帶寬使用――iftop兄墅、iptraf踢星、tcptrack、pktstat隙咸、netwatch和trafshow

  4. 每個進(jìn)程的帶寬使用――nethogs

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末沐悦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扎瓶,更是在濱河造成了極大的恐慌所踊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件概荷,死亡現(xiàn)場離奇詭異秕岛,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)误证,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門继薛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人愈捅,你說我怎么就攤上這事遏考。” “怎么了蓝谨?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵灌具,是天一觀的道長青团。 經(jīng)常有香客問我,道長咖楣,這世上最難降的妖魔是什么督笆? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮诱贿,結(jié)果婚禮上娃肿,老公的妹妹穿的比我還像新娘。我一直安慰自己珠十,他們只是感情好料扰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著焙蹭,像睡著了一般晒杈。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上壳嚎,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天桐智,我揣著相機(jī)與錄音,去河邊找鬼烟馅。 笑死说庭,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郑趁。 我是一名探鬼主播刊驴,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼寡润!你這毒婦竟也來了捆憎?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤梭纹,失蹤者是張志新(化名)和其女友劉穎躲惰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體变抽,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡础拨,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绍载。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片诡宗。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖击儡,靈堂內(nèi)的尸體忽然破棺而出塔沃,到底是詐尸還是另有隱情,我是刑警寧澤阳谍,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布蛀柴,位于F島的核電站螃概,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏鸽疾。R本人自食惡果不足惜谅年,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肮韧。 院中可真熱鬧,春花似錦旺订、人聲如沸弄企。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拘领。三九已至,卻和暖如春樱调,著一層夾襖步出監(jiān)牢的瞬間约素,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工笆凌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留圣猎,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓他嫡,卻偏偏與公主長得像撒顿,于是被迫代替她去往敵國和親玉转。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 必備的理論基礎(chǔ) 1.操作系統(tǒng)作用: 隱藏丑陋復(fù)雜的硬件接口欠啤,提供良好的抽象接口。 管理調(diào)度進(jìn)程屋灌,并將多個進(jìn)程對硬件...
    drfung閱讀 3,541評論 0 5
  • 2018-11-06 這一塊操作系統(tǒng)主要分為兩個部分洁段,一個部分是書本上操作系統(tǒng)的知識,還有一部門是linux的相關(guān)...
    zuoerfeng閱讀 3,860評論 0 3
  • 本文摘抄自linux基礎(chǔ)編程 IO概念 Linux的內(nèi)核將所有外部設(shè)備都可以看做一個文件來操作共郭。那么我們對與外部設(shè)...
    VD2012閱讀 1,021評論 0 2
  • python之路——IO模型 IO模型介紹 為了更好地了解IO模型落塑,我們需要事先回顧下:同步纽疟、異步、阻塞憾赁、非阻塞 ...
    go以恒閱讀 544評論 0 2
  • IO模型介紹 為了更好地了解IO模型污朽,我們需要事先回顧下:同步、異步龙考、阻塞蟆肆、非阻塞 同步(synchronous)...
    可笑的黑耀斑閱讀 1,192評論 0 2