內蒙古大學《計算機操作系統》上機實驗指導_第1頁
內蒙古大學《計算機操作系統》上機實驗指導_第2頁
內蒙古大學《計算機操作系統》上機實驗指導_第3頁
內蒙古大學《計算機操作系統》上機實驗指導_第4頁
內蒙古大學《計算機操作系統》上機實驗指導_第5頁
已閱讀5頁,還剩22頁未讀 繼續免費閱讀

VIP免費下載

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

文檔簡介

1、計算機操作系統上機實驗第 PAGE 27 頁 共 NUMPAGES 27 頁 計算機操作系統上機實驗指導計算機學院 第一部分實驗要求計算機操作系統課程實驗的目的是為了使學生在課程學習的同時,通過做實驗理解計算機操作系統的資源限制;通過進程調度算法的實現,了解計算機操作系統的核心功能。在計算機操作系統課程的實驗過程中,要求學生做到:(1)預習實驗指導書有關部分,認真做好實驗內容的準備,就實驗可能出現的情況提前做出思考和分析。(2)按照使用要求認真編寫程序,要求有寫出程序設計說明,給出程序清單(包括可讀性好的注釋)。(3)認真書寫實驗報告,并在規定的時間內提交實驗報告。(4)遵守機房紀律,服從輔導

2、教師指揮,愛護實驗設備。(5)分散上機時,積極主動上機完成任務;集中檢查時,不遲到。如有事不能出席,所缺實驗一般不補。(6)實驗的驗收將分為兩個部分。第一部分是上機操作,包括檢查程序運行和即時提問。第二部分是提交書面的實驗報告。計算機操作系統實驗將采用階段檢查方式,每個實驗都將應當在規定的時間內完成并檢查通過,過期視為未完成該實驗,不計成績。以避免期末集中檢查方式產生的諸多不良問題,希望同學們抓緊時間,合理安排,認真完成。實驗1. 操作系統安裝檢查點實驗目的:通過動手安裝linux虛擬機,來初步了解一個操作系統。了解虛擬機,能夠在windows下安裝linux系統和對VMware虛擬機進行操作

3、。實驗要求:在windows平臺下使用Vmware安裝Linux系統:fedora-15。完成安裝后提交兩個截圖并回答linux相關的問題。實驗步驟:(1)在10/labs/lab1/文件夾中下載fedota-15安裝包。(2)安裝VMwareworkstation:實驗室中自帶了VMwarestation ACE,如果上機時系統自帶VMware則可跳過下列安裝步驟。雙擊VMware-workstation-full-7.1.4-385536,在彈出界面:安裝提示和版權警告中選擇“next”;在安裝類型界面中的安裝類型:Typical(典型)和Custom(自定義)中選擇“Typical”。在

4、安裝目錄中選擇change,將安裝目錄轉換為F:osvmware(如果沒有目錄則自行建立)。自動更新界面:將自動更新的選項復選掉,選擇不自動更新。幫助vm收集資料界面中:選擇不幫助vm收集資料;創立快捷鍵界面中:選擇Start.(開始菜單中快捷方式)建立快捷方式。選擇contitue,開始安裝。安裝完畢后選擇restart now。注:其安裝sn放于10/grades/grades1/文件夾(3)安裝linux:fedora-15:開始-所有程序-VMware-VMworkstation,進入VMware。點擊上方工具欄中文件-新建-虛擬機。首先:在彈出界面中選擇典型;下一步:在上方的系統類型

5、中選擇linux,在下方的版本選擇中不選擇;下一步:在虛擬機名稱中輸入Fedora-15,下方對話中選擇瀏覽,選擇Linux所要安裝的文件位置F:osfedora(如果沒有請自行建立);下一步:在網絡連接設置中選擇使用橋接網絡;下一步:先輸入虛擬磁盤的大小,建議:10GB。完成以上步驟后,我們就回到了最初打開VMware的界面,在左邊favourites中出現了我們建立的Fedora-15虛擬機;左鍵單擊Fedora-15,在右側的設備欄中雙擊Memory,向右拖動滑動塊,使得內存分配大于600m,建議1024m以上,點擊ok;在右側的設備欄中雙擊CD-ROM,在彈出的窗口中選擇使用ISO鏡像

