1 shell編程參考模板_第1頁
1 shell編程參考模板_第2頁
1 shell編程參考模板_第3頁
1 shell編程參考模板_第4頁
1 shell編程參考模板_第5頁
已閱讀5頁,還剩6頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 Linux操作系統作業報告學 號: 110410430 姓 名: 孫宏碩 任課教師: 閆健恩 1 / 111 shell編程1)編寫shell腳本,針對指定源目錄,對所有的文件進行移動到指定目的目錄的操作,每個文件都要提示用戶是否要移動;10分2)編寫一個shell腳本,刪除指定目下所有的文件夾(如子文件夾不為空也要刪除);10分3)編寫一個腳本,可以完成多個網卡(每次配置一塊,分多次配置)的ip地址、網關、dns、掩碼的設置,并立即使其生效。10分(1) :#! /bin/bashif -d $1 thenfor i in ls $1doif -d $i thenecho $icd $1e

2、cho "move $i ?(Y or N)"read jcase $j in y)mv $i $2; n)echo "next"esac elsecd $1echo "move $i ?(Y or N) "read jcase $j iny)mv $i $2;n)echo "next" EsacFidoneElseecho "ERROR"fi#end(2) :#!/bin/bashcd $1for i in ls $1doif -d $i thenrm -rf $ielif -f $i the

3、nrm $ielseecho "ERROR"fidone#end(3) :#!/bin/bashnum=$ ifconfig -a | egrep -o "eth0-9|inet addr:0-9+.0-9+.0-9+.0-9+" | sed "s/inet addr:/t/g"echo your new network card ip are below:echo $numifconfig eth0 $1 netmask $2 uproute add default gw $3echo $4 >>/ect/resolv.

4、confnum2=$ ifconfig -a | egrep -o "eth0-9|inet addr:0-9+.0-9+.0-9+.0-9+" | sed "s/inet addr:/t/g"echo $num2二 ext2文件系統原理Ext2是 GNU/Linux 系統中標準的文件系統,其特點為存取文件的性能極好,對于中小型的文件更顯示出優勢,這主要得利于其簇快取層的優良設計。現已經有ext3,ext4等。相比于windows支持的FAT16 FAT32 及NTFS文件系統,ext2文件系統支持鏈接文件。在ext2文件系統中,文件由inode(包含有

5、文件的所有信息)進行唯一標識。一個文件可能對應多個文件名,只有在所有文件名都被刪除后,該文件才會被刪除。此外,同一文件在磁盤中存放和被打開時所對應的inode是不同的,并由內核負責同步。ext2文件系統采用三級間接塊來存儲數據塊指針, 并以塊(block,默認為1KB)為單位分配空間。其磁盤分配策略是盡可能將邏輯相鄰的文件分配到磁盤上物理相鄰的塊中,并盡可能將碎片分配給盡量少的 文件,以從全局上提高性能。ext2文件系統將同一目錄下的文件(包括目錄)盡可能的放在同一個塊組中,但目錄則分布在各個塊組中以實現負載均衡。在擴展文件時,會盡量一次性擴展8個連續塊給文件(以預留空間的形式實現)。 由以下

6、幾部分組成: 1 超級快(存儲了該文件系統最基本的信息,如塊大小,塊組中的塊數目等) 2 塊組描述符(描述了所有塊的屬性) 3 塊位圖和inode位圖 塊位圖和inode位圖的每一位分別指出塊組中對應的那個塊或inode是否被使用。 4 inode表 inode表用于跟蹤定位每個文件,包括位置、大小等(但不包括文件名),一個塊組只有一個inode表。5、數據塊 數據塊中存放文件的內容,包括目錄表、擴展屬性、符號鏈接等。三 linux內核源碼安裝Linux內核(kernel),是linux最核心的部分,實現管理存儲器,文件,外設,和系統資源等。 (1)下載linux內核源碼 https:/www

