從門外到門內(nèi):Linux基礎(chǔ)知識(shí)

最近在兼職部分運(yùn)維工作迟几,之前沒(méi)怎么做過(guò)消请,對(duì)Linux不是那么的熟悉,這導(dǎo)致的主要問(wèn)題是类腮,當(dāng)出現(xiàn)性能問(wèn)題臊泰,不知道看那些指標(biāo),那些指標(biāo)有什么含義蚜枢。有不足的當(dāng)然要惡補(bǔ)一下缸逃,所以就有了這篇文章。這篇文章只是拋磚引玉厂抽,改天有時(shí)間寫(xiě)篇需频,linxu性能監(jiān)控,大體上就是服務(wù)器性能應(yīng)該看那些指標(biāo)筷凤,去定位問(wèn)題所在昭殉。

內(nèi)存

存儲(chǔ)媒介

速度:L1/L2/ cache > 內(nèi)存 > 固態(tài) > 硬盤(pán)苞七。一般的緩存路徑是:硬盤(pán)or固態(tài)—>內(nèi)存 —> L1/L2緩存。 將數(shù)據(jù)存入L1/L2緩存一般是那種比較底層的應(yīng)用會(huì)采取的方式挪丢,例如linux的TLB(將虛擬地址到物理地址的映射緩存到 L1 cache中)蹂风,加快地址轉(zhuǎn)換的速度。

虛擬內(nèi)存

虛擬內(nèi)存是Linux管理內(nèi)存的一種技術(shù)乾蓬。它使得每個(gè)應(yīng)用程序都認(rèn)為自己擁有獨(dú)立且連續(xù)的可用的內(nèi)存空間惠啄。大體關(guān)系如下。

  進(jìn)程X                                                                      進(jìn)程Y
+-------+                                                                  +-------+
| VPFN7 |--+                                                               | VPFN7 |
+-------+  |       進(jìn)程X的                                 進(jìn)程Y的           +-------+
| VPFN6 |  |      Page Table                              Page Table     +-| VPFN6 |
+-------+  |      +------+                                +------+       | +-------+
| VPFN5 |  +----->| .... |---+                    +-------| .... |<---+  | | VPFN5 |
+-------+         +------+   |        +------+    |       +------+    |  | +-------+
| VPFN4 |    +--->| .... |---+-+      | PFN4 |    |       | .... |    |  | | VPFN4 |
+-------+    |    +------+   | |      +------+    |       +------+    |  | +-------+
| VPFN3 |--+ |    | .... |   | | +--->| PFN3 |<---+  +----| .... |<---+--+ | VPFN3 |
+-------+  | |    +------+   | | |    +------+       |    +------+    |    +-------+
| VPFN2 |  +-+--->| .... |---+-+-+    | PFN2 |<------+    | .... |    |    | VPFN2 |
+-------+    |    +------+   | |      +------+            +------+    |    +-------+
| VPFN1 |    |               | +----->| FPN1 |                        +----| VPFN1 |
+-------+    |               |        +------+                             +-------+
| VPFN0 |----+               +------->| PFN0 |                             | VPFN0 |
+-------+                             +------+                             +-------+
 虛擬內(nèi)存                               物理內(nèi)存                               虛擬內(nèi)存

這里需要了解的:

  1. 虛擬內(nèi)存的描述的結(jié)構(gòu)叫memory mapping任内,主要描述了虛擬地址的起始位置撵渡,長(zhǎng)度,權(quán)限死嗦,以及類型
  2. 虛擬內(nèi)存關(guān)聯(lián)的不一定是物理內(nèi)存姥闭,還可以是磁盤(pán),swap區(qū)越走。因?yàn)槭怯成渑锲罚梢杂成涞礁鞣N存儲(chǔ)媒介中去,這是虛擬內(nèi)存強(qiáng)大的地方之一
  3. 虛擬內(nèi)存由于是映射廊敌,所以可以先分配虛擬內(nèi)存铜跑,到了使用時(shí)才分配真正的物理內(nèi)存,這個(gè)叫延遲加載骡澈。大體的過(guò)程是這樣子的锅纺。1. 讀虛擬內(nèi)存 —> 發(fā)現(xiàn)沒(méi)有分配物理內(nèi)存 —> 缺頁(yè)中斷 —> 分配物理內(nèi)存 —> 與虛擬內(nèi)存產(chǎn)生管理 —>再次讀取。這樣做是為了提高內(nèi)存的使用效率肋殴。需要注意的是并不是任何情況下都是延遲加載的囤锉。
  4. 物理內(nèi)存可以映射到不同的進(jìn)程中的虛擬內(nèi)存中去(多對(duì)多關(guān)系),所以可以實(shí)現(xiàn)不同的進(jìn)程共享內(nèi)存

交換空間

當(dāng)系統(tǒng)物理內(nèi)存吃緊時(shí)护锤,Linux會(huì)將內(nèi)存中不常訪問(wèn)的數(shù)據(jù)保存到swap上官地。一個(gè)看內(nèi)存是否不夠的重要指標(biāo)swap的使用率

