用戶態與內核態 文件流與文件描述符 簡介【轉】

轉自:https://www.cnblogs.com/Jimmy1988/p/7479856.html

用戶態和內核態

程序代碼的依賴和調用關系如下圖所示:
mark

  • Lib:標準ASCI C函數,幾乎所有的平臺都支持該庫函數,因此依賴該庫的程序可移植性好;
  • System Function:系統調用函數,與系統內核進行交互,不同平臺具備不同的函數接口,因此可移植性較差

區分用戶態和內核態主要是由于系統資源的有限性,不能無限制的隨意分配給用戶使用,必須由系統進行統一管理

  • User mode:不能直接對系統資源進行訪問,如果要操作系統資源,必須轉化為內核態
  • Kernel mode:管理系統資源,可直接對系統資源進行控制和訪問

內核為用戶提供了統一的API供其使用,不同的系統的API接口不同,為了便于代碼的移植,出臺了POSIX標準,類Unix系統(Unix、Linux、BSD、SunOS等)均支持該標準。

文件流與文件描述符

  • 問題
    由上圖我們可看到,每執行一次系統調用,都要涉及到CPU狀態的切換,即從用戶態切換到內核態,即從用戶空間切換到內核空間,實現上下文切換的過程,會消耗相當一部分的CPU資源,因此頻繁的磁盤訪問對程序的執行效率將造成很大影響。

  • 解決方案
    為了解決以上的難題,采用了緩沖區的概念,當對磁盤文件進行操作時,可一次性從磁盤文件中讀出大量的數據暫放到緩沖區中,以后對這部分數據的訪問就不需要再進行系統調用了;當對文件行操作后,可將處理后的數據暫存到輸出緩沖區,待文件緩沖區滿后,一次性寫入到磁盤。

mark

以上,數據的輸入輸出就像是水在流動一樣,因此我們采用了的概念。

  • 文件流?:
    簡單來說就是建立在面向對象基礎上的一種抽象的處理數據的工具。在流中,定義了一些處理數據的基本操作,如讀取數據,寫入數據等,程序員是對流進行所有操作的,而不用關心流的另一頭數據的真正流向;
    文件流用結構體表示:struct FILE.
    FILE的結構體又是怎么樣的呢?我們可以進行查找一下:

      [niesh@niesh ~]$ vim /usr/include/stdio.h

我們看到了?stdio.h的文件中有一行:

__BEGIN_NAMESPACE_STD/* The opaque type of streams.  This is the definition used elsewhere.  */typedef struct _IO_FILE FILE; __END_NAMESPACE_STD

顯然,FILE?是?_IO_FILE的類型替換,那么我們找一下?_IO_FILE在哪里呢?

