1. 程式人生 > >Linux刷題總結

Linux刷題總結

1. 計劃任務內容格式:分 時 日 月 周 命令/指令碼

例項:

  1. 每天04:00

    0 4 * * * 要執行的命令

  2. 週二和週五18:00

    0 18 * * 2,5 要執行的命令

  3. 1月到3月份, 週二和週五18:00

    0 18 * 1-3 2,5 要執行的命令

  4. 週一到週五17:30發廣播,然後17:45分關機。寫兩條計劃任務,不是隻能寫一條

    30 17 * * 1-5 /usr/bin/wall < /root/msg

    45 17 * * 1-5 /sbin/shutdown -h now

  5. 中午12點到14點,每兩分鐘(偶數)

    /2 12-14

    * * 命令

    1-59/2 (奇數)

2. 通訊方式

UNIX中有如下的程序間通訊方式:

  • 檔案和記錄鎖定。
    為避免兩個程序間同時要求訪問同一共享資源而引起訪問和操作的混亂,在程序對共享資源進行訪問前必須對其進行鎖定,該程序訪問完後再釋放。這是UNIX為共享資源提供的互斥性保障。

  • 管道。
    管道一般用於兩個不同程序之間的通訊。當一個程序建立一個管道,並呼叫fork建立自己的一個子程序後,父程序關閉讀管道端,子程序關閉寫管道端,這樣 提供了兩個程序之間資料流動的一種方式。

  • FIFO 。
    FIFO是一種先進先出的佇列。它類似於一個管道,只允許資料的單向流動。每個FIFO都有一個名字,允許不相關的程序訪問同一個FIFO。因此也成為命名管。

  • 訊息佇列。
    UNIX下不同程序之間可實現共享資源的一種機制;UNIX允許不同程序將格式化的資料流以訊息形式傳送給任意程序。對訊息佇列具有操作許可權的程序都可以使用msget完成對訊息佇列的操作控制。通過使用訊息型別,程序可以按任何順序讀訊息,或為訊息安排優先順序順序。

  • 訊號燈。
    作為程序間通訊的一種方法,它不是用於交換大批資料,而用於多程序之間的同步(協調對共享儲存段的存取)。

  • 共享記憶體。
    通過訊號燈實現儲存共享(類似“紅燈停、綠燈行”)

其他通訊方式:

  • Linux程序間通訊:管道、訊號、訊息佇列、共享記憶體、訊號量、套接字(socket)
  • Linux執行緒間通訊:互斥量(mutex),訊號量,條件變數
  • Windows程序間通訊:管道、訊息佇列、共享記憶體、訊號量(semaphore) 、套接字(socket)
  • Windows執行緒間通訊:互斥量(mutex),訊號量(semaphore)、臨界區(critical
    section)、事件(event)

3. 查詢檔案

  1. locate並不真正對硬碟上的檔案系統進行查詢,而是對檔名資料庫進行檢索,而且可以使用萬用字元?和*
  2. find命令從指定的起始目錄開始,遞迴地搜尋其各個子目錄,查詢滿足尋找條件的檔案並對之採取相關的操作
  3. whereis命令只能用於程式名的搜尋,而且只搜尋二進位制檔案(引數-b)、man說明檔案(引數-m)和原始碼檔案(引數-s)
  4. type命令用來顯示指定命令的型別,判斷給出的指令是內部指令還是外部指令

4. 硬連結與軟連線

4.1 硬連結

硬連結
由於硬連結是有著相同 inode 號僅檔名不同的檔案,因此硬連結存在以下幾點特性:

  • 檔案有相同的 inode 及 data block;
  • 只能對已存在的檔案進行建立;
  • 不能交叉檔案系統進行硬連結的建立;
  • 不能對目錄進行建立,只可對檔案建立;
  • 刪除一個硬連結檔案並不影響其他有相同 inode 號的檔案。
4.2 軟連線

軟連線
軟連結與硬連結不同,若檔案使用者資料塊中存放的內容是另一檔案的路徑名的指向,則該檔案就是軟連線。軟連結就是一個普通檔案,只是資料塊內容有點特殊。軟連結有著自己的 inode 號以及使用者資料塊。因此軟連結的建立與使用沒有類似硬連結的諸多限制:

  • 軟連結有自己的檔案屬性及許可權等;
  • 可對不存在的檔案或目錄建立軟連結;
  • 軟連結可交叉檔案系統;
  • 軟連結可對檔案或目錄建立;
  • 建立軟連結時,連結計數 i_nlink 不會增加;
  • 刪除軟連結並不影響被指向的檔案,但若被指向的原檔案被刪除,則相關軟連線被稱為死連結(即 dangling link,若被指向路徑檔案被重新建立,死連結可恢復為正常的軟連結)。

