1. 程式人生 > 實用技巧 >MySql 技術內幕 (第6章 聚合和旋轉操作)

MySql 技術內幕 (第6章 聚合和旋轉操作)

4. Linux

(1) Linux的I/O模型介紹以及同步非同步阻塞非阻塞的區別(超級重要)

https://blog.csdn.net/sqsltr/article/details/92762279

https://www.cnblogs.com/euphie/p/6376508.html

(IO過程包括兩個階段:(1)核心從IO裝置讀寫資料和(2)程序從核心複製資料)

  • 阻塞:呼叫IO操作的時候,如果緩衝區空或者滿了,呼叫的程序或者執行緒就會處於阻塞狀態直到IO可用並完成資料拷貝。
  • 非阻塞:呼叫IO操作的時候,核心會馬上返回結果,如果IO不可用,會返回錯誤,這種方式下程序需要不斷輪詢直到IO可用為止,但是當程序從核心拷貝資料時是阻塞的。
  • IO多路複用就是同時監聽多個描述符,一旦某個描述符IO就緒(讀就緒或者寫就緒),就能夠通知程序進行相應的IO操作,否則就將程序阻塞在select或者epoll語句上。
  • 同步IO:同步IO模型包括阻塞IO,非阻塞IO和IO多路複用。特點就是當程序從核心複製資料的時候都是阻塞的。
  • 非同步IO:在檢測IO是否可用和程序拷貝資料的兩個階段都是不阻塞的,程序可以做其他事情,當IO完成後核心會給程序傳送一個訊號。

    (2) 檔案系統的理解(EXT4,XFS,BTRFS)

    (3) EPOLL的介紹和了解

    https://zhuanlan.zhihu.com/p/56486633

https://www.jianshu.com/p/397449cadc9a

https://blog.csdn.net/davidsguo008/article/details/73556811

Epoll是Linux進行IO多路複用的一種方式,用於在一個執行緒裡監聽多個IO源,在IO源可用的時候返回並進行操作。它的特點是基於事件驅動,效能很高。

epoll將檔案描述符拷貝到核心空間後使用紅黑樹進行維護,同時向核心註冊每個檔案描述符的回撥函式,當某個檔案描述符可讀可寫的時候,將這個檔案描述符加入到就緒連結串列裡,並喚起程序,返回就緒連結串列到使用者空間,由使用者程式進行處理。

Epoll有三個系統呼叫:epoll_create(),epoll_ctl()和epoll_wait()。

  • eoll_create()函式在核心中初始化一個eventpoll物件,同時初始化紅黑樹和就緒連結串列

  • epoll_ctl()用來對監聽的檔案描述符進行管理。將檔案描述符插入紅黑樹,或者從紅黑樹中刪除,這個過程的時間複雜度是log(N)。同時向核心註冊檔案描述符的回撥函式。

  • epoll_wait()會將程序放到eventpoll的等待佇列中,將程序阻塞,當某個檔案描述符IO可用時,核心通過回撥函式將該檔案描述符放到就緒連結串列裡,epoll_wait()會將就緒連結串列裡的檔案描述符返回到使用者空間。

    (4) IO複用的三種方法(select,poll,epoll)深入理解,包括三者區別,內部原理實現?

    (1)select的方法介紹:select把所有監聽的檔案描述符拷貝到核心中,掛起程序。當某個檔案描述符可讀或可寫的時候,中斷程式喚起程序,select將監聽的檔案描述符再次拷貝到使用者空間,然select後遍歷這些檔案描述符找到IO可用的檔案。下次監控的時候需要再次拷貝這些檔案描述符到核心空間。select支援監聽的描述符最大數量是1024.

    (2)poll使用連結串列儲存檔案描述符,其他的跟select沒有什麼不同。

(3)epoll將檔案描述符拷貝到核心空間後使用紅黑樹進行維護,同時向核心註冊每個檔案描述符的回撥函式,當某個檔案描述符可讀可寫的時候,將這個檔案描述符加入到就緒連結串列裡,並喚起程序,返回就緒連結串列到使用者空間。

