當前位置:首頁 » 論文設計 » 獲取系統畢業設計論文
擴展閱讀
中國網路原創新人樂團 2021-03-31 20:26:56
黨政視頻素材 2021-03-31 20:25:44
廈門大學統計學碩士 2021-03-31 20:25:36

獲取系統畢業設計論文

發布時間: 2021-03-30 02:55:15

⑴ 操作系統 畢業論文

操作系統課程設計報告
一. 簡介
Linux系統是從UNIX發展來的。UNIX是世界上最流行的操作系統之一,它是一種實時操作系統,可以運行於大型和小型計算機上的多任務系統。但由於它比較龐大,而且價格昂貴,所以不適合PC機用戶使用。而Linux正好彌補了這些缺點,同時還繼承了UNIX大多數優點。由於它基於PC機上運行的操作系統,並且內核源代碼是公開的,使得Linux成為時下最滸的操作系統。Linux是一種適用於PC機的計算機操作系統,它適合於多種平台,是目前唯一免費的非商品化操作系統。由於有結構清晰、功能強大等特點,它很快成為許多院校學生和科研機構的研究人員學習和研究的對象。在他們的熱心努力下,Linux漸漸成為一個穩定可靠、功能完善的操作系統。Linux是由UNIX發展來的,它不僅繼承了UNIX操作系統的特徵,而且許多方面還超過了UNIX系統。另外它還有許多UNIX所不具有的優點和特徵。它的源代碼是開放的,可運行於許多硬體平台 ,支持多達32種文件,支持大量的外部設備等。 Linux有廣泛的用處,它可用於:
 個人UNIX工作站。
 終端用戶和應用伺服器。
 UNIX開發平台。
 商業開發。
 網路伺服器。
 Internet伺服器。
 終端伺服器、傳真伺服器、Modem伺服器。
二、Linux系統下C編程原理
1. Linux系統的主要優異性能
 Linux系統是真正的爽用戶。多任務、多平台操作系統。
 Linux系統提供提供具有內置安全措施的分層的文件系統,支持多達32種文件系統。
 Linux系統提供命令解釋程序和編程語言。
 Linux系統提供強大的管理功能。
 Linux系統具有內枋的編程介面。
 Linux系統具有圖形用戶介面。
 Linux系統許多組成部分的源代碼是開放的,任何人都能修改和重新發布它。
 Linux系統不公可以運行許多自由發布的應用軟體,還可以運行許多商業化的應用軟體。
2. Linux系統的主要構成
 存儲管理
在Linux中,每一個進程都有一個比實際物理空間大得多的進程虛擬空間,每個進程還保留一張頁表,用於將本進程空間中的虛地址變換成物理地址,頁表還對物理頁的訪問許可權作了規定,從而達到存儲保護的目的。
 進程管理
在Linux中,進程是資源分配的基本單位,所有資源都是以進程為對象進行分配的,在一個進程的生命周期中,會用到許多系統資源,Linux的設計可以准確描述進程的狀態和資源的使用情況,以確保不出現某些進程過度佔用系統資源而導致另一些進程無休止地等待的情況。
 文件系統
Linux最重要的特徵之一就是支持多種不同的文件系統。在Linux中,一個分離的文件系統不是通過設備標志來訪問,而是把它合到一個單一的目錄樹結構中去,通過目錄訪問。Linux把一個新的文件系統安裝到系統單一目錄樹的某一目錄下,則該目錄下的所有內容被新安裝的文件系統所覆蓋,當文件系統被卸下後,安裝目錄下的文件將會被重新恢復。
 進程間通信