5. $ Shell 變數

  • $# 是傳給指令碼的引數個數
  • $0是指令碼本身的名字
  • $1是傳遞給該shell指令碼的第一個引數
  • $2是傳遞給該shell指令碼的第二個引數
  • $@是傳給指令碼的所有引數的列表
  • $* 是以一個單字串顯示所有向指令碼傳遞的引數,與位置變數不同,引數可超過9個
  • $$是指令碼執行的當前程序ID號
  • $? 是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤。最後執行的命令的結束程式碼(返回值)
  • $- 使用Set命令設定的Flag一覽
  • $1~$n, 新增到Shell的各引數值。$1是第1引數、$2是第2引數…。

6. OSI 模型

OSI模型及相關協議
每層協議:
1. 物理層: RJ45 、 CLOCK 、 IEEE802.3 (中繼器,集線器,閘道器)
2. 資料鏈路: PPP 、 FR 、 HDLC 、 VLAN 、 MAC (網橋,交換機)
3. 網路層: IP 、 ICMP 、 ARP 、 RARP 、 OSPF 、 IPX 、 RIP 、 IGRP 、 (路由器)
4. 傳輸層: TCP 、 UDP 、 SPX
5. 會話層: NFS 、 SQL 、 NETBIOS 、 RPC
6. 表示層: JPEG 、 MPEG 、 ASII
7. 應用層: FTP 、 DNS 、 Telnet 、 SMTP 、 HTTP 、 WWW 、 NFS

7. 靜態連結庫與動態連結庫

  1. 靜態連結庫的優點

    1. 程式碼裝載速度快,執行速度略比動態連結庫快;

    2. 只需保證在開發者的計算機中有正確的.LIB檔案,在以二進位制形式釋出程式時不需考慮在使用者的計算機上.LIB檔案是否存在及版本問題,可避免DLL地獄等問題。

  2. 動態連結庫的優點

    1. 更加節省記憶體並減少頁面交換;

    2. DLL檔案與EXE檔案獨立,只要輸出介面不變(即名稱、引數、返回值型別和呼叫約定不變),更換DLL檔案不會對EXE檔案造成任何影響,因而極大地提高了可維護性和可擴充套件性;

    3. 不同程式語言編寫的程式只要按照函式呼叫約定就可以呼叫同一個DLL函式;

    4. 適用於大規模的軟體開發,使開發過程獨立、耦合度小,便於不同開發者和開發組織之間進行開發和測試。

  3. 不足之處

    1. 使用靜態連結生成的可執行檔案體積較大,包含相同的公共程式碼,造成浪費;

    2. 使用動態連結庫的應用程式不是自完備的,它依賴的DLL模組也要存在,如果使用載入時動態連結,程式啟動時發現DLL不存在,系統將終止程式並給出錯誤資訊。而使用執行時動態連結,系統不會終止,但由於DLL中的匯出函式不可用,程式會載入失敗;速度比靜態連結慢。當某個模組更新後,如果新模組與舊的模組不相容,那麼那些需要該模組才能執行的軟體,統統撕掉。這在早期Windows中很常見。

8. 輸出重定向

\>        輸出重定向到一個檔案或裝置 覆蓋原來的檔案
\>!       輸出重定向到一個檔案或裝置 強制覆蓋原來的檔案
\>>       輸出重定向到一個檔案或裝置 追加原來的檔案
\<        輸入重定向到一個程式 

9. 資料存放區域

  • BSS(Block Started by Symbol)通常是指用來存放程式中未初始化的全域性變數和靜態變數的一塊記憶體區域。特點是:可讀寫的,在程式執行之前BSS段會自動清0。所以,未初始的全域性變數在程式執行之前已經成0了。
  • 資料段:資料段(data segment)通常是指用來存放程式中已初始化的全域性變數的一塊記憶體區域。資料段屬於靜態記憶體分配。
  • 程式碼段:程式碼段(code segment/textsegment)通常是指用來存放程式執行程式碼的一塊記憶體區域。這部分割槽域的大小在程式執行前就已經確定,並且記憶體區域通常屬於只讀,
    某些架構也允許程式碼段為可寫,即允許修改程式。在程式碼段中,也有可能包含一些只讀的常數變數,例如字串常量等。
  • 堆(heap):堆是用於存放程序執行中被動態分配的記憶體段,它的大小並不固定,可動態擴張或縮減。當程序呼叫malloc等函式分配記憶體時,新分配的記憶體就被動態新增到堆上(堆被擴張);當利用free等函式釋放記憶體時,被釋放的記憶體從堆中被剔除(堆被縮減)
  • 棧(stack):棧又稱堆疊,是使用者存放程式臨時建立的區域性變數,也就是說我們函式括弧“{}”中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變數)。除此以外,在函式被呼叫時,其引數也會被壓入發起呼叫的程序棧中,並且待到呼叫結束後,函式的返回值也會被存放回棧中。由於棧的先進後出特點,所以棧特別方便用來儲存/恢復呼叫現場。從這個意義上講,我們可以把堆疊看成一個寄存、交換臨時資料的記憶體區。