詳見 https://www.cnblogs.com/Anker/p/3265058.html

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

  • ET是邊緣觸發模式,在這種模式下,只有當描述符從未就緒變成就緒時,核心才會通過epoll進行通知。然後直到下一次變成就緒之前,不會再次重複通知。也就是說,如果一次就緒通知之後不對這個描述符進行IO操作導致它變成未就緒,核心也不會再次傳送就緒通知。優點就是隻通知一次,減少核心資源浪費,效率高。缺點就是不能保證資料的完整,有些資料來不及讀可能就會無法取出。
  • LT是水平觸發模式,在這個模式下,如果檔案描述符IO就緒,核心就會進行通知,如果不對它進行IO操作,只要還有未操作的資料,核心都會一直進行通知。優點就是可以確保資料可以完整輸出。缺點就是由於核心會一直通知,會不停從核心空間切換到使用者空間,資源浪費嚴重。

    (6) 查詢程序佔用CPU的命令(注意要了解到used,buf,代表意義)

    詳見:https://blog.csdn.net/qq_36357820/article/details/76606113
  1. top命令檢視linux負載:
  2. uptime檢視linux負載
  3. w檢視linux負載:
  4. vmstat檢視linux負載

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

    (8) shell指令碼用法

    (9) 硬連線和軟連線的區別

    (10) 檔案許可權怎麼看(rwx)

    (11) 檔案的三種時間(mtime, atime,ctime),分別在什麼時候會改變

    (12) Linux監控網路頻寬的命令,檢視特定程序的佔用網路資源情況命令

    (13)Linux中執行緒的同步方式有哪些?

    (14)怎麼修改一個檔案的許可權

    chmod 777 (177 277 477 等,許可權組合是 1 2 4,分別代表r x w )

    (15)檢視檔案內容常用命令

    詳見: http://blog.sina.com.cn/s/blog_7b4ce6b101018l8l.html
  5. cat 與 tac

cat的功能是將檔案從第一行開始連續的將內容輸出在螢幕上。當檔案大,行數比較多時,螢幕無法全部容下時,只能看到一部分內容。所以通常使用重定向的方式,輸出滿足指定格式的內容

cat語法:cat [-n] 檔名 (-n : 顯示時,連行號一起輸出)

tac的功能是將檔案從最後一行開始倒過來將內容資料輸出到螢幕上。我們可以發現,tac實際上是cat反過來寫。這個命令不常用。

tac語法:tac 檔名。

  1. more和less(常用)

more的功能是將檔案從第一行開始,根據輸出視窗的大小,適當的輸出檔案內容。當一頁無法全部輸出時,可以用“回車鍵”向下翻行,用“空格鍵”向下翻頁。退出檢視頁面,請按“q”鍵。另外,more還可以配合管道符“|”(pipe)使用,例如:ls -al | more

more的語法:more 檔名

Enter 向下n行,需要定義,預設為1行;

Ctrl f 向下滾動一屏;

空格鍵 向下滾動一屏;

Ctrl b 返回上一屏;

= 輸出當前行的行號;

:f 輸出檔名和當前行的行號;

v 呼叫vi編輯器;

! 命令 呼叫Shell,並執行命令;

q 退出more

less的功能和more相似,但是使用more無法向前翻頁,只能向後翻。

less可以使用【pageup】和【pagedown】鍵進行前翻頁和後翻頁,這樣看起來更方便。

less的語法:less 檔名

  1. head和tail

head和tail通常使用在只需要讀取檔案的前幾行或者後幾行的情況下使用。head的功能是顯示檔案的前幾行內容

head的語法:head [n number] 檔名 (number 顯示行數)

tail的功能恰好和head相反,只顯示最後幾行內容

tail的語法:tail [-n number] 檔名

  1. nl 複製程式碼
    1 nl的功能和cat -n一樣,同樣是從第一行輸出全部內容,並且把行號顯示出來

nl的語法:nl 檔名

  1. vim

這個用的太普遍了,主要是用於編輯。

(16)怎麼找出含有關鍵字的前後4行

(17)Linux的GDB除錯

(18)coredump是什麼 怎麼才能coredump

coredump是程式由於異常或者bug在執行時異常退出或者終止,在一定的條件下生成的一個叫做core的檔案,這個core檔案會記錄程式在執行時的記憶體,暫存器狀態,記憶體指標和函式堆疊資訊等等。對這個檔案進行分析可以定位到程式異常的時候對應的堆疊呼叫資訊。

