1沒有安裝操作系統的計算機啟動過程和結果?
啟動會比較快,但功能很局限,無法使用常見的軟件應用,對於普通用戶來說,功能很局限,對於專業工程師來說,想使用沒有操作系統的計算機也有難度。啟動后進入 BIOS
2虛擬機軟件(例如VMware,VirtualPC等)能不能理解為操作系統
虛擬機本身運行在一個操作系統上,但對虛擬機上運行的程序來說,它是一個OS。
Q:現代操作系統會不會因為內存太小,而讓應用程序無法啟動運行或讓系統崩潰?
操作系統的內存管理能使較大的應用程序在內存小的情況下運行
Q:在多道批處理中嘗試不斷增加程序的數量,系統的效率會不會持續增加?結果會如何?
不會,計算機效率達到峰值時,繼續增加程序數量,系統會崩潰
Q:分時技術的時間片設置太大或太小,應該根據哪些因素來考慮?是盡量大好還是盡量小好?
時間片小,每次運行時間短,但是等待時間短;時間片大,每次運行時間長,但是等待時間也長;根據分時操作系統的特點:多路調制性、獨占性、互交性分析,時間片應盡量小;就緒隊列中進程的數目,系統對響應時間的要求,系統的處理能力。
Q:你認為國產操作系統能否成功?影響成功的因素有哪些?
能,但對目前而言成功的概率可能有點小。對於現在國內如果發布新的操作系統在技術,組織管理,還有資金,有多少廠家能夠共同撐起,等因素;國家政策支持;然后國產操作系統勢必會照顧國內用戶體驗,因此會更受民眾支持;技術層次也在一直進步
Q:操作系統的微內核結構的優點對我們設計大規模的應用程序有什么啟示?
(1)提高了系統的可擴展性
(2)增強了系統的可靠性
(3)可移植性強
(4)提供了對分布式系統的支持
(5)融入了面向對象技術
Q:用戶態向內核態轉有多種情形(用戶請求OS提供服務、發生中斷、用戶進程產生錯誤、用戶態企圖執行特權指令),但是本質上就是一種情形,即通過中斷的形式進入。如何理解這句話?
系統在運行時由用戶態轉到內核態的最主要的三種方式包括1.系統調用2.異常3. 外圍設備的中斷 而其中系統調用可以認為是用戶進程主動發起的,異常和外圍設備中斷則是被動的。 從觸發方式上看,可以認為存在前述3種不同的類型,但是從最終實際完成由用戶態到內核態的切換操作上來說,涉及的關鍵步驟是完全一致的,沒有任何區別,都相當於執行了一個中斷響應的過程,因為系統調用實際上最終是中斷機制實現的,而異常和中斷的處理機制基本上也是一致的,所以即是用戶態向內核態轉有多種情形,本質上就是一種情形,即通過中斷。
Q:CPU收到外部中斷信號后,是如何響應該外部信號,完成中斷服務程序后,並最后自動回到原程序繼續運行的?這個過程中硬件,軟件會做哪些工作?
識別中斷源
保護斷點和現場
裝入 中斷服務程序地址CS:ip
進入中斷服務程序
恢復斷點和現場
中斷返回
Q:操作系統的初始引導過程涉及哪些程序模塊,各自存放的介質是什么,存放的形式是什么?
BIOS 它是一組固化到計算機內主板上一個ROM芯片上的程序,它保存着計算機最重要的基本輸入輸出的程序、開機后自檢程序和系統自啟動程序,介質是電路程序固件,存放形式是硬件,MBR MBR為存儲設備的第一個扇區,也就是該存儲設備的最前面的512字節 介質是硬盤,存放形式是字節數據。
Q: make menuconfig的作用什么?它產生的最終結果是什么?或者說它輸出什么?它是編譯命令嗎?
make menuconfig作用是配置Linux內核。它產生的最終結果是在源碼主文目錄中出現一個配置Linux內核的圖形界面。它不是編譯命令,是基於文本選項的配置界面
Q:比較DOS、Windows7與Linux早期版本都有哪些典型的操作界面?操作界面對普通用戶(辦公或娛樂)選擇操作系統有何影響?
Windows:圖形用戶界面和系統功能調用 Linux:鍵盤命令與系統功能調用 命令行模式、用戶圖形界面,更人性化的操作界面,會使用戶使用起來更加方便
Q:如何理解Shell與內核之間的交互?
不能,Shell就是用戶與操作系統內核之間的接口,起着協調用戶與系統的一致性和在用戶與系統之間進行交互的作用。它是一個橋梁,用戶和內核之間建立的友誼,都是通過這個橋梁完成的,也就是我們想讓內核幫我們做一些事情,首先需要將用戶的指令去傳遞給shell,翻譯成內核可以理解的一些信息,從而讓內核為我們服務。
Q: printf,open都是Linux中典型的隱式系統調用。當我們在“為Linux內核增加新的系統調用實驗”中增加一個新的系統調用后,我們在應用程序中是如何調用的它們的?為何我們不能像printf,open等函數一樣簡單地調用?
printf, open等函數都是linux種典型的隱式系統調用,類似Q:PI函數,通常在高級語言中使用,在編譯時隱式系統調用會轉化為顯式的系統調用,
因此可以在系統中直接調用。而在Linux中新增一個系統調用,則需要先在核態中寫入一個函數,
再將函數的日寇地址加入系統調用函數入口地址列表中,然后為其設置一個中斷號,並存放對應地址。
當在應用程序中調用時,函數先在用戶態執行,遇到INT 80H指令時,到system_call中找到相應的子函數入口地址,再到核心態中調用該系統函數
Q:進程具有異步性。異步,即每個程序不考慮其它程序的運行進度,按自己的邏輯往前運行。那么,異步性這個特點,好不好呢?是進程的優點還是缺點呢?
優點是:
1、異步流程可以立即給調用方返回初步的結果。
2、異步流程可以延遲給調用方最終的結果數據,在此期間可以做更多額外的工作,例如結果記錄等等。
3、異步流程在執行的過程中,可以釋放占用的線程等資源,避免阻塞,等到結果產生再重新獲取線程處理。
4、異步流程可以等多次調用的結果出來后,再統一返回一次結果集合,提高響應效率。
異步的執行效率高,節省時間,
缺點是:
實際操作系統中
會占用更多的資源,不利於我們對進程進行控制。
Q:為何沒有“阻塞到運行”或“就緒到阻塞”這樣的狀態遷移?,為何沒有“阻塞到運行”或“就緒到阻塞”這樣的狀態遷移?
阻塞態不能到運行態,因為CPU在同一時刻只能處理一個進程。 就緒態不能到阻塞態,一個就緒進程是不可能做任何會產生阻塞的 I/O 或者別的什么事情。只有運行的進程才能被阻塞
Q:進程控制塊中“內部進程通信信息”這一類成員變量(顯然不止一個)的作用是什么?
1 進程標識符。 2 處理機狀態。處理機狀態也稱處理機上下文,主要由處理機的各種寄存器中的內容組成。 3 進程調度信息 4 進程控制信息。
Q:“撤銷進程”的定義中提到,撤銷一個進程之前,先【遞歸】檢查其是否有子進程,如有,應先“撤銷”子進程。請問,Linux是否會按這個要求去撤銷某個進程?如果是的話,會有什么后果?如果不是的話,系統如何處理該進程的子孫進程(這些進程將失去父進程或祖先進程)?
不是 1.收回進程的所有資源 2.撤銷該進程的PCB :從PCB隊列中檢索到該PCB,獲取該進程的狀態,若進程處於運行態,立即終止進程;若進程具有子進程,則先遞歸撤銷子進程;Linux不會撤銷子進程,而是由另一個進程接管,釋放進程的所有資源,將進程從PCB隊列中移除
Q:列舉你知道的WINDOWS中,在程序啟動exe程序創建相應進程的方法?各有什么特點?
1、點擊應用程序對應的圖標或在控制台上直接輸入可執行程序的名字按回車,此方法簡單易操作,消費者無需對代碼有要求。
2、system()函數創建進程:建立獨立進程,擁有獨立的代碼空間,內存空間,等待新的進程執行完畢,system才返回.(阻塞)。
3、WinExec()函數創建進程:函數簡單只有兩個參數,前一個指定路徑,后一個指定顯示方式。
4、ShellExec()函數創建進程:可以指定工作目錄,並且還可以尋找文件的關聯直接打開不用加載與文件關聯的應用程序,還可以打開網頁,啟動相應的郵件關聯 發送郵件等等。
5、CreateProcess()函數創建進程:一共有十個參數,不過大部分都可以用NULL代替,它可以指定進程的安全屬性,繼承信息,類的優先級等等。如果要得到足夠多的關於新的進程的信息,控制新的進程的細節屬性,就需要使用CreateProcess函數。
Q:如何理解fork()函數的返回值有2個取值?
fork()函數是創建一個新進程, 它的返回值分別是:“子進程返回 0”和“父進程返回子進程的進程號 (PID)”,即可以通過fork()函數的返回值識別父子進程,讓其通過if else分流,干不同的事情
fork( )函數在子進程中返回值為0,用於標記該進程為子進程; 在父進程中返回值為子進程的id,便於鏈接父進程和子進程,實現父進程對子進程的尋找、控制; 當出錯時返回值為-1,便於處理錯誤創建進程。
Q:畫圓和畫方兩個過程是完全同步的嗎
“用線程實現並發畫圓和畫方” ,畫圓和畫方兩個過程是完全同步的嗎(即它們是一起開始一起結束的嗎)?如果不是,為什么不是?如果不是,應當如何做才能完全同步呢?
不是,因為CPU是嚴格按照程序的順序執行的。
“同時”是宏觀上的同時。即根據程序的並發執行特點:編寫一個畫圓的函數和一個畫方的函數,然后再用CreateThread函數創建兩個線程,分別畫圓和畫方,就可以實現並發的畫圓和畫方了。
第一,直接在控制台對應的坐標打印*來畫圓和畫方,但這樣畫出來太丑。因此,我們采取第二種方法,導入graphcis.h頭文件,創建畫板,再調用里面的putpixel函數,給對應坐標的像素點賦色。這樣畫出來的圓和方就是一個標准的圓和方了。
Q:臨界區的設置大些好還是小些好?各有什么缺點?
如果臨界區過大,可能導致等待程序餓死或者中斷調度執行其他事件
如果臨界區過小,可能導致臨界資源不在臨界區內,程序並發執行產生混亂應該把臨界資源恰當地控制在臨界區內 保護起來
Q:Lock(S)與unLock(S)
把課件中4.4.2節中提到的Lock(S),unLock(S)源代碼直接拷貝到應用程序的源代碼中,並定義S是全局變量,並設置合適的初值。請問Lock(S),unLock(S)兩個函數能否用於控制多線程之間的臨界區訪問?注意:不考慮語法錯誤。
1.lock與unlock 多線程中如果對共享數據同時讀取,則沒有問題。如果有的線程對共享數據進行讀,有的數據進行寫,則程序會崩潰,就需要阻止這一情況的發生。 互斥量mutex類 中有lock和unlock 這兩個可以保證數據安全。 互斥量中枷鎖 解鎖是成對使用的,本次如果只有lock沒有unlock時,下次運行到lock時會停在此處,等運行了unlock才可以繼續下去。所以一定要成對使用。 互斥量的枷鎖是需要一定時間的。
2.lock_guard 是一個類模板,需要包含了lock與unlock 在使用時,給其定義在局部作用域內,離開此作用域時,就釋放了,此時會調用unlock函數,這樣會避免方法一中 unlock忘記調用的尷尬。lock_guard 只是方便了上鎖,解鎖這個過程,並不管理互斥對象的生命周期。
3.在同一個進程的多線程同步鎖,宜用臨界區鎖,它比較節約線程上下文切換帶來的系統開銷。但因臨界區工作在用戶模式下,所以不能對不同進程中的多線程進行同步。 因互斥對象鎖屬於內核對象,所以在進行多線程同步時速度會比較慢,但是可以在不同進程的多個線程之間進行同步。
Q:舉出生活中類似“司機和售票員”的同步例子,並分析其中的關鍵操作。
去醫院先掛號然后才可以找到醫生看病,取到要化驗的項目,然后去化驗室驗血,得到化驗結果后再去找醫生,醫生根據化驗結果開葯
讀者和作家
1.多個讀者,只能read,不能write
2.多個作家,既能read,也能write
3.允許多個reader同時讀
4.不允許reader和writer同時操作
5.不允許多個作家同時操作
本質:保證一個writer進程必須與其他進程互斥地訪問共享對象
Q:V操作定義中的q隊列里面的進程都是阻塞進程。請問這些進程是從何而來的?或者說這些進程是怎么變成阻塞狀態進入q隊列的?
大於或等於0時代表可供並發進程使用的資源實體數;小於0時代表正在等待使用臨界區的進程數;用於互斥的信號量初始值應大於0;只能通過P、V原語操作而改變;信號燈是一個具有整數值的對象,它支持兩種操作P()和V()。P()操作減少信號燈的值,如果新的信號燈的值小於0,則操作阻塞;V()操作增加信號燈的值,如果結果值大於或等於0,則喚醒一個等待的進程。通常用信號燈來做進程的同步和互斥。
V操作順序執行下述兩個動作:
①S值加1,即S=S+1;
②如果S>0,則該進程繼續運行;
如果S≤0,則釋放信號量隊列上的第一個PCB(即信號量指量指針項所指向的PCB)所對應的進程(把阻塞態改為就緒態),執行V操作的進程繼續運行
Q:在4.5.3節“例子:3個進程Pa,Pb,Pc 。臨界資源數量為1,CSa,b,c是臨界區”中,三個進程並發過程中,是不是一定會發生阻塞或喚醒操作?如果mutex初值設置為0或2會有什么結果?在實際應用中,應該怎么合理的設置互斥量的初值?
以Pa,Pb,Pc為程序順序運行:
是的,mutex=1時,Pa=0不堵塞,Pb=-1堵塞后被喚醒,Pc=-2堵塞后被喚醒,即三個進程並發過程中,一定會發生阻塞或喚醒操作;
當mutex=0時,三個程序都會堵塞;
當mutex=2時,Pa=1不堵塞,Pb=0不堵塞,Pc=-1堵塞后被喚醒。
互斥量的初值:由於只允許一個進程進入,因此信號量中整型值的初始應設為1.該值表示可以允許多少個進程進入,當該值<0時,其絕對值就是等待使用臨界資源的進程數,也就是等待隊列中的進程數.
Q:應該怎么合理的設置信號量的初值?
在4.5.4節“實現進程同步的例子:司機vs售票員”中,如果把兩個信號量S1,S2的初值都設置為1,司機和售票員還能否正確同步?如果不能,請給出反例證明。在實際應用中,應該怎么合理的設置信號量的初值?
不能,因為都設置為1的話,直接司機從起步行駛停車一個進程就結束了,體現不了同步。在實際應用中,我們應該根據限制條件以及導致結果使設置的初值可以相互影響限制,體現出兩個進程的同步。
Q:“讀者和編者問題”:“讀者優先”,“編者優先”
“編者和讀者”同步問題在嚴格意義上講是一個同步問題還是一個互斥問題?如果把題目的同步要求做一個加強:如果有讀者和編者同時在等一個編者“寫完”,則當前的“寫”操作完后,等待的編者能優先進入。新的情形應當如何完成P-V同步操作?【建議網上查閱“讀者和編者問題”,“讀者優先”,“編者優先”】
同步問題,
互斥問題。
編者優先:
1.編者線程的優先級高於讀者線程。
2.當有編者到來時應該阻塞讀者線程的隊列。
3.當有一個編者正在寫時或在阻塞隊列時應當阻塞讀者進程的讀操作,直到所有編者進程完成寫操作時放開讀者進程。
4.當沒有寫者進程時讀者進程應該能夠同時讀取文件。
Q:“生產者-消費者”問題的同步的實現
在實際編程中,舉出1個類似“生產者-消費者”問題的同步例子,並簡單描述你准備采用什么樣的同步機制實現同步?要求給出具體的函數名字。(限Windows或Linux任一平台)
多線程同步例子:當廚師線程開始執行put方法或者服務員開始get方法時,都必須先獲取MediContainer對象的鎖,如果該鎖被其他線程占用,另一個線程就只能在鎖池中等待。這種鎖機制使得廚師線程執行put方法的整個過程中,服務員線程不會執行get方法,同樣,在服務員線程在執行get方法的整個過程中,廚師線程不執行put方法。
假設在一個賓館服務中,每人一次只能購用一間房(buy),每個保潔工一次只能清理一間房(clean),在一個人購買時,另一個人需要等待其購買完畢(wait),同樣,在清理房間時,也需要等待用戶退房。定義信號量x,y表示需要打掃房間的總數和打掃完成的總數,定義z用來實現購買房間時和打掃房間時的互斥。因此,在清理工打掃時實現clean方法前,需要使用P(x)限制房間數量進入緩沖區和P(z)實現打掃房間時的互斥,clean方法實現后,通過V(z)和V(y)用於釋放互斥量和喚醒用戶購買房間。在用戶購買房間時,通過P(y)限制購買房間和P(z)實現購買房間時的互斥,buy方法實現后,通過V(z)和V(x)用於釋放互斥量和喚醒清潔工打掃房間。
公共電話廳里有多個電話,如某人要打電話,首先要進行申請,看是否有電話空閑,若有,則可以使用電話,如果電話亭里所有電話都有人正在使用,那后來的人只有排隊等候。當某人用完電話后,則有空電話騰出,正在排隊的第一個人就可以使用電話。
empty——表示緩沖區是否為空,初值為1。
full——表示緩沖區中是否為滿,初值為0。
生產者進程:
某人要打電話,首先要進行申請,相當於執行一次P(empty)操作,申請一個可用資源(電話),執行一次V(full)操作
消費者進程:
某人用完電話,則有空電話騰出,相當於執行一次P(full)操作,釋放一個可用資源(電話),執行一次V(empty)操作
Q:進程的exit( )函數返回參數由父進程處理或接收。那么,在控制台上直接啟動的一個應用程序,其末尾的exit( )函數返回參數由誰處理或接收?
由所有進程的祖先進程 0號進程回收
Q:匿名管道為什么不能在兩端同時使用read或write完成讀寫操作,而要一端是使用重定向?
匿名管道創建函數pipe()系統調用底層的實現就相當於一個特殊的文件系統,每次調用的時候創建一個inode關聯着兩個file,一個用於讀,一個用於寫,從而實現數據的單向流動.
一個管道實際上就是一個無形(只存在於內存中)的文件,對這個文件的操作要通過兩個已經打開的文件進行,分別代表該管道的兩端 .
每個文件都是有一個inode數據結構代表的。雖然一個管道實際上是一個無形的文件,但是也得有一個inode數據結構。由於這個文件在創建管道之前並不存在,所以需要在創建管道時臨時創建一個inode結構。
Q:Linux信號機制與中斷機制有什么異同?
相同:
(1)采用了相同的異步通信方式;
(2 )當檢測出有信號或中斷請求時,都暫停正在執行的程序而轉去執行相應的處理程序;
(3 )都在處理完畢后返回到原來的斷點;
(4 )對信號或中斷都可進行屏蔽。
不同:
(1 )中斷有優先級,而信號沒有優先級,所有的信號都是平等的;
(2 )信號處理程序是在用戶態下運行的,而中斷處理程序是在核心態下運行;
(3 )中斷響應是及時的,而信號響應通常都有較大的時間延遲。
Q:“死機”或“宕機”或“系統卡住,鍵鼠沒有任何響應”
在Linux或Windows的實際應用中,用戶常說的“死機”或“宕機”或“程序卡住”或“系統卡住,鍵鼠沒有任何響應”與本章的“死鎖”是同一問題嗎?
死鎖與死機等不是同一問題,死鎖是系統還在運行,只不過發生了循環等待,導致無法正常執行功能。死機是系統崩潰無法運行了死鎖與死機等不是同一問題,死鎖是系統還在運行,只不過發生了循環等待,導致無法正常執行功能。死機是系統崩潰無法運行了
不是。 從原因看: 造成死機的原因大致有三種可能,一是應用程序被病毒感染,再就是應用程序本身存在bug,還有就是應用程序與操作系統之間存在一些沖突。 而造成死鎖的原因是由於競爭資源而引起的。 從結果來看: 死機造成的后果十分嚴重,影響所有進程,而死鎖只是部分進程受到影響,並不影響其他進程的運行。
Q:如何證明“參與死鎖的進程至少有2個已經占有資源”?
兩個進程都阻塞並且等待着別的進程釋放他所持有的資源。
Q:在Linux或Windows是如何處理死鎖的?
鴕鳥策略,對死鎖視而不見,留給用戶自行處理
Q:進程調度的7個目標中,你覺得windows或Linux重點在於滿足哪些目標?為什么這么認為?
Windows重點在於用戶:響應速度要快、對所有進程要公平;
Linux重點在於服務器:響應速度要快、系統吞吐量大、避免飢餓。
Q:考慮靜態優先數
考慮靜態優先數的時候,下列因素“基於進程所需的資源多少”,“基於程序運行時間的長短”,“基於進程的類型[IO/CPU,前台/后台,核心/用戶]”是如何影響靜態優先數確定的?譬如:進程所需的資源多(或少),就分配較小(或較多)的靜態優先數?!你的理由何在?
考慮靜態優先數的時候,下列因素基於進程所需的資源多少,基於程序運行時間的長短,基於進程的類型[IO/CPU,前台/后台,核心/用戶]譬如:進程所需的資源多(或少) 所需資源量越多(少),靜態優先數越小(大)。 程序運行時間越長(短),靜態優先數越小(大) 。
進程所需資源越少,靜態優先數越大。使進程處理時間盡可能短。
進程運行時間越短,靜態優先數越大。使系統吞吐量盡可能大,資源利用率盡可能高。
I/O類進程靜態優先數更大,用戶一般比較重視I/O進程
前台類進程靜態優先數更大
核心類進程靜態優先數更大,因為內核的權限比用戶權限高
Q:考慮動態優先數
考慮動態優先數的時候,下列因素“當使用CPU超過一定時長時”,“當進行I/O操作后”,“當進程等待超過一定時長時”是如何影響動態優先數確定的?譬如:當使用CPU超過一定時長時,就減少(或增加)的動態優先數?!你的理由何在?
IO發起后,降低優先數,極有可能要阻塞態了,高優先是不合理的;I/O完成后、進程阻塞轉就緒,提高優先數,資源到了就進行利用,避免死鎖
當使用CPU超過一定時長后,減少動態優先數,不阻塞其他進程太長時間 當進行I/O操作后,增加動態優先數,提高進程優先級執行其他可能的I/O操作 當進程等待時間超過一定時長后,增加動態優先數,避免該進程一直飢餓
Q: Linux創建子進程時,其COUNTER值為什么只繼承父進程的一半,原因何在?
為了資源的公平利用
防止有惡意的用戶進程不斷創建子進程長期占用CPU的時間
Q:何為地址映射功能?為何需要地址映射功能或者它的的作用是什么?在VS(C/C++)開發環境中,我們用”int i,j ;” 定義的i,j變量與地址是什么關系?
地址映射 :把程序中的地址(虛擬地址/虛地址/邏輯地址)變換成內存的真實地址(實地址/物理地址)的過程。
作用 :操作系統只能夠訪問到真實地址(實地址/物理地址),然后進行一系列的操作。而在編寫程序的時候的變量是一個虛地址,所以需要通過地址映射轉換為物理地址操作系統才能夠進行訪問。
變量與地址 :程序里面的地址是一個虛地址,變量經過編譯以后轉化為一個虛擬地址,這個地址要通過地址映射轉化為內存里面的真實地址才能夠被操作系統訪問,進而進程相關的操作。
Q:使用虛擬存儲管理功能的操作系統,還需不需要真是的內存?
需要真實的內存
Q:分區存儲管理用在專用的,具有特定工作任務的,嵌入式系統中,可不可行?
不好
Q:三種放置策略中,最佳適應法是不是比最壞適應法或首次適應算法性能要優異?為什么?
不是。
一、首次適應算法(First Fit):該算法從空閑分區鏈首開始查找,直至找到一個能滿足其大小要求的空閑分區為止。然后再按照作業的大小,從該分區中划出一塊內存分配給請求者,余下的空閑分區仍留在空閑分區鏈中。
二、最佳適應算法(Best Fit):該算法總是把既能滿足要求,又是最小的空閑分區分配給作業。為了加速查找,該算法要求將所有的空閑區按其大小排序后,以遞增順序形成一個空白鏈。這樣每次找到的第一個滿足要求的空閑區,必然是最優的。孤立地看,該算法似乎是最優的,但事實上並不一定。因為每次分配后剩余的空間一定是最小的,在存儲器中將留下許多難以利用的小空閑區。同時每次分配后必須重新排序,這也帶來了一定的開銷。
三、最壞適應算法(Worst Fit):最壞適應算法是將輸入的作業放置到主存中與它所需大小差距最大的空閑區中。空閑區大小由大到小排序。
Q:內存覆蓋技術有哪些缺點?
編程復雜:程序員划分程序模塊並確定覆蓋關系
程序執行時間長:從外存轉入內存耗時
Q:內存交換技術在實現過程,為何要考慮地址重定位的問題?
進程進入內存時,原本的位置可能已經被占用,會產生沖突,當被裝入非原始位置時就需要考慮重定位的問題進程進入內存時,原本的位置可能已經被占用,會產生沖突,當被裝入非原始位置時就需要考慮重定位的問題
Q:內存在分配過程中產生碎片的本質是什么?有哪些方法可以消除或減輕碎片問題?
本質: 過小的空閑區滿足不了程序所需內存,而一直得不到利用,形成了內存碎片。 解決辦法: 規定門限值,分配空閑區時,如果剩余部分小於門限值, 則將此空閑區整體分配給此程序。 內存拼接技術,將內存碎片(所有的空閑區)進行拼接成為一個大的空閑區。 讓程序能夠在不同內存分區進行運行,即把程序分開裝入不同的空閑區,充分利用空閑區,避免造成碎片。
Q:在虛擬內存管理方案的支持下,Windows或Linux還會不會因為內存過小導致應用程序無法運行或崩潰呢?
不會,因為使用了虛擬內存技術,使得操作系統能最大程度上以較小的內存運行較大的程序。
Q:頁表在頁式內存管理中起到什么重要的作用?
程序訪問的是虛擬地址,但實際訪問內存卻需要使用物理地址,頁表的作用就是通過線性地址來找到實際的物理地址。
Q:在有快表的存儲管理系統中,一條訪存指令要訪問到真正的數據,需要訪問內存幾次?
若快表命中,則可直接得到頁幀號,與頁內偏移拼接成物理地址后訪問內存,進行指令或者數據的存取。(只需訪問一次內存)
若快表不命中,則需去內存中訪問頁表,形成物理地址后,再一次訪問內存進行指令或者數據的存取。(需要訪問兩次內存)
Q:頁式虛擬內存管理是否適合實時操作系統采用
實時操作系統要求,每條指令或過程的完成時間是確定的或有上限的。依據此要求,你認為頁式虛擬內存管理是否適合實時操作系統采用?
不適合,由於頁式虛擬內存的每條指令的時間不確定,可能發生缺頁中斷,可能導致花費的時間超過實時操作系統的時間上限
Q:最佳算法(OPT算法, Optimal)
頁面淘汰算法中的最佳算法(OPT算法, Optimal)為何在實際中無法實現?既然無法實現,它的存在意義何在?
因為在程序沒有執行之前 是無法得知進程之后需要訪問哪個頁面. 也就不知道之后會不會再訪問或者很長時間再訪問的頁面. 所以無法實現.。 存在意義的話, 個人理解是為了指導其他算法的目標命中率,即設計其他算法時, 使用最佳算法的命中率做參考, 使新設計算法的結果逐步向最佳命中率靠攏
Q:頁面淘汰和缺頁中斷兩個概念對我們平時編寫高效率程序有什么啟示?
在請求頁式存儲管理中,當根據虛擬地址查頁表而發現所要訪問的頁不在內存時,就會產生缺頁中斷。系統響應中斷后,就由操作系統到輔存把所需要的頁讀入內存。內存可能有空閑的塊,也可能沒有。只有當內存中沒有空閑塊時,才會出現將內存現有頁面淘汰出去的問題,即要進行頁面淘汰。所以,缺頁中斷和頁面淘汰之間的關系是:頁面淘汰一定是由缺頁中斷所引起;但缺頁中斷則不一定引起頁面淘汰。
Q:段式或段頁式內存管理方案中的“段”概念和匯編語言中的“段Segment”含義相同嗎?
不相同. 匯編語言中的段指的是程序段, 是用寄存器尋址使用的. 段式中的段指的是內存段, 是指物理內存與操作系統轉換時所涉及到的概念
Q:把DS,CS等段寄存器理解為段基址
若在保護模式下,把DS,CS等段寄存器理解為段基址的話,會推導出一些不合實際的謬論出來。
Q:區分目標段的段描述符是在GDT表中還是LDT表中
在邏輯地址轉換到線性地址的過程中,訪存指令如何去區分目標段的段描述符是在GDT表中還是LDT表中?
選擇子中TI=0表示在GDT表中,TI=1表示在LDT表中
Q:為何Linux在形式上要采用三級頁表結構
Linux本質上采用的是二級頁表結構。為何它在形式上要采用三級頁表結構?
linux的頁表結構是為了節省地址轉換所需要的空間。分為PGD/PUD/PMD/PTE,P代表page,G代表global,D代表目錄(Director),U代表上級,M代表中間,T代表Table,E代表Entry。PTE是頁表項。他們之間的關系是層級結構,通過PGD訪問到最低端的PTE,訪問方式是上一層地址+偏移量(offset)。PTE+頁內偏移量可以訪問到具體的物理地址。
Q:Linux中段機制的作用什么?
Linux中的軟中斷和工作隊列是中斷上下部機制中的下半部實現機制。
1.軟中斷一般是可延遲函數的總稱,它不能睡眠,不能阻塞,它處於中斷上下文,不能進城切換,軟中斷不能被自己打斷,只能被硬件中斷打斷(上半部),可以並發的運行在多個CPU上。所以軟中斷必須設計成可重入的函數,因此也需要自旋鎖來保護其數據結構。
2.工作隊列中的函數處在進程上下文中,它可以睡眠,也能被阻塞,能夠在不同的進程間切換,以完成不同的工作
Q:操作系統公司(例如微軟)會不會去專門花精力編寫外設的控制程序/驅動程序呢?設備驅動管理或設備驅動程序是不是操作系統必須的組成部分?
不會,操作系統公司制定接口標准,驅動程序有各自設備廠家按接口標准實現。 不屬於,只是各位附加功能
1按“信息組織特征”對設備分類,可以分為 。
字符設備
塊設備
網絡設備
2下面說法錯誤的是 。
設備管理模塊具有將邏輯設備映射到物理設備的功能。
A.設備管理模塊具有將邏輯設備映射到物理設備的功能。
B.邏輯設備是一類物理設備的抽象。
C.邏輯設備是物理設備的實例。
D.物理設備具有用戶容易理解的友好名(Friendly Name)。
C、D
3關於設備獨立性的說法正確的是 。
Q:用戶使用統一規范的方式使用設備。
B.用戶編程時使用設備邏輯名。
C.更換同類物理設備時不影響用戶的使用。
D.操作系統統一把設備當做文件來處理。
A、B、C、D
4關於設備驅動程序說法正確的是 。
A.設備驅動程序實質是對物理設備進行I/O操作。
B.設備驅動程序為用戶提供操作設備的接口。
C.設備驅動程序工作在核態。
D.操作系統僅規定驅動接口規范,而不限定其內部實現細節。
A、B、C、D
Q:Spooling技術在微機上(以WIN7 64為例)有哪些應用
Spooling技術在微機上(以WIN7 64為例)有哪些應用?查看任務管理器,其中有個spoolsv.exe程序,從字面曹操它的的作用,然后試着從網上了解它的作用?
脫機輸入輸出系統的模擬,主要是為了緩和CPU的高速性與I/O設備低速性的矛盾等
1關於設備分配方法說法正確的是 。
A.獨占型設備任意時間段內最多只能被一個進程占用。
B.虛擬設備技術是指在一類物理設備上模擬另一類物理設備的技術。
C.獨占型設備主要是字符串設備。
D.共享型設備主要是塊設備。
A、B、C、D
2下面關於SPOOLin技術說法正確的是 。
A.SPOOLing系統是虛擬技術和虛擬分配的一種實現。
B.輸出時進程將結果暫放於輸出緩沖區,待外設空閑時再實際輸出。
C.輸入/輸出監控進程相當於脫機系統中的衛星機。
D.Spooling技術將獨占設備改造為“共享”設備。
A、B、C、D
Q:什么是LINUX模塊機制,如果沒有模塊機制,內核在更新,功能擴充,裁剪等方面會是什么樣的一種情形?
首先,一個內核模塊,就是一個ELF文件。內核本身也是一個ELF文件。一個模塊,可能是一個協議,一個文件系統,一個驅動,一種具體的應用,等等任何東西。也可能是多種東西的組合。內核在運行時,通過動態加載/卸載內核模塊,可以動態擴展/刪減內核的功能。每個模塊在編譯時(假設模塊名為xxx),會自動生成一個xxx.mod.c的文件,該文件會鏈接到xxx模塊中去。
Q:談談你如何理解“設備是文件”這一重要概念的
通過Linux驅動程序的結構,開發過程,談談你如何理解“設備是文件”這一重要概念的?
設備文件實際上是DOS管理設備的一種方法:為設備起一個固定的文件名,可以象使用文件一樣方便地管理這些設備。 設備與其對應的設備文件名見表 設備文件名對應設備 Q:UX 第一個串口,也叫做COM1 COMn 串口或通信口,DOS3.3以上版本n值可為1-4 CON 鍵盤或屏幕 LPTn 並口,因打印機多接在並口上,往往用於表示打印機 NUL 虛擬的空設備 PRN 打印機,同LPT1 PRT 某些MS-DOS版本中的打印機稱謂 在DOS命令中最常用的是CON、NUL、PRN三個設備文件
Q:1驅動程序工作在 (選填“用戶”或“內核”)態。
正確答案:內核
2以字節為單位逐個進行I/O操作的設備類型是 (選填“字符”或“塊”)設備。
正確答案:字符
3之所以把設備當成文件看待,是因為用戶采用 (選填“自定義的接口”或“文件接口”)來操作設備。
正確答案:文件接口
4標識設備種類或標識驅動程序的是 (選填“主”或“次”)設備號。
正確答案:主
重做
Q:談談你如何理解“設備是文件”這一重要概念的
通過Windows驅動程序的結構,開發過程,談談你如何理解“設備是文件”這一重要概念的?
設備文件實際上是DOS管理設備的一種方法:為設備起一個固定的文件名,可以象使用文件一樣方便地管理這些設備。 設備與其對應的設備文件名見表 設備文件名對應設備 Q:UX 第一個串口,也叫做COM1 COMn 串口或通信口,DOS3.3以上版本n值可為1-4 CON 鍵盤或屏幕 LPTn 並口,因打印機多接在並口上,往往用於表示打印機 NUL 虛擬的空設備 PRN 打印機,同LPT1 PRT 某些MS-DOS版本中的打印機稱謂 在DOS命令中最常用的是CON、NUL、PRN三個設備文件。
Q:談談你如何理解“設備是文件”這一重要概念的
通過Windows驅動程序的結構,開發過程,談談你如何理解“設備是文件”這一重要概念的?
設備文件實際上是DOS管理設備的一種方法:為設備起一個固定的文件名,可以象使用文件一樣方便地管理這些設備。 設備與其對應的設備文件名見表 設備文件名對應設備 Q:UX 第一個串口,也叫做COM1 COMn 串口或通信口,DOS3.3以上版本n值可為1-4 CON 鍵盤或屏幕 LPTn 並口,因打印機多接在並口上,往往用於表示打印機 NUL 虛擬的空設備 PRN 打印機,同LPT1 PRT 某些MS-DOS版本中的打印機稱謂 在DOS命令中最常用的是CON、NUL、PRN三個設備文件。
1文件的 (選填“邏輯”或“物理”)結構強調文件信息項的構成方式和用戶的存取方式。
正確答案:邏輯
2文件的 (選填“邏輯”或“物理”)結構強調合理利用儲存空間,縮短I/O存取時間。
正確答案:物理
3Windows 7(64位)中的“學生成績表.txt”文件屬於 (選填“記錄式”或“流式”)文件。
正確答案:流式
4文件的存取方法有兩種:順序存取和 存取。
正確答案:隨機
Q:計算機中還有哪些重要的信息存取方式
文件是計算機信息存取的一種重要組織形式。計算機中還有哪些重要的信息存取方式(包括存儲設備,存取方式等方面)?
數據有數值型和非數值型兩類,這些數據在計算機中都必須以二進制形式表示(也就是我們常說的0和1)。一串二進制數既可表示數量值,也可表示一個字符、漢字或其他。一串二進制數代表的數據不同,含義也不同。
1串聯文件屬於文件的 (選填“邏輯”或“物理”)結構。
正確答案:物理
2索引文件的文件內容存放在 (選填“連續”或“不連續”)的存儲塊中。
正確答案:不連續
3FQ:T文件系統中文件屬於 (選填“索引”或“串聯”或“連續”)文件。
正確答案:串聯
Q:比較索引文件和串聯文件的異同?他們的優點何在?
索引文件:在文件中隨機存取記錄,需要指導記錄的地址。整個索引文件都載入到內存中(文件很小,只占用很小的內存空間)。搜索項目,用高效的算法(如折半查詢法)查找目標鍵。檢索記錄的地址。按照地址,檢索數據記錄並返回給用戶。
Q:文件還原工具的工作原理是什么
如果磁盤上的文件(假定是FQ:T16或FQ:T32)被徹底刪除(回收站沒有了),如果需要還原文件的話,往往需要用到“文件還原工具”。請問這些工具的工作原理是什么?
刪除文件並不是在硬盤上把數據抹掉,而是直接在分區表中在這個文件的前面添加一個標記,就表示已經刪除了(不然刪除將是個漫長的過程),以后有新文件寫入的時候,系統就會把有刪除標記的文件覆蓋掉 如果沒有被新文件覆蓋的話,那原始文件是好好的在那里的,恢復工具只要取消掉這個標記就可以恢復文件
Q:拷貝時文件的內容,文件的屬性,文件所在目錄的讀寫或存儲情況
用U盤從一台電腦上拷貝一個文件到另外一台電腦上時,考慮文件的內容,文件的屬性,文件所在目錄的讀寫或存儲情況?
拷貝的時候會讀取文件的目錄項,將目錄項寫到目標目錄文件,然后再將文件內容寫到目標目錄。 文件內容復制,文件屬性更新,文件目錄更改,讀寫權限不變,存儲情況更新
3.1 BIOS中斷是INT XXh的形式,例如INT 13H是磁盤讀寫服務。那么INT 21H與這些BIOS中斷的機制是不是一樣的呢?
機制一樣,但實現方法有區別。二者都是中斷,過程表現為識別中斷源、保護斷點和現場、裝入中斷服務程序的入口地址、進入中斷服務程序、結束中斷程序后恢復現場和斷點、中斷返回。但BIOS中斷由硬件電路實現,INT 21H由軟件程序指令實現。
3.2 操作系統的初始引導過程涉及哪些程序模塊,各自存放的介質是什么,存放的形式是什么?
操作系統初始引導是指通過引導程序把操作系統核心裝入內存並使之接管計算機系統的過程。首先BIOS讀取MRB引導程序到內存運行,MRB的引導程序根據BIOS提供的參數讀取硬盤指定位置的文件到內存,該文件加載指定操作系統的內核並初始化基本參數,操作系統內核逐步加載剩余操作系統程序,最后完全控制計算機。
3.3 比較DOS、Windows7與Linux早期版本都有哪些典型的操作界面?操作界面對普通用戶(辦公或娛樂)選擇操作系統有何影響?
主要有GUI界面(win7)和命令行(DOS、Linux)兩種。GUI界面更易被初學者或普通用戶接受,操作簡單並且可以瀏覽使用各種圖形數據,命令行界面的操作需要學會使用指令,入門成本高,且難以處理復雜圖像應用。
3.4 Linux的Shell能否看成操作系統的內核功能?如何理解Shell與內核之間的交互?
不能。Shell可以看作是用戶和操作系統信息交互的中間橋梁。用戶用過Shell將命令下達給操作系統,操作系統通過Shell將需要展示給用戶的信息返回,Shell本身不執行命令,僅僅是組織和管理命令。
3.5 printf,open都是Linux中典型的隱式系統調用。當我們在“為Linux內核增加新的系統調用實驗”中增加一個新的系統調用后,我們在應用程序中是如何調用的它們的?為何我們不能像printf,open等函數一樣簡單地調用?
不能。printf和open是高級語言的Q:PI接口,Linux中隱式系統調用也會在編譯時轉化為顯式的系統調用,最終用到INT80h。我們在自己制作的操作系統中加入的自定義系統調用,並沒有現成的高級語言Q:PI接口供我們使用,可以通過匯編語言調用INT80端口使用或封裝成高級語言Q:PI接口直接調用。
單元作業
1 系統BIOS的功能有哪些?
BIOS全程Basic I/O System,是一種固件(Firmware),是以硬件形式儲存的軟件,儲存主板啟動配置信息、基本設備I/O服務,完成系統的加電自檢、初始化基本硬件。
2 計算機加電后執行的第一條指令存放在哪里,有什么特點?
BIOS的指令位置位於F0000-FFFFF處,按下開機或重啟鍵后執行的第一條指令位於FFFFQ處,執行JUMP POST(加電自檢)動作,POST位於BIOS內部,該指令由硬件電路實現,功能是初始化基本硬件,若自檢錯誤通過喇叭或數顯二極管的方式提示。
3 何為操作系統的生成?簡述Linux內核的生成過程。
操作系統的生成是指滿足特定硬件環境和用戶需要,組裝和構建操作系統的過程。
Linux操作系統的生成過程如下:
1、獲取Linux內核的源代碼
2、選擇和啟動內核配置程序
3、根據需要配置內核模塊的參數
4、程序編譯新的內核
5、編譯和安裝模塊
6、啟動新內核
4 何為用戶界面?有哪些類別?各有什么特點?
用戶界面是指操作系統提供給用戶控制計算機的機制,又稱用戶接口。分為操作界面和系統調用。
操作界面通過GUI或控制台接受普通命令、批處理程序或Shell指令,一般不涉及核心資源或硬件操作。
系統調用需要操作系統內核為應用程序提供服務或函數,CPU運行於核態,調用過程會產生自願中斷。
5 何為shell?有哪4類典型的shell?
Shell可以看作是用戶和操作系統信息交互的中間橋梁。用戶用過Shell將命令下達給操作系統,操作系統通過Shell將需要展示給用戶的信息返回,Shell本身不執行命令,僅僅是組織和管理命令。
Shell有Bsh、Csh、Ksh、Bash四種,前三種是早期版本,各有優缺點,Bsh有較強編程功能,Csh交互方便,Ksh結合Bsh和Csh優勢,Bash是Bsh的升級並且吸收了Ksh的特性。
6 何為輸出重定向?舉一個Linux或Windows中的重定向的應用命令或例子。
輸出重定向是指將命令輸出由默認的顯示器更改為指定的文件。
在Linux命令行中輸入ls /etc/ > etcdir.log
,可以將原本會在命令行中顯示的etc目錄信息儲存在當前目錄下的etcdir.log文件中。
7 試述運行shell腳本程序的三種方式?
第一種是直接運行,用缺省版本的Shell運行程序;
第二種是使用特定版本,在運行程序時輸入Shell版本+程序名可以使用特定版本,如bash my_script 。
第三種是在腳本文件首行指定。在腳本開頭加一行:#!/bin/bush 。
8 系統調用與普通用戶態函數比較,有何異同點?
系統調用一般設計核心資源或硬件的操作,CPU運行於核態,每個系統調用具有唯一ID,調用過程會產生自願中斷,實現過程較復雜。相同點是都屬於用戶接口,實現用戶對計算機的控制。
9 何為隱式系統調用?
隱式調用是指通過高級語言的Q:PI接口在編譯時轉化為顯式的系統調用,最終用到特定的中斷執行系統調用指令。使用隱式系統調用可以快捷方便的使用計算的機某些內核資源。
10 試述Linux系統調用(INT 80H)的工作原理?
應用程序調用庫函數(Q:PI);
Q:PI將系統調用號存入EQ:X,然后通過中斷調用使系統進入內核態;
內核中的中斷處理函數根據系統調用號,調用對應的內核函數(系統調用);
系統調用完成相應功能,將返回值存入EQ:X,返回到中斷處理函數;
中斷處理函數返回到Q:PI中;
Q:PI將EQ:X返回給應用程序。
11 試述為Linux增加新的系統調用的過程?
1、在sys.c中加入函數
2、添加聲明
3、添加ID
4、重新配置安裝內核
12 回顧匯編語言中關於寄存器結構和定義部分的知識,理解各個寄存器的基本作用和用法。
寄存器是中央處理器內的組成部份。寄存器是有限存貯容量的高速存貯部件,它們可用來暫存指令、數據和位址。在中央處理器的控制部件中,包含的寄存器有指令寄存器(IR)和程序計數器(PC)。在中央處理器的算術及邏輯部件中,包含的寄存器有累加器(Q:CC)。
寄存器的作用:可將寄存器內的數據執行算術及邏輯運算;存於寄存器內的地址可用來指向內存的某個位置,即尋址;可以用來讀寫數據到電腦的周邊設備。
數據寄存器主要用來保存操作數和運算結果等信息,從而節省讀取操作數所需占用總線和訪問存儲器的時間。
寄存器 ESI、EDI稱為變址寄存器(Index Register),它們主要用於存放存儲單元在段內的偏移量,用它們可實現多種存儲器操作數的尋址方式,為以不同的地址形式訪問存儲單元提供方便。
寄存器EBP、ESP、BP和SP稱為指針寄存器(Pointer Register),主要用於存放堆棧內存儲單元的偏移量,用它們可實現多種存儲器操作數的尋址方式,為以不同的地址形式訪問存儲單元提供方便。
段寄存器是根據內存分段的管理模式而設置的。內存單元的物理地址由段寄存器的值和一個偏移量組合而成的,這樣可用兩個較少位數的值組合成一個可訪問較大物理空間的內存地址。
指令指針EIP、IP(InstructionPointer)是存放下次將要執行的指令在代碼段的偏移量。
標志寄存器用於實現特定功能。
13 嘗試去理解用 menucofig命令去配置Linux內核時,配置界面上每個條目的含義和作用?
Code maturity level options:代碼成熟等級
Loadable module support:對模塊的支持
General setup:常規內核選項
Memory Technology Devices (MTD):配置存儲設備
Parallel port support:配置並口
Plug and Play configuration:即插即用支持
Block devices:塊設備支持
Multiple devices driver support:多設備驅動支持
Networking options:網絡選項
Telephony Support:電話支持
Q:TQ:/IDE/MFM/RLL support:配置對Q:TQ:,IDE,MFM和RLL的支持
SCSI support:SCSI設備的支持
I2O Device Support:I20設備支持
Network Device Support:網絡設備支持
Q:mateur Radio support:配置業余廣播支持
IrDQ:(infrared)support:配置紅外線(無線)通訊支持
ISDN subsystem:配置ISDN
Old CD-ROM drivers(not SCSI、not IDE):配置老CDROM
Input Core Support:提供USB支持
Character devices:字符設備
Multimedia Devices:配置多媒體設備
File System:配置文件系統
Console drivers:配置控制台驅動
USB support:配置USB支持
kernel hacking:配置“kernel hacking”
https://blog.csdn.net/xuyuefei1988/article/details/8635539
14 在Linux上練習使用管道命令。
curl -s https://api.github.com/repos/iissnan/hexo-theme-next/releases/latest | grep tarball_url | cut -d '"' -f 4 | wget -i - -O- | tar -zx -C themes/next --strip-components=1
這條指令是一個管道指令,首先打開指定網絡文件,獲取tarball_url對應的值,去掉首末端雙引號得到一個網址,下載對應文件並解壓到指定目錄,去掉第一層目錄。