6、,點擊瀏覽,找到我們下載的Fedora-15-i686-Live-Desktop.iso鏡像文件,點ok。 在左側的命令欄中點擊“啟動該虛擬機”,啟動Fedora-15.進入漂亮的fedora系統后,我們需要把他從光盤啟動安裝到硬盤上。首先:點擊左上角的Applications-System Tools-Install to HardDrive。下一步:在彈出的鍵盤語言選擇中選擇U.S. English。下一步:在安裝硬盤選擇中選擇Basic Storage Devices.下一步:在數據是否保留中選擇Yes,discard any data。下一步:在網絡主機名名輸入一個自己喜歡的ID,譬如

7、:Chaos。下一步:選擇自己計算機所在的時域,在圖中找到中國上海,shanghai,Asia,單擊確定。下一步:設置系統中root用戶(管理員)的密碼,并重復一次。密碼為:000000。在彈出框中點Use Anyway。下一步:在這一步中截圖,并逐條解釋每一個選項的意思。選項不做改變,點擊next。下一步:確認安裝,點擊Write Change to Disk。在安裝完畢后出現的窗口中點擊close,在右上角的中選擇live system user-Shut Down,然后選擇Restart。在Restart后我們進入了我們安裝的Fedora的設置界面。WelcomeLicense Info

8、rmation Create User 在這里輸入全名 用戶名 密碼,密碼重復兩次。(密碼為:000000)Date and Time 修改時間 Hardware Profile 上傳硬件信息 不做選擇點擊Finish。在彈出框中選擇 No,do not send.稍后,我們鍵入自己的密碼:000000進入了我們安裝的Fedora系統。為了記錄我們成功的安裝,打開Application-System Tools-Add/Remove Software后截圖。計算機操作系統實驗報告姓名 學號 成績 年 月 日一、回答問題在LINUX環境下系統設備管理,如何知道本機CPU、內存等系統配置?例如查詢

9、顯示器、鍵盤、鼠標等屬性磁盤管理,WINDOWS系統分區、LINUX分區各占多大?各分區所在位置? 磁盤文件系統管理,包括WINDOWS文件系統類型、LINUX文件系統類型、LINUX所占三個分區容量和用途、啟動掛接點等(4)Fedora或Ubuntu 系統下集成的C/C+語言開發環境是哪個?怎樣啟動進入和使用? 實驗2 Shell基本命令背景知識:ShellShell俗稱殼(用來區別于核),是指“提供使用者使用界面”的軟件(命令解析器)。它接收用戶命令,然后調用相應的應用程序。同時它又是一種程序設計語言。作為命令語言,它交互式解釋和執行用戶輸入的命令或者自動地解釋和執行預先設定好的一連串的命

10、令;作為程序設計語言,它定義了各種變量和參數,并提供了許多在高階語言中才具有的控制結構,包括循環和分支。 基本上shell分兩大類: 一:圖形界面shell(Graphical User Interface shell 即 GUI shell) 例如:應用最為廣泛的 Windows Explorer (微軟的windows系列制作系統),還有也包括廣為人知的 Linux shell,其中linux shell 包括 X window manger (BlackBox和FluxBox),以及功能更強大的CDE、GNOME、KDE、 XFCE。 二:命令行式shell(Command Line I

11、nterface shell ,即CLI shell) 例如: bash / sh / ksh / csh(Unix/linux 系統) COMMAND.COM(MS-DOS 系統) cmd.exe / 命令提示字符(Windows NT 系統) Windows PowerShell(支援 .NET Framework 技術的 Windows NT 系統) 傳統意義上的shell指的是命令行式的shell,以后如果不特別注明,shell是指命令行式的shell。 文字操作系統與外部最主要的接口就叫做shell。shell是操作系統最外面的一層。shell管理你與操作系統之間的交互:等待你輸入,

12、向操作系統解釋你的輸入,并且處理各種各樣的操作系統的輸出結果。 shell提供了你與操作系統之間通訊的方式。這種通訊可以以交互方式(從鍵盤輸入,并且可以立即得到響應),或者以shell script(非交互)方式執行。shell script是放在文件中的一串shell和操作系統命令,它們可以被重復使用。本質上,shell script是命令行命令簡單的組合到一個文件里面。 Shell基本上是一個命令解釋器,類似于DOS下的。它接收用戶命令(如ls等),然后調用相應的應用程序。較為通用的shell有標準的Bourne shell (sh)和C shell (csh)。實驗目的:通過學習Shel