10. EXT2 與EXT3

EXT2、EXT3:linux環境上的檔案系統。ext2/ext3檔案系統使用索引節點來記錄檔案資訊,作用像windows的檔案分配表。索引節點是一個結構,它包含了一個檔案的長度、建立及修改時間、許可權、所屬關係、磁碟中的位置等資訊。

EXT2、EXT3的區別如下:
1. ext2和ext3的格式完全相同,只是在ext3硬碟最後面有一部分空間用來存放Journal(日誌)的記錄;
2. 在ext2中,寫資料到硬碟中時,先將資料寫入快取中,當快取寫滿時才會寫入硬碟中;
3. 在ext3中,寫資料到硬碟中時,先將資料寫入快取中,鞀快取寫滿時系統先通知Journal,再將資料寫入硬碟,完成後再通知Journal,資料已完成寫入工作;
4. 是否有Journal的差別:在ext2中,系統開機時會去檢查有效位(Valid bit),如果值為1,表示系統上次有正常關機;如果為0,表示上次關機未正常關機,那系統就會從頭檢查硬碟中的資料,這樣時間會很長;在ext3中,也就是有Journal機制裡,系統開機時檢查Journal的資料,來檢視是否有錯誤產生,這樣就快了很多;
5. tune2fs –j 將ext2轉換成ext3

Ext3 目前所支援的最大16TB 檔案系統和最大2TB 檔案,Ext4 分別支援 1EB(1,048,576TB, 1EB=1024PB, 1PB=1024TB)的檔案系統,以及 16TB 的檔案。

11. 內零頭與外零頭

作業系統在分配記憶體時,有時候會產生一些空閒但是無法被正常使用的記憶體區域,這些就是記憶體碎片,或者稱為記憶體零頭,這些記憶體零頭一共分為兩類:內零頭和外零頭

內零頭是指程序在向作業系統請求記憶體分配時,系統滿足了程序所需要的記憶體需求後,還額外還多分了一些記憶體給該程序,也就是說額外多出來的這部分記憶體歸該程序所有,其他程序是無法訪問的。

外零頭是指記憶體中存在著一些空閒的記憶體區域,這些記憶體區域雖然不歸任何程序所有,但是因為記憶體區域太小,無法滿足其他程序所申請的記憶體大小而形成的記憶體零頭。
頁式儲存管理是以頁為單位(頁面的大小由系統確定,且大小是固定的)向程序分配記憶體的,例如:假設記憶體總共有100K,分為10頁,每頁大小為10K。現在程序A提出申請56K記憶體,因為頁式儲存管理是以頁為單位程序記憶體分配的,所以系統會向程序A提供6個頁面,也就是60K的記憶體空間,那麼在最後一頁中程序只使用了6K,從而多出了4K的記憶體碎片,但是這4K的記憶體碎片系統已經分配給程序A了,其他程序是無法再訪問這些記憶體區域的,這種記憶體碎片就是內零頭。

段式儲存管理是段(段的大小是程式邏輯確定,且大小不是固定的)為單位向程序進行記憶體分配的,程序申請多少記憶體,系統就給程序分配多少記憶體,這樣就不會產生內零頭,但是段式分配會產生外零頭。

例如:假設記憶體總的大小為100K,現在程序A向系統申請60K的記憶體,系統在滿足了程序A的記憶體申請要求後,還剩下40K的空閒記憶體區域;這時如果程序B向系統申請50K的記憶體區域,而系統只剩下了40K的記憶體區域,雖然這40K的記憶體區域不歸任何程序所有,但是因為大小無法滿足程序B的要求,所以也無法分配給程序B,這樣就產生了外零頭。請求段式儲存管理是在段式儲存管理的基礎上增加了請求調段功能和段置換功能。

所以段式和請求段式儲存管理會產生外零頭。

頁式-內零頭
段式-外零頭