這一塊操作系統(tǒng)主要分為兩個部分,一個部分是書本上操作系統(tǒng)的知識,還有一部門是linux的相關(guān)知識:
網(wǎng)站設(shè)計制作過程拒絕使用模板建站;使用PHP+MYSQL原生開發(fā)可交付網(wǎng)站源代碼;符合網(wǎng)站優(yōu)化排名的后臺管理系統(tǒng);網(wǎng)站設(shè)計制作、網(wǎng)站制作收費合理;免費進行網(wǎng)站備案等企業(yè)網(wǎng)站建設(shè)一條龍服務(wù).我們是一家持續(xù)穩(wěn)定運營了十多年的創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司。
linux相關(guān)知識
###(1) Linux中同步異步、阻塞非阻塞的區(qū)別(超級重要)
首先是同步異步、阻塞非阻塞的區(qū)別:
同步:所謂同步,就是在發(fā)出一個功能調(diào)用時,在沒有得到結(jié)果之前,該調(diào)用就不返回。也就是必須一件一件事做,等前一件做完了才能做下一件事。
例如普通B/S模式(同步):提交請求->等待服務(wù)器處理->處理完畢返回 這個期間客戶端瀏覽器不能干任何事
異步:異步的概念和同步相對。當一個異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實際處理這個調(diào)用的部件在完成后,通過狀態(tài)、通知和回調(diào)來通知調(diào)用者。
例如 ajax請求(異步): 請求通過事件觸發(fā)->服務(wù)器處理(這是瀏覽器仍然可以作其他事情)->處理完畢
阻塞:阻塞調(diào)用是指調(diào)用結(jié)果返回之前,當前線程會被掛起(線程進入非可執(zhí)行狀態(tài),在這個狀態(tài)下,cpu不會給線程分配時間片,即線程暫停運行)。函數(shù)只有在得到結(jié)果之后才會返回。
有人也許會把阻塞調(diào)用和同步調(diào)用等同起來,實際上他是不同的。對于同步調(diào)用來說,很多時候當前線程還是激活的,只是從邏輯上當前函數(shù)沒有返回,它還會搶占cpu去執(zhí)行其他邏輯,也會主動檢測io是否準備好。
非阻塞:非阻塞和阻塞的概念相對應(yīng),指在不能立刻得到結(jié)果之前,該函數(shù)不會阻塞當前線程,而會立刻返回。
再簡單點理解就是:
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ù)拷貝的時候進程是否阻塞
阻塞IO和非阻塞IO的區(qū)別就在于:應(yīng)用程序的調(diào)用是否立即返回
綜上可知,同步和異步,阻塞和非阻塞,有些混用,其實它們完全不是一回事,而且它們修飾的對象也不相同。
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ù)準備好。 如果數(shù)據(jù)沒有準備好,一直等待….數(shù)據(jù)準備好了,從內(nèi)核拷貝到用戶空間,IO函數(shù)返回成功指示。
阻塞I/O模型圖:在調(diào)用recv()/recvfrom()函數(shù)時,發(fā)生在內(nèi)核中等待數(shù)據(jù)和復(fù)制數(shù)據(jù)的過程。
當調(diào)用recv()函數(shù)時,系統(tǒng)首先查是否有準備好的數(shù)據(jù)。如果數(shù)據(jù)沒有準備好,那么系統(tǒng)就處于等待狀態(tài)。當數(shù)據(jù)準備好后,將數(shù)據(jù)從系統(tǒng)緩沖區(qū)復(fù)制到用戶空間,然后該函數(shù)返回。在套接應(yīng)用程序中,當調(diào)用recv()函數(shù)時,未必用戶空間就已經(jīng)存在數(shù)據(jù),那么此時recv()函數(shù)就會處于等待狀態(tài)。
2. 非阻塞I/O
非阻塞IO通過進程反復(fù)調(diào)用IO函數(shù)(多次系統(tǒng)調(diào)用,并馬上返回);在數(shù)據(jù)拷貝的過程中,進程是阻塞的
我們把一個SOCKET接口設(shè)置為非阻塞就是告訴內(nèi)核,當所請求的I/O操作無法完成時,不要將進程睡眠,而是返回一個錯誤。這樣我們的I/O操作函數(shù)將不斷的測試數(shù)據(jù)是否已經(jīng)準備好,如果沒有準備好,繼續(xù)測試,直到數(shù)據(jù)準備好為止。在這個不斷測試的過程中,會大量的占用CPU的時間。
3. IO復(fù)用
主要是select和epoll;對一個IO端口,兩次調(diào)用,兩次返回,比阻塞IO并沒有什么優(yōu)越性;關(guān)鍵是能實現(xiàn)同時對多個IO端口進行監(jiān)聽; I/O復(fù)用模型會用到select、poll、epoll函數(shù),這幾個函數(shù)也會使進程阻塞,但是和阻塞I/O所不同的的,這兩個函數(shù)可以同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數(shù)進行檢測,直到有數(shù)據(jù)可讀或可寫時,才真正調(diào)用I/O操作函數(shù)。
IO復(fù)用模型會用到select、poll、epoll函數(shù),這幾個函數(shù)也會使進程阻塞,但是和阻塞I/O所不同的是,這兩個函數(shù)可以同時阻塞多個I/O操作。而且可以同時對多個讀操作、多個寫操作的I/O函數(shù)進行檢測,直到有數(shù)據(jù)可讀或者可寫時(注意不是全部數(shù)據(jù)可讀或者可寫),才真正的調(diào)用I/O操作函數(shù)。
4. 信號驅(qū)動IO
首先我們允許套接口進行信號驅(qū)動I/O,并安裝一個信號處理函數(shù),進程繼續(xù)運行并不阻塞。當數(shù)據(jù)準備好時,進程會收到一個SIGIO信號,可以在信號處理函數(shù)中調(diào)用I/O操作函數(shù)處理數(shù)據(jù)。
5. 異步IO
當一個異步過程調(diào)用發(fā)出后,調(diào)用者不能立刻得到結(jié)果。實際處理這個調(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),這比普通用戶當前能買到的硬盤還要大的多。使用 ext4 能創(chuàng)建的最大卷/分區(qū)是 1 exbibyte(大概是 1,152,921.5 terabytes)。通過使用多種技巧, ext4 比 ext3 有很大的速度提升。類似一些最先進的文件系統(tǒng),它是一個日志文件系統(tǒng),意味著它會對文件在磁盤中的位置以及任何其它對磁盤的更改做記錄。縱觀它的所有功能,它還不支持透明壓縮、重復(fù)數(shù)據(jù)刪除或者透明加密。技術(shù)上支持了快照,但該功能還處于實驗性階段。
2.XFS 文件系統(tǒng)
XFS 文件系統(tǒng)是擴展文件系統(tǒng)(extent file system)的一個擴展。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)默認使用 XFS。
3.trfs 文件系統(tǒng)
btrfs 有很多不同的叫法,例如 Better FS、Butter FS 或者 B-Tree FS。它是一個幾乎完全從頭開發(fā)的文件系統(tǒng)。btrfs 出現(xiàn)的原因是它的開發(fā)者起初希望擴展文件系統(tǒng)的功能使得它包括快照、池化(pooling)、校驗以及其它一些功能。雖然和 ext4 無關(guān),它也希望能保留 ext4 中能使消費者和企業(yè)受益的功能,并整合額外的能使每個人,尤其是企業(yè)受益的功能。對于使用大型軟件以及大規(guī)模數(shù)據(jù)庫的企業(yè),讓多種不同的硬盤看起來一致的文件系統(tǒng)能使他們受益并且使數(shù)據(jù)整合變得更加簡單。刪除重復(fù)數(shù)據(jù)能降低數(shù)據(jù)實際使用的空間,當需要鏡像一個單一而巨大的文件系統(tǒng)時使用 btrfs 也能使數(shù)據(jù)鏡像變得簡單。
用戶當然可以繼續(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)缺點,一種文本處理命令是不能被另一個完全替換的,否則也不會出現(xiàn)三個文本處理命令了。只不過,相比較而言,sed和awk功能更強大而已,且已獨立成一種語言來介紹。
2.grep:文本過濾器,如果僅僅是過濾文本,可使用grep,其效率要比其他的高很多;
3.sed:Stream EDitor,流編輯器,默認只處理模式空間,不處理原數(shù)據(jù),如果你處理的數(shù)據(jù)是針對行進行處理的,可以使用sed;
4.awk:報告生成器,格式化以后顯示。如果對處理的數(shù)據(jù)需要生成報告之類的信息,或者你處理的數(shù)據(jù)是按列進行處理的,最好使用awk。
(4) IO復(fù)用的三種方法(select,poll,epoll)深入理解,包括三者區(qū)別,內(nèi)部原理實現(xiàn)?
1. IO復(fù)用的了解:
select,poll,epoll都是IO多路復(fù)用的機制。I/O多路復(fù)用就通過一種機制,可以監(jiān)視多個描述符,一旦某個描述符就緒(一般是讀就緒或者寫就緒),能夠通知程序進行相應(yīng)的讀寫操作。但select,poll,epoll本質(zhì)上都是同步I/O,因為他們都需要在讀寫事件就緒后自己負責進行讀寫,也就是說這個讀寫過程是阻塞的,而異步I/O則無需自己負責進行讀寫,異步I/O的實現(xiàn)會負責把數(shù)據(jù)從內(nèi)核拷貝到用戶空間。
此時需知道兩個概念:
所謂阻塞方式block,顧名思義,就是進程或是線程執(zhí)行到這些函數(shù)時必須等待某個事件的發(fā)生,如果事件沒有發(fā)生,進程或線程就被阻塞,函數(shù)不能立即返回。
所謂非阻塞方式non-block,就是進程或線程執(zhí)行此函數(shù)時不必非要等待事件的發(fā)生,一旦執(zhí)行肯定返回,以返回值的不同來反映函數(shù)的執(zhí)行情況,如果事件發(fā)生則與阻塞方式相同,若事件沒有發(fā)生,則返回一個代碼來告知事件未發(fā)生,而進程或線程繼續(xù)執(zhí)行,所以效率較高。
2. select 分析
select()的機制中提供一fd_set的數(shù)據(jù)結(jié)構(gòu),實際上是一long類型的數(shù)組, 每一個數(shù)組元素都能與一打開的文件句柄(不管是Socket句柄,還是其他 文件或命名管道或設(shè)備句柄)建立聯(lián)系,建立聯(lián)系的工作由程序員完成, 當調(diào)用select()時,由內(nèi)核根據(jù)IO狀態(tài)修改fd_set的內(nèi)容,由此來通知執(zhí)行了select()的進程哪一Socket或文件可讀或可寫。主要用于Socket通信當中。
select使用:它能夠監(jiān)視我們需要監(jiā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
#include
#include
int select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, struct timeval * timeout)
1
2
3
4
函數(shù)返回結(jié)果:當readfds或writefds中映象的文件可讀或可寫或超時,本次select()就結(jié)束返回。程序員利用一組系統(tǒng)提供的宏在select()結(jié)束時便可判斷哪一文件可讀或可寫,對Socket編程特別有用的就是readfds。
注:不同的timeval設(shè)置使select()表現(xiàn)出超時結(jié)束、無超時阻塞和輪詢?nèi)N特性(timeval可精確至百萬分之一秒)。
select詳細執(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為例,其核心實現(xiàn)就是__pollwait,也就是上面注冊的回調(diào)函數(shù)。
(5)__pollwait的主要工作就是把current(當前進程)掛到設(shè)備的等待隊列中,不同的設(shè)備有不同的等待隊列,對于tcp_poll來說,其等待隊列是sk->sk_sleep(注意把進程掛到等待隊列中并不代表進程已經(jīng)睡眠了)。在設(shè)備收到一條消息(網(wǎng)絡(luò)設(shè)備)或填寫完文件數(shù)據(jù)(磁盤設(shè)備)后,會喚醒設(shè)備等待隊列上睡眠的進程,這時current便被喚醒了。
(6)poll方法返回時會返回一個描述讀寫操作是否就緒的mask掩碼,根據(jù)這個mask掩碼給fd_set賦值。
(7)如果遍歷完所有的fd,還沒有返回一個可讀寫的mask掩碼,則會調(diào)用schedule_timeout是調(diào)用select的進程(也就是current)進入睡眠。當設(shè)備驅(qū)動發(fā)生自身資源可讀寫后,會喚醒其等待隊列上睡眠的進程。如果超過一定的超時時間(schedule_timeout指定),還是沒人喚醒,則調(diào)用select的進程會重新被喚醒獲得CPU,進而重新遍歷fd,判斷有沒有就緒的fd。
(8)把fd_set從內(nèi)核空間拷貝到用戶空間。
從以上工作流程可得到select特點:
a.所監(jiān)視的每種事件描述符個數(shù)有上限;
printf("%d\n",sizeof(fd_set));
1
我的linux系統(tǒng)所能關(guān)心事件應(yīng)為128字節(jié)*8=1024個描述符
b.調(diào)用前后輪詢;
使用select函數(shù),必須使用輔助數(shù)組保存關(guān)心的描述符,因為select函數(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的實現(xiàn)和select非常相似,只是描述fd集合的方式不同,poll使用pollfd結(jié)構(gòu)而不是select的fd_set結(jié)構(gòu),其他的都差不多。
#include
int poll(struct pollfd fds[], nfds_t nfds, int timeout);
1
2
監(jiān)視描述符事件選項:
fds:是一個struct pollfd結(jié)構(gòu)類型的數(shù)組,用于存放需要檢測其狀態(tài)的Socket描述符;每當調(diào)用這個函數(shù)之后,系統(tǒng)不會清空這個數(shù)組,操作起來比較方便;特別是對于socket連接比較多的情況下,在一定程度上可以提高處理的效率;這一點與select()函數(shù)不同,調(diào)用select()函數(shù)之后,select()函數(shù)會清空它所檢測的socket描述符集合,導(dǎo)致每次調(diào)用select()之前都必須把socket描述符重新加入到待檢測的集合中;因此,select()函數(shù)適合于只檢測一個socket描述符的情況,而poll()函數(shù)適合于大量socket描述符的情況;與select()十分相似,當返回正值時,代表滿足響應(yīng)事件的文件描述符的個數(shù),如果返回0則代表在規(guī)定時間內(nèi)沒有事件發(fā)生。如發(fā)現(xiàn)返回為負則應(yīng)該立即查看 errno,因為這代表有錯誤發(fā)生。
注:如果沒有事件發(fā)生,revents會被清空。
poll特點:
監(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)核為處理大批量文件描述符而作了改進的poll,是Linux下多路復(fù)用IO接口select/poll的增強版本,它能顯著提高程序在大量并發(fā)連接中中只有少量活躍的情況下的系統(tǒng)CPU利用率。另一點原因就是獲取事件的時候,它無須遍歷整個被偵聽的描述符集,只要遍歷那些被內(nèi)核IO事件異步喚醒而加入Ready隊列的描述符集合就行了。epoll除了提供select/poll那種IO事件的水平觸發(fā)(Level Triggered)外,還提供了邊緣觸發(fā)(Edge Triggered),這就使得用戶空間程序有可能緩存IO狀態(tài),減少epoll_wait/epoll_pwait的調(diào)用,提高應(yīng)用程序效率。
epoll特點:
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)存實現(xiàn)的,在epoll_ctl函數(shù)中:每次注冊新的事件到epoll句柄中時(在epoll_ctl中指定EPOLL_CTL_ADD),會把所有的fd拷貝進內(nèi)核,而不是在epoll_wait的時候重復(fù)拷貝。epoll保證了每個fd在整個過程中只會拷貝一次。
3.調(diào)用后不需輪詢判斷描述符事件是否就緒。
對于select和poll函數(shù)每次調(diào)用后輪詢檢測事件是否發(fā)生:epoll的解決方案不像select或poll一樣每次都把current輪流加入fd對應(yīng)的設(shè)備等待隊列中,而只在epoll_ctl時把current掛一遍(這一遍必不可少)并為每個fd指定一個回調(diào)函數(shù),當設(shè)備就緒,喚醒等待隊列上的等待者時,就會調(diào)用這個回調(diào)函數(shù),而這個回調(diào)函數(shù)會把就緒的fd加入一個就緒鏈表)。epoll_wait的工作實際上就是在這個就緒鏈表中查看有沒有就緒的fd(利用schedule_timeout()實現(xiàn)睡一會,判斷一會的效果)。
4.監(jiān)視描述符沒有個數(shù)上限。
epoll沒有這個限制,它所支持的FD上限是最大可以打開文件的數(shù)目,這個數(shù)字一般遠大于2048,注:在1GB內(nèi)存的機器上大約是10萬左右,具體數(shù)目可以cat /proc/sys/fs/file-max察看,一般來說這個數(shù)目和系統(tǒng)內(nèi)存關(guān)系很大。
5.IO效率不隨FD數(shù)目增加而線性下降。
傳統(tǒng)的select/poll另一個致命弱點就是當你擁有一個很大的socket集合,不過由于網(wǎng)絡(luò)延時,任一時間只有部分的socket是“活躍”的,但是select/poll每次調(diào)用都會線性掃描全部的集合,導(dǎo)致效率呈現(xiàn)線性下降。但是epoll不存在這個問題,它只會對“活躍”的socket進行操作—這是因為在內(nèi)核實現(xiàn)中epoll是根據(jù)每個fd上面的callback函數(shù)實現(xiàn)的。只有“活躍”的socket才會主動的去調(diào)用 callback函數(shù),其他idle狀態(tài)socket則不會。
拓展:系統(tǒng)維護一顆紅黑樹(平衡搜索二叉樹:穩(wěn)定)存儲監(jiān)視描述符,和一張鏈表存儲就緒的描述符。當每次注冊或修改,刪除新的文件描述符到epoll句柄中時,就會增加一個描述符到這課紅黑樹中(增刪改查簡單),當返回時檢測鏈表上是否有節(jié)點,有節(jié)點則拷貝到用戶傳給它的那個描述符數(shù)組中。
epoll對于select和poll相比,顯著優(yōu)點是:
(1)select,poll實現(xiàn)需要自己不斷輪詢所有fd集合,直到設(shè)備就緒,期間可能要睡眠和喚醒多次交替。而epoll其實也需要調(diào)用epoll_wait不斷輪詢就緒鏈表,期間也可能多次睡眠和喚醒交替,但是它是設(shè)備就緒時,調(diào)用回調(diào)函數(shù),把就緒fd放入就緒鏈表中,并喚醒在epoll_wait中進入睡眠的進程。雖然都要睡眠和交替,但是select和poll在“醒著”的時候要遍歷整個fd集合,而epoll在“醒著”的時候只要判斷一下就緒鏈表是否為空就行了,這節(jié)省了大量的CPU時間。這就是回調(diào)機制帶來的性能提升。
(2)select,poll每次調(diào)用都要把fd集合從用戶態(tài)往內(nèi)核態(tài)拷貝一次,并且要把current往設(shè)備等待隊列中掛一次,而epoll只要一次拷貝,而且把current往等待隊列上掛也只掛一次(在epoll_wait的開始,注意這里的等待隊列并不是設(shè)備等待隊列,只是一個epoll內(nèi)部定義的等待隊列)。這也能節(jié)省不少的開銷。
####5. 總結(jié):
poll和epoll適用于關(guān)心描述符個數(shù)多的應(yīng)用程序。其中epoll對于每次只有很少描述符就緒很有優(yōu)勢(采用回調(diào)機制監(jiān)測描述符就緒)。
綜上:epoll是上面三個函數(shù)中效率最高的。
(5) Epoll的ET模式和LT模式(ET的非阻塞)
LT(level triggered)是缺省的工作方式,并且同時支持block和no-block socket.在這種做法中,內(nèi)核告訴你一個文件描述符是否就緒了,然后你可以對這個就緒的fd進行IO操作。如果你不作任何操作,內(nèi)核還是會繼續(xù)通知你的,所以,這種模式編程出錯誤可能性要小一點。傳統(tǒng)的select/poll都是這種模型的代表.
ET(edge-triggered)是高速工作方式,只支持no-block socket。在這種模式下,當描述符從未就緒變?yōu)榫途w時,內(nèi)核通過epoll告訴你。然后它會假設(shè)你知道文件描述符已經(jīng)就緒,并且不會再為那個文件描述符發(fā)送更多的就緒通知,直到你做了某些操作導(dǎo)致那個文件描述符不再為就緒狀態(tài)了(比如,你在發(fā)送,接收或者接收請求,或者發(fā)送接收的數(shù)據(jù)少于一定量時導(dǎo)致了一個EWOULDBLOCK 錯誤)。
(6) 查詢進程占用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)底層的機制,為了加速對磁盤的訪問。
(7) linux的其他常見命令(kill,find,cp等等)
kill命令用來刪除執(zhí)行中的程序或工作。kill可將指定的信息送至程序
kill 3268
1
find命令用來在指定目錄下查找文件。任何位于參數(shù)之前的字符串都將被視為欲查找的目錄名。如果使用該命令時,不設(shè)置任何參數(shù),則find命令將在當前目錄下查找子目錄與文件。并且將查找到的子目錄和文件全部進行顯示。
find /home -name "*.txt"
1
cp命令用來將一個或多個源文件或者目錄復(fù)制到指定的目的文件或目錄。它可以將單個源文件復(fù)制成一個指定文件名的具體的文件或一個已經(jīng)存在的目錄下。cp命令還支持同時復(fù)制多個文件,當一次復(fù)制多個文件時,目標文件參數(shù)必須是一個已經(jīng)存在的目錄,否則將出現(xiàn)錯誤。
cp file /usr/men/tmp/file1
1
(8) shell腳本用法
Shell是一種腳本語言,那么,就必須有解釋器來執(zhí)行這些腳本。linux中最常見的解釋器就是bash。
腳本語言是不需要編譯的,是一種解釋型語言,可以直接通過解釋器解釋運行。
(9) 硬連接和軟連接的區(qū)別
硬連接指通過索引節(jié)點來進行連接。在Linux的文件系統(tǒng)中,保存在磁盤分區(qū)中的文件不管是什么類型都給它分配一個編號,稱為索引節(jié)點號(Inode Index)。在Linux中,多個文件名指向同一索引節(jié)點是存在的。比如:A是B的硬鏈接(A和B都是文件名),則A的目錄項中的inode節(jié)點號與B的目錄項中的inode節(jié)點號相同,即一個inode節(jié)點對應(yīng)兩個不同的文件名,兩個文件名指向同一個文件,A和B對文件系統(tǒng)來說是完全平等的。刪除其中任何一個都不會影響另外一個的訪問。
另外一種連接稱之為符號連接(Symbolic Link),也叫軟連接。軟鏈接文件有類似于Windows的快捷方式。它實際上是一個特殊的文件。在符號連接中,文件實際上是一個文本文件,其中包含的有另一文件的位置信息。比如:A是B的軟鏈接(A和B都是文件名),A的目錄項中的inode節(jié)點號與B的目錄項中的inode節(jié)點號不相同,A和B指向的是兩個不同的inode,繼而指向兩塊不同的數(shù)據(jù)塊。但是A的數(shù)據(jù)塊中存放的只是B的路徑名(可以根據(jù)這個找到B的目錄項)。A和B之間是“主從”關(guān)系,如果B被刪除了,A仍然存在(因為兩個是不同的文件),但指向的是一個無效的鏈接。
(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
訪問時間:對文件進行一次讀操作,它的訪問時間就會改變。例如像:cat、more等操作,但是像之前的state還有l(wèi)s命令對atime是不會有影響的;
修改時間:文件的內(nèi)容被最后一次修改的時間,我們經(jīng)常用的ls -l命令顯示出來的文件時間就是這個時間,當用vim對文件進行編輯之后保存,它的mtime就會相應(yīng)的改變;
狀態(tài)時間:當文件的狀態(tài)被改變的時候,狀態(tài)時間就會隨之改變,例如當使用chmod、chown等改變文件屬性的操作是會改變文件的ctime的。
(12) Linux監(jiān)控網(wǎng)絡(luò)帶寬的命令,查看特定進程的占用網(wǎng)絡(luò)資源情況命令
監(jiān)控總體帶寬使用――nload、bmon、slurm、bwm-ng、cbm、speedometer和netload
監(jiān)控總體帶寬使用(批量式輸出)――vnstat、ifstat、dstat和collectl
每個套接字連接的帶寬使用――iftop、iptraf、tcptrack、pktstat、netwatch和trafshow
每個進程的帶寬使用――nethogs
————————————————
版權(quán)聲明:本文為CSDN博主「祚兒瘋」的原創(chuàng)文章,遵循 CC 4.0 BY-SA 版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/u012414189/article/details/83830848