成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux內核設計與實現讀書筆記

系統 Linux
內核把物理頁作為內存管理的基本單位, 內存管理單元(MMU, 管理內存并將虛擬地址轉換為物理地址) 通常以頁為單位來管理系統中的頁表。

 [[176324]]

Unix強大的根本原因:

  1. Unix簡潔, 提供幾百個系統調用, 設計目的明確
  2. Unix中 所有東西都被當做文件對待
  3. Unix內核和相關系統工具是用C語言開發的, 移植能力強大
  4. Unix進程創建迅速, 有獨特的fork機制
  5. Unix提供簡單穩定的進程間通信元語

Linux是類Unix系統, 借鑒了Unix設計并實現了Unix的API.

應用程序通常調用庫函數(如C庫函數)再由庫函數通過系統調用界面, 讓內核代其完成各種任務.

  • Linux支持動態加載內核模塊
  • Linux支持對稱多處理(SMP)機制
  • Linux為 搶占式內核
  • Linux并不區分線程和其他的一般進程
  • Linux提供具有設備類的面向對象的設備模型, 熱插拔事件, 以及用戶控件的設備文件系統

中斷和中斷處理

中斷是一種解決處理器和速度差異的方案, 只有在硬件需要的時候再向內核發出信號. 中斷本質上是一種特殊的電信號.

  • 內核響應特定中斷, 然后 內核 調用特定的 中斷處理程序 , 終端處理程序是設備驅動程序的一部分
  • Linux中的終端處理程序是不可重入的, 同一個中斷處理程序不會被同時調用
  • 中斷上下文不可以睡眠(我理解當前被中斷的程序再中斷處理結束后需要繼續執行)
  • 中斷處理程序不在進程上下文中進行, 他們不能阻塞
  • 中斷處理分為兩部分, 上半部為中斷處理程序, 要求盡可能快的執行, 下半部( 用于減少中斷處理程序的工作量 )執行與中斷處理密切相關但中斷處理程序本身不執行的工作
  • 下半部的實現方法 軟中斷、tasklet、工作隊列 ,

中斷機制的實現:設置產生中斷, 通過電信號給處理器的特定管腳發送一個信號, 處理器聽著當前處理工作, 關閉中斷系統 , 然后調到內存中預定義的位置(中斷處理程序的入口點)開始執行.計算終端號, do_IRQ() 對接收的中斷進行應答, 禁止這條線上的中斷傳遞.

內核同步

對于共享資源, 如果同時被多個線程訪問和操作, 就可能發生各線程之間相互覆蓋共享數據, 造成訪問數據不一致.

同步實現通過主要 鎖機制 對共享資源進行加鎖, 只有持有鎖的線程才能操作共享資源, 其他線程睡眠(或者輪詢). 資源操作完成后, 持有鎖的線程釋放鎖, 由等待線程搶鎖.

內核同步方法:

  1. 原子操作
  2. 自旋鎖 , 特性是當線程無法獲取鎖, 會一直忙循環( 忙等 )等待鎖重新可以, 適用于短期輕量級加鎖
  3. 讀/寫自旋鎖 (共享/排它鎖), 一個或多個任務可以并發的持有讀者鎖, 寫者鎖只能被一個寫任務持有.
  4. 信號量 (睡眠鎖), 如果一個任務試圖獲得一個被占用的信用量時, 信號量會將其推進一個等待隊列, 然后讓其睡眠. 當信號量可用后, 等待隊列中的任務會被喚醒. 適用于鎖被長期占用的時候.
  5. mutex(計數為1的信號量), 這個是編程中最常見的.
  6. 順序鎖
  7. 屏障 (barriers), 用于確保指令序列和讀寫的執行順序

內核中造成并發的原因:

  • 中斷, 幾乎可以再任何時刻異步發生, 可能隨時打斷當前正在執行的代碼
  • 軟中斷和tasklet, 內核能在任何時刻喚醒或調度軟中斷或tasklet, 打斷當前正在執行的代碼
  • 內核搶占
  • 睡眠及與用戶空間的同步
  • 對稱多處理, 多個處理器同時執行代碼

