Linux編程手冊讀書筆記第二章(20140330)

  1. 內核:管理和分配計算機資源(即CPURAM和設備)的核心軟件層
  2. Linux內核可執行文件采用/bootvmlinuz或類似的路徑名,“z”表明內核是經過壓縮的可執行文件。
  3. 內核主要任務:

? ? 1)進程調度:Linux屬于搶占式多任務系統,多個進程(即運行中的程序)可同時駐留于內存,都能獲得對CPU的使用權

? ? 2)內存管理:以高效、公平地方式在進程之間共享這一資源,Linux采用了虛擬內存管理機制。

?? ? ? ? ? ? ? ? ? ? ? ? ? 虛擬內存管理機制優勢:

?? ? ? ? ? ? ? ? ? ? ? ? ? a. 進程與進程之間、進程與內核之間彼此隔離;一個進程無法讀取或修改內核或掐他進程的內存內容

?? ? ? ? ? ? ? ? ? ? ? ? ? b. 只需將進程的一部分保持在內存中,降低了每個進程對內存的需求量,使得可以在內存中加載更多的進程。

? ? 3)提供了文件系統:內核在磁盤上提供有文件系統,允許對文件執行創建、獲取、更新、刪除等操作

? ? 4)創建和終止進程:內核可以將新進程載入內存,為其提供運行所需的資源(CPURAM以及對文件的訪問)。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一旦進程執行完畢,內核需要確保釋放其占用的資源,以供或許進程使用

? ? 5)對設備的訪問:計算機外接設備(鼠標、鍵盤、磁盤等),可實現計算機與外部世界的通信。

?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 內核為進程提供了訪問設備的標準接口,同時還仲裁多個進程對同一個設備的訪問。

? ? 6)聯網:內核以用戶進程的名義收發網絡消息(數據包),同時將該數據包路由至目標系統。

? ? 7)提供系統調用API:進程可以利用系統調用API,請求內核去執行各種任務。


  1. 用戶態和核心態

? ? ? 1CPU一般在這兩種不同狀態下運行,執行硬件指令可使CPU在兩種狀態來回切換

? ? ? 2)虛擬內存區域劃分為:用戶空間部分、內核空間部分

? ? ? 3)用戶態下運行時,CPU只能訪問被標記為用戶空間的內存,試圖訪問內核空間的內存,將會引發硬件錯誤

? ? ? 4)核心態下運行時,CPU既能訪問用戶空間的內存,又能訪問內核空間的內存。

? ? ? 5CPU在核心態下運行時,可以執行特殊操作。如宕機(halt)、訪問內存管理硬件、設備I/O操作的初始化


  1. 交換區:磁盤空間中的保留區域,作為RAM的補充---進程可被保存至交換區
  2. 內核維護的底層數據結構,可將進程使用的文件名稱轉換為磁盤的物理位置
  3. 內核維護每個進程的虛擬內存與計算機物理內存及磁盤交換區之間的映射關系。
  4. 某進程可創建另一個進程---真正含義:某進程可以請求內核創建另一個進程。(因進程間所有通信都需要內核提供的通信機制完成)
  5. shell(命令解釋器):用于讀取用戶輸入的命令,并執行相應的程序以響應命令。

? ? 1)登陸shell:用戶剛登陸系統時,由系統創建,用以運行shell的進程。

? ? 2)對于UNIX系統而言,shell只是一個用戶進程。

? ? 3)登陸同一臺計算機的不同用戶同時可以使用不同的shell(就單個用戶來說,情況也一樣)

? ? 4shell設計兩個目的:a. 人機交互; b. 解釋shell腳本(包含shell命令的文本文件)

? ? 5shell內置有許多通常與編程語言相關的功能:包括變量、循環、條件語句、I/O命令、函數等

? ? 6)幾種重要的shell

? ? ? ? ? ? a. Bourne shellsh):歷史最為悠久,曾是UNIX第七版標配的shell,包含許多常見特性:I/O重定向、管道、文件名生成(通配符)、

?? ? ? ? ? ? ? 變量、環境變量處理、命令替換、后臺命令執行、函數等。

? ? ? ? ? ? b. C shellcsh):曾經時BSD系統的標配,但與Bourne shell并不兼容,為了保證在UNIX系統的移植性,人們更傾向使用Bourne shell