Linux提供多種進程間的通信機制,管道和信號是其中最基本兩種,其他還有消息隊列、信號燈及共享內存。為支持不同機器之間的進程通信,Linux還引入了機制。
3. gcc編譯器的使用
在Linux開發環境下,gcc是進行程序開發不可或缺的編譯工具,是GUN C Compile的縮寫,它是在GUN系統下的標准C編譯器。gcc作為Linux平台下的標准C編譯器,功能強大。人們可以使用gcc編譯器編譯單一文件的最基本的命令,正是有了gcc編譯器人們才能使用它編譯C源程序。
gcc的完整格式是gcc [options] [filenames] ,編譯選項指定的操作對給定的文件進行編譯處理。在後面可以有多個編譯選項,同時進行多個編譯操作。
三、總體設計
下面介紹Linux系統中的文件以及與文件有關的操作。在C編程環境中,與文件有關的操作主要是I/O操作,即基於文件描述符的操作。此外,還將介紹其他一些與文件有關的操作。
在Linux系統中,有關的I/O操作可以分為兩類。它們是基於文件描述符的I/O操作和基於流I/O的操作。它們有各自不同的特點和優勢。基於文件描述符的I/O操作是通過文件描述符對一個文件執行I/O操作的。文件是一個十分重要的概念。通常保存在外存中的數據都是以文件的形式保存的。文件描述符則是用於描述被打開文件的索引值。通常情況下,都是通過文件描述符打開一個文件執行I/O操作。
文件和文件系統是重要而復雜的概念。文件是有名字的一組相關信息的集合。在Linux系統中,文件的准確定義是不包含有任何其他結構的字元流。通俗的說,就是文件中的字元與字元之間除了同屬於一個文件之外,不存在任何其他的關系。文件中字元的關系,是由使用文件的應用程序來建立各解釋的。每一個文件都具有特定的屬性。Linux系統的文件屬性比較復雜,主要包括文件類型和文件許可權兩個方面。
1.文件類型
Linux下的文件可以分為5種不同的類型 。它們是普通文件、目錄文件、鏈接文件、設備文件和管道文件。
(1)、普通文件
普通文件也稱正規文件,是最常見的一類文件,也是最常使用到的一類文件。其特點是不包含有文件系統的結構信息。通常所接觸到的文件,包括圖形文件、數據文件、文檔文件、等等都屬於普通文件。這種類型的文件按其內部結構又可細分為兩個文件類型:文本文件和二進制文件。
(2)、目錄文件
目錄文件是用於存放文件名及其相關信息的文件。是內核組織文件系統的基本節點。目錄文件可以包含下一級目錄文件或普通文件。
(3)、鏈接文件
鏈接文件是一種特殊的文件。它實際上是指向一個真實存在的文件的鏈接。根據鏈接對象的不同,鏈接文件又可以細分為硬鏈接文件和符號鏈接文件。
(4)、設備文件
設備文件是Linux中最特殊的文件。正是由於它的存在,使得Linux系統可以十分方便地訪問外部設備。Linux系統為外部設備提供一種標准介面,將外部設備視為一種特殊的文件。用戶可以像訪問普通文件一樣訪問外部設備。這就使Linux系統可以很方便的適應不斷發展的外部設備。
(5)、管道文件
管道文件也是一種很特殊的文件。主要用於不同進程間的信息傳遞。當兩個進程間需要進行數據或信息傳遞時,可以通過管道文件。一個進程將需傳遞的數據或信息寫入管道的一端,另一進程則從管道的另一端取得所需的數據或信息。
2.進程基本介紹
在Linux環境下,進程是一個十分重要的概念。按現在通行的認識,進程是具有一定功能的程序關於一個數據集合的一次執行過程。對一個特定程序來說,它的每一個正在運行中的副本都有自己的進程。就是說,如果用戶在一個進程的一次運行尚未結束時再次啟動該程序,則將有兩個進程在運行這一程序。多個進程可以同時運行,各個進程之間相互隔開,除非不同進程之間需要進行數據交換,否則互不影響。
一個進程的存在過程,可以分為進程的產生、進程的執行和進程的結束3個步驟。當一個程序被啟動時,就產生一個新的進程。進程在系統內核的管理下得到執行。當某個進程執行完畢後,該進程就消亡了。
Linux系統支持多個進程同時進行。所謂同時,其實是Linux系統在各個進程之間調度,輪流是每個進程佔用CPU 的一個時間片。由於每個時間片和宏觀的時間相比很小,而每個進程可以頻繁的得到時間片,於是就使用戶看到了多個進程「同時」運行的情況。在每個進程屬性的安全信息里都設有一個優先順序,系統根據它來決定各個進程從CPU獲得的時間片的大小。
用戶在執行一個程序以完成一定的功能時,為了提高程序執行的效率,可以把一個程序設計成由若干個部分組成,由若干個部分組成,由若干個進程同時執行。這就是所謂並發程序的概念。此外,不同進程之間可能會需要相互合作,即進程通信和進程同步。
當然,多個進程並不需要同上時間產生並都維持到整個程序運行結束。用戶可以根據需要動態地產生結束進程。也就是說,一個進程可以派生另一個進程,這就是所謂父進程和了進程的關系。
每個進程都有各自的屬性,其中包括了進程的詳細信息。
3.庫的使用
代碼的重用性是當代計算機編程語言中一個重要的概念,可以把編譯好的目標文件模塊統一放到一個庫中,使得程序員可以在不同的程序中共享這些代碼。
在操作系統中,最終鏈接生成可執行文件時,如果鏈接的是一般的文件,則
整個文件的內容都會被裝入可執行文件中;如果鏈接的是庫,則只是從庫存中找到程序中用到的變數和數,將它們裝入可執行文件中,那些放在庫中但是沒有被程序所引用的變數和數則不會被鏈接到最終的可執行文件。
所以,使用庫可以節省在大量的開發時間,在寫較大的程序時,最好把程序
模塊放在庫中。
對於任何典型的操作系統命令都由簡單命令、參數、輸入文件名、輸出文件名、I\O重定向文件名等組成。(關於以上術語的數據字典見下表)
以命令 gcc –ggdb3 –o moon sun.c 為例:
數據字典一:
術語 說明
簡單命令 一個Linux長命令可以有多個像gcc,more等這樣的純命令組成。其中每個純命令如gcc,more就是這里說的簡單命令
參數 範例命令中的-g,-o就是參數,它們是命令的擴展,可以根據用戶的不用需要提供相應的不同服務
輸入文件名 範例命令中的sun.c就是輸入文件名,它相當於一個源文件,在文件的連接和復制的命令中也常常用到這樣的文件
輸出文件名 範例命令中的moon就是輸出文件名,它相當與一個目標文件,在文件的連接和復制的命令中也常常用到這樣的文件
I\O重定向文件名 在Linux系統中所有的設備都被看作文件進行管理,I\O文件(設備)作為輸出的目標時是可以根據用戶的需要進行調整的,I\O重定向文件名就是用來指定I\O文件(設備)名的