[niesh@niesh ~]$ grep -rn "\<_IO_FILE\>" /usr/include/
/usr/include/c++/4.8.2/streambuf:178: * This is based on _IO_FILE, just reordered to be more consistent, /usr/include/libio.h:145:struct _IO_jump_t; struct _IO_FILE; /usr/include/libio.h:163: struct _IO_FILE *_sbuf; /usr/include/libio.h:246:struct _IO_FILE { //此處正解 /usr/include/libio.h:267: struct _IO_FILE *_chain; /usr/include/libio.h:291: struct _IO_FILE _file; /usr/include/libio.h:299: struct _IO_FILE *_freeres_list; /usr/include/libio.h:316:typedef struct _IO_FILE _IO_FILE; /usr/include/libio.h:325:#define _IO_stdin ((_IO_FILE*)(&_IO_2_1_stdin_)) /usr/include/libio.h:326:#define _IO_stdout ((_IO_FILE*)(&_IO_2_1_stdout_)) /usr/include/libio.h:327:#define _IO_stderr ((_IO_FILE*)(&_IO_2_1_stderr_)) /usr/include/libio.h:329:extern _IO_FILE *_IO_stdin attribute_hidden; /usr/include/libio.h:330:extern _IO_FILE *_IO_stdout attribute_hidden; /usr/include/libio.h:331:extern _IO_FILE *_IO_stderr attribute_hidden; /usr/include/libio.h:391:extern int __underflow (_IO_FILE *); /usr/include/libio.h:392:extern int __uflow (_IO_FILE *); /usr/include/libio.h:393:extern int __overflow (_IO_FILE *, int); /usr/include/libio.h:395:extern _IO_wint_t __wunderflow (_IO_FILE *); /usr/include/libio.h:396:extern _IO_wint_t __wuflow (_IO_FILE *); /usr/include/libio.h:397:extern _IO_wint_t __woverflow (_IO_FILE *, _IO_wint_t); /usr/include/libio.h:435:extern int _IO_getc (_IO_FILE *__fp); /usr/include/libio.h:436:extern int _IO_putc (int __c, _IO_FILE *__fp); /usr/include/libio.h:437:extern int _IO_feof (_IO_FILE *__fp) __THROW; /usr/include/libio.h:438:extern int _IO_ferror (_IO_FILE *__fp) __THROW; /usr/include/libio.h:440:extern int _IO_peekc_locked (_IO_FILE *__fp); /usr/include/libio.h:446:extern void _IO_flockfile (_IO_FILE *) __THROW; /usr/include/libio.h:447:extern void _IO_funlockfile (_IO_FILE *) __THROW; /usr/include/libio.h:448:extern int _IO_ftrylockfile (_IO_FILE *) __THROW; /usr/include/libio.h:465:extern int _IO_vfscanf (_IO_FILE * __restrict, const char * __restrict, /usr/include/libio.h:467:extern int _IO_vfprintf (_IO_FILE *__restrict, const char *__restrict, /usr/include/libio.h:469:extern _IO_ssize_t _IO_padn (_IO_FILE *, int, _IO_ssize_t); /usr/include/libio.h:470:extern _IO_size_t _IO_sgetn (_IO_FILE *, void *, _IO_size_t); /usr/include/libio.h:

轉載于:https://www.cnblogs.com/sky-heaven/p/10773372.html

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

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

相關文章

趣圖:當我捕獲Bug的時候

2019獨角獸企業重金招聘Python工程師標準>>> 趣圖&#xff1a;當我以為已捕獲了所有可能的異常...的時候 趣圖&#xff1a;程序員調 Bug 的感覺&#xff0c;就是這樣的 轉載于:https://my.oschina.net/javafirst/blog/3042724

PowerDesigner15連接Oracle數據庫并導出Oracle的表結構

PowerDesigner連接Oracle數據庫&#xff0c;根據建立的數據源進行E-R圖生成。詳細步驟如下&#xff1a; 1、啟動PowerDesigner 2、菜單:File->Reverse Engineer ->Database 出來New Physical Data Model對話框,DBMS選擇ORACLE Version 10g 選項&#xff0c;其他可以選擇默…

2019年春季學期第九周作業

AQ這個作業屬于那個課程C語言程序設計II這個作業要求在哪里2019春第九周作業我在這個課程的目標是了解并且應用結構體和數組的知識這個作業在那個具體方面幫助我實現目標掌握了數組的簡單編程及應用&#xff0c;了解了結構體參考文獻C語言chap3和C語言chap9一、本周完成的作業 …

有源光纜AOC在40G網絡布線中備受歡迎的主要原因

現在很多數據中心已經在部署40G網絡&#xff0c;在40G網絡傳輸方案中會需要用到40G QSFP光模塊、40G高速線纜和40G有源光纜等產品&#xff0c;現如今用較多的是40G有源光纜&#xff0c;而40G高速線纜具有絕對的成本優勢&#xff0c;市場對高速線纜的需求量也是有增無減&#xf…

前端大框架知識歸納與總結

轉載于:https://juejin.im/post/5cc447ec6fb9a0324c20c412

accept和select的區別

2019獨角獸企業重金招聘Python工程師標準>>> 參考&#xff1a;https://blog.csdn.net/lsgqjh/article/details/65629609 select&#xff1a;查看指定fd_set中socket狀態&#xff0c;如果fd_set中有套接字準備就緒&#xff08;觸發&#xff08;讀、寫或執行&#xff…

【肥朝】看源碼,我為什么推薦IDEA?

本文并不評論Eclipse與IDEA孰好孰壞,但是由于肥朝平時都是使用IDEA開發的,所以推薦IDEA.這個和肥朝平時都是吃粵菜,所以推薦的都是粵菜為主,但是并不是說其他菜不好吃,肥朝不挑食! 1.條件斷點 看源碼的時候,經常遇到這個情況,源碼中有個for循環,關鍵是這個list的size有時候長達…

【技術干貨+限時活動】openstack原理及在華為云中的應用

五一小假提前放送&#xff0c;實力干貨課程&#xff0c;講清openstack原理及在華為云中的應用&#xff0c;一門路過別錯過的課程&#xff01;免費學習參加限時活動&#xff0c;評論課程&#xff0c;智能音響體脂秤領回家&#xff01;快戳&#xff1a;http://u6.gg/sxHV5轉載于:…

ansible的參數及常用模塊

ansible的參數及常用模塊參數&#xff1a;查看幫助手冊&#xff1a;ansible-doc -a查指定模塊的幫助&#xff1a;ansible-doc -s 模塊名ansible-doc -s setup 查看setup模塊的幫助信息ansible-doc -lansible-doc -s fileOptions:-a, --all Show …

[HNOI2009]有趣的數列

[HNOI2009]有趣的數列 有一個長度為2n的1~2n的全排列&#xff0c;保證其奇數項遞增&#xff0c;偶數項遞增&#xff0c;并且相鄰的奇數項和偶數項&#xff0c;后面的偶數項大于奇數項的方案數\(mod\ p,n<1000000,P<1000000000\)。 解 注意到2n&#xff0c;實際上也就猜到…

bzoj 3881 [Coci2015]Divljak——LCT維護parent樹鏈并

題目&#xff1a;https://www.lydsy.com/JudgeOnline/problem.php?id3881 對 S 建 SAM &#xff0c;每個 T 會讓 S 的 parent 樹的鏈并答案1&#xff1b;在 T 走每一步的時候&#xff0c;走到的節點用 LCT access 一下&#xff0c;就能找到該點到 parent 根的鏈。 給鏈打標記。…

介紹一下再Apache下的Tomcat負載均衡的一些使用問題

在負載均衡技術中&#xff0c;硬件設備是比較昂貴的&#xff0c;對于負載均衡的學習者如果不是在企業中應用或者是學員中學習&#xff0c;很少有機會能碰到實際操作的訓練。&#xff08;http://xz.8682222.com&#xff09;所以&#xff0c;很多朋友都會選擇軟件方面的設置進行研…

Java利器之UML類圖詳解

本文轉載自https://blog.csdn.net/xiehuimx/article/details/53427452。 前言UML&#xff08;Unified Modeling Language&#xff09;中文統一建模語言&#xff0c;是一種開放的方法&#xff0c;用于說明、可視化、構建和編寫一個正在開發的、面向對象的、軟件密集系統的制品的…

Material Design之AppBarLayout總結

CoordinatorLayout 官方文檔 CoordinatorLayout 是一個加強型的FrameLayout. CoordinatorLayout 主要用于兩種場景: 作為activity最外層布局 作為協調一個或多個具有特定交互的子view的父布局 子view之間的特定協調動作&#xff0c;通過app:layout_behavior指定&#xff0c;如…

Git和GitHub快速入門

Git入門 簡介 Git 是 Linus Torvalds 為了幫助管理 Linux 內核開發而開發的一個開放源碼的分布式版本控制系統。 工具 準備工具 Git下載地址&#xff1a;https://git-scm.com Git配置 配置的內容主要是&#xff1a;用戶名和郵箱 git config --global --add user.name <用…

團隊沖刺三

昨天我做了什么&#xff1f; 完成了登錄的布局文件&#xff0c;建立數據庫&#xff0c;建數據表&#xff0c;連接數據庫&#xff0c;將信息存儲。 遇到了什么問題&#xff1f; 數據庫存儲功能報錯 今天打算做什么&#xff1f; 解決昨天遺留的問題。轉載于:https://www.cnblogs.…

C語言進階——全局變量

全局變量 定義在函數外面的變量是全局變量 全局變量具有全局的生存期和作用域 它們與任何函數都無關 在任何函數內部都可以使用它們 全局變量初始化 沒有做初始化的全局變量會得到0值 指針會得到NULL值 只能用編譯時刻已知的值來初始化全局變量 它們的初始化發生在main函數之前…

為什么我不用ViewPager或RecyclerView來做上下滑切換

上下滑切換翻頁大概是這樣的效果&#xff1a; 目前網上有諸多如 “仿抖音上下滑...” “仿花椒映客直播...” 之類的技術分享&#xff0c;都有講述實現上下滑切換頁面的方案&#xff0c;其中以 ViewPager 和 RecyclerView SnapHelper 兩種方案為多&#xff0c;但是都有明顯的缺…

web項目上之深入理解Java國際化

作者&#xff1a;https://blog.csdn.net/yangbo787827967/article/details/81124439 假設我們正在開發一個支持多國語言的Web應用程序&#xff0c;要求系統能夠根據客戶端的系統的語言類型返回對應的界面&#xff1a;英文的操作系統返回英文界面&#xff0c;而中文的操作系統則…

Chrome運行時性能瓶頸分析

一&#xff0c;初探&#xff0c;根據現象發現問題 chrome的performance知道很久了&#xff0c;但總是沒有特別權威且跟上時代的學習資料&#xff0c;這次痛定思痛&#xff0c;直接看英文文檔&#xff0c;一點點把這塊啃掉&#xff0c;本筆記基于Chrome 59 step 1: 隱身模式打開…