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>

        計(jì)算機(jī)科班學(xué)習(xí) OS 的正確姿勢!

        共 4389字,需瀏覽 9分鐘

         ·

        2021-02-10 16:19

        閱讀本文大概需要 11 分鐘。



        大家好,我是小北。
        今天單獨(dú)討論下,如何學(xué)習(xí)操作系統(tǒng)這個(gè)話題。
        操作系統(tǒng)發(fā)展到今天,已經(jīng)非常復(fù)雜了,像 Windows、Linux 任意一個(gè)都是幾千萬行代碼級(jí)別,想靠個(gè)人完全搞懂,幾乎是不可能的了。
        所以需要先明確一下我們學(xué)習(xí)的目的,不同的學(xué)習(xí)目的,適用不同的方法,這里我僅僅列一下作為一名開發(fā)人員,我們掌握 OS 的幾種目標(biāo):
        第一種:
        知曉 OS 基本概念:看在線課程原理部分的視頻或者看《現(xiàn)代操作系統(tǒng)》之類的書,可大致知道OS的概念;
        第二種:
        理解OS基本原理: 在1的基礎(chǔ)上,完成與 OS 相關(guān)的課程練習(xí)題,可進(jìn)一步理解 OS 基本原理,練習(xí)題可以參考學(xué)堂在線清華OS課程的練習(xí)題:

        第三種:
        掌握 OS 部分核心功能實(shí)現(xiàn)(細(xì)節(jié)):在 2 的基礎(chǔ)上,能夠通過編程完成類似 ?xv6 的幾個(gè) lab ,
        比如 xv6 就會(huì)涉及以下模塊:
        • Booting a PC
        • Memory Management
        • Multitasking
        • File system, Spawn and Shell
        • Network Driver
        每個(gè)模塊代碼量都不會(huì)很多,但是麻雀雖小,五臟俱全,通過自己動(dòng)手實(shí)現(xiàn) thread、spinlock、semaphore 這些東西,會(huì)讓你理解更加深刻。
        當(dāng)然,在往上走就是去研究最新 Linux Kernel,研究一些子模塊了,有些還需要閱讀最新的 System 領(lǐng)域論文。
        最新的 Linux Kernel ?里有很多新的算法、研究結(jié)果不斷的加入。
        當(dāng)然,這就超出了我所能掌握的范疇了哈哈。
        不過說實(shí)話,如果你還在校大二大三,我真的墻裂建議你去做一些國外的計(jì)算機(jī) lab,比如OS、Network。
        等到畢業(yè)了,幾乎就不太可能從頭開始系統(tǒng)學(xué)習(xí)那些基礎(chǔ)知識(shí)了,除非你能自己閉關(guān)兩三年,啥也不做,待在一個(gè)地方專心修煉。
        好好珍惜在學(xué)校大把的空閑時(shí)間,做一些讓在專業(yè)上讓自己受益一生的事情。
        這里我可以列舉幾個(gè),國內(nèi)不少喜歡 System 的同學(xué)都會(huì)去跟 MIT、CMU、UCB 這些計(jì)算機(jī)名校的課程。
        比如 MIT 的 6.824 Distributed System、6.830 Database SystemsMIT 6.828 Operating System Engineering .....

        xv6

        6.828 就是今天要介紹的主角:
        MIT6.828:Operating System Engineering
        官網(wǎng)主頁:https://pdos.csail.mit.edu/6.828/2020/index.html
        在官網(wǎng),包含了Schedule、Labs、xv6-book 等等。
        尤其是 xv6-lab 包含了操作系統(tǒng)中最為核心的模塊:

        每個(gè)模塊都搭好了框架,留下最為核心的部分給我們?nèi)?shí)現(xiàn),你可以把這個(gè)看做一種「完形填空」:
        • System Call、Page tables
        • Traps
        • Lazy allocation、Copy On-Write
        • Multithreading、Lock
        • File System、mmpa
        • network driver
        如果想看視頻的話可以去 Youtube 或者 B站:
        MIT 6.828: Operating System Engineering :https://www.bilibili.com/video/BV1px411E7ST

        ucore

        如果你想找一個(gè)國內(nèi)的類似 xv6 的 lab,那么這里推薦清華大學(xué) ucore OS。
        它其實(shí)也是起源于MIT CSAIL PDOS課題組開發(fā)的 xv6 & jos、哈佛大學(xué)開發(fā)的 OS161教學(xué)操作系統(tǒng)、以及Linux-2.4 內(nèi)核。
        然后清華的老師在這個(gè)基礎(chǔ)上,增加、調(diào)整了一些代碼,為清華大學(xué) OS 課程設(shè)計(jì)的一個(gè)lab。
        另外,這個(gè)課程的很多資料、文檔都是中文的,還有清華老師的配套視頻課程。
        清華大學(xué)-操作系統(tǒng):https://www.xuetangx.com/course/THU08091000267/5883104
        順便推薦幾本經(jīng)典的書籍吧:
        書名(英文):Operating Systems : Design and Implementation (3rd Edition)
        書名(中文):操作系統(tǒng):設(shè)計(jì)及實(shí)現(xiàn) (第三版)
        原作者:Andrew S. Tanenbaum / Albert S. Woodhull
        翻譯者:王鵬、尤晉元、朱鵬、敖青云
        Operating System (操作系統(tǒng))
        書名(英文):Operating System Concepts (7th Edition)
        書名(中文):操作系統(tǒng)概念 (第七版)
        原作者:Abraham Silberschatz / Peter Baer Galvin / Greg Gagne
        另外還有諸如《現(xiàn)代操作系統(tǒng)》、《Operating Systems: Three Easy Pieces》之類的。
        尤其是 《Operating Systems: Three Easy Pieces》,閱讀體驗(yàn)比較好,討論問題由淺入深。
        而書名也是很有意思,Three Easy Piece是為了致敬費(fèi)曼的關(guān)于物理學(xué)的書籍:《Six Easy Pieces: Essentials Of Physics Explained By Its Most Brilliant Teacher》。
        用作者的話說,操作系統(tǒng)只有物理學(xué)一半難,那就叫 《Three Easy Pieces》好了。
        Three 也是指代本書三個(gè)部分:
        • 虛擬化(Virtualization
        • 并發(fā)(Concurrency
        • 持久化(Persistence
        操作系統(tǒng)這門課,易學(xué)難精,但是掌握到日常編程和面試夠用還是比較容易的。
        那么畢業(yè)生或者說你去準(zhǔn)備校招面試應(yīng)該達(dá)到怎樣的水平:
        • OS 四大模塊的理論知識(shí): 進(jìn)程與線程管理、內(nèi)存管理、IO與文件系統(tǒng)、設(shè)備管理
        • 了解 Linux 內(nèi)核部分實(shí)現(xiàn)原理,如內(nèi)存管理、進(jìn)程管理、虛擬文件系統(tǒng)等
        • 了解和熟悉常用的系統(tǒng)調(diào)用已經(jīng) System API
        其中內(nèi)存、進(jìn)程、IO 是重點(diǎn),這幾塊也是和編程關(guān)系最密切的,這里推薦先挑本偏理論的書看看,了解操作系統(tǒng)的全貌:
        • 《現(xiàn)代操作系統(tǒng)》
        • 《操作系統(tǒng)—精髓與設(shè)計(jì)原理》
        不必全看,兩者任選一本都不錯(cuò),我自己是仔細(xì)看了第二本,因?yàn)槭俏覀兘滩?,同時(shí)挑著看了現(xiàn)代操作系統(tǒng)部分章節(jié)。

        操作系統(tǒng)包含的知識(shí)

        這部分看完你應(yīng)該對下面這些話題有一個(gè)清晰認(rèn)知了:
        • 操作系統(tǒng)由哪些構(gòu)成
        • 進(jìn)程的狀態(tài)、切換、調(diào)度
        • 進(jìn)程間通信方式(共享內(nèi)存、管道、消息)
        • 進(jìn)程和線程的區(qū)別
        • 線程的實(shí)現(xiàn)方式(一對一、多對一等)
        • 互斥與同步(信號(hào)量、管程、鎖)
        • 死鎖檢測與避免
        • 并發(fā)經(jīng)典的問題:讀者寫者、哲學(xué)家就餐問題
        • 為什么需要虛擬內(nèi)存,MMU 具體如何做地址轉(zhuǎn)換的
        • 內(nèi)存為什么分段、分頁
        • 頁面置換算法
        • 文件系統(tǒng)是如何組織的
        • 虛擬文件系統(tǒng)(VFS)是如何抽象的
        • ...
        但是這還不夠,看完偏理論的書,當(dāng)面試官問「進(jìn)程和線程的區(qū)別」時(shí)。
        大概只能回答出「進(jìn)程是資源分配的最小單位,線程是CPU調(diào)度的最小單位,balabala...」這樣正確卻普通的答案。
        但是如果你了解 Linux 內(nèi)核的實(shí)現(xiàn),就可以實(shí)際出發(fā),講講 Linux 中進(jìn)程和線程是如何創(chuàng)建的,區(qū)別在哪里。
        比如在 Linux 中進(jìn)程和線程實(shí)際上都是用一個(gè)結(jié)構(gòu)體 task_struct來表示一個(gè)執(zhí)行任務(wù)的實(shí)體。進(jìn)程創(chuàng)建調(diào)用fork 系統(tǒng)調(diào)用,而線程創(chuàng)建則是 pthread_create 方法,但是這兩個(gè)方法最終都會(huì)調(diào)用到 do_fork 來做具體的創(chuàng)建操作 ,區(qū)別就在于傳入的參數(shù)不同。
        深究下去,你會(huì)發(fā)現(xiàn) Linux 實(shí)現(xiàn)線程的方式簡直太巧妙了,實(shí)際上根本沒有線程,它創(chuàng)建的就是進(jìn)程,只不過通過參數(shù)指定多個(gè)進(jìn)程之間共享某些資源(如虛擬內(nèi)存、頁表、文件描述符等),函數(shù)調(diào)用棧、寄存器等線程私有數(shù)據(jù)則獨(dú)立。
        這樣是不是非常符合理論書上的定義:同一進(jìn)程內(nèi)的多個(gè)線程共享該進(jìn)程的資源,但線程并不擁有資源,只是使用他們。
        這也算符合 Unix 的哲學(xué)了— KISS(Keep It Simple, Stupid)。
        但是在其它提供了專門線程支持的系統(tǒng)中,則會(huì)在進(jìn)程控制塊(PCB)中增加一個(gè)包含指向該進(jìn)程所有線程的指針,然后再每個(gè)線程中再去包含自己獨(dú)占的資源。
        這算是非常正統(tǒng)的實(shí)現(xiàn)方式了,比如 Windows 就是這樣干的。
        但是相比之下 Linux 就顯得取巧很多,也很簡潔。
        對于進(jìn)程、線程這塊你還可以把 fork、vfork、clone 、pthread_create 這些模塊關(guān)系徹底搞清楚,對你理解 Linux 下的進(jìn)程實(shí)現(xiàn)有非常大的幫助。
        說了這么多,就是想強(qiáng)調(diào)一下理論聯(lián)系實(shí)際的重要性。
        特別是操作系統(tǒng),最好的實(shí)踐就是看下 Linux 內(nèi)核是怎么實(shí)現(xiàn)的,當(dāng)然不是叫你直接去啃 Linux 源碼,那不是一般人能掌握的。
        最好的方式是看書,書的脈絡(luò)給你理得很清晰。
        書籍推薦:
        • 《Linux內(nèi)核設(shè)計(jì)與實(shí)現(xiàn)》
        這本書恰到好處,即講清楚了內(nèi)核實(shí)現(xiàn)的要點(diǎn),又不會(huì)通篇源碼。
        這本書重點(diǎn)關(guān)注「第 3 章進(jìn)程管理」、「第 5 章系統(tǒng)調(diào)用」、「第12章內(nèi)存管理」、「第13章虛擬文件系統(tǒng)」、「第 15 章進(jìn)程地址空間」
        這些章節(jié)屬于操作系統(tǒng)核心部分,其它如中斷處理、塊 IO、設(shè)備管理根據(jù)你自己興趣選擇看下就可以了。
        基本上做到這里,操作系統(tǒng)就沒什么大問題了。

        自制OS

        另外,如果你還想自己寫一個(gè)(模仿) mini os,那么你需要一些前置依賴知識(shí),否則估計(jì)會(huì)被很多硬件、匯編知識(shí)勸退:
        • 筑基內(nèi)功-- 需要學(xué)習(xí)計(jì)算機(jī)原理、C語言(需要熟練運(yùn)用)、數(shù)據(jù)結(jié)構(gòu)課程
        • 工欲善其事,必先利其器,掌握以下Linux 下常用命令行:
        pwd、cd、find等,1-2 款趁手的編輯器,推薦掌握 vim 的基本操作
        gcc、gdb、ld、make等編譯構(gòu)建鏈、objdump、nm、readif、dd 等 ELF 文件分析、燒錄工具。
        這里只推薦一本我看過的書《操作系統(tǒng)真象還原》,作者實(shí)在太好了,所有需要前置依賴的部分他都會(huì)簡單的寫個(gè)教程,照著這本書就能擼一個(gè)屬于自己的 os。

        這部分大家感興趣就自己去看好了,在公眾號(hào)發(fā)自制 OS 文章,我覺得不太合適,因?yàn)閷?shí)在太多細(xì)節(jié)了,公眾號(hào)不適合做這樣的教程。
        截取其中一部分讀者也會(huì)看得云里霧里,純碎作者自嗨。
        關(guān)于自制 OS 后面可以單獨(dú)寫一篇文章~

        好了,自學(xué) OS 部分就到這里了。
        大家周末愉快~
        記得幫我點(diǎn)個(gè)贊和在看喲~



        點(diǎn)個(gè)在看你最好看

        瀏覽 48
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        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>
            国产一级a毛一级a免费看视频 | 日本成人在线不卡 | 国产精品23p | 丝袜制服大香蕉 | 五月天操逼视频 | 操逼操逼操逼操逼操逼操逼操逼操逼操逼 | 早川濑里奈av片在线观看 | 成人精品毛片在线播放 | 另类TS人妖一区二区三区牧瑶 | 国产日韩欧美久久久 |