linux c程序中內核態與用戶態內存存儲問題

?Unix/Linux的體系架構

  如上圖所示,從宏觀上來看,Linux操作系統的體系架構分為用戶態和內核態(或者用戶空間和內核)。內核從本質上看是一種軟件——控制計算機的硬件資源,并提供上層應用程序運行的環境。用戶態即上層應用程序的活動空間,應用程序的執行必須依托于內核提供的資源,包括CPU資源、存儲資源、I/O資源等。為了使上層應用能夠訪問到這些資源,內核必須為上層應用提供訪問的接口:即系統調用。

  系統調用是操作系統的最小功能單位,這些系統調用根據不同的應用場景可以進行擴展和裁剪,現在各種版本的Unix實現都提供了不同數量的系統調用,如Linux的不同版本提供了240-260個系統調用,FreeBSD大約提供了320個(reference:UNIX環境高級編程)。我們可以把系統調用看成是一種不能再化簡的操作(類似于原子操作,但是不同概念),有人把它比作一個漢字的一個“筆畫”,而一個“漢字”就代表一個上層應用,我覺得這個比喻非常貼切。因此,有時候如果要實現一個完整的漢字(給某個變量分配內存空間),就必須調用很多的系統調用。如果從實現者(程序員)的角度來看,這勢必會加重程序員的負擔,良好的程序設計方法是:重視上層的業務邏輯操作,而盡可能避免底層復雜的實現細節。庫函數正是為了將程序員從復雜的細節中解脫出來而提出的一種有效方法。它實現對系統調用的封裝,將簡單的業務邏輯接口呈現給用戶,方便用戶調用,從這個角度上看,庫函數就像是組成漢字的“偏旁”。這樣的一種組成方式極大增強了程序設計的靈活性,對于簡單的操作,我們可以直接調用系統調用來訪問資源,如“人”,對于復雜操作,我們借助于庫函數來實現,如“仁”。顯然,這樣的庫函數依據不同的標準也可以有不同的實現版本,如ISO C?標準庫,POSIX標準庫等。

  Shell是一個特殊的應用程序,俗稱命令行,本質上是一個命令解釋器,它下通系統調用,上通各種應用,通常充當著一種“膠水”的角色,來連接各個小功能程序,讓不同程序能夠以一個清晰的接口協同工作,從而增強各個程序的功能。同時,Shell是可編程的,它可以執行符合Shell語法的文本,這樣的文本稱為Shell腳本,通常短短的幾行Shell腳本就可以實現一個非常大的功能,原因就是這些Shell語句通常都對系統調用做了一層封裝。為了方便用戶和系統交互,一般,一個Shell對應一個終端,終端是一個硬件設備,呈現給用戶的是一個圖形化窗口。我們可以通過這個窗口輸入或者輸出文本。這個文本直接傳遞給shell進行分析解釋,然后執行。

  總結一下,用戶態的應用程序可以通過三種方式來訪問內核態的資源:

1)系統調用

2)庫函數

3)Shell腳本

  下圖是對上圖的一個細分結構,從這個圖上可以更進一步對內核所做的事有一個“全景式”的印象。主要表現為:向下控制硬件資源,向內管理操作系統資源:包括進程的調度和管理、內存的管理、文件系統的管理、設備驅動程序的管理以及網絡資源的管理,向上則向應用程序提供系統調用的接口。從整體上來看,整個操作系統分為兩層:用戶態和內核態,這種分層的架構極大地提高了資源管理的可擴展性和靈活性,而且方便用戶對資源的調用和集中式的管理,帶來一定的安全性。

二、用戶態和內核態的切換

  因為操作系統的資源是有限的,如果訪問資源的操作過多,必然會消耗過多的資源,而且如果不對這些操作加以區分,很可能造成資源訪問的沖突。所以,為了減少有限資源的訪問和使用沖突,Unix/Linux的設計哲學之一就是:對不同的操作賦予不同的執行等級,就是所謂特權的概念。簡單說就是有多大能力做多大的事,與系統相關的一些特別關鍵的操作必須由最高特權的程序來完成。Intel的X86架構的CPU提供了0到3四個特權級,數字越小,特權越高,Linux操作系統中主要采用了0和3兩個特權級,分別對應的就是內核態和用戶態。運行于用戶態的進程可以執行的操作和訪問的資源都會受到極大的限制,而運行在內核態的進程則可以執行任何操作并且在資源的使用上沒有限制。很多程序開始時運行于用戶態,但在執行的過程中,一些操作需要在內核權限下才能執行,這就涉及到一個從用戶態切換到內核態的過程。比如C函數庫中的內存分配函數malloc(),它具體是使用sbrk()系統調用來分配內存,當malloc調用sbrk()的時候就涉及一次從用戶態到內核態的切換,類似的函數還有printf(),調用的是wirte()系統調用來輸出字符串,等等。

  到底在什么情況下會發生從用戶態到內核態的切換,一般存在以下三種情況:

1)當然就是系統調用:原因如上的分析。

2)異常事件:?當CPU正在執行運行在用戶態的程序時,突然發生某些預先不可知的異常事件,這個時候就會觸發從當前用戶態執行的進程轉向內核態執行相關的異常事件,典型的如缺頁異常。

3)外圍設備的中斷:當外圍設備完成用戶的請求操作后,會像CPU發出中斷信號,此時,CPU就會暫停執行下一條即將要執行的指令,轉而去執行中斷信號對應的處理程序,如果先前執行的指令是在用戶態下,則自然就發生從用戶態到內核態的轉換。

  注意:系統調用的本質其實也是中斷,相對于外圍設備的硬中斷,這種中斷稱為軟中斷,這是操作系統為用戶特別開放的一種中斷,如Linux?int 80h中斷。所以,從觸發方式和效果上來看,這三種切換方式是完全一樣的,都相當于是執行了一個中斷響應的過程。但是從觸發的對象來看,系統調用是進程主動請求切換的,而異常和硬中斷則是被動的。

三、總結

  本文僅是從宏觀的角度去理解Linux用戶態和內核態的設計,并沒有去深究它們的具體實現方式。從實現上來看,必須要考慮到的一點我想就是性能問題,因為用戶態和內核態之間的切換也會消耗大量資源。

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

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

相關文章

線程自動退出_C++基礎 多線程筆記(一)

join & detachjoin和detach為最基本的用法,join可以使主線程(main函數)等待子線程(自定義的function_1函數)完成后再退出程序,而detach可以使子線程與主線程毫無關聯的獨立運行,當主線程執行…

WEB在線預覽PDF