coredump產生的條件

  1. shell資源控制限制,使用 ulimit -c 命令檢視shell執行程式時的資源 ,如果為0,則不會產生coredump。可以用ulimit -c unlimited設定為不限大小。
  2. 讀寫越界,包括:陣列訪問越界,指標指向錯誤的記憶體,字串讀寫越界
  3. 使用了執行緒不安全的函式,讀寫未加鎖保護
  4. 錯誤使用指標轉換
  5. 堆疊溢位

    (19)tcpdump常用命令

    用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網路上的資料包進行截獲的包分析工具。 tcpdump可以將網路中傳送的資料包的“頭”完全截獲下來提供分析。它支援針對網路層、協議、主機、網路或埠的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的資訊。

實用命令例項

將某埠收發的資料包儲存到檔案

sudo tcpdump -i any port 埠 -w 檔名.cap

列印請求到螢幕

sudo tcpdump -i any port 埠 -Xnlps0

預設啟動

tcpdump
普通情況下,直接啟動tcpdump將監視第一個網路介面上所有流過的資料包。
監視指定網路介面的資料包

tcpdump -i eth1
如果不指定網絡卡,預設tcpdump只會監視第一個網路介面,一般是eth0,下面的例子都沒有指定網路介面。 

(20) crontab命令

詳見:https://www.cnblogs.com/peida/archive/2013/01/08/2850483.html

corntab命令是用來指定使用者計劃任務的。使用者將需要定時執行的任務寫入crontab檔案中,提交給crond程序定期執行。

  • crontab命令用來對crontab檔案進行管理

1.命令格式:
crontab [-u user] file
crontab [-u user] [ -e | -l | -r ]
2.命令功能:
通過crontab 命令,我們可以在固定的間隔時間執行指定的系統指令或 shell script指令碼。時間間隔的單位可以是分鐘、小時、日、月、周及以上的任意組合。這個命令非常設合週期性的日誌分析或資料備份等工作。
3.命令引數:
-u user:用來設定某個使用者的crontab服務,例如,“-u ixdba”表示設定ixdba使用者的crontab服務,此引數一般有root使用者來執行。
file:file是命令檔案的名字,表示將file做為crontab的任務列表檔案並載入crontab。如果在命令列中沒有指定這個檔案,crontab命令將接受標準輸入(鍵盤)上鍵入的命令,並將它們載入crontab。
-e:編輯某個使用者的crontab檔案內容。如果不指定使用者,則表示編輯當前使用者的crontab檔案。
-l:顯示某個使用者的crontab檔案內容,如果不指定使用者,則表示顯示當前使用者的crontab檔案內容。
-r:從/var/spool/cron目錄中刪除某個使用者的crontab檔案,如果不指定使用者,則預設刪除當前使用者的crontab檔案。
-i:在刪除使用者的crontab檔案時給確認提示。

  • crontab檔案內容

crond是Linux下的週期性執行系統任務的守護程序,他會根據/etc下的crontab配置檔案的內容執行。使用者需要將計劃任務寫入crontab檔案中才能執行。

使用者所建立的crontab檔案中,每一行都代表一項任務,每行的每個欄位代表一項設定,它的格式共分為六個欄位,前五段是時間設定段,第六段是要執行的命令段,格式如下:

minute hour day month week command

其中:
minute: 表示分鐘,可以是從0到59之間的任何整數。
hour:表示小時,可以是從0到23之間的任何整數。
day:表示日期,可以是從1到31之間的任何整數。
month:表示月份,可以是從1到12之間的任何整數。
week:表示星期幾,可以是從0到7之間的任何整數,這裡的0或7代表星期日。
command:要執行的命令,可以是系統命令,也可以是自己編寫的指令碼檔案。
在以上各個欄位中,還可以使用以下特殊字元:
星號():代表所有可能的值,例如month欄位如果是星號,則表示在滿足其它欄位的制約條件後每月都執行該命令操作。
逗號(,):可以用逗號隔開的值指定一個列表範圍,例如,“1,2,5,7,8,9”
中槓(-):可以用整數之間的中槓表示一個整數範圍,例如“2-6”表示“2,3,4,5,6”
正斜線(/):可以用正斜線指定時間的間隔頻率,例如“0-23/2”表示每兩小時執行一次。同時正斜線可以和星號一起使用,例如
/10,如果用在minute欄位,表示每十分鐘執行一次。