模塊說明:

模塊名稱 功能說明
總控模塊
main() 該模塊調用其他模塊實現命令解釋功能,保證無論命令執行成功與否都在命令執行後返回命令提示符
命令初始化模塊
init_command() 使用singnal函數對進程進行處理,達到初始化命令的效果
命令行輸入
get_comln() 該模塊接受用戶鍵盤輸入的所有字元並存入相應的字元數組,供其他模塊使用
分析簡單命令個數
get_simcom() 該模塊對用戶鍵盤輸入的長命令進行分析並最終將長命令分割成數據字典一中的元素,存入相應的結構數組,供執行模塊執行
執行指令
execute() 對各種的數據字典一中的元素進行最後的處理,完成區分前後台程序,封鎖、開啟鍵盤等功能
分析簡單命令
get_simarg() 對簡單命令進行分割,為執行模塊提供最直接的信息
得到下一個標志符
get_word() 該過程用來記錄輸入文件名、輸出文件名、I\O重定向並存入相應的結構數組
查看字元串是否匹配
check() 用來區分長命令中各個數據字典一中的元素的標准,為分割長命令提供參考信息
執行簡單命令
run_com() 該模塊與操作系統底層聯系,使用系統調用完成各個簡單命令的最終執行
程序初始化
init_once() 對程序中用到的所有變數和數據結構進行初始化

模塊圖:

四.詳細設計
/*執行輸入命令的文件execute.c*/
execute(int j)
{
int m,fd,fds[2]; /*fd 文件描述符號*/
if(infile[0]!=』0』)
/*如果命令指定了輸入文件則打開輸入文件*/
cmdlin[0].infd=open(infile,O_RDONLY);
if(outfile[0]!=』\0』)
/*如果命令指定了輸出文件則打開相應的輸出文件*/
if(append= =FLASE)
cmdlin[j-1].outfd=open(outfile,O_WRONLYIO_CREATIO_TRUNC,0666);
/*本句意思:一個已只讀方式打開某指定文件的函數,如果該文件不存在*/
/*則創建此文件,如果該文件存在則將文件長度截至0*/
else
cmdlin[j-1].outfd=open(outfile,O_WRONLYIO_CREATIO_APPEND,0666);
/*對前台進程和後台進程進行不同的處理*/
if(background)
/*當一個進程結束時系統將產生一個SIGCHIOD信號通知其父進程*/
signal(SIGCHLD,SIG_IGN);
else
signal(SIGCHLD,SIG_DFL);

/*循環執行每個簡單命令*/
for(m=0;m<j;++m)
{
/*對管道進行操作*/
if(m<j-1)
{
pipe(fds);/*調用pipe函數創建了一個管道*/
cmdlin[m+1].infd=fds[0];
cmdlin[m].outfd=fds[1];
}
/*執行一條簡單命令*/
run_com(&cmdlin[m]);/*調用run_com函數執行一條簡單命令*/
/*關閉該命令的輸入*/
if(fd=cmdlin[m].infd)
close(fd);
/*關閉該命令的輸出*/
if ((fd=cmdlin[m].outfd)!=1)
close(fd);
}
/*如果不是後台命令,等待直到最後一條簡單命令執行完畢*/
if(background==FALSE)
while(wait(NULL)!=lastpid);
}