這是我在博客園發表的第一篇文章。以后會陸續把在線預覽其他格式文檔的解決方案發表出來。 解決思路:把pdf轉換成html顯示。 在線預覽pdf我暫時了解3種解決方案,歡迎大家補充。 方案一: 利用pdf2html軟件將PDF轉換成HTML。 用法: PDF2HTML [選…

[算法]判斷一個數是不是2的N次方

如果一個數是2^n,說明這個二進制里面只有一個1。除了1. a (10000)b a-1 (01111)b a&(a-1) 0。 如果一個數不是2^n, 說明它的二進制里含有多一個1。 a (1xxx100)b a-1(1xxx011)b 那么 a&(a-1)就是 (1xxx000)b, 而不會為0。 所以可…

VMware Ubuntu 全屏問題解決

在終端中輸入: sudo apt install open-vm* 回車 自動解決

數組拼接時中間怎么加入空格_【題解二維數組】1123:圖像相似度

1123:圖像相似度時間限制: 1000 ms 內存限制: 65536 KB【題目描述】給出兩幅相同大小的黑白圖像(用0-1矩陣)表示,求它們的相似度。說明:若兩幅圖像在相同位置上的像素點顏色相同,則稱它們在該位置具有相同的像素點。兩幅圖像的…

(舊)子數涵數·C語言——條件語句

首先,我們講一下理論知識,在編程中有三種結構,分別是順序結構、條件結構、循環結構,如果用流程圖來表示的話就是: 那么在C語言中,如何靈活運用這三種結構呢?這就需要用到控制語句了。 而條件語句…

apache.commons.lang.StringUtils 使用心得

apache.commons.lang.StringUtils 使用心得 轉載于:https://www.cnblogs.com/qinglizlp/p/5549687.html

python哪個版本支持xp_windows支持哪個版本的python

Windows操作系統支持Python的Python2版本和Python3版本,下載安裝時要根據windows的操作系統來選擇對應的Python安裝包,否則將不能安裝成功。 Python是跨平臺的,免費開源的一門計算機編程語言。是一種面向對象的動態類型語言,最初被…

Ubuntu 鍵盤錯位解決 更改鍵盤布局

原因是鍵盤布局不能適應鍵盤 解絕方法:更改鍵盤布局 一般改為標準104鍵盤就行 在終端輸入 sudo dpkg-reconfigure keyboard-configuration 選擇 標準104鍵盤 然后一直回車就行

【No.1 Ionic】基礎環境配置

Node 安裝git clone https://github.com/nodejs/node cd node ./configure make sudo make install node -v npm -vnpm設置淘寶鏡像npm config set registry https://registry.npm.taobao.org npm config set disturl https://npm.taobao.org/distIOS Simulatorsudo npm instal…

識別操作系統

使用p0f進行操作系統探測 p0f是一款被動探測工具,通過分析網絡數據包來判斷操作系統類型。目前最新版本為3.06b。同時p0f在網絡分析方面功能強大,可以用它來分析NAT、負載均衡、應用代理等。 p0f的命令參數很簡單,基本說明如下: l…

常用RGB顏色表

轉載于:https://www.cnblogs.com/Itwonderful/p/5550800.html

python中seek函數的用法_在Python中操作文件之seek()方法的使用教程

seek()方法在偏移設定該文件的當前位置。參數是可選的,默認為0,這意味著絕對的文件定位,它的值如果是1,這意味著尋求相對于當前位置,2表示相對于文件的末尾。 沒有返回值。需要注意的是,如果該文件被打開或…

WPF中Grid實現網格,表格樣式通用類(轉)

/// <summary> /// 給Grid添加邊框線 /// </summary> /// <param name"grid"></param> public static void InsertFrameForGrid(Grid grid) { var rowcon grid.RowDefinitions.Count; var clcon grid.ColumnDefinitions.Count; for (var i…

VS2017 安裝 QT5.9

VS2017專業版使用最新版Qt5.9.2教程&#xff08;最新教材&#xff09; 目錄 VS2017專業版使用最新版Qt5.9.2教程&#xff08;最新教材&#xff09; 運行環境&#xff1a; 1.安裝Qt5.9.2 2.安裝Qt5.9與VS2017之間的插件: 3.配置Qt VS Tool的環境. 4.設置創建的Qt的項目的屬…

異步與并行~ReaderWriterLockSlim實現的共享鎖和互斥鎖

返回目錄 在System.Threading.Tasks命名空間下&#xff0c;使用ReaderWriterLockSlim對象來實現多線程并發時的鎖管理&#xff0c;它比lock來說&#xff0c;性能更好&#xff0c;也并合理&#xff0c;我們都知道lock可以對代碼塊進行鎖定&#xff0c;當多線程共同訪問代碼時&am…

linux ssh yum升級_Linux 運維必備的 13 款實用工具,拿好了

作者丨Erstickthttp://blog.51cto.com/13740508/2114819本文介紹幾款 Linux 運維比較實用的工具&#xff0c;希望對 Linux 運維人員有所幫助。1. 查看進程占用帶寬情況 - NethogsNethogs 是一個終端下的網絡流量監控工具可以直觀的顯示每個進程占用的帶寬。下載&#xff1a;htt…

iOS應用如何支持IPV6

本文轉自 http://www.code4app.com/forum.php?modviewthread&tid8427&highlightipv6 果然是蘋果打個哈欠&#xff0c;iOS行業內就得起一次風暴呀。自從5月初Apple明文規定所有開發者在6月1號以后提交新版本需要支持IPV6-Only的網絡&#xff0c;大家便開始熱火朝天的研…

SQL Server -- SQLserver 存儲過程執行錯誤記錄到表

SQLserver 存儲過程執行錯誤記錄到表 From: http://blog.csdn.net/leshami/article/details/51333650 對于在執行存儲過程中碰到的一些錯誤&#xff0c;如果未及時捕獲或者說傳遞給前端應用程序來&#xff0c;在這樣的情形下&#xff0c;故障的排查顯得尤為困難。基于此&…

opencv python教程簡書_OpenCV-Python系列二:常用的圖像屬性

對于圖像&#xff0c;我們經常需要知道關于圖像的特殊屬性&#xff0c;比如寬度&#xff0c;高度&#xff0c;面積&#xff0c;像素點數目等等&#xff0c;那么在opencv-python中&#xff0c;這些信息如何獲取呢&#xff1f; 本文結構&#xff1a; 1.基本圖像屬性 2. 對于openc…