(21) 檢視後臺程序

  • jobs

檢視當前控制檯的後臺程序

想要停止後臺程序,使用jobs命令檢視其程序號(比如為num),然後kill %num即可

  • ps

檢視後臺程序

  • top

檢視所有程序和資源使用情況,類似Windows中的工作管理員

停止程序:介面是互動式的,在視窗輸入k 之後輸入PID,會提示輸入停止程序模式 有SIGTERM和 SIGKILL 如果留空不輸入,就是SIGTERM(優雅停止)

退出top:輸入q即可

(22)排程演算法總結

1.先來先去

2.最短作業優先排程

3.高響應比排程

要求服務時間相同,等待時間少的先處理,等待時間相同,要求服務時間長的先處理。長作業和短作業得到了兼顧。

4.時間片輪轉排程(Round Robin)

5.最高優先順序排程

6.多級反饋佇列排程

    1. 按照先來先服務原則排序,設定N個就緒佇列為Q1,Q2...QN,每個佇列中都可以放很多作業;
    2. 為這N個就緒佇列賦予不同的優先順序,第一個佇列的優先順序最高,第二個佇列次之,其餘各佇列的優先權逐個降低;
    3. 設定每個就緒佇列的時間片,優先權越高,演算法賦予佇列的時間片越小。時間片大小的設定按照實際作業(程序)的需要調整;
    4. 程序在進入待排程的佇列等待時,首先進入優先順序最高的Q1等待。
    5. 首先排程優先順序高的佇列中的程序。若高優先順序中佇列中已沒有排程的程序,則排程次優先順序佇列中的程序。例如:Q1,Q2,Q3三個佇列,只有在Q1中沒有程序等待時才去排程Q2,同理,只有Q1,Q2都為空時才會去排程Q3。
    6. 對於同一個佇列中的各個程序,按照時間片輪轉法排程。比如Q1佇列的時間片為N,那麼Q1中的作業在經歷了時間片為N的時間後,若還沒有完成,則進入Q2佇列等待,若Q2的時間片用完後作業還不能完成,一直進入下一級佇列,直至完成。
    7. 在低優先順序的佇列中的程序在執行時,又有新到達的作業,那麼在執行完這個時間片後,CPU馬上分配給新到達的作業即搶佔式排程CPU。

2.頁面置換演算法

缺頁中斷

  1. 在 CPU 裡訪問一條 Load M 指令,然後 CPU 會去找 M 所對應的頁表項。

  2. 如果該頁表項的狀態位是「有效的」,那 CPU 就可以直接去訪問實體記憶體了,如果狀態位是「無效的」,則 CPU 則會發送缺頁中斷請求。

  3. 作業系統收到了缺頁中斷,則會執行缺頁中斷處理函式,先會查詢該頁面在磁碟中的頁面的位置。

  4. 找到磁碟中對應的頁面後,需要把該頁面換入到實體記憶體中,但是在換入前,需要在實體記憶體中找空閒頁,如果找到空閒頁,就把頁面換入到實體記憶體中。

  5. 頁面從磁碟換入到實體記憶體完成後,則把頁表項中的狀態位修改為「有效的」。

  6. 最後,CPU 重新執行導致缺頁異常的指令。

頁表字段

1.opt

頁表內7、0、1其中7是最久沒有被訪問到的,將7置換出去。

2.lru

看將來要用的頁面 在已經在用的頁面中哪個是最久不會被使用的,然後置換掉它。

4.clock-置換

5.least used

為每個在用的頁面設定一個計數器,用的最少的置換掉。

三。磁碟排程演算法

假設一組磁碟磁軌位置

98,183,37,122,14,124,65,67

1.先來先服務。

2.最短時間優先

3.掃描演算法

先往一個方向掃,掃到沒有訪問位置為止然後轉換方向再掃一次。

4.迴圈掃描

先往一個方向掃,然後掉頭到磁頭0方向再接著同方向掃。

5.look與c-look

look是掃描的優化,不會移動到尾端,移動到最遠請求位置就返回了。

c-look是針對迴圈掃描的優化,不會移動到尾端,移動到最遠請求位置就返回重掃。