<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                本章主要介紹程序執行過程中操作系統、CPU都干了什么 # 運行前 程序在運行前,只是在硬盤上待著,此時就是一堆**二進制代碼**而已,沒有任何作用。 程序只有進入了內存才能運行,但是要進入內存,則需要服從**操作系統**的調度。 一個程序在運行的時候可能需要很大的空間,比如3G,但是操作系統不可能為每個程序都分配那么大,因為同時加載入內存的程序可能很多。 所以操作系統想了個辦法,它和CPU一起“欺騙”了程序,它可以把硬盤的部分空間當作內存展示給程序,這就是**虛擬內存技術**,這種欺騙手段能實現的原因在于,程序的局部性原理,也就是程序不會同時運行所有的代碼。 **虛擬內存**是一種內存管理技術,使得應用程序認為它擁有連續的可用的內存。 實際上可能并不是這樣,它通常是被分隔成多個物理內存碎片,還有可能暫時存儲在外部磁盤存儲器上, ![image.png](http://upload-images.jianshu.io/upload_images/1323506-0778282632c5a541.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 這種做法最核心的問題就在于**調度**。我們可以把程序切分成若干塊,也就是**頁面**,然后分頁裝入內存中。這樣,之后暫時用不到的頁面就可以置換到硬盤上呢。 ![image.png](http://upload-images.jianshu.io/upload_images/1323506-58daa780e601af9b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ![image.png](http://upload-images.jianshu.io/upload_images/1323506-78999fabd1743f03.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 裝載 在程序運行之前,操作系統會進行程序的**裝載**,也就是創建一個**進程結構**,它會有自己的一套虛擬地址、頁表等結構。 但是裝載器不會把代碼裝載到物理內存中,而是用一個**頁表**把代碼在硬盤上的位置記錄下來,只有在真正運行的時候才會加載到內存里面。 最后,裝載器會找到程序的入口地址,執行的時候,從入口地址開始讀第一條指令。 # 運行 下載程序雖然還在硬盤里面,但是操作系統已經建立了一個**進程**,它有一套自己的虛擬地址、頁表等高級數據結構。 操作系統進行進程的調度,當輪到這個進程來的時候,才從裝載器返回的入口點開始執行。 CPU從程序入口處取出指令,但是這是一個虛擬地址,需要轉換為物理地址。那么怎么轉換呢?CPU會去查看**頁表**,可以這個頁表現在還指向的是**硬盤中的地址**,所以CPU會執行**缺頁中斷處理程序** 最后CPU會從硬盤里面把代碼加載入內存,之后CPU當然得把**頁表**修改一下,這樣才能反映數據已經進入內存呢。 ![image.png](http://upload-images.jianshu.io/upload_images/1323506-6a2759fda0c0858b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 隨著程序的執行,越來越多的數據和代碼被加載到物理內存,而且這些加載到內存中的**頁**不是連續的,他會安插在內存的不同位置去。 ![image.png](http://upload-images.jianshu.io/upload_images/1323506-022e0a01df99968f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 值得注意的是,在內存中的只是進程的一個實例而已,可以相當于程序的一個**化身**。 CPU會不斷的讀數據、寫數據,時間片到了,就把進程掛起來,也就是說進程其實不是獨占CPU的,只是因為進程切換得非常快,從人類的角度來看,以為程序在同時執行一樣。 最后進程運行結束,內存中的數據會清理,覆蓋。 ![image.png](http://upload-images.jianshu.io/upload_images/1323506-67d076eb7a5faa2d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) # 操作系統為什么要這么做 操作系統為什么要那么麻煩的搞出什么內存映射、虛擬內存來,還不是因為資源有限,內存就那么大,程序又那么多,為了讓更多的程序運行起來,有效的利用內存和CPU,只能使用這種方法了。 # 參考 本文由[操作系統是個大騙子?](https://mp.weixin.qq.com/s?__biz=MzAxOTc0NzExNg==&mid=2665513894&idx=1&sn=3cf8faef41800f0dd52f84a0ae2d8065&chksm=80d67be5b7a1f2f31833dc71f8c67dc50e64b14bb5a25678155a7b39927b63db7c17510793d0&scene=21#wechat_redirect)改編過來的
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看