版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、計(jì)算機(jī)操作系統(tǒng)上機(jī)實(shí)驗(yàn)第 PAGE 27 頁(yè) 共 NUMPAGES 27 頁(yè) 計(jì)算機(jī)操作系統(tǒng)上機(jī)實(shí)驗(yàn)指導(dǎo)計(jì)算機(jī)學(xué)院 第一部分實(shí)驗(yàn)要求計(jì)算機(jī)操作系統(tǒng)課程實(shí)驗(yàn)的目的是為了使學(xué)生在課程學(xué)習(xí)的同時(shí),通過做實(shí)驗(yàn)理解計(jì)算機(jī)操作系統(tǒng)的資源限制;通過進(jìn)程調(diào)度算法的實(shí)現(xiàn),了解計(jì)算機(jī)操作系統(tǒng)的核心功能。在計(jì)算機(jī)操作系統(tǒng)課程的實(shí)驗(yàn)過程中,要求學(xué)生做到:(1)預(yù)習(xí)實(shí)驗(yàn)指導(dǎo)書有關(guān)部分,認(rèn)真做好實(shí)驗(yàn)內(nèi)容的準(zhǔn)備,就實(shí)驗(yàn)可能出現(xiàn)的情況提前做出思考和分析。(2)按照使用要求認(rèn)真編寫程序,要求有寫出程序設(shè)計(jì)說明,給出程序清單(包括可讀性好的注釋)。(3)認(rèn)真書寫實(shí)驗(yàn)報(bào)告,并在規(guī)定的時(shí)間內(nèi)提交實(shí)驗(yàn)報(bào)告。(4)遵守機(jī)房紀(jì)律,服從輔導(dǎo)
2、教師指揮,愛護(hù)實(shí)驗(yàn)設(shè)備。(5)分散上機(jī)時(shí),積極主動(dòng)上機(jī)完成任務(wù);集中檢查時(shí),不遲到。如有事不能出席,所缺實(shí)驗(yàn)一般不補(bǔ)。(6)實(shí)驗(yàn)的驗(yàn)收將分為兩個(gè)部分。第一部分是上機(jī)操作,包括檢查程序運(yùn)行和即時(shí)提問。第二部分是提交書面的實(shí)驗(yàn)報(bào)告。計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)將采用階段檢查方式,每個(gè)實(shí)驗(yàn)都將應(yīng)當(dāng)在規(guī)定的時(shí)間內(nèi)完成并檢查通過,過期視為未完成該實(shí)驗(yàn),不計(jì)成績(jī)。以避免期末集中檢查方式產(chǎn)生的諸多不良問題,希望同學(xué)們抓緊時(shí)間,合理安排,認(rèn)真完成。實(shí)驗(yàn)1. 操作系統(tǒng)安裝檢查點(diǎn)實(shí)驗(yàn)?zāi)康模和ㄟ^動(dòng)手安裝linux虛擬機(jī),來初步了解一個(gè)操作系統(tǒng)。了解虛擬機(jī),能夠在windows下安裝linux系統(tǒng)和對(duì)VMware虛擬機(jī)進(jìn)行操作
3、。實(shí)驗(yàn)要求:在windows平臺(tái)下使用Vmware安裝Linux系統(tǒng):fedora-15。完成安裝后提交兩個(gè)截圖并回答linux相關(guān)的問題。實(shí)驗(yàn)步驟:(1)在10/labs/lab1/文件夾中下載fedota-15安裝包。(2)安裝VMwareworkstation:實(shí)驗(yàn)室中自帶了VMwarestation ACE,如果上機(jī)時(shí)系統(tǒng)自帶VMware則可跳過下列安裝步驟。雙擊VMware-workstation-full-7.1.4-385536,在彈出界面:安裝提示和版權(quán)警告中選擇“next”;在安裝類型界面中的安裝類型:Typical(典型)和Custom(自定義)中選擇“Typical”。在
4、安裝目錄中選擇change,將安裝目錄轉(zhuǎn)換為F:osvmware(如果沒有目錄則自行建立)。自動(dòng)更新界面:將自動(dòng)更新的選項(xiàng)復(fù)選掉,選擇不自動(dòng)更新。幫助vm收集資料界面中:選擇不幫助vm收集資料;創(chuàng)立快捷鍵界面中:選擇Start.(開始菜單中快捷方式)建立快捷方式。選擇contitue,開始安裝。安裝完畢后選擇restart now。注:其安裝sn放于10/grades/grades1/文件夾(3)安裝linux:fedora-15:開始-所有程序-VMware-VMworkstation,進(jìn)入VMware。點(diǎn)擊上方工具欄中文件-新建-虛擬機(jī)。首先:在彈出界面中選擇典型;下一步:在上方的系統(tǒng)類型
5、中選擇linux,在下方的版本選擇中不選擇;下一步:在虛擬機(jī)名稱中輸入Fedora-15,下方對(duì)話中選擇瀏覽,選擇Linux所要安裝的文件位置F:osfedora(如果沒有請(qǐng)自行建立);下一步:在網(wǎng)絡(luò)連接設(shè)置中選擇使用橋接網(wǎng)絡(luò);下一步:先輸入虛擬磁盤的大小,建議:10GB。完成以上步驟后,我們就回到了最初打開VMware的界面,在左邊f(xié)avourites中出現(xiàn)了我們建立的Fedora-15虛擬機(jī);左鍵單擊Fedora-15,在右側(cè)的設(shè)備欄中雙擊Memory,向右拖動(dòng)滑動(dòng)塊,使得內(nèi)存分配大于600m,建議1024m以上,點(diǎn)擊ok;在右側(cè)的設(shè)備欄中雙擊CD-ROM,在彈出的窗口中選擇使用ISO鏡像
6、,點(diǎn)擊瀏覽,找到我們下載的Fedora-15-i686-Live-Desktop.iso鏡像文件,點(diǎn)ok。 在左側(cè)的命令欄中點(diǎn)擊“啟動(dòng)該虛擬機(jī)”,啟動(dòng)Fedora-15.進(jìn)入漂亮的fedora系統(tǒng)后,我們需要把他從光盤啟動(dòng)安裝到硬盤上。首先:點(diǎn)擊左上角的Applications-System Tools-Install to HardDrive。下一步:在彈出的鍵盤語(yǔ)言選擇中選擇U.S. English。下一步:在安裝硬盤選擇中選擇Basic Storage Devices.下一步:在數(shù)據(jù)是否保留中選擇Yes,discard any data。下一步:在網(wǎng)絡(luò)主機(jī)名名輸入一個(gè)自己喜歡的ID,譬如
7、:Chaos。下一步:選擇自己計(jì)算機(jī)所在的時(shí)域,在圖中找到中國(guó)上海,shanghai,Asia,單擊確定。下一步:設(shè)置系統(tǒng)中root用戶(管理員)的密碼,并重復(fù)一次。密碼為:000000。在彈出框中點(diǎn)Use Anyway。下一步:在這一步中截圖,并逐條解釋每一個(gè)選項(xiàng)的意思。選項(xiàng)不做改變,點(diǎn)擊next。下一步:確認(rèn)安裝,點(diǎn)擊Write Change to Disk。在安裝完畢后出現(xiàn)的窗口中點(diǎn)擊close,在右上角的中選擇live system user-Shut Down,然后選擇Restart。在Restart后我們進(jìn)入了我們安裝的Fedora的設(shè)置界面。WelcomeLicense Info
8、rmation Create User 在這里輸入全名 用戶名 密碼,密碼重復(fù)兩次。(密碼為:000000)Date and Time 修改時(shí)間 Hardware Profile 上傳硬件信息 不做選擇點(diǎn)擊Finish。在彈出框中選擇 No,do not send.稍后,我們鍵入自己的密碼:000000進(jìn)入了我們安裝的Fedora系統(tǒng)。為了記錄我們成功的安裝,打開Application-System Tools-Add/Remove Software后截圖。計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名 學(xué)號(hào) 成績(jī) 年 月 日一、回答問題在LINUX環(huán)境下系統(tǒng)設(shè)備管理,如何知道本機(jī)CPU、內(nèi)存等系統(tǒng)配置?例如查詢
9、顯示器、鍵盤、鼠標(biāo)等屬性磁盤管理,WINDOWS系統(tǒng)分區(qū)、LINUX分區(qū)各占多大?各分區(qū)所在位置? 磁盤文件系統(tǒng)管理,包括WINDOWS文件系統(tǒng)類型、LINUX文件系統(tǒng)類型、LINUX所占三個(gè)分區(qū)容量和用途、啟動(dòng)掛接點(diǎn)等(4)Fedora或Ubuntu 系統(tǒng)下集成的C/C+語(yǔ)言開發(fā)環(huán)境是哪個(gè)?怎樣啟動(dòng)進(jìn)入和使用? 實(shí)驗(yàn)2 Shell基本命令背景知識(shí):ShellShell俗稱殼(用來區(qū)別于核),是指“提供使用者使用界面”的軟件(命令解析器)。它接收用戶命令,然后調(diào)用相應(yīng)的應(yīng)用程序。同時(shí)它又是一種程序設(shè)計(jì)語(yǔ)言。作為命令語(yǔ)言,它交互式解釋和執(zhí)行用戶輸入的命令或者自動(dòng)地解釋和執(zhí)行預(yù)先設(shè)定好的一連串的命
10、令;作為程序設(shè)計(jì)語(yǔ)言,它定義了各種變量和參數(shù),并提供了許多在高階語(yǔ)言中才具有的控制結(jié)構(gòu),包括循環(huán)和分支。 基本上shell分兩大類: 一:圖形界面shell(Graphical User Interface shell 即 GUI shell) 例如:應(yīng)用最為廣泛的 Windows Explorer (微軟的windows系列制作系統(tǒng)),還有也包括廣為人知的 Linux shell,其中l(wèi)inux shell 包括 X window manger (BlackBox和FluxBox),以及功能更強(qiáng)大的CDE、GNOME、KDE、 XFCE。 二:命令行式shell(Command Line I
11、nterface shell ,即CLI shell) 例如: bash / sh / ksh / csh(Unix/linux 系統(tǒng)) COMMAND.COM(MS-DOS 系統(tǒng)) cmd.exe / 命令提示字符(Windows NT 系統(tǒng)) Windows PowerShell(支援 .NET Framework 技術(shù)的 Windows NT 系統(tǒng)) 傳統(tǒng)意義上的shell指的是命令行式的shell,以后如果不特別注明,shell是指命令行式的shell。 文字操作系統(tǒng)與外部最主要的接口就叫做shell。shell是操作系統(tǒng)最外面的一層。shell管理你與操作系統(tǒng)之間的交互:等待你輸入,
12、向操作系統(tǒng)解釋你的輸入,并且處理各種各樣的操作系統(tǒng)的輸出結(jié)果。 shell提供了你與操作系統(tǒng)之間通訊的方式。這種通訊可以以交互方式(從鍵盤輸入,并且可以立即得到響應(yīng)),或者以shell script(非交互)方式執(zhí)行。shell script是放在文件中的一串shell和操作系統(tǒng)命令,它們可以被重復(fù)使用。本質(zhì)上,shell script是命令行命令簡(jiǎn)單的組合到一個(gè)文件里面。 Shell基本上是一個(gè)命令解釋器,類似于DOS下的。它接收用戶命令(如ls等),然后調(diào)用相應(yīng)的應(yīng)用程序。較為通用的shell有標(biāo)準(zhǔn)的Bourne shell (sh)和C shell (csh)。實(shí)驗(yàn)?zāi)康模和ㄟ^學(xué)習(xí)Shel
13、l指令,并成功運(yùn)行相應(yīng)指令,來對(duì)Shell有個(gè)直觀的概念。并且熟悉linux關(guān)于調(diào)用和監(jiān)測(cè)操作系統(tǒng)的重要命令實(shí)驗(yàn)要求:學(xué)習(xí)調(diào)用和監(jiān)測(cè)操作系統(tǒng)的重要命令:(1)查看系統(tǒng)硬件配置(2)查看操作系統(tǒng)類型和版本(3)查看軟件配置情況(4)監(jiān)測(cè)系統(tǒng)資源使用情況(5)查看文件系統(tǒng)配置情況實(shí)驗(yàn)步驟:(1)進(jìn)入linux。完成要求的操作。(2)記錄操作后系統(tǒng)的狀態(tài)。(3)提交實(shí)驗(yàn)報(bào)告。計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名 學(xué)號(hào) 成績(jī) 年 月 日一、回答問題(1)查看系統(tǒng)硬件配置(2)查看操作系統(tǒng)類型和版本(3)查看軟件配置情況(4)監(jiān)測(cè)系統(tǒng)資源使用情況(5)查看文件系統(tǒng)配置情況(6)簡(jiǎn)述windos和linux兩者sh
14、ell的區(qū)別實(shí)驗(yàn)3 Shell腳本編程背景知識(shí): 計(jì)算機(jī)語(yǔ)言是為了各種目的和任務(wù)而開發(fā)的,一個(gè)常見任務(wù)就是把各種不同的已有組件連接起來以完成相關(guān)任務(wù)。大多腳本語(yǔ)言共性是:良好的快速開發(fā),高效率的執(zhí)行,解釋而非編譯執(zhí)行,和其它語(yǔ)言編寫的程序組件之間通信功能很強(qiáng)大。 許多腳本語(yǔ)言用來執(zhí)行一次性任務(wù),尤其是系統(tǒng)管理方面。它可以把服務(wù)組件粘合起來,因此被廣泛用于GUI創(chuàng)建或者命令行,操作系統(tǒng)通常提供一些默認(rèn)的腳本語(yǔ)言,即通常所謂shell腳本語(yǔ)言。 腳本通常以文本(如ASCII)保存,只在被調(diào)用時(shí)進(jìn)行解釋或編譯。 有些腳本是為了特定領(lǐng)域設(shè)計(jì)的,但通常腳本都可以寫更通用的腳本。在大型項(xiàng)目中經(jīng)常把腳本和其
15、它低級(jí)編程語(yǔ)言一起使用,各自發(fā)揮優(yōu)勢(shì)解決特定問題。腳本經(jīng)常用于設(shè)計(jì)互動(dòng)通信,它有許多可以單獨(dú)執(zhí)行的命令,可以做很高級(jí)的操作,(如在傳統(tǒng)的Unix shell (sh)中,大多操作就是程序本身。) 這些高級(jí)命令簡(jiǎn)化了代碼編寫過程。諸如內(nèi)存自動(dòng)管理和溢出檢查等性能問題可以不用考慮。在更低級(jí)或非腳本語(yǔ)言中,內(nèi)存及變量管理和數(shù)據(jù)結(jié)構(gòu)等耗費(fèi)人工,為解決一個(gè)給定問題需要大量代碼,當(dāng)然這樣能夠獲得更為細(xì)致的控制和優(yōu)化。腳本缺少優(yōu)化程序以提速或者降低內(nèi)存的伸縮性。 綜上所述,腳本編程速度更快,且腳本文件明顯小于如同類C程序文件。這種靈活性是以執(zhí)行效率為代價(jià)的。腳本通常是解釋執(zhí)行的,速度可能很慢,且運(yùn)行時(shí)更耗內(nèi)
16、存。在很多案例中,如編寫一些數(shù)十行的小腳本,它所帶來的編寫優(yōu)勢(shì)就遠(yuǎn)遠(yuǎn)超過了運(yùn)行時(shí)的劣勢(shì),尤其是在當(dāng)前程序員工資趨高和硬件成本趨低時(shí)。 然而,在腳本和傳統(tǒng)編程語(yǔ)言之間的界限越來越模糊,尤其是在一系列新語(yǔ)言及其集成暢出現(xiàn)時(shí)。在一些腳本語(yǔ)言中,有經(jīng)驗(yàn)的程序員可以進(jìn)行大量?jī)?yōu)化工作。在大多現(xiàn)代系統(tǒng)中通常有多種合適的腳本語(yǔ)言可以選擇,所以推薦使用多種語(yǔ)言(包括C或匯編語(yǔ)言)編寫一種腳本。在本實(shí)驗(yàn)中推薦使用bash shell或者c shell編寫程序,當(dāng)然,我們也歡迎使用其他語(yǔ)言完成實(shí)驗(yàn)。參考資料:UNIX系統(tǒng)基礎(chǔ)與SHELL編程 ,作者:章衛(wèi)國(guó), 李愛軍,西北工業(yè)大學(xué)出版社出版。精通UNIX Shell
17、腳本編程,作者:(美)Randal K. Michael,電子工業(yè)出版社。中國(guó)IT實(shí)驗(yàn)室Shell編程: HYPERLINK /List_129.html /List_129.htmlLinux Man Pages: HYPERLINK /man1/bash.1.php /man1/bash.1.php實(shí)驗(yàn)?zāi)康模簭?fù)習(xí)shell腳本語(yǔ)言編程,并能完成一些相關(guān)于操作系統(tǒng)的基礎(chǔ)操作。實(shí)驗(yàn)要求:使用腳本編程語(yǔ)言調(diào)用操作系統(tǒng)共用例程:(1)查看主機(jī)名、IP地址(2)創(chuàng)建目錄、文件(3)修改目錄文件屬性(4)基本輸入輸出實(shí)驗(yàn)步驟:(1)進(jìn)入linux。編寫程序完成實(shí)驗(yàn)要求。(2)記錄程序運(yùn)行的結(jié)果。(3)
18、提交實(shí)驗(yàn)報(bào)告(截圖放在實(shí)驗(yàn)報(bào)告里)。計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名 學(xué)號(hào) 成績(jī) 年 月 日程序功能程序代碼程序結(jié)果截圖實(shí)驗(yàn)4 Linux進(jìn)程控制背景知識(shí):進(jìn)程通信:進(jìn)程間通信的目的數(shù)據(jù)傳輸:一個(gè)進(jìn)程需要將它的數(shù)據(jù)發(fā)送給另一個(gè)進(jìn)程,發(fā)送的數(shù)據(jù)量在一個(gè)字節(jié)到幾兆字節(jié)之間。 共享數(shù)據(jù):多個(gè)進(jìn)程想要操作共享數(shù)據(jù),一個(gè)進(jìn)程對(duì)共享數(shù)據(jù)的修改,別的進(jìn)程應(yīng)該立刻看到。 通知事件:一個(gè)進(jìn)程需要向另一個(gè)或一組進(jìn)程發(fā)送消息,通知它(它們)發(fā)生了某種事件(如進(jìn)程終止時(shí)要通知父進(jìn)程)。 資源共享:多個(gè)進(jìn)程之間共享同樣的資源。為了作到這一點(diǎn),需要內(nèi)核提供鎖和同步機(jī)制。 進(jìn)程控制:有些進(jìn)程希望完全控制另一個(gè)進(jìn)程的執(zhí)行(如Deb
19、ug進(jìn)程),此時(shí)控制進(jìn)程希望能夠攔截另一個(gè)進(jìn)程的所有陷入和異常,并能夠及時(shí)知道它的狀態(tài)改變。 進(jìn)程通過與內(nèi)核及其它進(jìn)程之間的互相通信來協(xié)調(diào)它們的行為。Linux支持多種進(jìn)程間通信(IPC)機(jī)制,信號(hào)和管道是其中的兩種。除此之外,Linux還支持System V 的IPC機(jī)制(用首次出現(xiàn)的Unix版本命名)。進(jìn)程間通信有三種 1.發(fā)送信號(hào),是同步的,可以帶參數(shù),也可以不帶參數(shù),如kill或者是sigqueue 2.管道,建立管道進(jìn)行通訊 3.共享內(nèi)存,開辟一塊內(nèi)存區(qū)域,多個(gè)應(yīng)用程序都可以訪問,達(dá)到通訊的目的,但是是異步的。進(jìn)程間通信的部分函數(shù)列舉其中部分相關(guān)于進(jìn)程的函數(shù):fork,getpid,
20、getppid,system,exec.等 fork():可以建立子進(jìn)程。函數(shù)原型:pid_t fork( void );注: pid_t 是一個(gè)宏定義,其實(shí)質(zhì)是定義在#include中的int型,是用來保存進(jìn)程ID的變量。fork函數(shù)會(huì)創(chuàng)建一個(gè)新的子進(jìn)程。其子進(jìn)程會(huì)會(huì)獲得父進(jìn)程的數(shù)據(jù)空間與堆棧能資源的副本。并對(duì)父進(jìn)程的環(huán)境變量、組代碼、用戶代碼、已打開的文件代碼、工作目錄和資源限制進(jìn)行繼承。同時(shí)需要注意的是,子進(jìn)程復(fù)制父進(jìn)程的地址空間的內(nèi)容,因此,子進(jìn)程有自己的地址空間,父子進(jìn)程間對(duì)于這些存儲(chǔ)空間不共享。其返回值將會(huì)在父子進(jìn)程中各返回一次,如果fork失敗則會(huì)返回-1,將其正確的返回值記錄在
21、實(shí)驗(yàn)報(bào)告中記錄。getpid():取得進(jìn)程識(shí)別碼。函數(shù)原型為pid_t getpid(void),由pid_t記錄目前進(jìn)程的進(jìn)程識(shí)別碼。示例:“pid_t p=getpid();”getppid():取得父進(jìn)程識(shí)別碼。其與getpid類似。區(qū)別在于其返回的是目前進(jìn)程的父進(jìn)程識(shí)別碼。system(string):system()會(huì)調(diào)用fork()產(chǎn)生子進(jìn)程,由子進(jìn)程來調(diào)用/bin/sh-c string來執(zhí)行參數(shù)string字符串所代表的命令。exec.():裝入并運(yùn)行其它程序的函數(shù)。exec.是一個(gè)函數(shù)族,這里列出了他的六個(gè)函數(shù)。int execl(const char *path, cons
22、t char *arg, .);int execlp(const char *file, const char *arg, .);int execle(const char *path, const char *arg, ., char *const envp);int execv(const char *path, char *const argv);int execvp(const char *file, char *const argv);int execve(const char *path, char *const argv, char *const envp);其中,*path說明
23、由路徑名指定執(zhí)行程序,如:execl(“/bin/ls”,)*file說明由文件指定執(zhí)行程序;其第二個(gè)參數(shù)以及用省略號(hào)表示的其他參數(shù)一起組成了該程序執(zhí)行時(shí)的參數(shù)表,按照l(shuí)inux中的慣例,參數(shù)表的第一項(xiàng)是不帶路徑的程序文件名。被調(diào)用的程序可以訪問這個(gè)參數(shù)表,它相當(dāng)于shell下的命令行參數(shù)。實(shí)際上,shell本身對(duì)命令的調(diào)用也是用exec來實(shí)現(xiàn)的。由于參數(shù)的個(gè)數(shù)是任意的,所以需要用一個(gè)NULL指針來標(biāo)記參數(shù)表的結(jié)尾。下面列舉了一個(gè)簡(jiǎn)單的范例:int execl(const char* fullpath, const char* arg, )execl(“/bin/ls”,“l(fā)s”,“-l”,N
24、ULL);/如果execl返回,說明其調(diào)用失敗Perror(“execl failed to run ls”);以上幾個(gè)函數(shù)都是包含在頭文件unistd.h中。下面介紹一下wait()函數(shù)。其表頭文件為 #include #include。wait():原型為pid_t wait (int * status);暫停目前進(jìn)程的執(zhí)行,直到有信號(hào)來臨或者子進(jìn)程結(jié)束。如果在調(diào)用wait()時(shí)子進(jìn)程已經(jīng)結(jié)束,則wait()會(huì)立即返回子進(jìn)程結(jié)束狀態(tài)值。子進(jìn)程的結(jié)束狀態(tài)值會(huì)由參數(shù)status 返回,而子進(jìn)程的進(jìn)程識(shí)別碼也會(huì)一起返回。如果不在意結(jié)束狀態(tài)值,則參數(shù)status 可以設(shè)成NULL。實(shí)驗(yàn)?zāi)康模豪斫膺M(jìn)
25、程的概念,并通過實(shí)驗(yàn)明確程序與進(jìn)程的區(qū)別;通過對(duì)于操作系統(tǒng)的交互操作對(duì)于并發(fā)進(jìn)程有一個(gè)直觀的概念;培養(yǎng)在linux系統(tǒng)下關(guān)于進(jìn)程編寫程序的能力。實(shí)驗(yàn)要求:編寫程序:用fork函數(shù)由一個(gè)父進(jìn)程生成兩個(gè)子進(jìn)程,并屏顯三個(gè)進(jìn)程的進(jìn)程ID。要求父進(jìn)程創(chuàng)建子進(jìn)程,在子進(jìn)程中分別用exec函數(shù)與system函數(shù)執(zhí)行“dir -a”。并分析其區(qū)別。分析以下代碼為什么不是只打出來一句話,而是兩句話。 main () pid_tpid;pid=fork();if(pid0)printf(errorinfork!);elseif(pid=0)printf(iamthechildprocess,myprocessi
26、dis%dn,getpid();elseprintf(iamtheparentprocess,myprocessidis%dn,getpid();結(jié)果是 rootlocalhostc#./a.out iamthechildprocess,myprocessidis4286iamtheparentprocess,myprocessidis4285編寫代碼,父進(jìn)程輸出:“father:”后綴pid,子進(jìn)程輸出:“child”,后綴pid;多次運(yùn)行,并以此解釋程序并行原理。實(shí)驗(yàn)步驟:(1)進(jìn)入linux。編寫程序完成實(shí)驗(yàn)要求。(2)記錄程序運(yùn)行的結(jié)果。(3)提交實(shí)驗(yàn)報(bào)告。計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名
27、學(xué)號(hào) 成績(jī) 年 月 日程序功能程序框圖或描述程序代碼實(shí)驗(yàn)5進(jìn)程間的通信機(jī)制背景知識(shí):進(jìn)程間通信的定義為了進(jìn)程相互之間交換數(shù)據(jù),引入了進(jìn)程間通信(IPC )。常用的機(jī)制有:共享內(nèi)存段(shared memory segment)。在內(nèi)存中劃分一段公共區(qū)域供多個(gè)進(jìn)程共享,以達(dá)到在多進(jìn)程間快速、大量的共享數(shù)據(jù)。管道(pipe)是先進(jìn)先出的單向數(shù)據(jù)通道,可在相關(guān)進(jìn)程間傳遞未結(jié)構(gòu)化的數(shù)據(jù)流。FIFO(即命名管道)是擁有永久名稱的管道。除了上述機(jī)制之外,還有信號(hào)量和消息隊(duì)列,在本次實(shí)驗(yàn)里不做要求:信號(hào)量(Semaphore)。允許進(jìn)程相互同步,主要特點(diǎn)為,避免多個(gè)進(jìn)程共享資源時(shí)的沖突。消息隊(duì)列(Messa
28、ge queue)。在進(jìn)程間以隊(duì)列形式異步傳遞少量數(shù)據(jù),例如消息。而在UNIX中也有著面向客戶/服務(wù)器模型而設(shè)計(jì)的,針對(duì)客戶和服務(wù)器程序提供不同的socket 系統(tǒng)調(diào)用。我們通常可以稱為套接字。套接字(Socket)端口式進(jìn)程通信方式。類似于插槽,針對(duì)客戶和服務(wù)器模型,客戶隨即申請(qǐng)一個(gè)Socket,系統(tǒng)為之分配一個(gè)Socket號(hào),雙方根據(jù)Socket號(hào)進(jìn)行通信。實(shí)驗(yàn)?zāi)康模豪斫膺M(jìn)程通信的概念,在前一次學(xué)習(xí)了相關(guān)進(jìn)程控制函數(shù)的基礎(chǔ)上,實(shí)現(xiàn)進(jìn)程間的通信。實(shí)驗(yàn)要求:編寫程序:題目1:使用父進(jìn)程創(chuàng)建四個(gè)子進(jìn)程,在進(jìn)程間用pipe函數(shù)進(jìn)行通信。題目2:使用FIFO函數(shù)進(jìn)行通行,由進(jìn)程A生產(chǎn)數(shù)據(jù),由進(jìn)程B讀
29、取數(shù)據(jù)。題目3:使用管道或者套接字進(jìn)行通信,編寫程序建立四個(gè)進(jìn)程。分別試驗(yàn)三寫一讀、兩寫兩讀情況,多次執(zhí)行后觀察果是否,并對(duì)記錄的執(zhí)行結(jié)果進(jìn)行解釋。計(jì)算機(jī)操作系統(tǒng)實(shí)驗(yàn)報(bào)告姓名 學(xué)號(hào) 成績(jī) 年 月 日程序功能程序框圖或描述程序代碼實(shí)驗(yàn)6 Linux線程控制背景知識(shí): 線程,是程序執(zhí)行流的最小單元。一個(gè)標(biāo)準(zhǔn)的線程由線程ID,當(dāng)前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進(jìn)程中的一個(gè)實(shí)體,是被系統(tǒng)獨(dú)立調(diào)度和分派的基本單位,線程自己不擁有系統(tǒng)資源,只擁有一點(diǎn)在運(yùn)行中必不可少的資源,但它可與同屬一個(gè)進(jìn)程的其它線程共享進(jìn)程所擁有的全部資源。一個(gè)線程可以創(chuàng)建和撤消另一個(gè)線程,同一進(jìn)程中的多個(gè)線程之
30、間可以并發(fā)執(zhí)行。由于線程之間的相互制約,致使線程在運(yùn)行中呈現(xiàn)出間斷性。線程也有就緒、阻塞和運(yùn)行三種基本狀態(tài)。每一個(gè)程序都至少有一個(gè)線程,那就是程序本身。線程是程序中一個(gè)單一的順序控制流程。在單個(gè)程序中同時(shí)運(yùn)行多個(gè)線程完成不同的工作,稱為多線程。使用多線程的理由之一是和進(jìn)程相比,它是一種非常節(jié)儉的多任務(wù)操作方式。我們知道,在Linux系統(tǒng)下,啟動(dòng)一個(gè)新的進(jìn)程必須分配給它獨(dú)立的地址空間,建立眾多的數(shù)據(jù)表來維護(hù)它的代碼段、堆棧段和數(shù)據(jù)段,這是一種昂貴的多任務(wù)工作方式。而運(yùn)行于一個(gè)進(jìn)程中的多個(gè)線程,它們彼此之間使用相同的地址空間,共享大部分?jǐn)?shù)據(jù),啟動(dòng)一個(gè)線程所花費(fèi)的空間遠(yuǎn)遠(yuǎn)小于啟動(dòng)一個(gè)進(jìn)程所花費(fèi)的空間
31、,而且,線程間彼此切換所需的時(shí)間也遠(yuǎn)遠(yuǎn)小于進(jìn)程間切換所需要的時(shí)間。據(jù)統(tǒng)計(jì),總的說來,一個(gè)進(jìn)程的開銷大約是一個(gè)線程開銷的30倍左右,當(dāng)然,在具體的系統(tǒng)上,這個(gè)數(shù)據(jù)可能會(huì)有較大的區(qū)別。使用多線程的理由之二是線程間方便的通信機(jī)制。對(duì)不同進(jìn)程來說,它們具有獨(dú)立的數(shù)據(jù)空間,要進(jìn)行數(shù)據(jù)的傳遞只能通過通信的方式進(jìn)行,這種方式不僅費(fèi)時(shí),而且很不方便。線程則不然,由于同一進(jìn)程下的線程之間共享數(shù)據(jù)空間,所以一個(gè)線程的數(shù)據(jù)可以直接為其它線程所用,這不僅快捷,而且方便。當(dāng)然,數(shù)據(jù)的共享也帶來其他一些問題,有的變量不能同時(shí)被兩個(gè)線程所修改,有的子程序中聲明為static的數(shù)據(jù)更有可能給多線程程序帶來災(zāi)難性的打擊,這些正
32、是編寫多線程程序時(shí)最需要注意的地方。除了以上所說的優(yōu)點(diǎn)外,不和進(jìn)程比較,多線程程序作為一種多任務(wù)、并發(fā)的工作方式,當(dāng)然有以下的優(yōu)點(diǎn):1) 提高應(yīng)用程序響應(yīng)。這對(duì)圖形界面的程序尤其有意義,當(dāng)一個(gè)操作耗時(shí)很長(zhǎng)時(shí),整個(gè)系統(tǒng)都會(huì)等待這個(gè)操作,此時(shí)程序不會(huì)響應(yīng)鍵盤、鼠標(biāo)、菜單的操作,而使用多線程技術(shù),將耗時(shí)長(zhǎng)的操作(time consuming)置于一個(gè)新的線程,可以避免這種尷尬的情況。2) 使多CPU系統(tǒng)更加有效。操作系統(tǒng)會(huì)保證當(dāng)線程數(shù)不大于CPU數(shù)目時(shí),不同的線程運(yùn)行于不同的CPU上。3) 改善程序結(jié)構(gòu)。一個(gè)既長(zhǎng)又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú)立的運(yùn)行部分,這樣的程序會(huì)利于理解和
33、修改。線程函數(shù)進(jìn)程創(chuàng)建函數(shù)創(chuàng)建線程實(shí)際上就是確定調(diào)用該線程函數(shù)的入口點(diǎn),這里通常使用的函數(shù)是pthread_create()。在線程創(chuàng)建以后,就開始運(yùn)行相關(guān)的線程函數(shù),在該函數(shù)運(yùn)行完之后,該線程也就退出了,這也是線程退出一種方法。所需頭文件#include 函數(shù)原型int pthread_create (pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg)函數(shù)傳入值thread:線程標(biāo)識(shí)符attr:線程屬性設(shè)置(其具體設(shè)置參見9.2.3小節(jié)),通常取為NULLstart_routin
34、e:線程函數(shù)的起始地址,是一個(gè)以指向void的指針作為參數(shù)和返回值的函數(shù)指針arg:傳遞給start_routine的參數(shù)函數(shù)返回值成功:0出錯(cuò):返回錯(cuò)誤碼進(jìn)程退出函數(shù)線程退出時(shí)使用函數(shù)pthread_exit,是線程的主動(dòng)行為。注意進(jìn)程退出時(shí)使用exit函數(shù),線程中用pthread_exit替代exit。所需頭文件#include 函數(shù)原型void pthread_exit(void *retval)函數(shù)傳入值retval:線程結(jié)束時(shí)的返回值,可由其他函數(shù)如pthread_join()來獲取等待函數(shù)(等待一個(gè)線程的結(jié)束)由于一個(gè)進(jìn)程中的多個(gè)線程共享數(shù)據(jù)段,因此通常在線程退出后,退出線程所占用
35、的資源并不會(huì)隨線程結(jié)束而釋放。所有需要pthread_join函數(shù)來等待線程結(jié)束。類似于wait系統(tǒng)調(diào)用。所需頭文件#include 函數(shù)原型int pthread_join (pthread_t th, void *thread_return)函數(shù)傳入值th:等待線程的標(biāo)識(shí)符thread_return:用戶定義的指針,用來存儲(chǔ)被等待線程結(jié)束時(shí)的返回值(不為NULL時(shí))函數(shù)返回值成功:0出錯(cuò):返回錯(cuò)誤碼互斥鎖線程控制互斥鎖是用一種簡(jiǎn)單的加鎖方法來控制對(duì)共享資源的原子操作。這個(gè)互斥鎖只有兩種狀態(tài),也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。在同一時(shí)刻只能有一個(gè)線程掌握某個(gè)互斥鎖,擁有
36、上鎖狀態(tài)的線程能夠?qū)蚕碣Y源進(jìn)行操作。若其他線程希望上鎖一個(gè)已經(jīng)被上鎖的互斥鎖,則該線程就會(huì)掛起,直到上鎖的線程釋放掉互斥鎖為止??梢哉f,這把互斥鎖保證讓每個(gè)線程對(duì)共享資源按順序進(jìn)行原子操作。互斥鎖機(jī)制主要包括下面的基本函數(shù)?;コ怄i初始化:pthread_mutex_init()互斥鎖上鎖:pthread_mutex_lock()互斥鎖判斷上鎖:pthread_mutex_trylock()互斥鎖接鎖:pthread_mutex_unlock()消除互斥鎖:pthread_mutex_destroy()其中,互斥鎖可以分為快速互斥鎖、遞歸互斥鎖和檢錯(cuò)互斥鎖。這3種鎖的區(qū)別主要在于其他未占有互斥
37、鎖的線程在希望得到互斥鎖時(shí)是否需要阻塞等待??焖冁i是指調(diào)用線程會(huì)阻塞直至擁有互斥鎖的線程解鎖為止。遞歸互斥鎖能夠成功地返回,并且增加調(diào)用線程在互斥上加鎖的次數(shù),而檢錯(cuò)互斥鎖則為快速互斥鎖的非阻塞版本,它會(huì)立即返回并返回一個(gè)錯(cuò)誤信息。默認(rèn)屬性為快速互斥鎖。所需頭文件#include 函數(shù)原型int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)函數(shù)傳入值mutex:互斥鎖MutexattrPTHREAD_MUTEX_INITIALIZER:創(chuàng)建快速互斥鎖PTHREAD_RECURSI
38、VE_MUTEX_INITIALIZER_NP:創(chuàng)建遞歸互斥鎖PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:創(chuàng)建檢錯(cuò)互斥鎖函數(shù)返回值成功:0出錯(cuò):返回錯(cuò)誤碼所需頭文件#include 函數(shù)原型int pthread_mutex_lock(pthread_mutex_t *mutex,)int pthread_mutex_trylock(pthread_mutex_t *mutex,)int pthread_mutex_unlock(pthread_mutex_t *mutex,)int pthread_mutex_destroy(pthread_mutex_t
39、 *mutex,)函數(shù)傳入值mutex:互斥鎖函數(shù)返回值成功:0出錯(cuò):1信號(hào)量線程控制信號(hào)量也就是操作系統(tǒng)中所用到的PV原子操作,它廣泛用于進(jìn)程或線程間的同步與互斥。信號(hào)量本質(zhì)上是一個(gè)非負(fù)的整數(shù)計(jì)數(shù)器,它被用來控制對(duì)公共資源的訪問。這里先來簡(jiǎn)單復(fù)習(xí)一下PV原子操作的工作原理。PV原子操作是對(duì)整數(shù)計(jì)數(shù)器信號(hào)量sem的操作。一次P操作使sem減一,而一次V操作使sem加一。進(jìn)程(或線程)根據(jù)信號(hào)量的值來判斷是否對(duì)公共資源具有訪問權(quán)限。當(dāng)信號(hào)量sem的值大于等于零時(shí),該進(jìn)程(或線程)具有公共資源的訪問權(quán)限;相反,當(dāng)信號(hào)量sem的值小于零時(shí),該進(jìn)程(或線程)就將阻塞直到信號(hào)量sem的值大于等于0為止。PV原子操作主要用于進(jìn)程或線程間的同步和互斥這兩種典型情況。Linux實(shí)現(xiàn)了POSIX的無(wú)名信號(hào)量,主要用于線程間的互斥與同步。這里主要介紹幾個(gè)常見函數(shù)。sem_init()用于創(chuàng)建一個(gè)信號(hào)量,并初始化它的值。sem_wait()和sem_trywait()都相當(dāng)于P操作,在信號(hào)量大于零時(shí)它們都能將信號(hào)量的值減一,兩者的區(qū)別在于若信號(hào)量小于零時(shí),sem_wait()將會(huì)阻塞進(jìn)程,而sem_trywait()則會(huì)立即返回。sem_post()相當(dāng)于V操作,它將信號(hào)量的值加一同時(shí)發(fā)出信號(hào)來喚醒等待的進(jìn)程。sem_getv
溫馨提示
- 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 翻地合同范例
- 采購(gòu)玉米居間合同范例
- 找人辦事居間協(xié)議合同范例
- 裝飾裝修服務(wù)合同范例
- 簡(jiǎn)易旅社用工合同范例
- 醫(yī)院保潔用工合同范例
- 合作用工合同范例
- 2025年漯河道路運(yùn)輸從業(yè)資格證考試
- 2025年臨汾普通貨運(yùn)從業(yè)資格證模擬考試
- 2025年巴中a2貨運(yùn)從業(yè)資格證模擬考試題
- 風(fēng)險(xiǎn)分級(jí)管控和隱患排查治理體系培訓(xùn)考試試題(附答案)
- 項(xiàng)目四任務(wù)1:認(rèn)識(shí)毫米波雷達(dá)(課件)
- 跳繩體育教案
- 2024年一級(jí)注冊(cè)建筑師理論考試題庫(kù)ab卷
- 試驗(yàn)檢測(cè)方案
- 2024年軟件開發(fā)調(diào)試合同樣本(二篇)
- 地理月考分析及改進(jìn)措施初中生
- 中醫(yī)師承指導(dǎo)老師學(xué)術(shù)思想
- 課程設(shè)計(jì)報(bào)告數(shù)據(jù)庫(kù)原理與應(yīng)用樣本
- 2024年北京控股集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- (完整word版)體檢報(bào)告單模版
評(píng)論
0/150
提交評(píng)論