這里主要需要了解的是:

  1. 一般當(dāng)需要使用到swap的時(shí)候,這說(shuō)明系統(tǒng)內(nèi)存不夠用了烙懦,處理速度會(huì)各種慢驱入,雖然服務(wù)暫時(shí)可用,但很慢B任觥?鹘稀!掩缓,分分鐘和死掉沒(méi)啥區(qū)別雪情。
  2. 什么時(shí)候用swap, 什么時(shí)候不該用。結(jié)論是在內(nèi)存勉強(qiáng)夠用的情況下你辣,可用使用swap巡通,其它情況下不需要使用尘执。內(nèi)存不夠的情況下,合理的做法是加內(nèi)存扁达。內(nèi)存夠的情況下swap沒(méi)啥用處,除非需要休眠蠢熄,但是服務(wù)器當(dāng)然是24小時(shí)工作的跪解,即便是內(nèi)存泄露,讓內(nèi)核觸發(fā)OOM Killer签孔,重啟也好過(guò)叉讥,服務(wù)變得很慢,處于假死狀態(tài)饥追。

page cache & buffer cache

cache和buffer都是對(duì)接兩個(gè)速度不對(duì)稱的設(shè)備一塊區(qū)域图仓,一般來(lái)說(shuō),cache是加速讀但绕,buffer是加速寫(xiě)的(處理數(shù)據(jù)產(chǎn)生的速度 > 數(shù)據(jù)寫(xiě)入的速度救崔,中間加個(gè)buffer使用數(shù)據(jù)寫(xiě)入均勻化,每次寫(xiě)入更多的數(shù)據(jù))捏顺。page cache和buffer cache都是存儲(chǔ)到內(nèi)存當(dāng)中六孵,page cache緩存的是文件系統(tǒng)中的內(nèi)容,用來(lái)加速文件的讀取幅骄,而buffer cache緩存的是塊設(shè)備中內(nèi)容劫窒,加速對(duì)塊設(shè)備的寫(xiě)入。最后拆座,cache&buffer主巍,這兩個(gè)是好東西,對(duì)于對(duì)接兩個(gè)速度不對(duì)稱的系統(tǒng)都可以用到挪凑。

這里需要了解一下的:

  1. 當(dāng)系統(tǒng)中free的內(nèi)存很小時(shí)孕索,不代表真的內(nèi)存不夠用,當(dāng)free的內(nèi)存很小躏碳,buffer cache和page cache也都很小檬果,此時(shí)才代表系統(tǒng)內(nèi)存不夠用了。
  2. 讀寫(xiě)文件的路徑: 讀—> page cache —> buffer cache —> 磁盤(pán) 寫(xiě)—> page cache —> buffer cache —> 磁盤(pán)
  3. 可以手動(dòng)的將page cache釋放掉唐断。先刷新cache中的內(nèi)存到磁盤(pán)选脊,再清除
    僅清除頁(yè)面緩存(一般用這個(gè)): sync; echo 1 > /proc/sys/vm/drop_caches. 
    除目錄項(xiàng)和inode: sync; echo 2 > /proc/sys/vm/drop_caches    
    清除頁(yè)面緩存逆济,目錄項(xiàng)和inode: sync; echo 3 > /proc/sys/vm/drop_caches 
    

Oom killer

當(dāng)系統(tǒng)內(nèi)存不夠時(shí)矮慕,將會(huì)觸發(fā)oom killer通過(guò)一定的算法選取一個(gè)進(jìn)程來(lái)殺掉。注意了P邱5ぞ鳌钝的!不是內(nèi)存使用最高的進(jìn)程會(huì)被殺掉

這個(gè)需要了解的是

  1. 算法的權(quán)重與分?jǐn)?shù):/proc/[pid]/oom_adj, [-17, 15] -17表示禁止被kill(可以通過(guò)寫(xiě)入-17來(lái)達(dá)到禁止殺死的目的), 數(shù)字越大代表越容易被殺掉翁垂。分?jǐn)?shù): /proc/[pid]/oom_score 根據(jù)oom_adj算出來(lái)的,內(nèi)部不夠時(shí)選最高分的來(lái)殺掉硝桩。
  2. 查看被oom killer死掉的log: dmesg | grep -i 'killed process'

打印出分?jǐn)?shù)最高的進(jìn)程的shell腳本

#!/bin/bash
for proc in $(find /proc -maxdepth 1 -regex '/proc/[0-9]+'); do
    printf "%2d %5d %s\n" \
        "$(cat $proc/oom_score)" \
        "$(basename $proc)" \
        "$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)"
done 2>/dev/null | sort -nr | head -n 10

內(nèi)存碎片

  1. 外部碎片:未被分配的內(nèi)存沿猜,由于太多零碎的不連續(xù)小內(nèi)存,無(wú)法滿足當(dāng)前較大內(nèi)存的申請(qǐng)要求
    原因:頻繁的分配與回收物理頁(yè)導(dǎo)致大量的小塊內(nèi)存夾雜在已分配頁(yè)面中間

  2. 內(nèi)部碎片:已經(jīng)分配的內(nèi)存碗脊,卻不能被利用的內(nèi)存空間
    緣由:所有內(nèi)存分配必須起始可被4啼肩、8或16(體系結(jié)構(gòu)決定)整除的地址或者M(jìn)MU分頁(yè)機(jī)制限制
    實(shí)例:請(qǐng)求一個(gè)11Byte的內(nèi)存塊,系統(tǒng)可能會(huì)分配12Byte衙伶、16Byte等稍大一些的字節(jié)祈坠,這些多余空間就產(chǎn)生碎片

關(guān)于linux內(nèi)存的好書(shū)or好文