13、l指令,并成功運行相應指令,來對Shell有個直觀的概念。并且熟悉linux關于調用和監測操作系統的重要命令實驗要求:學習調用和監測操作系統的重要命令:(1)查看系統硬件配置(2)查看操作系統類型和版本(3)查看軟件配置情況(4)監測系統資源使用情況(5)查看文件系統配置情況實驗步驟:(1)進入linux。完成要求的操作。(2)記錄操作后系統的狀態。(3)提交實驗報告。計算機操作系統實驗報告姓名 學號 成績 年 月 日一、回答問題(1)查看系統硬件配置(2)查看操作系統類型和版本(3)查看軟件配置情況(4)監測系統資源使用情況(5)查看文件系統配置情況(6)簡述windos和linux兩者sh

14、ell的區別實驗3 Shell腳本編程背景知識: 計算機語言是為了各種目的和任務而開發的,一個常見任務就是把各種不同的已有組件連接起來以完成相關任務。大多腳本語言共性是:良好的快速開發,高效率的執行,解釋而非編譯執行,和其它語言編寫的程序組件之間通信功能很強大。 許多腳本語言用來執行一次性任務,尤其是系統管理方面。它可以把服務組件粘合起來,因此被廣泛用于GUI創建或者命令行,操作系統通常提供一些默認的腳本語言,即通常所謂shell腳本語言。 腳本通常以文本(如ASCII)保存,只在被調用時進行解釋或編譯。 有些腳本是為了特定領域設計的,但通常腳本都可以寫更通用的腳本。在大型項目中經常把腳本和其

15、它低級編程語言一起使用,各自發揮優勢解決特定問題。腳本經常用于設計互動通信,它有許多可以單獨執行的命令,可以做很高級的操作,(如在傳統的Unix shell (sh)中,大多操作就是程序本身。) 這些高級命令簡化了代碼編寫過程。諸如內存自動管理和溢出檢查等性能問題可以不用考慮。在更低級或非腳本語言中,內存及變量管理和數據結構等耗費人工,為解決一個給定問題需要大量代碼,當然這樣能夠獲得更為細致的控制和優化。腳本缺少優化程序以提速或者降低內存的伸縮性。 綜上所述,腳本編程速度更快,且腳本文件明顯小于如同類C程序文件。這種靈活性是以執行效率為代價的。腳本通常是解釋執行的,速度可能很慢,且運行時更耗內

16、存。在很多案例中,如編寫一些數十行的小腳本,它所帶來的編寫優勢就遠遠超過了運行時的劣勢,尤其是在當前程序員工資趨高和硬件成本趨低時。 然而,在腳本和傳統編程語言之間的界限越來越模糊,尤其是在一系列新語言及其集成暢出現時。在一些腳本語言中,有經驗的程序員可以進行大量優化工作。在大多現代系統中通常有多種合適的腳本語言可以選擇,所以推薦使用多種語言(包括C或匯編語言)編寫一種腳本。在本實驗中推薦使用bash shell或者c shell編寫程序,當然,我們也歡迎使用其他語言完成實驗。參考資料:UNIX系統基礎與SHELL編程 ,作者:章衛國, 李愛軍,西北工業大學出版社出版。精通UNIX Shell

17、腳本編程,作者:(美)Randal K. Michael,電子工業出版社。中國IT實驗室Shell編程: HYPERLINK /List_129.html /List_129.htmlLinux Man Pages: HYPERLINK /man1/bash.1.php /man1/bash.1.php實驗目的:復習shell腳本語言編程,并能完成一些相關于操作系統的基礎操作。實驗要求:使用腳本編程語言調用操作系統共用例程:(1)查看主機名、IP地址(2)創建目錄、文件(3)修改目錄文件屬性(4)基本輸入輸出實驗步驟:(1)進入linux。編寫程序完成實驗要求。(2)記錄程序運行的結果。(3)

18、提交實驗報告(截圖放在實驗報告里)。計算機操作系統實驗報告姓名 學號 成績 年 月 日程序功能程序代碼程序結果截圖實驗4 Linux進程控制背景知識:進程通信:進程間通信的目的數據傳輸:一個進程需要將它的數據發送給另一個進程,發送的數據量在一個字節到幾兆字節之間。 共享數據:多個進程想要操作共享數據,一個進程對共享數據的修改,別的進程應該立刻看到。 通知事件:一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件(如進程終止時要通知父進程)。 資源共享:多個進程之間共享同樣的資源。為了作到這一點,需要內核提供鎖和同步機制。 進程控制:有些進程希望完全控制另一個進程的執行(如Deb

19、ug進程),此時控制進程希望能夠攔截另一個進程的所有陷入和異常,并能夠及時知道它的狀態改變。 進程通過與內核及其它進程之間的互相通信來協調它們的行為。Linux支持多種進程間通信(IPC)機制,信號和管道是其中的兩種。除此之外,Linux還支持System V 的IPC機制(用首次出現的Unix版本命名)。進程間通信有三種 1.發送信號,是同步的,可以帶參數,也可以不帶參數,如kill或者是sigqueue 2.管道,建立管道進行通訊 3.共享內存,開辟一塊內存區域,多個應用程序都可以訪問,達到通訊的目的,但是是異步的。進程間通信的部分函數列舉其中部分相關于進程的函數:fork,getpid,