內存管理

內核把物理頁作為內存管理的基本單位, 內存管理單元(MMU, 管理內存并將虛擬地址轉換為物理地址) 通常以頁為單位來管理系統中的頁表.

內核把也劃分為不同的區( zone ), 使用區對具有相似特性的頁進行分組

  1. // <linux/gfp.h> 該函數分配2的order次方個連續`物理頁`, 返回指針指向***個頁的page結構體  
  2. staticinlinestructpage *  
  3. alloc_pages(gfp_tgfp_mask,unsignedintorder)  
  4. // 釋放物理頁  
  5. externvoidfree_pages(unsignedlongaddr,unsignedintorder);  
  6. //<linux/slab.h>以字節為單位分配一塊內核內存(物理上連續)  
  7. static__always_inlinevoid*kmalloc(size_tsize,gfp_tflags)  
  8. //釋放kmalloc分配的內存塊  
  9. voidkfree(constvoid*); 

虛擬文件系統

虛擬文件系統為用戶控件程序提供了文件和文件系統相關接口.

文件的元數據, 被存儲在一個單獨的數據結構中, 被稱為 inode (索引節點)

虛擬文件系統(VFS)有四個主要的對象模型:

  • 超級塊對象, 代表一個具體的已安裝文件系統, 存儲特定文件系統的信息
  • 索引節點對象, 代表一個具體文件, 包含內核在操作文件或目錄時需要的全部信息, 一個索引節點代表文件系統中的一個文件,
  • 目錄項對象, 代表一個目錄項, 是路徑的一個組成部分, VFS把目錄當做文件處理 , 目錄項對象沒有對應的磁盤數據結構
  • 文件對象, 代表進程打開的文件, 進程直接處理的是文件
  1. // <linux/fs.h> 文件對象的數據結構 
  2. structfile { 
  3. union
  4. structllist_node fu_llist; 
  5. structrcu_head fu_rcuhead; 
  6.  } f_u; 
  7. structpath f_path; 
  8. structinode *f_inode;/* cached value */ 
  9. conststructfile_operations *f_op; 
  10.  
  11. /* 
  12.  * Protects f_ep_links, f_flags. 
  13.  * Must not be taken from IRQ context. 
  14.  */ 
  15. spinlock_tf_lock; 
  16. atomic_long_tf_count; 
  17. unsignedintf_flags; 
  18. fmode_tf_mode; 
  19. structmutex f_pos_lock; 
  20. loff_tf_pos; 
  21. structfown_struct f_owner; 
  22. conststructcred *f_cred; 
  23. structfile_ra_state f_ra; 
  24.  
  25.  u64 f_version; 
  26. #ifdefCONFIG_SECURITY 
  27. void*f_security; 
  28. #endif 
  29. /* needed for tty driver, and maybe others */ 
  30. void*private_data; 
  31.  
  32. #ifdefCONFIG_EPOLL 
  33. /* Used by fs/eventpoll.c to link all the hooks to this file */ 
  34. structlist_head f_ep_links; 
  35. structlist_head f_tfile_llink; 
  36. #endif/* #ifdef CONFIG_EPOLL */ 
  37. structaddress_space *f_mapping; 
  38. } __attribute__((aligned(4)));/* lest something weird decides that 2 is OK */ 

塊I/O層

系統中能夠 隨機訪問 固定大小數據片(chunks)的硬件設備稱作塊設備, 如硬盤. 按照字符流的方式被 有序訪問 的硬件設備稱為字符設備, 如鍵盤

  1. # <linux/bio.h>I/O設備基本容器由bio結構體表示 
  • I/O調度程序 用于管理塊設備的請求隊列, 決定隊列中的請求排列順序以及什么時刻派發請求到掛設備. 這樣有利于減少磁盤的尋址時間, 從而提高全局的吞吐量
  • linux實際使用的I/O調度程序有 linux電梯, 最終期限I/O調度, 預測I/O調度程序, 空操作的I/O調度程序