各種必要的基礎(chǔ)知識(shí)詳細(xì)講解
偏向底層地講解內(nèi)存分配的操作過(guò)程

網(wǎng)絡(luò)

套接字

套接字是一個(gè)塊內(nèi)存空間,用來(lái)存放控制通信操作的控制信息(例如:通信對(duì)象的IP , 端口矢劲,狀態(tài)等)赦拘。由于是存放控制信息的抽象,所以不同的協(xié)議相關(guān)的控制信息是不一樣的芬沉。

TCP

很細(xì)節(jié)的協(xié)議躺同,我覺(jué)得非必要的情況下,不需要進(jìn)行深入的了解丸逸。需要很明確了解的是: 網(wǎng)絡(luò)通信是不可靠的笋籽,而 TCP是可靠的通信協(xié)議,為了保證可靠椭员,TCP協(xié)議設(shè)計(jì)得非常復(fù)雜车海,例如:連接時(shí)的三次握手,通信時(shí)的應(yīng)答重發(fā)機(jī)制隘击,斷開(kāi)時(shí)的四次握手等等侍芝。下面是我覺(jué)得有必要去了解的。

需要了解的

協(xié)議頭的重要字段
  • 序號(hào):相當(dāng)于從開(kāi)頭的第幾個(gè)字節(jié)(初始序號(hào)隨機(jī)計(jì)算)
  • ACK號(hào):初始序號(hào)+接收到的總的字節(jié)數(shù)+1
  • 窗口大新裢:接收buffer的大兄莸(高效的利用等待ACK號(hào)的時(shí)間,發(fā)發(fā)發(fā)凶赁,只要接收buffer還有空間咧栗,用于加速傳輸)
  • 控制位: ACK(成功接收), SYN(建立連接), FIN(端口連接)
  • 校驗(yàn)和: 檢查是否出錯(cuò)
整個(gè)通信的大體過(guò)程
image.png

創(chuàng)建套接字

主要進(jìn)行的操作是分配內(nèi)存空間,寫(xiě)入初始狀態(tài)

連接

確認(rèn)通信雙方的IP&端口虱肄,通信窗口的大兄掳濉(接受緩存的大小)咏窿,初始序號(hào)斟或。另外的,三次握手主要是為了防止服務(wù)端接收到連接請(qǐng)求后集嵌,客戶端已經(jīng)關(guān)閉了萝挤, 若不進(jìn)行服務(wù)端到客戶單的確認(rèn)就進(jìn)行連接御毅,就造成無(wú)畏的連接,進(jìn)而造成資源浪費(fèi)怜珍。

收發(fā)

這一塊比較有趣值得借鑒的是端蛆,提升收發(fā)效率的機(jī)制。例如:

發(fā)送buffer的刷新機(jī)制: 用buffer來(lái)連接兩個(gè)速度不一致的通信對(duì)象酥泛。既然是buffer必然也是有刷新機(jī)制今豆,TCP協(xié)議采用的是:長(zhǎng)度+時(shí)間機(jī)制。長(zhǎng)度機(jī)制是指當(dāng)buffer滿了才刷新(發(fā)送出去)揭璃,時(shí)間機(jī)制是指超過(guò)一定的時(shí)間將buffer中的數(shù)據(jù)刷新晚凿,兩者相互補(bǔ)充亭罪,如果數(shù)據(jù)一來(lái)就發(fā)送瘦馍,就會(huì)發(fā)送出大量的小包,增加傳輸次數(shù)应役,效率降低情组,但是如果發(fā)送的頻率低,每次都等到夠數(shù)據(jù)量才發(fā)送箩祥,就造成了無(wú)畏的等待院崇。

高效利用等待ACK號(hào)的機(jī)制: 如果每次都發(fā)送一個(gè)包,就要等到接收到應(yīng)答包再發(fā)送下一個(gè)包袍祖,這等待的時(shí)間就白白浪費(fèi)掉了底瓣,那群大牛們就想出了,在接收端設(shè)置buffer(就是指窗口)蕉陋,當(dāng)buffer沒(méi)有被填滿就可以繼續(xù)發(fā)發(fā)發(fā)捐凭,然后將多次應(yīng)答合并成一個(gè)應(yīng)答。應(yīng)答的主要作用是確認(rèn)是否丟包凳鬓,是否出錯(cuò)等茁肠,而這個(gè)主要是通過(guò)序號(hào)+已經(jīng)接收到的數(shù)據(jù) + 校驗(yàn)和確認(rèn)的,所以可以多個(gè)應(yīng)答信號(hào)合并缩举。

根據(jù)網(wǎng)絡(luò)包平均返回時(shí)間調(diào)整ACK號(hào)的等待時(shí)間:如果等待一段時(shí)間后沒(méi)有收到垦梆,會(huì)將包重發(fā),由于網(wǎng)絡(luò)傳輸又快有慢仅孩,這意味著并不能設(shè)置一個(gè)固定值托猩,那群大牛就想出了根據(jù)網(wǎng)絡(luò)包平均返回時(shí)間調(diào)整ACK號(hào)的等待時(shí)間的機(jī)制。

還有一塊比較有趣的辽慕,當(dāng)server接收到一個(gè)連接請(qǐng)求站刑,協(xié)議棧會(huì)給等待的套接字復(fù)制一個(gè)副本,然后客戶端的套接字和復(fù)制出來(lái)的套接字相交互鼻百,這意味著會(huì)有很多端口一樣的套接字绞旅。問(wèn)題來(lái)了摆尝,當(dāng)服務(wù)器端收到客戶端的數(shù)據(jù)后,怎么找到和自己建立連接的套機(jī)字因悲?答案是:客戶端IP+端口+服務(wù)器端IP+端口堕汞,來(lái)找到相對(duì)于的套接字。