/*執行簡單命令*/
run_com(struct cmd *ptr )
{
int k,pid; /* pid是進程標志符,用於指定所等待的進程*/
if (pid=fork( ) )
/*要創建一個進程最基本的系統調用是fork,系統調用fork用於派生一個進程,此進程與*/
/*當前進程相同*/

/*父進程*/
{
if (background= =TRUE)
printf(「%d\n」,pid);
/*如果是後台命令,列印出進程標識*/
lastpid=pid;
/*記錄最後一個簡單命令的進程標志*/
}
else
{
/*如果是後台進程要關閉鍵盤輸入*/
if(ptr->infd= =0&&background= =TRUE)
/* O_RDONLY 在設備文件中有一個極其特殊的文件/dev/null 所有放入這一設備*
/*的數據都將不在存在,可以將它看成是刪除操作*/
ptr->infd=open(「/dev/null, O_RDONLY);
/*對輸入進行重定向*/
if (ptr->infd!=0)
{
close(0);
/*p是復制文件描述符,也就是說新得到的文件描述符和原來的文件描述符將*/
/*共同指向一個打開的文件*/
p(ptr->infd);
}/dev/null
/*對輸入進行重定向*/
if(ptr->outfd!=1)
{
close(1);
p(ptr->outfd);
}
/*前台進程可以接受鍵盤輸入的中斷和退出信號*/
if(background= =FALSE)
{
/*信號都有自己特定的名字,都以SIG開頭*/
singnal(SIGINT,SIG_DFL);
/*SIG_DFL表示調用系統定義的預設處理*/
singnal(SIGQUIT,SIG_DFL);
}
/*關閉其他文件描述符,使得除了標准輸入標准輸出和錯誤輸出兩處設置的管道和I/O重定向*/
for(k=3; k>OPEN_MAX; ++k)
close(k);
/*下面代碼執行一條簡單命令*/
/*進程式控制制execvp函數可裝入並運行稱為子進程的其他的可執行文件稱為父進程的*/
/*execvp函數調用成功時,子進程便覆蓋父進程*/
execvp(ptr->av[0],ptr->av);
exit(1);
}
}
五、測試
即使是最優秀的程序員也不可避免在編程時出現一些這樣那樣的錯誤。所有的程序在寫好以後,都要經過測試,在調試過程中發現並改正程序中的錯誤。
Gdb就是Linux下的一個功能強大的C程序的調試器,它能在程序運行時觀察程序的內部結構和內存的使用情況。我們的測試就是通過gdb進行的。
測試計劃:
監視程序中變數的變化
設置斷點,使程序在指定的代碼行上暫停執行,便於觀察。
單步執行代碼;
分析崩潰程序產生冊core文件。

六、自我評價:
通過本次課程設計,我更加深刻的理解了大型軟體(比如操作系統)結構的復雜和精巧。以及自己在軟體編程中的巨大差距。在本次課程實踐中我的收獲有三點:
第一, 明確了大型程序在構架和整體布局上是何其嚴格和規整。
第二, 第二明確了多個模塊在互相調用中程序的復雜程度以及演算法設計的失誤在實際編碼中帶來的巨大麻煩。
第三, 在本次編寫程序的過程中深切的感受到了「團隊精神」在軟體開發中的重要作用,以及協調工作的重要性和高效性。
總之, 在這次課程設計中,我覺得自己得到了很大的進步,非常感謝老師為我們提供的這次機會。

你看看吧 希望你能用的上!!