1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        操作系統(tǒng) 虛擬地址空間、用戶空間、內(nèi)核空間、用戶態(tài)與內(nèi)核態(tài)

        共 2326字,需瀏覽 5分鐘

         ·

        2021-07-31 08:39

        內(nèi)存分頁

        為了節(jié)約內(nèi)存,提高使用效率,操作系統(tǒng)會將內(nèi)存拆成一個個的小塊來使用,在 Linux 中,這每一小塊叫做 page(頁) ,大小為4k

        什么是虛擬地址空間

        多任務(wù)操作系統(tǒng)中,每個進程都運行在屬于自己的虛擬內(nèi)存中,這塊空間被稱為 Virtual Address Space(虛擬地址空間)

        為什么要有虛擬地址空間

        為了讓進程之間相互隔離。

        假如讓進程直接操作物理內(nèi)存,很有可能會出現(xiàn),不同進程都操作了同一物理內(nèi)存地址,造成相互影響。于是就抽象出來 虛擬地址空間 這樣一個中間層,讓一塊 虛擬地址空間 映射到一塊 物理地址空間

        如上圖,兩塊虛擬內(nèi)存通過page table(頁表) 將自己映射到物理內(nèi)存上,進程只能看到虛擬內(nèi)存(當然它自己是不知道內(nèi)存是虛擬的),進程只能"運行"在虛擬地址空間,只會操作屬于自己的虛擬內(nèi)存,因此進程之間不會相互影響

        虛擬地址空間的大小及分配

        操作系統(tǒng)需要為每一個進程分配屬于自己的虛擬內(nèi)存,那這個虛擬內(nèi)存要分配多大呢?

        在沒有虛擬地址空間之前,是根據(jù)進程的需要按需分配物理內(nèi)存的。但有了虛擬地址空間,分配策略可以變一下,先把虛擬地址空間分配的大些,但不立馬建立與物理內(nèi)存的映射,而是用到的時候,用多少,建立多少

        這樣物理內(nèi)存的大小雖然不變,但是內(nèi)存分配的靈活性大大的提高了,進程也不用擔心地址會跟別的進程沖突,盡管用就是

        32 位操作系統(tǒng)中,操作系統(tǒng)會為每個進程分配最大為 4G(2 的 32 次方)的虛擬地址空間

        用戶空間與內(nèi)核空間

        操作系統(tǒng)雖然為每個進程都分配了虛擬地址空間,但 虛擬地址空間中并不是所有的區(qū)域都可以為進程所用

        操作系統(tǒng)將虛擬地址空間 分為用戶空間內(nèi)核空間,對于 32 位的操作系統(tǒng),在 Linux虛擬地址空間中,用戶空間內(nèi)核空間的大小比例為 3:1,而在 window 中則為 2:2

        為什么會有內(nèi)核空間

        為了系統(tǒng)的安全,現(xiàn)代的操作系統(tǒng)一般都強制用戶進程不能直接操作內(nèi)核的,所有的系統(tǒng)調(diào)用都要交給內(nèi)核完成(應用程序所有的操作,最終都是由內(nèi)核代為完成的)。

        但是內(nèi)核也要運行在內(nèi)存中,為了防止用戶進程干擾,操作系統(tǒng)為內(nèi)核單獨劃分了一塊內(nèi)存區(qū)域,這塊區(qū)域就是內(nèi)核空間,系統(tǒng)內(nèi)核運行在內(nèi)核空間中,

        內(nèi)核空間與用戶空間的映射

        Linux 中,系統(tǒng)啟動時,就需要將內(nèi)核加載到物理內(nèi)存的內(nèi)核空間上運行。

        但對于進程,物理內(nèi)存對它是不可見的,但它又需要使用內(nèi)核來完成各種系統(tǒng)調(diào)用,而內(nèi)核實際又在物理內(nèi)存上。怎么解決這個矛盾?

        Linux 想了一個辦法,將進程的虛擬地址空間中的內(nèi)核空間映射到物理內(nèi)存中的內(nèi)核空間上,內(nèi)核就“搬到”虛擬內(nèi)存中了。而在進程看了,自己的內(nèi)存中就有了內(nèi)核了,就可以通過內(nèi)核進行各種系統(tǒng)調(diào)用了

        Linux 中,內(nèi)核空間是持續(xù)的,并且所有進程虛擬地址空間中的內(nèi)核空間都映射到同樣的物理內(nèi)存內(nèi)核空間

        如上圖 進程a 和 進程b 的內(nèi)核空間都映射到了同一塊物理內(nèi)存區(qū)域,而用戶空間的地址,則被映射到了不同的物理內(nèi)存區(qū)域

        用戶態(tài)與內(nèi)核態(tài)

        當一個進程執(zhí)行系統(tǒng)調(diào)用而陷入內(nèi)核代碼中執(zhí)行時,就稱進程處于內(nèi)核運行態(tài)(或簡稱為內(nèi)核態(tài))。

        比如有一個寫文件的的 python 程序

        with open('/test.txt','a+') as fw: # 打開文件
            fw.write('內(nèi)容')
        復制代碼

        運行起來之后就是一個進程了,也有了自己的虛擬地址空間,包括用戶空間和內(nèi)核空間。剛開始這個進程是運行在用戶空間,但當執(zhí)行到 fw.write('內(nèi)容') 時,發(fā)現(xiàn)要往磁盤中寫入一個文件,而讀寫磁盤這種事,只有內(nèi)核才能操作,內(nèi)核提供了一個 write() 系統(tǒng)級函數(shù),fw.write('內(nèi)容') 這段代碼最終是執(zhí)行 write() 系統(tǒng)調(diào)用來實現(xiàn)文件寫入的

        剛開始的 python 代碼是加載到用戶空間的內(nèi)存中運行的,當執(zhí)行 write() 系統(tǒng)調(diào)用是,write()是在內(nèi)核空間運行的,但他們都屬于同一進程,只是在執(zhí)行系統(tǒng)調(diào)用的時候發(fā)生一個狀態(tài)的切換。

        程序運行在用戶空間的時候,進程處于用戶態(tài),程序進入到內(nèi)核運行后,進程處于內(nèi)核態(tài),這兩種狀態(tài)的切換就被稱為上行文切換

        上行文切換是很消耗資源的,所以要盡量避免上下文切換

        用戶態(tài)切換到內(nèi)核態(tài)的 3 種方式

        除了上面提到的系統(tǒng)調(diào)用,還有兩張方式會導致用戶態(tài)切換到內(nèi)核態(tài)

        • 系統(tǒng)調(diào)用 : 這是用戶態(tài)進程主動要求切換到內(nèi)核態(tài)的一種方式,用戶態(tài)進程通過系統(tǒng)調(diào)用申請使用操作系統(tǒng)提供的服務(wù)程序完成工作,而系統(tǒng)調(diào)用的機制其核心還是使用了操作系統(tǒng)為用戶特別開放的一個中斷來實現(xiàn),例如 Linux 的 int 80h 中斷。

        • 異常 : 當 CPU 在執(zhí)行運行在用戶態(tài)下的程序時,發(fā)生了某些事先不可知的異常,這時會觸發(fā)由當前運行進程切換到處理此異常的內(nèi)核相關(guān)程序中,也就轉(zhuǎn)到了內(nèi)核態(tài),比如缺頁異常。

        • 外圍設(shè)備的中斷 : 當外圍設(shè)備完成用戶請求的操作后,會向 CPU 發(fā)出相應的中斷信號,這時 CPU 會暫停執(zhí)行下一條即將要執(zhí)行的指令轉(zhuǎn)而去執(zhí)行與中斷信號對應的處理程序,如果先前執(zhí)行的指令是用戶態(tài)下的程序,那么這個轉(zhuǎn)換的過程自然也就發(fā)生了由用戶態(tài)到內(nèi)核態(tài)的切換。


        作者:我妻禮彌
        鏈接:https://juejin.cn/post/6990237426903957540
        來源:掘金
        著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。



        瀏覽 23
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一级射视屏| 日本无删减大尺度百合电影 | 在线观看免费黄色视频 | 精品少妇嗷嗷叫在线观看视频 | 蜜臀av在线免费观看 | 日本三级片在线 | 日本熟女视频 | 中国一级黄色毛片 | 91丨九色丨国产 在线 | 上瘾16分钟大尺度的片段 |