斷開(kāi)連接

這個(gè)我覺(jué)得沒(méi)什么特別需要了解的晃琳。需要知道的:當(dāng)主動(dòng)斷開(kāi)方進(jìn)入socket進(jìn)入TIME_WAIT狀態(tài)后讯检,需要經(jīng)過(guò)一定時(shí)間(這個(gè)是一個(gè)固定時(shí)間,可以改)才會(huì)將套接字刪除卫旱,主要是為了誤操作人灼。例如,當(dāng)客戶端發(fā)送FIN信號(hào)—>服務(wù)器端返回ACK號(hào) —> 服務(wù)器端發(fā)送FIN信號(hào) —> 客戶端返回ACK號(hào)顾翼,若在客戶端返回的ACK號(hào)投放,由于網(wǎng)絡(luò)問(wèn)題,服務(wù)器端沒(méi)有收到适贸,服務(wù)器端會(huì)重新發(fā)送FIN號(hào)灸芳,如果馬上刪除,相同的端口分配給了新的應(yīng)用程序拜姿,此時(shí)就將新的套接字給端口開(kāi)了烙样。

套接字狀態(tài)的變化

客戶端: CLOSED->SYN_SENT->ESTABLISHED->FIN_WAIT_1->FIN_WAIT_2->TIME_WAIT->CLOSED
服務(wù)器端: CLOSED->LISTEN->SYN_RCVD->ESTABLISHED->CLOSE_WAIT->LAST_ACK->CLOSED

重點(diǎn)關(guān)注的狀態(tài)是: ESTABLISHED, TIME_WAIT, LAST_ACK。

UDP

特點(diǎn)是無(wú)連接蕊肥,直接發(fā)發(fā)發(fā)谒获。因此,資源消耗小壁却,速度相對(duì)于TCP來(lái)說(shuō)更快批狱,但是丟包嚴(yán)重。所以它適用于發(fā)送的數(shù)據(jù)特點(diǎn):

  1. 短數(shù)據(jù)儒洛。例如精耐,一個(gè)包就可以發(fā)完的,即便出錯(cuò)了應(yīng)用程序也能知道琅锻,重發(fā)就好卦停。例如DNS查詢(DNS默認(rèn)是UDP ,當(dāng)然可以改為TCP)恼蓬。
  2. 無(wú)需重發(fā)惊完,或者重發(fā)了也沒(méi)什么用的場(chǎng)景,例如直播時(shí)的音頻处硬,視頻小槐,重發(fā)了也沒(méi)什么意義。

DNS

DNS服務(wù)器提供通過(guò)域名查詢IP地址的服務(wù),還提供的其它服務(wù)凿跳,但主要是域名解析件豌。記錄域名到IP的映射的類型叫A記錄。

需要了解的

域名映射的存儲(chǔ)與域名的遞歸搜索

域名存儲(chǔ):DSN服務(wù)器中的映射信息是按照域名以分層次的結(jié)構(gòu)來(lái)保存的控嗜,一個(gè)域作為一個(gè)整體存放在DNS服務(wù)器中茧彤,上一級(jí)也可能會(huì)緩存了下一級(jí)的域名映射。例如疆栏,www.api.test.com 曾掂,以.來(lái)做分割,越靠右層級(jí)越高(隱藏了一個(gè)根域/)壁顶。每一個(gè)域都作為一個(gè)整體存儲(chǔ)并向上層機(jī)的域注冊(cè)存儲(chǔ)當(dāng)前域的服務(wù)器的IP珠洗,因此在本域就能找到本域所又的映射,沒(méi)有該映射就提供可以找到該域映射的DNS服務(wù)器的IP若专。

遞歸搜索: 這個(gè)語(yǔ)言不好描述许蓖,這個(gè)直接上圖說(shuō)明

DNS遞歸查詢.png
查詢順序

DNS的查詢結(jié)果各個(gè)階段都有緩存,查詢順序是這樣的:客戶端—>瀏覽器緩存→系統(tǒng)緩存→路由器緩存→ISP DNS 緩存→遞歸搜索

一個(gè)域名映射多個(gè)IP時(shí)的處理

當(dāng)一個(gè)域名映射有多個(gè)IP時(shí)富岳,通過(guò)輪詢算法得到一個(gè)ip返回給客戶端蛔糯。這個(gè)就是最簡(jiǎn)單的負(fù)載均衡方案拯腮。缺點(diǎn):如果其中一臺(tái)服務(wù)器掛掉了窖式,DNS然后會(huì)返回,現(xiàn)在的瀏覽器返回的IP地址失敗了动壤,會(huì)嘗試再次請(qǐng)求獲取第二個(gè)IP地址萝喘。

CDN與DSN

CDN作為緩存服務(wù)器,本質(zhì)上是一個(gè)代理琼懊,此時(shí)CDN服務(wù)器的IP將代替web服務(wù)器注冊(cè)到DNS服務(wù)中阁簸。

防火墻與DNS