? ? ? ? ? ? c. Korn shellksh):AT&T貝爾實驗室編寫,是Bourne shell的繼任者,同時吸收了C shell的很多交互特性

? ? ? ? ? ? d. Bourne again shellbash:GNU項目對于Bourne shell的重新實現,同時提供了與Korn shellC shell類似的交互特性。

?? ? ? ? ? ? ? LinuxBourne shell正是由Bourne again shell仿真提供的

  1. 超級用戶:用戶ID0,通常登錄名為root
  2. 用戶密碼文件/etcpasswd:包含用戶名、用戶IDUID)、組ID、主目錄、登陸shell
  3. 用戶組文件/etcgroup:組名、組IDGID)、用戶列表(隸屬于該組的用戶登錄名列表)
  4. 為了訪問文件,用戶分為3類:文件(屬主)的用戶;文件用戶同一組的用戶;其他用戶
  5. Shell啟動的進程會繼承3個已打開的文件描述符:描述符0為標準輸入;描述符1為標準輸出;描述符2為標準錯誤。
  6. stdio函數庫中,這幾種描述符分別與文件流stdinstdoutstderr相對應
  7. C語言標準庫的I/O函數(stdio函數庫):fopenfclosescanfprintffgetsfputs ? ? stdio函數位于I/O系統調用層(openclosereadwrite 等)之上。
  8. 過濾器:從stdin讀取輸入,加以轉換,再將轉換后的數據輸出到stdout,常將擁有上述行為的程序稱為過濾器,如catgreptrsortwcsedawk
  9. 邏輯上將一個進程劃分為以下幾個部分(也稱為段)

? ? 1)文本:程序的指令

? ? 2)數據:程序使用的靜態變量

? ? 3)堆:程序可以從該區域動態分配額外內存

? ? 4)棧:隨函數調用、返回而增減的一片內存,用于為局部變量和函數調用鏈接信息分配存儲空間。

19.子進程從父進程處繼承數據段、棧段、堆段的副本后,可以修改這些內容,不影響父進程的原版內容。

  1. 有兩種方式可以終止一個進程:其一,進程使用_exit()系統調用(或相關的exit()庫函數),請求退出;其二,向進程傳遞信號,將其殺死
  2. 進程的終止狀態,一個非負小整數,可供父進程的wait()系統調用檢測。
  3. 終止狀態為0表示進程功成身退,非0表示有錯誤發生。
  4. 大多數shell會將前一執行程序的終止狀態保存于shell變量$?中。
  5. init進程:系統引導時,內核創建,是所有進程之父,該進程相應的程序文件為sbininit”init的進程號為1,總以超級用戶權限運行。誰(哪怕是超級用戶)都不能殺死”init進程,只有關閉系統才能終止該進程。init的主要任務是創建并監控系統運行所需的一系列進程。
  6. 進程間通信(IPC)機制:

? ? 1)信號(signal),用來表示事件的發生

? ? 2)管道(亦即shell用戶所熟悉的操作符)和FIFO,用于在進程間傳遞數據

? ? 3)套接字,供同一臺主機或是聯網的不同主機上所運行的進程之間傳遞數據。

? ? 4)文件鎖定,為防止其他進程讀取或更新文件內容,允許某進程對文件的部分區域加以鎖定

? ? 5)消息隊列:用于在進程間交換消息

? ? 6)信號量(semaphore):用來同步進程動作

? ? 7)共享內存:允許兩個及兩個以上進程共享一塊內存。當某進程改變了共享內存的內容時,其他所有進程會立即了解到這一變化。

26.內核、其他進程(只要有相應的權限)或進程自身均可向進程發送信號。

  1. 發生下列情況之一時,內核可以向進程發送信號:

? ? 1)用戶鍵入中斷字符(通常為CtrlC

? ? 2)進程的子進程之一已經終止

? ? 3)由進程設定的定時器(告警時鐘)已經到期。

? ? 4)進程嘗試訪問無效的內存地址。