進程地址空間

內核需要管理用戶空間中進程的內存, 這個內存稱為 進程地址空間 , 系統中所有進程之間以虛擬方式共享內存.

進程地址空間由進程可尋址的虛擬內存組成, 每個進程有32位或64位地址空間.

虛擬地址空間, 可被訪問的合法地址空間稱為 內存區域 :

  • 可執行文件代碼的內存映射, 稱為代碼段
  • 可執行文件的已初始化全局變量的內存映射, 稱為數據段
  • 包含未初始化全局變量,bss(block started by symbol)段的零頁的內存映射
  • 用于進程用戶空間棧的零頁內存映射
  • 每一個如C庫或動態鏈接程序等共享庫的代碼段、數據段和bss會被載入進程的地址空間
  • 任何內存映射文件
  • 任何共享內存段
  • 任何匿名的內存映射, 如malloc分配的內存

內核使用內存描述符結構體表示進程的地址空間, 內存描述符由mm_struct( <linux/sched.h> )結構體表示. 內核線程沒有進程地址空間, 也沒有相關的內存描述符, 所有內核線程沒有用戶上下文

應用程序操作的對象是 映射到物理內存上的虛擬內存 , 而處理器操作的是物理內存, Linux使用三級頁表完成地址轉換, 每個虛擬地址作為索引指向頁表, 頁表項則指向下一級的頁表. 在多級頁表中通過TLB(translate lookaside buffer)作為一個虛擬地址映射到物理地址的緩存

責任編輯:武曉燕 來源: 推酷
相關推薦

2017-02-07 15:54:14

數據可視化數據分析

2009-06-16 13:09:15

Hibernate實戰Hibernate

2009-06-18 14:20:45

hibernate實戰

2015-03-10 14:05:46

程序員軟件架構讀書筆記

2014-04-16 11:39:52

2024-08-02 19:49:41

2015-07-15 13:45:51

SQLServer讀書筆記

2015-07-15 13:48:01

SQLServer讀書筆記

2021-09-23 14:39:28

鴻蒙HarmonyOS應用

2010-04-21 12:54:46

Unix內核

2017-03-27 18:05:49

Linux內核編譯與開發

2018-05-18 09:07:43

Linux內核內存

2010-01-06 16:47:53

Linux內核

2024-03-15 08:54:59

Linux內核NUMA

2013-07-22 11:25:12

2011-01-14 13:50:37

2018-11-13 12:52:50

Linux內核?;厮?/a>

2021-11-15 04:00:07

Linux 內核動態

2021-11-14 07:29:55

Linux 內核靜態追蹤Linux 系統

2009-08-26 17:22:09

C#語言
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕精品一区久久久久 | 天天操天天射天天舔 | 黑人巨大精品欧美一区二区免费 | 亚洲国产在 | 日韩欧美国产精品一区二区 | 亚洲人人舔人人 | 男女国产视频 | www精品美女久久久tv | 天天干.com| 狠狠干av| 国产精品美女久久久久久久网站 | 国产精品福利网 | 精品国产一区二区三区性色av | 国内精品久久久久久 | 97人人干| 色综合视频 | 日韩免费av | 国产一区二区免费 | 中文在线播放 | 亚洲午夜精品一区二区三区他趣 | 久久久久久久一区 | 欧美综合在线视频 | 精品欧美一区二区在线观看 | 精品一区二区三区四区五区 | 亚洲欧美综合精品久久成人 | jizz亚洲人| 成人免费看黄 | 国产一区二区精华 | 国产一区不卡在线观看 | 日韩一级黄色毛片 | 国产一二三视频在线观看 | 久久婷婷国产麻豆91 | 色站综合 | 日韩激情一区 | 欧美日韩黄| 欧美v免费| 国产精品美女久久久 | 久久成人精品视频 | 伊人在线| 免费黄色av网站 | 亚洲精品一 |