基礎概念
文件描述fd
文件描述符(file description),用於表述指向文件引用的抽象話題概念
文件描述符在形式上是一個非負整數,實際上它是一個索引值,指向內核為每一個進程所維護的該進程打開文件的記錄表,當程序打開一個現有文件或者創建一個新文件時,內核就向該進程返回一個文件描述符
unix系統把任何對象看做是文件,文件就是一串二進制流,我門對數據(流)的讀寫操作就是對文件的操作,所以當我們的進程在做讀寫操作時會返回一個記錄訪問位置的索引值,當我們繼續操作該文件時可直接通過這個索引值到達上一次的位置.
用戶空間和內核空間,與進程
現在操作系統都是采用虛擬存儲器,對於32位操作系統,它的尋址空間為4G.操作系統的核心是內核,獨立於普通程序,可以訪問受保護的內存空間,也有訪問底層硬件設備的所有權限.為了保證用戶進程不能直接操作內核,保證內核安全,操作系統將虛擬空間划分為兩部分,一部分稱為內核空間,一部分稱為用戶空間,這兩部分空間大小和地址范圍分別為1G和3G,內核空間供內核使用,用戶空間供用戶進程使用
進程是程序的一次動態執行過程,它經歷了從代碼加載,執行到執行完畢的一個完整過程,這個過程也是進程本身從產生,發展到最終消亡的過程,多進程操作系統能同時運行多個進程,由於CPU具備分時機制,所以每個進程都能獲得自己的時間片,由於CPU執行速度非常快,使得所有程序好像是在同時運行一樣
在操作系統中進程是進行系統資源分配,調度和管理的最小單位,進程在執行過程中擁有獨立的內存單元,當操作系統加載程序到內存中,操作系統會為每個進程分配4G的虛擬內存空間.地址從0x00000000到0xFFFFFFFF,其中1G(3-4)是內核所使用的內核空間,3G(0-3)是進程使用的用戶空間
這里要注意的是系統為每個進程分配4G的虛擬內存空間,實際上這4G的虛擬內存是一個可尋址的地址范圍,並不是實際的物理內存,這個可尋址的4G地址范圍由內存區域表來管理.每個進程所用到的內存區域會通過頁表映射到物理內存,所以每個進程都可以使用同樣的虛擬內存地址而不沖突,他們的實際物理地址是不同的
為了控制進程的執行,內核必須有能力掛起正在CPU上運行的進程,並恢復以前掛起的某個進程的執行.這種行為被稱為進程切換,任務切換或上下文切換,盡管每個進程都有自己的地址空間,但所有進程都在同一個CPU寄存器里,
因此,在恢復一個進程執行前,內核必須確保每個寄存器中含有掛起進程時所需要的值.進程恢復執行前必須裝入寄存器的一組數據,稱為硬件上下文(hardware Context),硬件上下文包含了進程恢復時所需要的所有信息.
一個進程的運行轉到另一個進程上,需要做很多交接記錄位置的動作,
進程的切換和阻塞
進程的切換是內核執行該進程的時間片到期而主動掛起該進程,切換到另一個進程的動作.但是進程在一個時間片內執行過程中,遇到某些期望的事件未發生那么進程就會放棄處理機成了阻塞,致使進程阻塞的典型事件有:請求I/O,申請緩沖空間等.
緩存IO,
緩沖區以及對緩沖區的操作,是所有IO的基礎,進程執行IO操作可以簡單的描述為緩沖區的數據讀與寫
在數據read傳輸過程中需要將數據從磁盤中拷貝到內核空間的的緩沖區,然后從內核空間拷貝到進程用戶空間,這個過程會經歷兩個階段:1,等待數據准備,2,將數據重內核拷貝到用戶空間,而且這兩個過程是需要時間的,這就造成了阻塞.稱為阻塞IO
在這個基礎上,為了充分利用CPU資源,發展出了非阻塞io,IO多路復用,信號驅動IO,異步IO
阻塞IO
當用戶進程調用了recfrom這個系統調用,系統內核就開始了IO的第一個階段,准備數據階段(對於網絡IO,很多時候數據在一開始還沒有到達,沒有接收到一個完整的UDP包,這個時候內核就要等待足夠的數據到來,磁盤IO的情況就是等待磁盤數據從磁盤上讀取到內核空間),這個過程需要等待,而用戶進程這邊整個進程就會被阻塞 ,當內核空間把數據准備好了,返回給用戶進程一個結果,用戶進程才解除阻塞狀態,
非阻塞IO
非阻塞IO是對阻塞IO的一個改進,即在內核未完成准備數據的時候,返回一個狀態error告訴進程我沒准備好,用戶進程收到error狀態會繼續發起發起IO請求,直到內核空間准備好了數據,返回正確的狀態.
IO多路復用
待續.................
https://mp.weixin.qq.com/s?__biz=MzI4NTEzMjc5Mw==&mid=2650554694&idx=1&sn=b923effe8a7feed34f2d6637c4041df9&chksm=f3f833d0c48fbac69c0118c20bb7f8d983e0e571cf7cbf4efffc925c2324533b4d6ca463ac11#rd