20、getppid,system,exec.等 fork():可以建立子進程。函數原型:pid_t fork( void );注: pid_t 是一個宏定義,其實質是定義在#include中的int型,是用來保存進程ID的變量。fork函數會創建一個新的子進程。其子進程會會獲得父進程的數據空間與堆棧能資源的副本。并對父進程的環境變量、組代碼、用戶代碼、已打開的文件代碼、工作目錄和資源限制進行繼承。同時需要注意的是,子進程復制父進程的地址空間的內容,因此,子進程有自己的地址空間,父子進程間對于這些存儲空間不共享。其返回值將會在父子進程中各返回一次,如果fork失敗則會返回-1,將其正確的返回值記錄在

21、實驗報告中記錄。getpid():取得進程識別碼。函數原型為pid_t getpid(void),由pid_t記錄目前進程的進程識別碼。示例:“pid_t p=getpid();”getppid():取得父進程識別碼。其與getpid類似。區別在于其返回的是目前進程的父進程識別碼。system(string):system()會調用fork()產生子進程,由子進程來調用/bin/sh-c string來執行參數string字符串所代表的命令。exec.():裝入并運行其它程序的函數。exec.是一個函數族,這里列出了他的六個函數。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、由路徑名指定執行程序,如:execl(“/bin/ls”,)*file說明由文件指定執行程序;其第二個參數以及用省略號表示的其他參數一起組成了該程序執行時的參數表,按照linux中的慣例,參數表的第一項是不帶路徑的程序文件名。被調用的程序可以訪問這個參數表,它相當于shell下的命令行參數。實際上,shell本身對命令的調用也是用exec來實現的。由于參數的個數是任意的,所以需要用一個NULL指針來標記參數表的結尾。下面列舉了一個簡單的范例:int execl(const char* fullpath, const char* arg, )execl(“/bin/ls”,“ls”,“-l”,N

24、ULL);/如果execl返回,說明其調用失敗Perror(“execl failed to run ls”);以上幾個函數都是包含在頭文件unistd.h中。下面介紹一下wait()函數。其表頭文件為 #include #include。wait():原型為pid_t wait (int * status);暫停目前進程的執行,直到有信號來臨或者子進程結束。如果在調用wait()時子進程已經結束,則wait()會立即返回子進程結束狀態值。子進程的結束狀態值會由參數status 返回,而子進程的進程識別碼也會一起返回。如果不在意結束狀態值,則參數status 可以設成NULL。實驗目的:理解進