大家都知道,在中國(guó)大陸是訪問(wèn)不了google的哼丈,做個(gè)限制的其中一個(gè)簡(jiǎn)單的做法就是當(dāng)對(duì)www.google.com這個(gè)域名解析時(shí)启妹,返回一個(gè)錯(cuò)誤的IP地址,這樣就限制了對(duì)google的訪問(wèn)醉旦。

防火墻

防火墻有好幾種饶米,這里主要需要了解的是包過(guò)濾的方式。包過(guò)濾的主要思路是指允許指定的包通過(guò)车胡,包括發(fā)送和接收檬输,通對(duì)各種協(xié)議包的頭部信息進(jìn)行過(guò)濾。例如匈棘,TCP協(xié)議的請(qǐng)求頭中丧慈,有客戶端的IP,端口信息主卫,有服務(wù)器端的IP逃默,端口信息鹃愤,通過(guò)SYN和ACK控制位,還知道是否是連接請(qǐng)求完域。有了這些信息就可以制定相對(duì)應(yīng)的過(guò)濾規(guī)則了昼浦,只能對(duì)IP為xxx的通過(guò)連接請(qǐng)求,只開(kāi)放xxx端口等等筒主。云服務(wù)提供商都會(huì)提供相應(yīng)的設(shè)置界面設(shè)置過(guò)濾規(guī)則关噪,在機(jī)器中也可以通過(guò)iptables來(lái)自己設(shè)置。額外的乌妙,可以通過(guò)iptable來(lái)搭建透明代理使兔,將請(qǐng)求都轉(zhuǎn)發(fā)到代理中。

關(guān)于網(wǎng)絡(luò)的好書(shū)or好文

網(wǎng)絡(luò)是怎么連接的: 上面關(guān)于網(wǎng)絡(luò)的知識(shí)大部分都是出自于這本書(shū)的知識(shí)點(diǎn)的整理藤韵,非常不錯(cuò)的一本科普級(jí)別的書(shū)虐沥,適合僅僅是像我只需稍微了解一下網(wǎng)絡(luò)的人看

CPU

CPU利用率和CPU負(fù)載沒(méi)有關(guān)系,兩個(gè)是不同維度的東西泽艘。

cpu利用率

顯示的是程序在運(yùn)行期間實(shí)時(shí)占用的CPU百分比欲险。

各個(gè)CPU狀態(tài)

us: 用戶空間占用CPU百分比
sy: 內(nèi)核空間占用CPU百分比
ni: 用戶進(jìn)程空間內(nèi)改變過(guò)優(yōu)先級(jí)的進(jìn)程占用CPU百分比
id: 空閑CPU百分比
wa: 等待輸入輸出的CPU時(shí)間百分比
hi: 硬件中斷
si: 軟件中斷

一般來(lái)說(shuō),主要關(guān)注的是us, sy, id, wa, 例如當(dāng)wa過(guò)高匹涮,此時(shí)就表示網(wǎng)絡(luò)或者是硬盤(pán)出現(xiàn)了性能問(wèn)題了天试。

cpu負(fù)載

一定時(shí)間內(nèi)處于就緒狀態(tài)的平均進(jìn)程數(shù),一定時(shí)間一般是1分鐘然低,5分鐘喜每,15分鐘。當(dāng)負(fù)載大于CPU核數(shù)時(shí)雳攘,這意味著有的進(jìn)程需要等待带兜,不能及時(shí)的分配到CPU,因此總體性能就會(huì)下降吨灭。推薦的CPU的平均負(fù)載是小于CPU個(gè)數(shù)X核數(shù)X0.7刚照。一般創(chuàng)業(yè)公司經(jīng)常是一臺(tái)服務(wù)器,部署多個(gè)服務(wù)喧兄,突然有一個(gè)服務(wù)的負(fù)載突然增加无畔,CPU負(fù)載超過(guò)核數(shù)后,各個(gè)服務(wù)的整體性能就會(huì)下降繁莹。

權(quán)限

linux的權(quán)限是基于用戶來(lái)組織的檩互,用戶劃分為:所有者,用戶組咨演,其它人闸昨。權(quán)限劃分為:讀(r),寫(xiě)(w),執(zhí)行(x)饵较,讀寫(xiě)執(zhí)行對(duì)于文件和目錄的含義是不同的拍嵌。剛開(kāi)始玩linux會(huì)經(jīng)常遇到各種權(quán)限問(wèn)題

需要說(shuō)明一下的

  1. cp后,文件屬性默認(rèn)是為系統(tǒng)創(chuàng)建該類型文件的默認(rèn)屬性循诉,可以加-P 保持和原來(lái)一樣的屬性
  2. 程序?qū)ξ募母鞣N增刪改讀和允許該程序的用戶有關(guān)
  3. 子文件夾的權(quán)限與父文件夾的權(quán)限無(wú)關(guān)横辆,不具繼承關(guān)系

文件

r: 可讀取文件的內(nèi)容
w: 可修改文件的內(nèi)容
x: 可被系統(tǒng)執(zhí)行

目錄

r: 可查看目錄下的文件信息
w: 具有更改改目錄結(jié)構(gòu)的權(quán)限,這里的更改是指茄猫,增狈蚤,刪,重命名划纽,移動(dòng)
x: 是否允許進(jìn)入該目錄

進(jìn)程

一點(diǎn)基礎(chǔ)知識(shí)

進(jìn)程在內(nèi)存中的組成

代碼段:程序代碼數(shù)據(jù)

棧段:存儲(chǔ)函數(shù)的放回地址脆侮,函數(shù)的參數(shù),局部變量等

