Time of Update: 2018-12-05
一、終端的概念在UNIX系統中,使用者通過終端登入系統後得到一個Shell進程,這個終端成為Shell進程的控制終端(Controlling
Time of Update: 2018-12-05
一、為了理解訊號,先從我們最熟悉的情境說起:1. 使用者輸入命令,在Shell下啟動一個前台進程。2. 使用者按下Ctrl-C,這個鍵盤輸入產生一個硬體中斷。3. 如果CPU當前正在執行這個進程的代碼,則該進程的使用者空間代碼暫停執行,CPU從使用者態切換到核心態處理硬體中斷。4. 終端驅動程式將Ctrl-C解釋成一個SIGINT訊號,記在該進程的PCB中(也可以說發送了一個SIGINT訊號給該進程)。5. 當某個時刻要從核心返回到該進程的使用者空間代碼繼續執行之前,首先處理PCB中記錄的訊號,
Time of Update: 2018-12-05
一、posix 訊號量訊號量的概念參見這裡。前面也講過system v 訊號量,現在來說說posix 訊號量。system v 訊號量只能用於進程間同步,而posix 訊號量除了可以進程間同步,還可以線程間同步。system v 訊號量每次PV操作可以是N,但Posix 訊號量每次PV只能是1。除此之外,posix 訊號量還有命名和匿名之分(man 7 sem_overview):1、命名訊號量名字以/somename 形式分辨,只能有一個/ ,且總長不能超過NAME_MAX - 4(一般是25
Time of Update: 2018-12-05
一、posix 條件變數一種線程間同步的情形:線程A需要等某個條件成立才能繼續往下執行,現在這個條件不成立,線程A就阻塞等待,而線程B在執行過程中使這個條件成立了,就喚醒線程A繼續執行。在pthread庫中通過條件變數(Condition Variable)來阻塞等待一個條件,或者喚醒等待這個條件的線程。Condition Variable用pthread_cond_t類型的變數表示,和Mutex的初始化和銷毀類似,pthread_cond_init函數初始化一個Condition
Time of Update: 2018-12-05
一、exec替換進程映象在進程的建立上Unix採用了一個獨特的方法,它將進程建立與載入一個新進程映象分離。這樣的好處是有更多的餘地對兩種操作進行管理。當我們建立了一個進程之後,通常將子進程替換成新的進程映象,這可以用exec系列的函數來進行。當然,exec系列的函數也可以將當前進程替換掉。二、exec關聯函數組包含標頭檔<unistd.h>功能用exec函數可以把當前進程替換為一個新進程。exec名下是由多個關聯函數組成的一個完整系列,標頭檔<unistd.h>原型
Time of Update: 2018-12-05
一、虛擬記憶體先來看一張圖(來自《Linux核心完全剖析》),如下:分段機制:即分成程式碼片段,資料區段,堆棧段。每個記憶體段都與一個特權級相關聯,即0~3,0具有最高特權級(核心),3則是最低特權級(使用者),每當程式試圖訪問(許可權又分為可讀、可寫和可執行)一個段時,當前特權級CPL就會與段的特權級進行比較,以確定是否有許可權訪問。每個特權級都有自己的程式棧,當程式從一個特權級切換到另一個特權級上執行時,堆棧段也隨之改換到新層級的堆棧中。段選擇符:每個段都有一個段選擇符。段選擇符指明段的大小
Time of Update: 2018-12-05
一、開啟檔案核心資料結構1、一個進程開啟兩個檔案檔案狀態標誌:讀、寫、追加、同步、非阻塞等2、一個進程兩次開啟同一檔案3、兩個進程開啟同一檔案樣本程式: C++ Code 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960/****************************************************
Time of Update: 2018-12-05
一、什麼是進程從使用者的角度來看進程是程式的一次執行過程。從作業系統的核心來看,進程是作業系統分配的記憶體、CPU時間片等資源的基本單位。進程是資源分派的最小單位。每一個進程都有自己獨立的地址空間與執行狀態。像UNIX這樣的多任務作業系統能夠讓許多程式同時運行,每一個運行著的程式就構成了一個進程。二、進程資料結構進程的靜態描述:由三部分組成:PCB、有關程式段和該程式段對其進行操作的資料結構集。進程式控制制塊:用於描述進程情況及控制進程運行所需的全部資訊。程式碼片段:是進程中能被進程發送器在CP
Time of Update: 2018-12-05
個人比較喜歡iftop,它能動態用簡單的ASC表徵圖識網卡當前流量首行是網路流量刻度,中間是與其它機器的流量,有個白底的bar直觀的標識流量變化,後三列資料分別表示:1. preceding 2 seconds 過去兩秒鐘的流量(traffic)2. around half that amount over the preceding 10s 過去十秒鐘流量的一半3. a fifth of that over the whole of the last 40s
Time of Update: 2018-12-05
一、fork系統調用包含標頭檔 <sys/types.h> 和 <unistd.h>函數功能:建立一個子進程函數原型 pid_t
Time of Update: 2018-12-05
一、核心如何?訊號的捕捉如果訊號的處理動作是使用者自訂函數,在訊號遞達時就調用這個函數,這稱為捕捉訊號。由於訊號處理函數的代碼是在使用者空間的,處理過程比較複雜,舉例如下:1. 使用者程式註冊了SIGQUIT訊號的處理函數sighandler。2. 當前正在執行main函數,這時發生中斷或異常切換到核心態。3. 在中斷處理完畢後要返回使用者態的main函數之前檢查到有訊號SIGQUIT遞達。4.
Time of Update: 2018-12-05
一、MTU乙太網路和IEEE 802.3對資料幀的長度都有限制,其最大值分別是1500和1492位元組,將這個限制稱作傳輸單元最大值(MTU,Maximum Transmission
Time of Update: 2018-12-05
一、是典型的UDP用戶端/伺服器通訊過程下面依照通訊流程,我們來實現一個UDP回射客戶/伺服器 #include <sys/types.h> #include <sys/socket.h> ssize_t send(int sockfd, const void *buf, size_t len, int flags); ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const
Time of Update: 2018-12-05
一、read/write 函數read函數從開啟的裝置或檔案中讀取資料。#include <unistd.h>ssize_t read(int fd, void *buf, size_t
Time of Update: 2018-12-05
一、讀取檔案中繼資料int stat(const char *path, struct stat *buf);int fstat(int fd, struct stat *buf);int lstat(const char *path, struct stat *buf); stat() stats the file pointed to by path and fills in buf. lstat() is identical to stat(), except that if
Time of Update: 2018-12-05
一、ISO/OSI參考模型OSI(open system interconnection)開放系統互聯模型是由ISO(International Organization for Standardization)國際標準組織定義的網路分層模型,共七層,如。物理層(Physical Layer):物理層定義了所有電子及物理裝置的規範,為上層的傳輸提供了一個物理介質,本層中資料轉送的單位為位元(bit)。屬於本層定義的規範有EIA/TIA RS-232、EIA/TIA RS-449、V.35、RJ-
Time of Update: 2018-12-05
一、IP資料報格式IP資料報格式如下:版本IP協議版本號碼,長度為4位,IPv4此欄位值為4,IPv6此欄位值為6首部長度以32位的字為單位,該欄位長度為4位,最小值為5,即不帶任何選項的IP首部20個位元組;最大值為15,所以首部長度最大為60個位元組服務類型(TOS)長度為8位。此欄位包含3位的優先權(現已忽略),4位的服務類型子欄位和1位的保留位(必須置0)。4位的服務類型分別為最小延遲(D)、最大輸送量(T)、最高可靠性(R)、最小費用(F),如。總長度該欄位長度為16位,以位元組為單位
Time of Update: 2018-12-05
一、處理序間通訊每個進程各自有不同的使用者地址空間,任何一個進程的全域變數在另一個進程中都看不到,所以進程之間要交換資料必須通過核心,在核心中開闢一塊緩衝區,進程1把資料從使用者空間拷到核心緩衝區,進程2再從核心緩衝區把資料讀走,核心提供的這種機制稱為處理序間通訊(IPC,InterProcess Communication)。如所示。二、管道是一種最基本的IPC機制,由pipe函數建立:#include <unistd.h>int pipe(int
Time of Update: 2018-12-05
一、虛擬記憶體分段機制:即分成程式碼片段,資料區段,堆棧段。每個記憶體段都與一個特權級相關聯,即0~3,0具有最高特權級(核心),3則是最低特權級(使用者),每當程式試圖訪問(許可權又分為可讀、可寫和可執行)一個段時,當前特權級CPL就會與段的特權級進行比較,以確定是否有許可權訪問。每個特權級都有自己的程式棧,當程式從一個特權級切換到另一個特權級上執行時,堆棧段也隨之改換到新層級的堆棧中。段選擇符:每個段都有一個段選擇符。段選擇符指明段的大小、存取權限和段的特權級、段類型以及段的第一個位元組線上
Time of Update: 2018-12-05
今天重讀了cfs調度器,使我忍不住再寫一篇關於cfs的文章,cfs調度器的已耗用時間是0(logN),而以前的調度器的已耗用時間是O(1),這是不是就是說cfs的效率比O(1)的更差呢?並不是那樣,我們知道cfs調度器下的運行隊列是基於紅/黑樹狀結構組織的,找出下一個進程就是截下左下角的節點,固定時間完成,所謂的O(logN)指的是插入時間,可是紅/黑樹狀結構的統計效能是不錯的,沒有多大機率真的用得了那麼多時間,因為紅節點和黑節點的特殊相片順序既保證了樹的一定程度的平衡,又不至於花太多的時間來維