25、程的概念,并通過實驗明確程序與進程的區別;通過對于操作系統的交互操作對于并發進程有一個直觀的概念;培養在linux系統下關于進程編寫程序的能力。實驗要求:編寫程序:用fork函數由一個父進程生成兩個子進程,并屏顯三個進程的進程ID。要求父進程創建子進程,在子進程中分別用exec函數與system函數執行“dir -a”。并分析其區別。分析以下代碼為什么不是只打出來一句話,而是兩句話。 main () pid_tpid;pid=fork();if(pid0)printf(errorinfork!);elseif(pid=0)printf(iamthechildprocess,myprocessi

26、dis%dn,getpid();elseprintf(iamtheparentprocess,myprocessidis%dn,getpid();結果是 rootlocalhostc#./a.out iamthechildprocess,myprocessidis4286iamtheparentprocess,myprocessidis4285編寫代碼,父進程輸出:“father:”后綴pid,子進程輸出:“child”,后綴pid;多次運行,并以此解釋程序并行原理。實驗步驟:(1)進入linux。編寫程序完成實驗要求。(2)記錄程序運行的結果。(3)提交實驗報告。計算機操作系統實驗報告姓名

27、學號 成績 年 月 日程序功能程序框圖或描述程序代碼實驗5進程間的通信機制背景知識:進程間通信的定義為了進程相互之間交換數據,引入了進程間通信(IPC )。常用的機制有:共享內存段(shared memory segment)。在內存中劃分一段公共區域供多個進程共享,以達到在多進程間快速、大量的共享數據。管道(pipe)是先進先出的單向數據通道,可在相關進程間傳遞未結構化的數據流。FIFO(即命名管道)是擁有永久名稱的管道。除了上述機制之外,還有信號量和消息隊列,在本次實驗里不做要求:信號量(Semaphore)。允許進程相互同步,主要特點為,避免多個進程共享資源時的沖突。消息隊列(Messa

28、ge queue)。在進程間以隊列形式異步傳遞少量數據,例如消息。而在UNIX中也有著面向客戶/服務器模型而設計的,針對客戶和服務器程序提供不同的socket 系統調用。我們通常可以稱為套接字。套接字(Socket)端口式進程通信方式。類似于插槽,針對客戶和服務器模型,客戶隨即申請一個Socket,系統為之分配一個Socket號,雙方根據Socket號進行通信。實驗目的:理解進程通信的概念,在前一次學習了相關進程控制函數的基礎上,實現進程間的通信。實驗要求:編寫程序:題目1:使用父進程創建四個子進程,在進程間用pipe函數進行通信。題目2:使用FIFO函數進行通行,由進程A生產數據,由進程B讀

29、取數據。題目3:使用管道或者套接字進行通信,編寫程序建立四個進程。分別試驗三寫一讀、兩寫兩讀情況,多次執行后觀察果是否,并對記錄的執行結果進行解釋。計算機操作系統實驗報告姓名 學號 成績 年 月 日程序功能程序框圖或描述程序代碼實驗6 Linux線程控制背景知識: 線程,是程序執行流的最小單元。一個標準的線程由線程ID,當前指令指針(PC),寄存器集合和堆棧組成。另外,線程是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之

30、間可以并發執行。由于線程之間的相互制約,致使線程在運行中呈現出間斷性。線程也有就緒、阻塞和運行三種基本狀態。每一個程序都至少有一個線程,那就是程序本身。線程是程序中一個單一的順序控制流程。在單個程序中同時運行多個線程完成不同的工作,稱為多線程。使用多線程的理由之一是和進程相比,它是一種非常節儉的多任務操作方式。我們知道,在Linux系統下,啟動一個新的進程必須分配給它獨立的地址空間,建立眾多的數據表來維護它的代碼段、堆棧段和數據段,這是一種昂貴的多任務工作方式。而運行于一個進程中的多個線程,它們彼此之間使用相同的地址空間,共享大部分數據,啟動一個線程所花費的空間遠遠小于啟動一個進程所花費的空間

31、,而且,線程間彼此切換所需的時間也遠遠小于進程間切換所需要的時間。據統計,總的說來,一個進程的開銷大約是一個線程開銷的30倍左右,當然,在具體的系統上,這個數據可能會有較大的區別。使用多線程的理由之二是線程間方便的通信機制。對不同進程來說,它們具有獨立的數據空間,要進行數據的傳遞只能通過通信的方式進行,這種方式不僅費時,而且很不方便。線程則不然,由于同一進程下的線程之間共享數據空間,所以一個線程的數據可以直接為其它線程所用,這不僅快捷,而且方便。當然,數據的共享也帶來其他一些問題,有的變量不能同時被兩個線程所修改,有的子程序中聲明為static的數據更有可能給多線程程序帶來災難性的打擊,這些正

32、是編寫多線程程序時最需要注意的地方。除了以上所說的優點外,不和進程比較,多線程程序作為一種多任務、并發的工作方式,當然有以下的優點:1) 提高應用程序響應。這對圖形界面的程序尤其有意義,當一個操作耗時很長時,整個系統都會等待這個操作,此時程序不會響應鍵盤、鼠標、菜單的操作,而使用多線程技術,將耗時長的操作(time consuming)置于一個新的線程,可以避免這種尷尬的情況。2) 使多CPU系統更加有效。操作系統會保證當線程數不大于CPU數目時,不同的線程運行于不同的CPU上。3) 改善程序結構。一個既長又復雜的進程可以考慮分為多個線程,成為幾個獨立或半獨立的運行部分,這樣的程序會利于理解和

33、修改。線程函數進程創建函數創建線程實際上就是確定調用該線程函數的入口點,這里通常使用的函數是pthread_create()。在線程創建以后,就開始運行相關的線程函數,在該函數運行完之后,該線程也就退出了,這也是線程退出一種方法。所需頭文件#include 函數原型int pthread_create (pthread_t *thread, pthread_attr_t *attr,void *(*start_routine)(void *), void *arg)函數傳入值thread:線程標識符attr:線程屬性設置(其具體設置參見9.2.3小節),通常取為NULLstart_routin