數(shù)據(jù)段:

  • data: 初始化數(shù)據(jù)勇劣,例如靜態(tài)變量
  • BSS: 存儲(chǔ)初始化為0的數(shù)據(jù)
  • 堆:使用malloc等函數(shù)靖避,動(dòng)態(tài)分配的內(nèi)存

task_struct結(jié)構(gòu):linxu用于管理進(jìn)程的數(shù)據(jù)結(jié)構(gòu),里面記錄了進(jìn)程的很多信息比默,例如:進(jìn)程的狀態(tài)幻捏,調(diào)度信息,進(jìn)程號(hào)命咐,打開(kāi)的文件, 堆棧信息等等篡九。

進(jìn)程號(hào): 用于標(biāo)識(shí)一個(gè)進(jìn)程

INIT進(jìn)程: 它是內(nèi)核啟動(dòng)的第一個(gè)用戶級(jí)進(jìn)程,進(jìn)程號(hào)為1

父進(jìn)程: 創(chuàng)建子進(jìn)程的進(jìn)程侈百,會(huì)承擔(dān)子進(jìn)程的資源的回收瓮下,每個(gè)進(jìn)程都有父進(jìn)程翰铡,idle進(jìn)程除外

孤兒進(jìn)程:一個(gè)父進(jìn)程退出钝域,而它的一個(gè)或多個(gè)子進(jìn)程還在運(yùn)行,這些進(jìn)程沒(méi)有了爸爸所以就叫孤兒進(jìn)程锭魔。孤兒進(jìn)程將被init進(jìn)程(進(jìn)程號(hào)為1)所收養(yǎng)例证,并由init進(jìn)程對(duì)它們完成一些資源的回收工作。它沒(méi)啥危害迷捧。

僵死進(jìn)程:進(jìn)程已經(jīng)退出织咧,但父進(jìn)程沒(méi)有進(jìn)行資源(主要是task_struct結(jié)構(gòu))回收。一般來(lái)說(shuō)漠秋,肯定是有短暫的時(shí)間是處于這個(gè)狀態(tài)笙蒙,但是如果父進(jìn)程因?yàn)閎ug等原因,不回收子進(jìn)程的資源庆锦,這會(huì)導(dǎo)致資源的泄露捅位,例如沒(méi)那么多進(jìn)程號(hào)可以分配。當(dāng)進(jìn)程處于僵尸進(jìn)程,可以kill掉父進(jìn)程艇搀,此時(shí)僵尸進(jìn)程將會(huì)成為孤兒進(jìn)程尿扯,由INIT進(jìn)程回收。

進(jìn)程組: 一個(gè)或多個(gè)進(jìn)程的集合焰雕,組長(zhǎng)進(jìn)程的進(jìn)程號(hào)等于進(jìn)程組ID衷笋,進(jìn)程組的生存周期是進(jìn)程組中生存最久的那個(gè)進(jìn)程,因此組長(zhǎng)進(jìn)程退出后進(jìn)程組任然在

會(huì)話: 一個(gè)或多個(gè)進(jìn)程組的集合矩屁。例如辟宗,登錄一個(gè)shell,此時(shí)就是一個(gè)會(huì)話吝秕,包含了會(huì)話首進(jìn)程慢蜓,一個(gè)前臺(tái)進(jìn)程組,多個(gè)后臺(tái)進(jìn)程組郭膛。前臺(tái)進(jìn)程組的進(jìn)程特點(diǎn)就是晨抡,可以向終端設(shè)備進(jìn)行讀寫(xiě)操作,而后臺(tái)進(jìn)程組的進(jìn)程只能是向終端設(shè)備進(jìn)行寫(xiě)操作则剃。

守護(hù)進(jìn)程: 特點(diǎn)獨(dú)立于控制終端耘柱,在后臺(tái)運(yùn)行。獨(dú)立與終端環(huán)境棍现,這意味著需要和啟動(dòng)它的進(jìn)程運(yùn)行環(huán)境相隔離调煎,例如會(huì)話,控制終端己肮,進(jìn)程組士袄,文件描述符,文件權(quán)限掩碼谎僻,工作目錄等娄柳。很多服務(wù)類的進(jìn)程都是以守護(hù)進(jìn)程的形式存在的,例如crond艘绍,redis, ngnix等赤拒。

信號(hào): 進(jìn)程之間相互傳遞消息的一種方法,全稱為軟中斷信號(hào)诱鞠。進(jìn)程收到信號(hào)后的處理:1. 進(jìn)行相關(guān)的處理 2. 忽略 3. 安裝系統(tǒng)默認(rèn)值去處理挎挖。kill -l 可以看到所有的信號(hào),本質(zhì)上就是一個(gè)約定俗成的整數(shù)航夺。

進(jìn)程使用的系統(tǒng)資源的限制:進(jìn)程可使用的系統(tǒng)資源蕉朵,例如,打開(kāi)文件的個(gè)數(shù)是有所限制的阳掐。在cat /proc/pid/limits文件可以看到相關(guān)的限制始衅。存在感比較強(qiáng)的限制是最大文件打開(kāi)數(shù)堪伍。

進(jìn)程優(yōu)先級(jí):進(jìn)程優(yōu)先級(jí)高的可以獲得更多的cpu運(yùn)行時(shí)間。這個(gè)值越小觅闽,表示進(jìn)程”優(yōu)先級(jí)”越高帝雇,而值越大“優(yōu)先級(jí)”越低, -20至19共40個(gè)級(jí)別。只有root權(quán)限才能更改為負(fù)數(shù)級(jí)別蛉拙。

