日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

IO操作底層調用過程|內核|中斷|

做后端的程序員都知道我們編寫的程序主要分方法程序和IO操作程序。
有什么不一樣呢?
方法程序就不多說了。IO程序有什么不同呢?IO操作指的是對硬件設備操作,比如鍵盤、鼠標、網卡、顯卡…
那又有什么區別呢?

那就得說說系統調用
先看下面簡單的一個圖,cpu主要從內存拉取數據執行,將返回結果返回給內存,是我們程序的執行過程(今天重點不是這)

  • 我們的程序分為 系統程序kernel(內核程序,操作系統自帶的程序)用戶程序(app之類的我們自己放在系統程序)。
    系統程序kernel用戶程序 都是程序。
  • 系統啟動之前兩者都是存在磁盤中、系統啟動啟動之后先調用內核程序操作系統相關程序比如:用戶登錄等,完成系統啟動。
    此時內程序會執行在內核空間中,用戶程序執行時候是在用戶空間

    那么問題來了,為什么分內核和用戶空間呢?內核空間有什么用?
    內核空間是用來給執行系統程序,操作系統硬件程序,并且給用戶程序提供操作設備的方法調用,比如調用系統的IO設備啥的。

    但是!!!!!
    系統程序執行的時候會開啟保護模式GDT** 。

    用戶程序在用戶空間執行,他是訪問不了內核空間的數據的,只能訪問用戶空間數據(因為被保護了),而內核程序執行時可以調用整個內存空間的數據的(可以理解為特權,后面就知道為什么了)。
    那為什么要這樣呢?
    可以理解,內核程序是用來操作系統的程序,如果能被用戶程序訪問,那操作系統很容易就被惡意破壞了。

    那么問題(老伙伴)它又來了,明明我們程序里面是可以操作IO的啊,怎么說不能呢?而且用戶程序都不能訪問內核空間咋調用內核程序操作IO呢?

    這就是神奇的地方了!!!
    在這之前得知道一個知識,相比大家都知道cpu切換,多線程的時候大家都知道cpu會在各個線程里面來回切換,保證線程都能被執行…

    那是怎么做的呢?
    CPU內部有一個硬件叫做晶振器,他是由直流電進,出來的時候,會產生震動(簡單這么理解),
    每次震動的時候,會讓CPU產生時鐘中斷。
    怎么理解中斷:CPU停止當前線程的執行,此時將執行信息保存在寄存器中,資源還給內存(保護現場)。
    上面這個過程是CPU多線程切換的原理,不僅晶振器可以中斷cpu,io操作也可以中斷。。。。

    在內核程序開始進入內存的時候,會有一個表IDT(中斷表) 來記錄中斷的號碼和對應的回調函數記錄當前執行的程序。而這個表是放在內核程序里面的。(重點)

    現在回過頭來說說為什么用戶這邊能通過內核程序調用系統IO?
    剛才說了不僅時鐘中斷可以中斷CPU,IO操作也會中斷CPU
    比如:程序中執行System.out.print的時候最終會被編譯成 write()+ INT0x80 ,這個write方法就是內核程序讓顯卡打印的程序,INT0x80 是讓CPU中斷的指令。(!!!轉折點

    神奇的過程!!!!
    用戶程序在執行 System.out.print 之后 等于 最終執行了 write()+ INT0x80 ,當執行到INT0x80的時候,啪 ! CPU被中斷了,這個時候CPU就要保存現場,然后把當前執行的程序也就是write() 作為參數放到回調函數里面放到IDT表,保存起來。(記住IDT表是放在內核程序里面的),下一次CPU需要繼續執行這個方法時,怎么著?它得沖IDT去調用 回調函數啊,正好執行了write(
    )方法(完成了IO操作)。

    以上就是IO操作的一個用戶態(用戶程序執行時,用戶空間的狀態)切換成內核態(用戶程序執行時,內核空間的狀態)的過程。

    總結:

  • 宏觀上說,用戶程序調用IO設備時,是需要內核程序調用的,所以上面說到了內核程序的作用:向下操作系統設備,向上提供操作設備方法,目的輕量化用戶程序,包攬系統調用操作,用戶程序不需要再自己寫底層調用設備程序。
  • 用戶態切換內核態需要消耗時間,開銷大。所以用戶程序頻發的調用IO會有性能損耗。比如BIO模型中,利用每一個線程對應一個連接,會讓cpu來回調度,每次調度就是一次內核態切換,消耗性能。
  • 總結

    以上是生活随笔為你收集整理的IO操作底层调用过程 | 用户态切换内核态原理 | 中断概念的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。