34、e:線程函數的起始地址,是一個以指向void的指針作為參數和返回值的函數指針arg:傳遞給start_routine的參數函數返回值成功:0出錯:返回錯誤碼進程退出函數線程退出時使用函數pthread_exit,是線程的主動行為。注意進程退出時使用exit函數,線程中用pthread_exit替代exit。所需頭文件#include 函數原型void pthread_exit(void *retval)函數傳入值retval:線程結束時的返回值,可由其他函數如pthread_join()來獲取等待函數(等待一個線程的結束)由于一個進程中的多個線程共享數據段,因此通常在線程退出后,退出線程所占用

35、的資源并不會隨線程結束而釋放。所有需要pthread_join函數來等待線程結束。類似于wait系統調用。所需頭文件#include 函數原型int pthread_join (pthread_t th, void *thread_return)函數傳入值th:等待線程的標識符thread_return:用戶定義的指針,用來存儲被等待線程結束時的返回值(不為NULL時)函數返回值成功:0出錯:返回錯誤碼互斥鎖線程控制互斥鎖是用一種簡單的加鎖方法來控制對共享資源的原子操作。這個互斥鎖只有兩種狀態,也就是上鎖和解鎖,可以把互斥鎖看作某種意義上的全局變量。在同一時刻只能有一個線程掌握某個互斥鎖,擁有

36、上鎖狀態的線程能夠對共享資源進行操作。若其他線程希望上鎖一個已經被上鎖的互斥鎖,則該線程就會掛起,直到上鎖的線程釋放掉互斥鎖為止。可以說,這把互斥鎖保證讓每個線程對共享資源按順序進行原子操作。互斥鎖機制主要包括下面的基本函數。互斥鎖初始化:pthread_mutex_init()互斥鎖上鎖:pthread_mutex_lock()互斥鎖判斷上鎖:pthread_mutex_trylock()互斥鎖接鎖:pthread_mutex_unlock()消除互斥鎖:pthread_mutex_destroy()其中,互斥鎖可以分為快速互斥鎖、遞歸互斥鎖和檢錯互斥鎖。這3種鎖的區別主要在于其他未占有互斥

37、鎖的線程在希望得到互斥鎖時是否需要阻塞等待。快速鎖是指調用線程會阻塞直至擁有互斥鎖的線程解鎖為止。遞歸互斥鎖能夠成功地返回,并且增加調用線程在互斥上加鎖的次數,而檢錯互斥鎖則為快速互斥鎖的非阻塞版本,它會立即返回并返回一個錯誤信息。默認屬性為快速互斥鎖。所需頭文件#include 函數原型int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr)函數傳入值mutex:互斥鎖MutexattrPTHREAD_MUTEX_INITIALIZER:創建快速互斥鎖PTHREAD_RECURSI

38、VE_MUTEX_INITIALIZER_NP:創建遞歸互斥鎖PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP:創建檢錯互斥鎖函數返回值成功:0出錯:返回錯誤碼所需頭文件#include 函數原型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,)函數傳入值mutex:互斥鎖函數返回值成功:0出錯:1信號量線程控制信號量也就是操作系統中所用到的PV原子操作,它廣泛用于進程或線程間的同步與互斥。信號量本質上是一個非負的整數計數器,它被用來控制對公共資源的訪問。這里先來簡單復習一下PV原子操作的工作原理。PV原子操作是對整數計數器信號量sem的操作。一次P操作使sem減一,而一次V操作使sem加一。進程(或線程)根據信號量的值來判斷是否對公共資源具有訪問權限。當信號量sem的值大于等于零時,該進程(或線程)具有公共資源的訪問權限;相反,當信號量sem的值小于零時,該進程(或線程)就將阻塞直到信號量sem的值大于等于0為止。PV原子操作主要用于進程或線程間的同步和互斥這兩種典型情況。Linux實現了POSIX的無名信號量,主要用于線程間的互斥與同步。這里主要介紹幾個常見函數。sem_init()用于創建一個信號量,并初始化它的值。sem_wait()和sem_trywait()都相當于P操作,在信號量大于零時它們都能將信號量的值減一,兩者的區別在于若信號量小于零時,sem_wait()將會阻塞進程,而sem_trywait()則會立即返回。sem_post()相當于V操作,它將信號量的值加一同時發出信號來喚醒等待的進程。sem_getv

溫馨提示

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

評論

0/150

提交評論