進(jìn)程的生命周期與狀態(tài)變化

從進(jìn)程的生命周期的角度可以很好的了解進(jìn)程尸闸,進(jìn)程的生命周期:創(chuàng)建—>執(zhí)行—>終止—>刪除,每一步都涉及到一些進(jìn)程相關(guān)的知識(shí)孕锄。

創(chuàng)建

進(jìn)程的創(chuàng)建主要是調(diào)用系統(tǒng)fork()來(lái)創(chuàng)建一個(gè)進(jìn)程

這里需要了解的是

  1. fork()函數(shù)調(diào)用之后吮廉,在父進(jìn)程會(huì)返回子進(jìn)程的進(jìn)程號(hào),子進(jìn)程返回0
  2. 子進(jìn)程與父進(jìn)程共享代碼段畸肆,復(fù)制了服進(jìn)程的棧段和數(shù)據(jù)段宦芦,也就是說(shuō)擁有自己獨(dú)立的棧段和數(shù)據(jù)段,但是一開(kāi)始只是邏輯上的擁有轴脐,而非物理上的擁有调卑。如果每次都是完全拷貝進(jìn)程的棧段和數(shù)據(jù)段,那么系統(tǒng)開(kāi)銷就很大大咱,不會(huì)那么傻恬涧。為了提高效率,其實(shí)只是子進(jìn)程擁有自己獨(dú)立的虛擬內(nèi)存空間碴巾,映射的物理內(nèi)存還是和父進(jìn)程共享溯捆,當(dāng)子進(jìn)程中的數(shù)據(jù)有所改變才會(huì)分配新的物理空間。

執(zhí)行—>終止—>刪除

這里主要是涉及到了進(jìn)程運(yùn)行時(shí)狀態(tài)的變化

進(jìn)程的狀態(tài)有:

R(TASK_RUNNING): 運(yùn)行狀態(tài) | 在運(yùn)行隊(duì)列中等待

S(TASK_INTERRUPTIBLE): 可中斷的睡眠狀態(tài)厦瓢√嶙幔可中斷其實(shí)就是指,當(dāng)某條件滿足后可以被喚醒煮仇,也就是我們程序員見(jiàn)慣的阻塞劳跃,例如: 等待IO,sleep, 等待信號(hào)等待欺抗。

D(TASK_UNINTERRUPTIBLE): 不可中斷的睡眠狀態(tài)售碳,此時(shí)進(jìn)程是不可以被中斷的,這意味著此時(shí)的進(jìn)程不會(huì)響應(yīng)各種異步信號(hào)绞呈,例如,不會(huì)響應(yīng)SIGKILL信號(hào)间景。主要意義在于佃声,內(nèi)存的某些處理流程不能被打斷。額外的倘要,TASK_UNINTERRUPTIBLE狀態(tài)總是非常短暫的圾亏,通過(guò)ps命令基本上不可能捕捉到十拣。

T(TASK_STOPPED or TASK_TRACED): 暫停狀態(tài)或者跟蹤狀態(tài)。這里需要分開(kāi)說(shuō)志鹃。

  1. TASK_STOPPED狀態(tài): 當(dāng)向進(jìn)程發(fā)送SIGSTOP夭问、SIGTSTP、SIGTTIN曹铃、SIGTTOU信號(hào)缰趋,進(jìn)程響應(yīng)后(TASK_UNINTERRUPTIBLE狀態(tài)不會(huì)響應(yīng))會(huì)進(jìn)入該狀態(tài),發(fā)送SIGCONT信號(hào)陕见,又會(huì)恢復(fù)到TASK_RUNNING狀態(tài)秘血。
  2. TASK_TRACED狀態(tài): 進(jìn)程調(diào)試時(shí)處于的狀態(tài)和TASK_STOPPED類似,主要區(qū)別在于不會(huì)響應(yīng)SIGCONT评甜。

Z(TASK_DEAD - EXIT_ZOMBIE): 僵尸狀態(tài)灰粮,當(dāng)子進(jìn)程退出,但父進(jìn)程沒(méi)有將子進(jìn)程的資源回收時(shí)處于的狀態(tài)忍坷。進(jìn)程退出后粘舟,進(jìn)程占用的資源就會(huì)被回收,例如棧段佩研,數(shù)據(jù)段等蓖乘,但是task_struct結(jié)構(gòu)并沒(méi)有被回收,這個(gè)需要父進(jìn)程來(lái)回收韧骗。我猜這樣做的主要原因是嘉抒,父進(jìn)程可能會(huì)需要到子進(jìn)程的一些信息。

狀態(tài)變化如下圖

進(jìn)程的狀態(tài)轉(zhuǎn)移圖.png

一些重要的配置文件

登錄讀取的配置文件

讀取順序:/etc/environment -> /etc/profile ->/etc/bashrc-> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> ~/.bash_logout

各個(gè)配置文件的作用

/etc/environment: 一般是配置一下基本的環(huán)境變量袍暴,例如些侍,系統(tǒng)當(dāng)前語(yǔ)言變量

/etc/profile: 此文件為系統(tǒng)的每個(gè)用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時(shí),該文件被執(zhí)行。注意了政模,是用戶登錄時(shí)執(zhí)行的岗宣,如su 采用non-loin模式,將不會(huì)讀取該文件淋样。