7、./在該網站下載linux源代碼,在ubuntu9.10版本中內核版本為2.6.31-14可以再/usr/src中查看而linux-headers-2.6.31-14-generic是我們ubuntu使用的源碼文件,進入該目錄然后使用 make menuconfig配置內核然后使用make命令生成鏡像使用make modules生成模塊 完成安裝后,編譯好的內核模塊會從內核源代碼目錄拷貝至/lib/modules下面。最后使用mkinitrd lnitrd-2.6.31-14Linux內存管理物理地址 用于內存芯片級的單元尋址,與處理器和CPU連接的地址總線相對應。這個概念

8、應該是這幾個概念中最好理解的一 個,但是值得一提的是,雖然可以直接把物理地址理解成插在機器上那根內存本身,把內存看成一個從0字節一直到最大空量逐字節的編號的大數組,然后把這個數 組叫做物理地址,但是事實上,這只是一個硬件提供給軟件的抽像,內存的尋址方式并不是這樣。所以,說它是“與地址總線相對應”,是更貼切一些,不過拋開對 物理內存尋址方式的考慮,直接 把物理地址與物理的內存一一對應,也是可以接受的。也許錯誤的理解更利于形而上的抽像。虛擬內存這是對整個內存(不要與機器上插那條對上號)的抽像描述。它是相對于物理內存來講的,可以直接理解成“不直實的”,“假的”內存,例如,一個0x08000000內存

9、地址,它并不對就物理地址上那個大數組中0x08000000 - 1那個地址元素;之所以是這樣,是因為現代操作系統都提供了一種內存管理的抽像,即虛擬內存(virtual memory)。進程使用虛擬內存中的地址,由操作系統協助相關硬件,把它“轉換”成真正的物理地址。這個“轉換”,是所有問題討論的關鍵。有了這樣的抽 像,一個程序,就可以使用比真實物理地址大得多的地址空間。(拆東墻,補西墻,銀行也是這樣子做的),甚至多個進程可以使用相同的地址。不奇怪,因為轉換 后的物理地址并非相同的。可以把連接后的程序反編譯看一下,發現連接器已經為程序分配了一個地址,例如,要調用某個函數A,代碼不是call A,而

10、是call0x0811111111 ,也就是說,函數A的地址已經被定下來了。沒有這樣的“轉換”,沒有虛擬地址的概念,這樣做是根本行不通的。對任何一個普通進程來講,它都會涉及到5種不同的數據段。包含有“程序代碼段”、“程序數據段”、“程序堆棧段”等。代碼段:代碼段是用來存放可執行文件的操作指令,也就是說是它是可執行程序在內存中的鏡像。代碼段需要防止在運行時被非法修改,以只準許讀取操作,而不允許寫入操作它是不可寫的。數據段:數據段用來存放可執行文件中已初始化全局變量,換句話說就是存放程序靜態分配的變量和全局變量。BSS段:BSS段包含了程序中未初始化的全局變量,在內存中 bss段全部置零。堆:堆是

11、用于存放進程運行中被動態分配的內存段,它的大小并不固定,可動態擴張或縮減。當進程調用malloc等函數分配內存時,新分配的內存就被動態添加到堆上(堆被擴張);當利用free等函數釋放內存時,被釋放的內存從堆中被剔除(堆被縮減)棧:棧是用戶存放程序臨時創建的局部變量,也就是說我們函數括弧“”中定義的變量(但不包括static聲明的變量,static意味著在數據段中存放變量)。除此以外,在函數被調用時,其參數也會被壓入發起調用的進程棧中,并且待到調用結束后,函數的返回值也會被存放回棧中。由于棧的先進先出特點,所以棧特別方便用來保存/恢復調用現場。從這個意義上講,我們可以把堆棧看成一個寄存、交換臨時