28.shell中,可使用kill命令向進程發送信號;在程序內部,系統調用kill()可提供相同的功能。

  1. 收到信號時,進程會根據信號采取如下動作之一:忽略信號;? ? ? 被信號“”殺死; ? ? 先掛起,之后再被專用信號喚醒。
  2. 多個線程之間,共享同一數據區域和堆,每個線程擁有屬于自己的棧。線程之間可以通過共享的全局變量進行通信。
  3. shell執行的每個程序都會在一個新進程內發起。比如,shell創建了3個進程來執行以下管道命令(在當前的工作目錄下,根據文件大小對文件進行排序并顯示):ls -l | sort -k5n | less
  4. 偽終端:是一對相互連接的虛擬設備,也稱為主從設備。在這對設備之間,設有一條IPC信道,可供數據進行雙向傳遞。telnetssh都屬于偽終端。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383372.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383372.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383372.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

直接交換排序

直接交換排序 缺點:進行一些重復性比較,解決放法:堆排序 選擇排序優化 //如果當前的數大于假定最大的數 //改變下標 //如果當前的數小于假定最小的數 //改變下標 //遍歷數組跳到下一個元素 //如果最大的數沒有在它的位置上 //交換 //交換…

Linux編程手冊讀書筆記第三章(20140407)