~/.bash_profile | ~/.bash_login | ~/.profile: 這三個(gè)都是屬于用戶級(jí)別的配置文件耗式,依次讀取,成功讀取一個(gè)后面的將不再讀取趁猴。

/etc/bashrc: 對(duì)所有用戶打開(kāi)新的shell都是生效的

~/.bashrc: 打開(kāi)一個(gè)新的shell讀取的配置文件

~/.bash_logout: 若是以login模式登錄的刊咳,當(dāng)每次退出系統(tǒng)(退出bash shell)時(shí),執(zhí)行該文件,一些退出操作可以寫(xiě)入改shell儡司。

系統(tǒng)啟動(dòng)過(guò)程

不同版本的linux采用的init系統(tǒng)有所不同

sysvinit: 古老的東西
init進(jìn)程 —> 讀取/etc/inittab —>/etc/rc.d/rc.sysinit —> /etc/rc.d/rc[0-6].d —> /etc/rc.d/rc.local
不同發(fā)行版本會(huì)有點(diǎn)點(diǎn)區(qū)別娱挨,這里主要是需要了解
/etc/rc.d/rc[0-6].d: 存放了各個(gè)啟動(dòng)級(jí)別需要啟動(dòng)的服務(wù),開(kāi)啟啟動(dòng)可以添加進(jìn)去
/etc/rc.d/rc.local: 本地初始化程序, 可以自定義的開(kāi)機(jī)啟動(dòng)
/etc/rc.d/init.d: 含有各類服務(wù)程序, /etc/rc.d/rc[0-6].d中的服務(wù)都軟鏈到該目錄捕犬。

upstart:這個(gè)ubuntu在采用跷坝,具體的可以看看 UpStart

systemd: CentOS 7之后在采用酵镜,具體的可以看看 systemd
啟動(dòng)過(guò)程這個(gè)東西了解它,主要是為了弄一下開(kāi)機(jī)開(kāi)啟的服務(wù)柴钻,上面的三種啟動(dòng)方式有所不同淮韭。但是都是有init.d目錄,啟動(dòng)級(jí)別的rc[0-6]d的概念贴届,rc.local文件靠粪,但目錄或文件的路徑有點(diǎn)不一樣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末粱腻,一起剝皮案震驚了整個(gè)濱河市庇配,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绍些,老刑警劉巖捞慌,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異柬批,居然都是意外死亡啸澡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門氮帐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嗅虏,“玉大人,你說(shuō)我怎么就攤上這事上沐∑し” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵参咙,是天一觀的道長(zhǎng)龄广。 經(jīng)常有香客問(wèn)我,道長(zhǎng)蕴侧,這世上最難降的妖魔是什么择同? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮净宵,結(jié)果婚禮上敲才,老公的妹妹穿的比我還像新娘。我一直安慰自己择葡,他們只是感情好紧武,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著刁岸,像睡著了一般脏里。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虹曙,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天迫横,我揣著相機(jī)與錄音,去河邊找鬼酝碳。 笑死矾踱,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的疏哗。 我是一名探鬼主播呛讲,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼返奉!你這毒婦竟也來(lái)了贝搁?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤芽偏,失蹤者是張志新(化名)和其女友劉穎雷逆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體污尉,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡膀哲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了被碗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片某宪。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖锐朴,靈堂內(nèi)的尸體忽然破棺而出兴喂,到底是詐尸還是另有隱情,我是刑警寧澤焚志,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布衣迷,位于F島的核電站,受9級(jí)特大地震影響娩嚼,放射性物質(zhì)發(fā)生泄漏蘑险。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一岳悟、第九天 我趴在偏房一處隱蔽的房頂上張望佃迄。 院中可真熱鬧,春花似錦贵少、人聲如沸呵俏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)普碎。三九已至,卻和暖如春录平,著一層夾襖步出監(jiān)牢的瞬間麻车,已是汗流浹背缀皱。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留动猬,地道東北人啤斗。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像赁咙,于是被迫代替她去往敵國(guó)和親钮莲。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

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

  • 第一章 Nginx簡(jiǎn)介 Nginx是什么 沒(méi)有聽(tīng)過(guò)Nginx彼水?那么一定聽(tīng)過(guò)它的“同行”Apache吧崔拥!Ngi...
    JokerW閱讀 32,670評(píng)論 24 1,002
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,072評(píng)論 25 707
  • 又來(lái)到了一個(gè)老生常談的問(wèn)題,應(yīng)用層軟件開(kāi)發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢凤覆? 今天就這個(gè)問(wèn)題開(kāi)始链瓦,來(lái)談?wù)劜?..
    tangsl閱讀 4,122評(píng)論 0 23
  • 問(wèn)題1: 編譯無(wú)法通過(guò),出現(xiàn)錯(cuò)誤: 一般出現(xiàn)這種和 _sqlite 相關(guān)的錯(cuò)誤叛赚,表示缺少sqlite依賴庫(kù)澡绩,解決方...
    KingLionsFrank閱讀 261評(píng)論 0 1
  • 在這世界上,有許多東西俺附,而它們都是我們的好朋友肥卡。 我依次跟他們打招呼!你好事镣!明媚的太陽(yáng)公公步鉴,你照在我身上,如同站在...
    美麗的茉莉閱讀 233評(píng)論 0 3