12、數據的內存區。進程內存空間Linux操作系統采用虛擬內存管理技術,使得每個進程都有各自互不干涉的進程地址空間。該空間是塊大小為4G的線性虛擬空間,用戶所看到和接觸到的都是該虛擬地址,無法看到實際的物理內存地址。利用這種虛擬地址不但能起到保護操作系統的效果(用戶不能直接訪問物理內存),而且更重要的是,用戶程序可使用比實際物理內存更大的地址空間(具體的原因請看硬件基礎部分)。 第一、4G的進程地址空間被人為的分為兩個部分用戶空間與內核空間。用戶空間從0到3G(0xC0000000),內核空間占據3G到4G。用戶進程通常情況下只能訪問用戶空間的虛擬地址,不能訪問內核空間虛擬地址。只有用戶進程進行系統

13、調用(代表用戶進程在內核態執行)等時刻可以訪問到內核空間。第二、用戶空間對應進程,所以每當進程切換,用戶空間就會跟著變化;而內核空間是由內核負責映射,它并不會跟著進程改變,是固定的。內核空間地址有自己對應的頁表(init_mm.pgd),用戶進程各自有不同的頁表。 第三、每個進程的用戶空間都是完全獨立、互不相干的。Linux進程調度Linux的進程管理由進程控制塊、進程調度、中斷處理、任務隊列、定時器、bottom half隊列、系統調用、進程通信等等部分組成。進程調用分為實時進程調度和非實時進程調度兩種。前者調度時,可以采用基于動態優先級的輪轉法(RR),也可以采用先進現出算法(FIFO)。

14、 后者調度時,一律采用基于動態優先級的輪轉法。某個進程采用何種調度算法由改進程的進程控制塊中的某些屬性決定,沒有專門的系統用來處理關于進程調度的相 關事宜。 Linux的進程調度由schedule()函數負責,任何進程,當它從系統調用返回時,都會轉入schedule(),而中斷處理函數完成它們的響應任 務以后,也會進入schedule()。進程控制塊數據結構Linux系統的進程控制塊用數據結構task_struct表示,這個數據結構占用1680個字節,具體的內容不在這里介紹。進程調度Linux進程調度由schedule()執行,其任務是在run-queue隊列中選出一個就緒進程。每個進程都有一

15、個調度策略,在它的task_struct中規定(policy屬性),或為SCHED_RR,SCHED_FIFO,或為SCHED_OTHER。前兩種為實時進程調度策略,后一種為普通進程調度策略。用戶進程由do_fork()函數創建,它也是fork系統調用的執行者。do_fork()創建一個新的進程,繼承父進程的現有資源,初始化進程時鐘、信號、時間等數據。完成子進程的初始化后,父進程將它掛到就緒隊列,返回子進程的pid。在支持多進程的系統中,理想情況下,各個進程應該是根據其優先級公平地占有CPU。而不會出現“誰運氣好誰占得多”這樣的不可控的情況。linux進程調度中最基本的數據結構是struct

16、runqueue;有關于此結構的隊列在kernel/sched.c,此隊列包含了處理器的所有可執行進程的信息。 每個運行隊列都有兩個優先級數組,一個活躍的和一個過期的,此數組也是在kernel/sched.c中含有。 schedule函數定義也是在kernel/sched.c中。每個CPU均有兩個具有優先級的隊列。一個“活動”隊列,一個“過期”隊列。活動隊列中包含所有映射于該CPU并具有時間片的任務。而過期隊列包含所有已 經使用完時間片的任務(依然是一個有序隊列)。活動隊列和過期隊列不能直接訪問,而是通過每個CPU的運行隊列結構中的兩個指針來訪問。調度程序不需每次 都掃描所有的任務,而是在一個任務變成就緒狀態時將其放到“活動”的隊列中。當調度程序運行時,只選擇活動隊列中最有利的任務來執行。這樣,調度可以在一 個恒定的時間里完成。當任務執行時,它會得到一個時間片,或者在其轉到另一線程之前得到一段時間的CPU使用權。當時間片用完后,任務會被轉移到“過期” 的隊列中。在該隊列中,任務會根據其優先級進行排序。 當活動隊列中的任務均被運行完時,我們就交換兩個指針,從而使得先前的過期隊列成為活動隊列,同樣先前空閑的活動隊列將轉變為過期隊列。因此,可以看得出 來,“活動”隊列中總是排好了順序的任務隊列,如

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論