外殼函數執行一條中斷機器指令(int 0x80),引發處理器從用戶態切換到核心態,并執行系統中斷0x80的中斷矢量所指向的代碼。(在2.6內核及glib 2.3.2之后的版本都支持sysenter指令,進入內核的速度更快&#xff…

Linux編程手冊讀書筆記第四章(20140407)

標準文件描述符定義在<unistd.h>中&#xff0c;STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO打開一個文件&#xff1a;open&#xff08;&#xff09; &#xff03;include<sys/stat.h> #include<fcntl.h> int open(const char *pathname, int flags, …/* …

快速排序概念及實現

快速排序 快速排序是Hoare于1962年提出的一種二叉樹結構的交換排序方法&#xff0c; 其基本思想為&#xff1a; 任取待排序元素序列中的某元素作為基準值&#xff0c;按照該排序碼將待排序集合分割成兩子序列&#xff0c;左子序列中所有元素均小于基準值&#xff0c;右子序列…

Linux編程手冊讀書筆記第五章(20140408)

改變已打開文件性質&#xff1a;fcntl&#xff08;&#xff09; #include<fcntl.h> int fcntl(int fd, int cmd, …); (1) 調用失敗返回&#xff0d;1 &#xff08;2&#xff09;fcntl函數有5種功能&#xff1a; a. 復制一個現有的描述符&#xff08;cmd&#xff1d;F_D…

歸并排序概念及其實現

基本思想&#xff1a; 歸并排序&#xff08;MERGE-SORT&#xff09;是建立在歸并操作上的一種有效的排序算法,該算法是采用分治法&#xff08;Divide and Conquer&#xff09;的一個非常典型的應用。將已有序的子序列合并&#xff0c;得到完全有序的序列&#xff1b;即先使每個…

##連接符和#符的使用

C語言中如何使用宏C&#xff08;和C&#xff09;中的宏&#xff08;Macro&#xff09;屬于編譯器預處理的范疇&#xff0c;屬于編譯期概念&#xff08;而非運行期概念&#xff09;。下面對常遇到的宏的使用問題做了簡單總結。 關于#和## 在C語言的宏中&#xff0c;#的功能是將其…

計數排序和基數排序

適用于數據集中在某個范圍中&#xff0c; //統計每個數據出現的次數 計數排序&#xff1a;鴿巢原理 1找范圍 2給空間 3記次數 4回收 for(int i 0;i<size; i) {temp[array[i]]; }for(int i0;i<range;i&#xff09;{while(temp[i])array[index]i;}代碼實現 時間復雜度&…

信號量sem_wait()的使用

閑來無事&#xff0c;我給大家講下UNIX/Linux下信號量函數的使用。首先你得知道什么叫信號量&#xff0c;什么時候要用信號量。這個嘛&#xff0c;主要就是用來保護共享資源的&#xff0c;也就是說如果你想限制某個&#xff08;些&#xff09;資源在同一時刻只能有一&#xff0…

C++起始(關鍵字,命名空間,缺省參數,函數重載(c語言為什么不支持函數重載))

1. C關鍵字(C98) 2. 命名空間 在C/C中&#xff0c;變量、函數和后面要學到的類都是大量存在的&#xff0c;這些變量、函數和類的名稱將都存在于全局作用 域中&#xff0c;可能會導致很多沖突。使用命名空間的目的是對標識符的名稱進行本地化&#xff0c;以避免命名沖突或名字污…

va_list和vsnprintf、getopt

原理解釋&#xff1a; VA_LIST 是在C語言中解決變參問題的一組宏&#xff0c;在<stdarg.h>頭文件下。 VA_LIST的用法&#xff1a; &#xff08;1&#xff09;首先在函數里定義一具VA_LIST型的變量&#xff0c;這個變量是指向參數的指針 &#xff08;2&a…

GitHub相關

git是一個版本控制工具. 主要解決三個問題 代碼被喵星人吃掉了.產品經理反復修改需求, 需要同時維護多個版本代碼.多人協同開發. 安裝 git for windows 這個是一個git的windows系統的命令行版本 https://git-scm.com/downloads 下載會很慢很慢 使用 Github 創建項目 注冊…

linux中bin與sbin目錄的作用及區別介紹

在linux系統中&#xff0c;有兩個重要的目錄&#xff1a;bin與sbin&#xff0c;分別包括/bin、/usr/bin/與/sbin、/usr/sbin/。 bin: bin為binary的簡寫&#xff0c;主要放置系統的必備執行文件&#xff0c;例如: cat、cp、chmod df、dmesg、gzip、kill、ls、mkdir、more、m…

c++起始(名詞修飾,extern “C” ,引用)

名字修飾(name Mangling) 在C/C中&#xff0c;一個程序要運行起來&#xff0c;需要經歷以下幾個階段&#xff1a;預處理、編譯、匯編、鏈接。 Name Mangling是一種在編譯過程中&#xff0c;將函數、變量的名稱重新改編的機制&#xff0c;簡單來說就是編譯器為了區分各 個函數…

Linux進程間通信方式--本地socket

先上一個代碼 服務端&#xff1a; [cpp] view plaincopy //s_unix.c #include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define UNIX_DOMAIN "/tmp/UNIX.domain" int main(void) { so…

extern和static的區別

c語言中的 static&#xff1a; 修飾局部變量&#xff1a;存放在靜態數據區&#xff0c;生命周期位整個程序結束&#xff0c;但作用于仍為函數局部。 修飾全局變量&#xff1a;無法被同一工程其他源文件訪問。 修飾函數&#xff1a;與全局變量類似。 extern&#xff1a; 可被…

RT5350原廠SDK及AP移植步驟詳解

最近想搞一下rt5350&#xff0c;所以找了個原廠的SDK包進行了編譯&#xff0c;很快路由器就可以用了&#xff0c;把我的編譯操作步驟寫了下分享給更多的愛好者&#xff0c;供大家參靠&#xff0c;下一步準備移植攝像頭玩玩。有興趣的可以一起交流。 RT5350移植Toolchain工具的安…

linux系統編程之進程概念(操作系統---管理,進程創建,進程狀態,進程優先級, 環境變量,程序地址空間,進程O(1)調度方法)

系統編程&#xff1a; 進程概念->進程控制->基礎IO->進程間通信->進程信號->多線程進程概念 馮諾依曼體系結構----現代計算機硬件體系結構 馮諾依曼體系結構----現代計算機硬件體系結構 計算機五大硬件單元&#xff1a;輸入設備&#xff1a;鍵盤輸出設備&#…

Make Menuconfig詳解 (配置內核選擇)

Make Menuconfig簡介 make menuconfig 圖形化的內核配置make mrproper -----刪除不必要的文件和目錄. #make config&#xff08;基于文本的最為傳統的配置界面&#xff0c;不推薦使用&#xff09; #make menuconfig&#xff08;基于文本選單的配置界面&#xff0c;字符終端下…

Linux系統編程之進程控制(進程創建,fork函數,進程中止,進程等待,程序替換)

進程創建 fork()------復制&#xff0c;返回值&#xff0c;寫時復制 vfork()創建子進程—子進程與父進程共用同一塊虛擬地址空間&#xff0c; 為了防止調用棧混亂&#xff0c;因此阻塞父進程直到子進程調用exit&#xff08;&#xff09;退出或者進行程序替換 vfork創建的子…