朱小軍,王立松
(南京航空航天大學(xué) 計算機科學(xué)與技術(shù)學(xué)院,江蘇 南京 211106)
在每個學(xué)期操作系統(tǒng)課程的第一節(jié)課上,筆者都會向?qū)W生發(fā)問卷調(diào)查,其中一個問題是“你最想從本課程中學(xué)到什么”。每年都會有同學(xué)回答,想實現(xiàn)一個“麻雀雖小五臟俱全”的小型操作系統(tǒng)。在主流搜索引擎上搜索“如何學(xué)習(xí)操作系統(tǒng)”,也會有大量建議是“讀一個小型操作系統(tǒng)的源碼”。因此,以一個小型操作系統(tǒng)為基礎(chǔ)開展操作系統(tǒng)教學(xué)符合學(xué)生的期望,也是很多“過來人”的建議。
筆者探索了以修改小型操作系統(tǒng)內(nèi)核為內(nèi)容的實驗教學(xué)方案,同時修改理論教學(xué)內(nèi)容和方法,以期實現(xiàn)理論與實踐同步開展,相輔相成,強化教學(xué)效果。相對于傳統(tǒng)的以理論為中心的教學(xué),筆者認為應(yīng)將側(cè)重點向?qū)嶒瀮A斜。
目前在部分高校,如南京航空航天大學(xué),操作系統(tǒng)課程理論部分講解的是“設(shè)計”操作系統(tǒng),而課程的實踐部分以“用”操作系統(tǒng)為主,多是驗證性實驗,這不可避免地造成了矛盾。以信號量知識點為例,理論部分講解如何設(shè)計信號量以滿足進程同步的需求,而實驗部分則是用已經(jīng)實現(xiàn)的信號量去解決應(yīng)用問題。由于這種差異的存在,雖然操作系統(tǒng)的教學(xué)已探索出多種教學(xué)方法[1-3],但是少有關(guān)注理論部分與實踐部分緊密結(jié)合的方案,甚至有教師提議直接舍棄實驗部分的教學(xué)[2]。為了將理論部分和實踐部分結(jié)合,需要將實踐部分從“用”改為“設(shè)計”,也即設(shè)計、修改一個操作系統(tǒng)的內(nèi)核。
在設(shè)計內(nèi)核實驗時,面臨以下問題。
(1)雖然國外有大量教學(xué)案例,但無法直接應(yīng)用到國內(nèi)的教學(xué)中,因為國內(nèi)無法提供足夠的師資力量對學(xué)生進行輔導(dǎo),國內(nèi)的學(xué)生也沒有足夠的時間完成課程任務(wù)。比如,MIT的操作系統(tǒng)課程逐步引導(dǎo)學(xué)生從零開始設(shè)計、實現(xiàn)一個操作系統(tǒng),但MIT會為此配備足夠多的高質(zhì)量助教,而且每個學(xué)生在一個學(xué)期只修讀幾門課程(教務(wù)建議是每學(xué)期3~4門)。目前,這兩點在國內(nèi)無法做到。
(2)國內(nèi)能夠公開找到資料且是修改內(nèi)核的教學(xué)案例大多采用了發(fā)行版Linux內(nèi)核,實際教學(xué)效果有限。這是因為發(fā)行版內(nèi)核代碼量大,易使學(xué)生產(chǎn)生畏難情緒無法通讀源碼。此外,代碼過多也增加了調(diào)試內(nèi)核的難度。
(3)內(nèi)核實驗需要和理論教學(xué)同步開展,筆者認為理想的情況是每個理論教學(xué)的知識點都有一個配套的內(nèi)核實驗,理論講授和實驗教學(xué)同步開展,同步結(jié)束。為達到預(yù)期目的,有兩個問題需要解決:一是,內(nèi)核實驗可能會影響理論教學(xué)中知識點的講授次序和講授方法;二是,部分理論教學(xué)的知識點可能沒有對應(yīng)的內(nèi)核實驗。當然,有的高校是在理論教學(xué)結(jié)束后單獨開設(shè)綜合性實驗課程[4],但這樣延后安排的實驗無法促進理論教學(xué),還可能出現(xiàn)學(xué)生遺忘理論課內(nèi)容的情況。
在經(jīng)過對比權(quán)衡后,筆者選擇了MIT開發(fā)的教學(xué)用操作系統(tǒng)xv6[5]。首先,xv6是開源免費軟件,只有約五千行代碼,學(xué)習(xí)和調(diào)試相對容易。其次,xv6只實現(xiàn)了內(nèi)核的基本功能,大量未實現(xiàn)的功能可作為實驗項目。最后,xv6有大量國內(nèi)外資料供參考,既減輕了教師設(shè)計新實驗的壓力,學(xué)生也有足夠的參考資源。
內(nèi)核實驗的內(nèi)容及安排見表1,共6個實驗,其中部分實驗源自MIT的開放課程。每個實驗結(jié)束時學(xué)生需要提交一次源碼和項目報告,教師評分。學(xué)生的總成績由6個實驗加權(quán)求和得到。教師在布置實驗任務(wù)時,需要確保先導(dǎo)的理論知識已經(jīng)講授完畢。由于理論和實驗的緊密結(jié)合,如果二者分屬兩門課程,建議由同一個教師講授。每個實驗預(yù)計學(xué)生需要10個小時完成,所有實驗共60小時。從學(xué)生反饋的情況來看,雖然不同實驗的用時不同,但所有實驗的累計用時相差不大。
由于課程的動態(tài)增減和多個先導(dǎo)課程持續(xù)不斷的教學(xué)改革,每年學(xué)生的基礎(chǔ)有所不同,所以內(nèi)核實驗的難度應(yīng)隨之動態(tài)改變,這可以通過增減提示信息來控制。例如實驗0的添加用戶命令部分,可以大致提示學(xué)生參考已有命令,也可以具體提示學(xué)生留意哪幾個文件的哪幾行代碼。提示信息的多少取決于學(xué)生的基礎(chǔ),可以通過與學(xué)生的交流以及問卷調(diào)查獲得。事實上,實驗0較簡單,目的是讓學(xué)生熟悉環(huán)境,增加完成任務(wù)的信心。
實際教學(xué)過程中會出現(xiàn)部分學(xué)生在對原理不理解的情況下依然完成了任務(wù)。有兩種情況,一是學(xué)生參考了xv6已有的類似實現(xiàn),例如實驗0和實驗1中添加系統(tǒng)調(diào)用部分;二是參考了網(wǎng)上的代碼,例如實驗1中的定時任務(wù)部分。筆者不反對學(xué)生參考任何資源(只要不是相互間的抄襲),因為尋找資料本身就是學(xué)習(xí),但希望學(xué)生能理解內(nèi)部原理。為此,建議在實驗中增加問答題,既是引導(dǎo),也是強制要求。例如,實驗0或?qū)嶒?中可以要求學(xué)生使用GDB跟蹤一個系統(tǒng)調(diào)用的執(zhí)行過程,并指出引起CPU內(nèi)核態(tài)和用戶態(tài)切換的具體指令。
在目前的教學(xué)體制下,學(xué)生一般更重視理論課。為此,在每個實驗項目批改結(jié)束后,建議在理論課上對其進行總結(jié),并分析講解典型錯誤,以此為契機復(fù)習(xí)先導(dǎo)理論知識點。例如,實驗0結(jié)束后復(fù)習(xí)內(nèi)核態(tài)、用戶態(tài)以及系統(tǒng)調(diào)用。由于學(xué)生已經(jīng)閱讀過相應(yīng)的內(nèi)核源碼,所以此時復(fù)習(xí)有事半功倍的效果。再比如,信號量一直是理論課的教學(xué)難點,在實驗3完成后再次講解信號量,學(xué)生的認識將會更加透徹。
需要對學(xué)生提交的實驗報告在格式和內(nèi)容上做出要求,以避免學(xué)生既要思考內(nèi)容又要調(diào)整格式。操作系統(tǒng)的實驗不可避免需要粘貼部分代碼,對一些學(xué)生而言這是負擔,因為普遍采用的word軟件不支持代碼的高亮顯示。如果報告的格式混亂,教師讀起來費力,學(xué)生自己也不愿仔細修改。此外,當課程結(jié)束需要將所有報告匯總時,學(xué)生又需要花費較多精力統(tǒng)一格式。為此,經(jīng)過往屆學(xué)生的建議,筆者統(tǒng)一要求學(xué)生用Markdown寫實驗報告,并給出模板,將學(xué)生從調(diào)格式的工作中解放出來,將注意力集中在報告內(nèi)容而不是格式上。由于報告看起來美觀,學(xué)生也愿意花精力寫報告。
為了提高學(xué)生的積極性,建議引入適度的競爭,并在成績上予以體現(xiàn)。例如,可以將思路清晰的報告在課堂上演示并予以表揚。實驗4中可以增設(shè)開放性實驗,讓學(xué)生自己實現(xiàn)其他節(jié)省物理內(nèi)存的技術(shù),以節(jié)省物理內(nèi)存的數(shù)量對學(xué)生的實現(xiàn)進行排名,并邀請前幾名學(xué)生在課堂上分享經(jīng)驗。
為了與內(nèi)核實驗緊密結(jié)合,需要對理論課程的內(nèi)容作出調(diào)整。由于需要在理論課上總結(jié)實驗的內(nèi)容,所以需要對原有的部分理論知識點進行弱化,即減少教學(xué)時間。筆者采用的教材[6]建議弱化的知識點見表2。需要注意,不是因為這些知識點不重要,而是無法在有限的課堂時間內(nèi)全部覆蓋。
表2 理論知識點的調(diào)整
如第1節(jié)所述,如果理論知識點沒有配套的內(nèi)核實驗,則與筆者的初衷不符。在此采用的方法是減少這些知識點的課時。例如,關(guān)于死鎖有較多知識點,但目前主流操作系統(tǒng),如Windows和Linux,均未處理死鎖。當然教師也不容易設(shè)計內(nèi)核實驗,考慮到教學(xué)效果,不建議在課堂上詳細講解關(guān)于死鎖的算法。此外,因為主流操作系統(tǒng)未采用,分段存儲管理及引申的存儲管理方法也無必要設(shè)計對應(yīng)內(nèi)核實驗(事實上xv6的早期版本采用了分段存儲管理,現(xiàn)已更新為分頁存儲管理)。
該理論和實驗教學(xué)方案自2016年春開始在南航計算機軟件培優(yōu)班試點,已試點兩年,圖1為試點前后學(xué)生對課程的評教成績。雖然不同年份學(xué)生不同、教師不同,但可以確定的是采用新方案后學(xué)生對課程的評價并沒有降低。學(xué)生雖然在新方案下的工作量較大,但從中學(xué)到了知識和技能,對課程的正面評價較多。
圖1 操作系統(tǒng)課程的學(xué)生評教成績(平均值±標準差)
操作系統(tǒng)課程是一門傳統(tǒng)的計算機類專業(yè)的核心課程,已有多種成熟的教學(xué)方法。近來一般認為應(yīng)當培養(yǎng)學(xué)生的系統(tǒng)能力,即結(jié)合組成原理、操作系統(tǒng)、編譯原理等核心課程,培養(yǎng)學(xué)生的系統(tǒng)觀。筆者認為培養(yǎng)系統(tǒng)能力的關(guān)鍵在于以實驗為中心,通過實驗將各課程的知識點重新組織。為此,筆者探索了一系列基于xv6的內(nèi)核實驗,并相應(yīng)調(diào)整了理論課程的知識點。以此為主要組成部分的成果“計算機軟硬件協(xié)同貫穿式人才培養(yǎng)的創(chuàng)新與實踐”獲得2017年江蘇省教學(xué)成果二等獎。