NWPU計算機學院OS課內(nèi)實驗指導_第1頁
NWPU計算機學院OS課內(nèi)實驗指導_第2頁
NWPU計算機學院OS課內(nèi)實驗指導_第3頁
NWPU計算機學院OS課內(nèi)實驗指導_第4頁
NWPU計算機學院OS課內(nèi)實驗指導_第5頁
已閱讀5頁,還剩31頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

西北工業(yè)大學計算機學院

計算機操作系統(tǒng)實驗指導

張羽方智毅谷建華編

目錄

一、操作系統(tǒng)課內(nèi)實驗目的-1-

二、操作系統(tǒng)實驗整體安排和要求-2-

2.1整體安庫-2-

2.2課內(nèi)實驗考核方案-2-

2.3實驗環(huán)境要求-3-

2.3.1硬件環(huán)境-3-

2.3.2軟件環(huán)境-3-

三、熟悉系統(tǒng)的安裝與使用-4-

3.1實驗一Opensolaris操作系統(tǒng)的安裝及使用-4-

3.1.1實驗目的-4-

3.1.2實驗預習內(nèi)容-4-

3.1.3實驗內(nèi)容及步驟-4-

3.1.4實驗總結(jié)-6-

3.2實驗二vi編輯器的學習和使用-7-

3.2.1實驗目的-7-

3.2.2實驗預習內(nèi)容-7-

3.2.3實驗內(nèi)容及步驟-7-

3.2.4實驗總結(jié)…...-8-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗-9-

4.1概述-9-

4.1.1MDB簡介-9-

4.1.2Dtrace簡介-11-

4.2實驗三系統(tǒng)調(diào)用(systemcalls)-14-

4.2.1實驗目的-14-

4.2.2實驗預習內(nèi)容-14-

4.2.3實驗內(nèi)容及步驟-14-

4.2.4實驗總結(jié)-17-

4.3實驗四進程與線程(processesandthreads)-18-

4.3.1實驗目的-18-

4.3.2實驗預習內(nèi)容-18-

4.3.3實驗內(nèi)容及步驟-18-

4.3.4實驗總結(jié)-28-

4.4實驗五存儲管理(memorymanagement)-29-

4.4.1實驗目的-29-

4.4.2實驗預習內(nèi)容-29-

4.4.3實驗內(nèi)容及步驟-29-

4.4.4實驗總結(jié)-29-

4.5實驗六文件系統(tǒng)與I/O(filesystem&I/O)-33-

4.5.1實驗目的-33-

4.5.2實驗預習內(nèi)容-33-

4.5.3實驗內(nèi)容及步驟-33-

4.5.4實驗總結(jié)-34-

?、操作系統(tǒng)課內(nèi)實驗目的

一、操作系統(tǒng)課內(nèi)實驗目的

計算機操作系統(tǒng)課內(nèi)實驗作為操作系統(tǒng)課堂理論教學的輔助部分是加強計

算機科學與技術專業(yè)實踐的重要環(huán)節(jié)之一。由于操作系統(tǒng)自身的龐大和復雜,造

成學生在學過操作系統(tǒng)課程后,總有一種“霧里看花”的感覺,即只是支離破碎

的了解了一些操作系統(tǒng)局部知識,而很難將這些知識融會貫通,對于運用操作系

統(tǒng)知識從事設計和應用更是無從談起。本實驗課的目的就是力圖解決上述問題。

本實驗課基于Sunmicrosystem公司的Opensolarisforx86操作系統(tǒng)平臺,通

過Opensolaris提供的Dtrace工具,對操作系統(tǒng)的內(nèi)核進行動態(tài)跟蹤。在一系列

的實驗中,學生通過對操作系統(tǒng)內(nèi)核中的探針(probe)進行編程,能清晰地看

到內(nèi)核的動態(tài)映像、準確地檢測系統(tǒng)的狀態(tài),從而使學生加深了對操作系統(tǒng)理論

的理解、提高了學習的興趣、加強了實踐的能力,在一定程度上也培養(yǎng)了學生自

己動手解決操作系統(tǒng)故障的能力。

-1-

:、操作系統(tǒng)實驗整體安排和要求

二、操作系統(tǒng)實驗整體安排和要求

2.1整體安排

課內(nèi)實驗將按以下三個方面進行:對常用的系統(tǒng)調(diào)用命令的使用方式有一個

較熟練的掌握;對典型操作系統(tǒng)的編程基礎知識和機制進行學習和了解;運用一

些重要的系統(tǒng)調(diào)用編寫程序模塊,對操作系統(tǒng)中的一些重要概念和典型算法進行

實現(xiàn)或驗證。實驗內(nèi)容如下:

第一部分:熟悉系統(tǒng)的安裝與使用

實驗」Opensolaris操作系統(tǒng)的安裝與使用

實驗二vi編輯器的學習和使用

第二部分:利用MDB、Dtrace工具對內(nèi)核進行監(jiān)視和跟蹤

實驗三系統(tǒng)調(diào)用(systemcall)

實驗四進程與線程(processesandthreads)

實驗五存儲管理(memorymanagement)

實驗六文件系統(tǒng)與I/O(filesystem&I/O)

2.2課內(nèi)實驗考核方案

操作系統(tǒng)課內(nèi)實驗考核按照預習報告30%、上機實驗35%、實驗報告35%

的比例進行。

預習報告內(nèi)容包括兩部分,?是對相關知識學習的書面總結(jié)(知識綜述和參

考文獻);二是對本次實驗的分析報告(主要針對涉及算法的題目)。實驗報告內(nèi)

容主要包括本次實驗的上機結(jié)果(數(shù)據(jù)結(jié)構(gòu)、程序框圖、源程序文檔和運行情況)

以及實驗中難點分析和心得。

-2-

:、操作系統(tǒng)實驗整體安排和要求

2.3實驗環(huán)境要求

2.3.1硬件環(huán)境

80386DX以上兼容機,可以使用Intel、AMD系列處理器,主板可以是支持

ISA、ESA或PCI總線結(jié)構(gòu),主存最小要求2MB,建議64MB以上。硬盤支持

IDE、SCSI接口的控制器,容量最小為500MB,建議2GB以上,顯示器可以使

用VGA、EGA、CGA或SUPERVGA的顯示卡或顯示器,網(wǎng)卡可以使用各種通

用的以太網(wǎng)及局域網(wǎng)卡。

2.3.2軟件環(huán)境

要求操作系統(tǒng)為Solaris8以上。建議使用Solaris10。

實驗工具為dtracejab實驗包。

-3-

三、熟悉系統(tǒng)的安裝與使用

三、熟悉系統(tǒng)的安裝與使用

3.1實驗一Opensolaris操作系統(tǒng)的安裝及使用

3.1.1實驗目的

學習Opensolaris操作系統(tǒng)的安裝,體會操作系統(tǒng)為了方便用戶,不斷改進

的安裝過程;熟悉Opensolaris系統(tǒng)的登錄和退出,并熟悉它常用命令的操作使

用方法。

3.1.2實驗預習內(nèi)容

Unix/Linux操作系統(tǒng)的發(fā)展歷程,Solaris操作系統(tǒng)的主要發(fā)行版本;對目前

Unix/Linux/Solaris的主流論壇的了解;認真閱讀有關Solaris安裝資料?,了解磁

盤分區(qū)的方式,了解Solaris對硬件(CPU、內(nèi)存和硬盤空間)的要求、安裝過

程;進入和退出系統(tǒng)的命令,有關文件系統(tǒng)中的目錄創(chuàng)建、修改和刪除,有關文

件系統(tǒng)中的文件建立、刪除、編輯、查詢、歸檔和壓縮等和有關系統(tǒng)管理等。

3.1.3實驗內(nèi)容及步驟

Solaris操作系統(tǒng)的安裝(SAID自動安裝盤安裝)

1、收集硬件配置資料(硬盤空間大小、顯卡類型、顯存大小、網(wǎng)卡類型等

基本信息);

2、使用SAID安裝Solaris,要求磁盤上已存在一個Solaris分區(qū)或一塊未分

配、未格式化且可作為主分區(qū)的磁盤空間。如果目前系統(tǒng)上只安裝了Windows,

那么磁盤上必須要有--塊未分配的磁盤空間(大于8GBytes)。因為Solaris安裝

程序需要一塊未分配的磁盤空間來創(chuàng)建Solaris類型的fdisk主分區(qū),用來存放

Solaris操作系統(tǒng)。如果目前磁盤上所有空間都已分配,可用pqmagic或其它磁盤

分區(qū)工具通過減小或刪除已有分區(qū)來劃分出一塊未用的磁盤空間。另外,由于磁

盤最多只允許有4個主分區(qū),所以現(xiàn)有主分區(qū)數(shù)量不要多于3個,以預留一個主

分區(qū)給Solaris。安裝過程中,已有的FAT/FAT32/NTFS格式的分區(qū)將被保留,現(xiàn)

有的Windows系統(tǒng)不會被破壞,而且在安裝完Solaris10后Windows系統(tǒng)仍然能

被正常引導。

3、BIOS設置:在BIOS中將系統(tǒng)啟動方式設置為光盤引導,保存設置,重

新啟動。

-4-

三、熟悉系統(tǒng)的安裝與使用

4、光盤安裝:系統(tǒng)以光盤方式啟動后,安裝即自動進行,無需人工進行任

何干預(個別情況下可能會跳出kdmconfig程序提示對Xserver進行選擇,根據(jù)

提示繼續(xù)即可)安裝結(jié)束后,光盤自動彈出。取出光盤,回車,系統(tǒng)將自動重啟。

5、啟動Solaris操作系統(tǒng):Solaris通過使用Grub程序來支持多系統(tǒng)的引導。

開機自檢過后,屏幕上將出現(xiàn)Grub引導界面,提示對操作系統(tǒng)進行選擇,分別

是:

SolarisNevadasnv_50X86

Solarisfailsafe

Windows

選擇第一項,啟動Solaris11。

說明:SAID預置了對Windows操作系統(tǒng)引導的支持,如果想啟動先前安裝

的Windows操作系統(tǒng),可選擇第一項,將進入原Windows的引導界面(可對現(xiàn)

有的多個Windows操作系統(tǒng)進行引導)。

6、登錄Solaris

以root用戶登錄,用戶名:root;密碼:root

Solaris操作系統(tǒng)的使用

(1)登錄、退出和關閉系統(tǒng);

(2)man命令的使用;

(3)—help命令的使用;

(4)1s命令的使用;

(5)cp命令的使用

(6)ps命令的使用

(7)grep命令的使用

(8)head、tail命令的使用

(9)mv命令的使用

(10)echo命令的使用

(ll)whatis命令的使用;

(12)whereis命令的使用;

-5-

三、熟悉系統(tǒng)的安裝與使用

(13)find命令的使用;

(14)sort命令的使用;

(15)tar命令的使用;

(16)apropos命令的使用

(17)gzip解壓縮歸檔文件命令的使用;

(18)mkdir命令的使用

3.1.4實驗總結(jié)

整理出以上命令的使用手冊(功能、命令格式、常用參數(shù)說明以及命令使用

實例)。

-6-

三、熟悉系統(tǒng)的安裝與使用

3.2實驗二vi編輯器的學習和使用

3.2.1實驗目的

通過對vi編輯器的學習和使用,熟悉Unix類環(huán)境下的正文編輯程序及其作

用。

3.2.2實驗預習內(nèi)容

認真學習Linux的正文編輯的相關基礎知識,了解其編輯方式、插入方式和

命令方式。

3.2.3實驗內(nèi)容及步驟

使用“ESC”鍵在命令模式和插入模式之間進行切換。各項操作命令如下:

1、進入插入模式

a追加,I插入,。在當前行下插入一空行;A在行尾追加,I從行首插入,0

在當前行上插入一空行。

2、復制正文

yy復制當前行,nyy復制n行,yw復制一個詞,y)復制從光標至句末的所

有正文;y}復制從光標至句首的所有正文,nyx復制類型為X。

3、刪除正文

x刪除一個字符,dd刪除當前行,ndd刪除n行,dw刪除一個單詞(從光

標處開始),nx刪除n個字符,Agndd刪除n行正文到緩沖區(qū)g中,AGndd刪除

n行正文追加到緩沖區(qū)g中,c$從當前光標處刪至行尾,”從當前光標處刪至行

首,ndw(或dnw)刪除n個詞。

4、替換正文

P將緩沖區(qū)的內(nèi)容粘貼到當前光標處,AgP將g緩沖區(qū)里的內(nèi)容粘貼到當前

行下,AgP將g緩沖區(qū)的內(nèi)容粘貼到當前行上,rn用字符n替換當前字符。

5、查找定位

nG將光標定位到第n行,AF向前一屏,向后一屏,向下半屏,向

上半屏。

6、文件操作

:w寫盤,:wq(或:ZZ)寫盤退出,:q!不存盤退出,:e!不存盤不退出,u恢

復前一步的改變,:efilename編輯文件名,:wfilename寫文件名,:w!filename

重寫文件名,:!cmd運行一個命令,然后返回,75顯示當前文件和行號。

-7-

三、熟悉系統(tǒng)的安裝與使用

3.2.4實驗總結(jié)

1)說明vi的三種主要操作方式。

2)對上述各vi操作舉例列表說明。

-8-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

4.1概述

4.1.1MDB簡介

MDB(ModularDebugger)是Solaris操作系統(tǒng)自帶的內(nèi)核級調(diào)試工具。它

為調(diào)試這些程序和方案提供完全可自定義環(huán)境,其中包括動態(tài)模塊工具,它可以

讓程序員自己定義調(diào)試命令來對執(zhí)行程序進行特定的分析。每個MDB模塊都可

用于在兒種不同的上下文(包括實時的和事后的)中檢查程序。Solaris操作系

統(tǒng)包含一組MDB模塊,旨在幫助程序員調(diào)試Solaris內(nèi)核以及相關的設備驅(qū)動

程序和內(nèi)核模塊。

MDB可提供范圍廣泛的功能集合,用于分析Solaris內(nèi)核和其他目標程序。

它可以實現(xiàn)以下功能:

+查找特定線程分配的所有內(nèi)存

*歹U顯內(nèi)核STREAM的直觀圖

*確定特定地址所引用的結(jié)構(gòu)類型

*在內(nèi)核中查找已泄漏的內(nèi)存塊

*分析內(nèi)存以查找棧跟蹤

在Solaris系統(tǒng)中,以共享通用功能的兩個命令提供MDB:mdb和kmdbo

可以使用mdb命令以交互方式或在腳本中調(diào)試實時用戶進程、用戶進程核心轉(zhuǎn)

儲文件、內(nèi)核崩潰轉(zhuǎn)儲、實時操作系統(tǒng)、目標文件和其他文件。在還需要控制和

停止內(nèi)核執(zhí)行時,可以使用kmdb命令調(diào)試實時操作系統(tǒng)內(nèi)核和設備驅(qū)動程序。

-9-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

MDBLanguageMDBModuleAPI

DebuggerEngine

disassemblerlibkvmtarget/proctarget

圖4-1MDB體系結(jié)構(gòu)

在本實驗課中,我們將用MDB來打印一些內(nèi)核數(shù)據(jù)結(jié)構(gòu)。

mdb中輸入命令的格式是:

expression::dcmd

e.g.0x300acde123::ps

通過

::dmods-IHess

或者::dcmds

可以找到mdb中的命令。如果需要翻頁查找,可以在命令后面加上!lesso

如果需要了解一個命令的參數(shù),輸入

::help命令名

例如,查看ps命令的更多信息:

::helpps

具體的MDB命令使用方法將在具體的實驗中說明。

-10-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

4.1.2Dtrace簡介

DTrace是一個用于SolarisTM操作系統(tǒng)的動態(tài)跟蹤框架。它可用于檢查用戶

程序和操作系統(tǒng)的行為,可由系統(tǒng)管理員或應用程序開發(fā)者使用,適用于實時生

產(chǎn)系統(tǒng)。DTrace允許用戶查看系統(tǒng),以便了解其工作方式、在軟件的多個層之

間跟蹤性能問題或找出導致異常行為的原因。用戶可以使用DTrace來創(chuàng)建自己

的自定義程序,以便動態(tài)地檢測系統(tǒng),并對可用Dtrace的編程語言D語言闡明

的任意問題做出快速簡明的回答。

DTrace允許所有Solaris用戶執(zhí)行以下操作:

*動態(tài)地啟用和管理數(shù)以千計的探測器

,動態(tài)地將邏輯謂詞和操作與探測器相關聯(lián)

*動態(tài)地管理跟蹤緩沖區(qū)和緩沖區(qū)策略

4顯示和檢查來自實時系統(tǒng)或崩潰轉(zhuǎn)儲的跟蹤數(shù)據(jù)

DTrace允許Solaris開發(fā)者和管理員執(zhí)行以下操作:

,實現(xiàn)使用DTrace工具的自定義腳本

*實現(xiàn)使用DTrace檢索跟蹤數(shù)據(jù)的分層工具

Dtrace工具的動態(tài)跟蹤功能是通過散布在整個Solaris系統(tǒng)中的兒萬個probe

(探測器)來實現(xiàn)的。probe類似于位于系統(tǒng)中受關注位置的一些可編程傳感器。

如果要確定系統(tǒng)的狀態(tài),可使用DTrace對相應的傳感器進行編程,以便記錄關

注的信息。當每個probe觸發(fā)時,DTrace便會從probe中收集數(shù)據(jù)并向用戶報告。

如果未對probe指定任何操作,DTrace將僅記錄probe的每次觸發(fā)。

請注意,每個probe的名稱由四個部分組成:

表4-1probe各部分的名稱含義

名稱含義

提供器(provider)發(fā)布此探測器的DTrace提供器的名稱。提供器名稱通常與執(zhí)行檢測過

程以啟用探測器的DTrace內(nèi)核模塊的名稱相對應。

模塊(module)此探測器對應于特定的程序位置時,為探測器所在模塊的名稱。該名

稱為內(nèi)核模塊的名稱或用戶庫的名稱。

函數(shù)(function)此探測器對應于特定的程序位置時,為探測器所在程序函數(shù)的名稱。

名稱(name)探測器名稱的最后組成部分是一個有助于您了解探測器語義的名稱

(如BEGIN或END)。

-11-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

寫出完整的人工可讀的探測器名稱時,用冒號分隔列出該名稱的所有四個部

分,如下所示:

#probedescriptions

provider:module:function:name

D語言腳本程序的結(jié)構(gòu)如下:

probedescriptions

/predicate/

(

actionstatements

}

當D腳本執(zhí)行時,探測器描述所指定的probe就會被打開。當probe被觸發(fā)

并且predicate(斷言)為真時,聲明的操作就會執(zhí)行。

用如下命令查看系統(tǒng)中的所有probeo

#dtrace-1

IDPROVIDERMODULEFUNCTIONNAME

1dtraceBEGIN

2dtraceEND

3dtraceERROR

4fasttrapfasttrapfasttrap

5vminfounixpage_reclaimpgrec

6sysinfounixmutex_vector_entermutex_adenters

7schedunixsetkpdqenqueue

8schedunixsetfrontdqenqueue

9schedunixsetbackdqenqueue

10schedunixdispdeqdequeue

11schedunixdispdequeue

省略了許多行

43290lockstatgenunixthreadJockthread-spin

43291lockstatgenunixthread_lock_highthread-spin

-12-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

Dtrace的體系結(jié)構(gòu)如下圖所示:

libdtrace(3LIB)

用戶級

dtrace(7D)

一丙核

DTrace

DTrace

圖4-2Dtrace體系結(jié)構(gòu)和組件概覽

Dtrace腳本的運行方式,是在終端中輸入“./filename”,如運行sleep.d腳本

就是在終端中鍵入"./sleep.d":

#./sleep.d

有些腳本需要帶參數(shù),就直接跟在腳本后面輸入即可,如:

#./syscall.d1516

腳本的退出有兩種情況,一種是自動退出,一種是強制退出。

自動退出又包含了兩種情況,一種是在執(zhí)行腳本時遇到了exit語句;另一種

是通過-c指定了運行的命令,命令結(jié)束后,腳本也跟著結(jié)束。

強制退出是使用kill或pkill結(jié)束腳本,也就是另外運行一個shell,然后運

行kill或pkill結(jié)束dtrace進程。或者用Control+C強制推出。

-13-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

4.2實驗三系統(tǒng)調(diào)用(systemcalls)

4.2.1實驗目的

本實驗從系統(tǒng)調(diào)用入手,讓學生看到fork。函數(shù)被調(diào)用來創(chuàng)建進程的過程,

同時用內(nèi)核跟蹤工具跟蹤新創(chuàng)建的進程進行系統(tǒng)調(diào)用的過程,對系統(tǒng)調(diào)用的調(diào)用

層次和調(diào)用次數(shù)進程統(tǒng)計和打印。

本實驗旨在加深學生對進程的理解,區(qū)分進程和程序的區(qū)別;讓學生對操作

系統(tǒng)內(nèi)核以及系統(tǒng)調(diào)用的過程有一個最直觀的了解。

4.2.2實驗預習內(nèi)容

復習進程的概念,了解vfork。、forkl()函數(shù)的功能和它們的區(qū)別,熟悉在

Solaris系統(tǒng)中的進程管理相關命令。

4.2.3實驗內(nèi)容及步驟

1、在桌面環(huán)境中打開一個終端(在CDE中右擊鼠標,選擇工具->終端)。

2、用"#cddtrace」ab”命令進入/dtrace」ab文件夾,所有的實驗素材都在

這個文件夾中。本實驗的腳本在system_calls子目錄中:

#cddtracejab/system__call

#

3、運行fork.d腳本,然后從桌面環(huán)境中再打開一個終端,即可看到如下輸

出:

#./fork.d

forkldtexecforkedPID1513

forkldtwmforkedPID1512

vforkdttermforkedPID1514

forkldttermforkedPID1515

第一列顯示的是調(diào)用fork。函數(shù)進行進程創(chuàng)建的程序名稱,D語言的腳本中

用內(nèi)置變量execname得到。最后一列是被fork創(chuàng)建的新進程的pid,比如pid為

1515的進程運行是CDE環(huán)境下的偽終端程序dttermo

在新打開的終端中運行“echo$$"命令,可以看到該終端的進程號:

#echo$$

1515

#

-14-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

fork.d腳本的輸出記錄了我們在桌面右擊然后打開一個終端的過程中,那些

進程被創(chuàng)建了、被創(chuàng)建的進程pid是多少。

下圖是這些進程的關系圖:

圖4-3啟動??個終端的過程

4、在新創(chuàng)建的終端中運行gedit程序,這是一個可視化的文本編輯器。

#gedit

這時將出現(xiàn)gedit程序的編輯窗口,如圖4-3所示:

圖4-4gedit文本編輯器

并且運行fork.d腳本的終端將有新的輸出:

-15-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

dtexecforkedPID1513

fork1dtwmforkedPID1512

vforkdttermforkedPID1514

fork1

;ork1dttermforkedPID1515

shforkedPID1516

進程1516就是剛才啟動的gedit對應的進程pid號。

如果中斷fork.d腳本運行,它將輸出本次運行過程中進程創(chuàng)建的統(tǒng)計數(shù)據(jù):

WHOWHICHFORKCOUNT

*11

dttermfok1

dttermvf

foo*r12

gnectfo12

shfork*16

bash

該數(shù)據(jù)顯示了每個程序進行進程創(chuàng)建的次數(shù)以及用哪個函數(shù)進行創(chuàng)建。

5、接下來,在另一個終端中運行syscall.d腳本,這個腳本需要一個參數(shù),

即一個進程的pid,我們用1516這個進程來實驗(也就是剛才新啟動的文本編輯

器gedit的進程)。

運行腳本"./syscall.d1516",這個腳本記錄了它跟蹤到的5個gedit進行的

系統(tǒng)調(diào)用,并打印出該系統(tǒng)調(diào)用函數(shù)調(diào)用其它內(nèi)核函數(shù)的調(diào)用次序

#,/syscall.d1516

dtrace:script\/syscalH.d'matched63212probes

CPUFUNCTION

0->sigaction

0->setsigact

0->sigdelq

0<-sigdelq

0->sigdelq

0<-sigdelq

0<-setsigact

0<-sigaction

0<=sigaction

[……]

腳本運行結(jié)束時打印系統(tǒng)調(diào)用和內(nèi)核函數(shù)調(diào)用的次數(shù)統(tǒng)計情況:

-16-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

——……systemcalls

read2

sigaction1

write2

-kernelcalls

allocbwait2

msgdsize9

releasestr9

getq_noenab10

kmemcachealloc11

apic_setspl18

putnext19

[……]

我們可以去查看一下sigaction()函數(shù)的源代碼,它位于uts/common/syscall

目錄下的sigaction.c文件中。通過代碼我們也可以驗證上面打印出的調(diào)用順序。

請注意,由于dtrace是動態(tài)跟蹤工具,而函數(shù)流程可能是分支結(jié)構(gòu),所以打

印出的函數(shù)調(diào)用關系不是唯一的,每一次所顯示的只是那一次運行函數(shù)的調(diào)用關

系。

如果想一直記錄某個進程的系統(tǒng)調(diào)用情況并查看它對內(nèi)核函數(shù)的調(diào)用關系,

可以運行syscalll.d腳本,它將一直跟蹤某個進程的函數(shù)調(diào)用情況,記錄了一個

進程所有的系統(tǒng)調(diào)用以及這個系統(tǒng)調(diào)用進行的內(nèi)核函數(shù)調(diào)用。強行退出時將打印

總的系統(tǒng)調(diào)用次數(shù)。由于輸出很長,這里就不再贅述。

4.2.4實驗總結(jié)

1、通過實驗結(jié)果解釋一下從CDE桌面啟動一個終端,發(fā)生了哪些進程創(chuàng)建

的過程?

2、觀看syscalLd的打印輸出,然后在源代碼中查看被調(diào)用的函數(shù),了解這

些函數(shù)的功能。

-17-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

4.3實驗四進程與線程(processesandthreads)

4.3.1實驗目的

通過實驗查看進程的結(jié)構(gòu)proc」的信.息,加深對進程概念的認識;查看內(nèi)核

線程被阻塞時同步對象的類型;查看在TS(分時)調(diào)度等級隊列中的內(nèi)核線程

時間片剩余的情況,體會時間片輪轉(zhuǎn)調(diào)度算法;查看進程間通信(IPC)機制中

系統(tǒng)調(diào)用的次序。

通過以上幾個實驗,加深學生對理論知識的理解,讓學生對課堂所學知識有

直觀的認識。

4.3.2實驗預習內(nèi)容

學習Solaris操作系統(tǒng)的兩級調(diào)度模型,瀏覽內(nèi)核源代碼中proc結(jié)構(gòu)、klwp

結(jié)構(gòu)和kthread結(jié)構(gòu)的定義,了解相關字段的含義,了解fork函數(shù)的功能,了解

內(nèi)核線程調(diào)度等級的概念。學習IPC的各種機制模型,如共享內(nèi)存、消息隊列、

信號量等。

4.3.3實驗內(nèi)容及步驟

本次實驗分四個部分,需要的腳本和程序在/dtrace」ab/proc_thread目錄下

1用MDB工具查看進程數(shù)據(jù)結(jié)構(gòu)proc_to

1、打開一個終端,鍵入命令"mdb-k”進入MDB:

bash-3.00#mdb-k

Loadingmodules:[unixkrtldgenunixspecfsdtraceuppc

pcplusmpufsipsctpusbauhcis1394fctlncalotszfs

randomnfsspppcryptoptmipc]

2、在命令行提示符下輸入命令“ps”,查看當前系統(tǒng)中運行的進程:

-18-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

.>

DHDpGD

SIDSIUIDFLAGSADDRNAME

RoooO

R3ooO00x00000001fec1dd7csched

R2ooO00x00020001d3224278fsflush

R1ooO00x00020001d3224ae0pageout

R:ps119800x42004000d3225348init

Rpl7188378700x42014000d47cd1e8gpdf

89766300x42004000d47cf388mozilla

-8238

R87387

737300x42014000d32130f0dtterm

R740738740740

R53052753053000x42004000d3213958sh

R52852752852800x42004000d320f1c8Xorg

R525152452400x42004000d321c010fbconsole

00x42000000d3217880snmpd

其中倒數(shù)第二列“ADDR”是該進程結(jié)構(gòu)proc_t的首地址,我們要使用它來

查看進程結(jié)構(gòu)。

2、我們選擇一個進程,比如pid為738的進程(該進程運行的偽終端dtterm

程序)。在MDB中鍵入如下命令:

>d32130f0::printproc_t

{

p_exec=0xd4e32300

p_as=0xd3162238

pjockp=0xd2996880

p_crlock={

_opaque=[0,0]

p_cred=0xd488d888

p_swapcnt=0

p_stat=*\002,

p_wcode='\0'

p_pidflag=0

p_wdata=0

p_ppid=0x2e1

pjjarent=0xd47d5038

p_child=0xd3213958

p_psibling=0

p_sibling_ns=0

p_child_ns=0

p_next=0xd47d5038

pjDrev=0xd3213958

p_nextofkin=0xd47d5038

p_orphan=0xd3213958

p_nextorph=0

p_sessp=0xd4e36c98

p_pidp=0xd4eab7e8

p_pgidp=0xd4eab7e8

……(還有很多行)

-19-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

這里打印了該進程結(jié)構(gòu)proc」的各自段的值,其含義請查閱相關資料。這里

給出一些比較重要的字段的含義:

表4-1proc_t部分字段

字段含義

p_execvnode指針,指向一個ELF文件,最終指向磁盤

上的該進程對應的可執(zhí)行文件o

P-as指向該進程的進程地址空間

P_PPid父進程的pid

p_parent指向父進程proc_t結(jié)構(gòu)的指針

p_child指向第一個子進程結(jié)構(gòu)的指針

p_next^pjDrev維護進程鏈表的指針,指向前后的進程結(jié)構(gòu)

p_orphan孤兒指針,在其子進程被kill后,指向其子進程

創(chuàng)建的子進程。

P_pidp指向一個pid結(jié)構(gòu)體,里面描述了一些pid信息

pjwpid最近分配給該進程的Iwp的id號

pjwpcnt該進程擁有的Iwp數(shù)量

p_utime該進程的用戶態(tài)時間片

p_stime該進程的系統(tǒng)時間片

P.doorjist該進程的door鏈表的首節(jié)點地址

3、可以再繼續(xù)跟蹤一些指針,可以得到豐富的信息,比如我們再查看p_as

指針,它指向了該進程地址空間的信息:

>d32130f0::printproc_tp_as|::walkseg|::printstructseg

(

s_base=0x8038000

s_size=0x10000

s_szc=0

s_flags=0

s_as=0xd3162238

s_tree={

avl_child=[0,0]

avl_parent=0xd4d10c94

avl_child_index=0

avl_balance=0

}

s_ops=segvn_ops

s_data=0xd4d11718

)

[……]

這里打印的是管理該進程地址空間的一個段結(jié)構(gòu)的信息,s.base是段的首地

址,s_size是該段的大小,s_data是該段的段地址。如果再跟蹤s_data的話,還

可以看到這個進程運行的機器指令。

關閉終端,結(jié)束該實驗。

-20-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

2查看阻塞線程的同步對象類型

Solaris操作系統(tǒng)是基于線程的兩級調(diào)度,最終被處理機調(diào)度的是內(nèi)核線程

(kthread),在不同的調(diào)度等級上的調(diào)度策略不同,比如在分時(TS)等級上是

基于優(yōu)先級的搶占式、時間片輪轉(zhuǎn)調(diào)度。而在系統(tǒng)內(nèi)核中,各線程之間會由于一

些同步事件而被阻塞,比如進程間通信、讀寫互斥,條件變量不滿足等,也可能

是用戶程序造成的等待。

這里用sleep.d腳本跟蹤被阻塞線程的同步對象類型。當一個內(nèi)核線程在同

步對象上休眠時,將激活該腳本里sched:::sleep探針,此時系統(tǒng)會設置Iwpsinfo

結(jié)構(gòu)的一個字段pjstype,以表示同步對象的類型,見下表:

表4-2同步對象類型

阻塞類型含義

SOBJ_MUTEX內(nèi)核互斥同步對象

SOBJ_RWLOCK讀寫鎖同步對象

SOBJ_CV條件變量同步對象

SOBJ_SEMA信號量同步對象

SOBJ_USER用戶級同步對象

SOBJ_USER_PI優(yōu)先級繼承的用戶級同步對象

SOBJ_SHUTLE互動同步對象(與Solaris門相關)

1、打開一個終端,進入/dtrace_lab/proc_thread目錄,運行sleep.d腳本:

bash-3.00#./sleep.d

2、再打開一個終端,運行,一些程序,如gedit、starsuite(類似office的辦公

軟件)。然后按Control+C結(jié)束sleep.d腳本,就可以看到如下結(jié)果(節(jié)選):

bash-3.00#./sleep.d

AC

SOBJCV_ADDRCNT

condvard36c94961

condvard3c622f21

condvarfec7d1b41

kernelmutexd99600001

kernelsemaphored2f251181

kernelsemaphored55dfb401

kernelsemaphored5856d281

user-levellock81336C01

user-levellock876e6881

shuttle052

condvard4cd41f271

condvard5ba251673

condvard531bcf274

condvard566d472110

-21-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

CNTNAMETIDSleeping

On...

1Xorg1

libc.so.1'close+0x15

1automountd1

libc.so.1'_pollsys+0x15

1automountd4

libc.so.1'_Iwp_park+Ox19

1bash1一

Iibc.so.1'_waitid+0x15

r……]

可以看到發(fā)生阻塞得線程號、線程的地址、阻塞的同步對象類型以及被阻塞

的次數(shù)。在一個線程的生命周期內(nèi),線程的地址可以看作是這個線程的唯一標識。

3查看線程調(diào)度中各線程時間片的剩余情況

TS等級的線程是按時間片輪轉(zhuǎn)來調(diào)度的。內(nèi)核函數(shù)ts」ick()將檢查各線程的

盛譽時間片情況。如果一個線程時間片用完,則該函數(shù)將阻塞這個線程。下面是

ts_tick()函數(shù)的定義:

staticvoid

ts_tick(kthread_t*t);

內(nèi)核進入該函數(shù)的時候?qū)⒓せ钜粋€probe,在這個probe中我們利用當前線

程指針(即ts_tick()函數(shù)的參數(shù))得到該線程剩余的時間片(請參閱相應部分源

代碼)。

1、打開一個終端,運行ts.d腳本

bash-3.00#./ts.d

2、在另一個終端中運行一個計算質(zhì)數(shù)的程序(這個程序需要大量地占用

CPU):

bash-3.00#./calculate

-22-

四、內(nèi)核監(jiān)視與動態(tài)跟蹤實驗

然后可以看到腳本的輸出如下:

bash-3.00#./ts.d

EXECPIDLWPIDTICKSLEFTCNT

sched751131

sched891121

sched950141

sched11061774

sched11061784

sched5301138

sched5301148

sched5301158

sched5301168

sched5301826

sched112511326

sched112511426

sched112511526

sched112511626

sched530138

sched530138

sched1125138

sched112511038

sched112511138

sched112511238

sched5301439

sched53015

sched112516

sched112517

sched112518

sched11251161

sched11251—

26J

1

sched11251364

sched11251464

sched11251—

以上打印輸出的意思是進程號為PID的進程對應的內(nèi)核線程在某個時刻還

有TICKSLEFT個時間單位剩余。CNT是這種情況出現(xiàn)的次數(shù)。

4進程間通信中系統(tǒng)調(diào)用的關系及通信數(shù)據(jù)的顯示

Solaris系統(tǒng)提供的進程間通信(IPC)機制主要有共享內(nèi)存、信號量、消息

隊列以及Solaris門幾種。我們這里選擇消息隊列來進行實驗。

消息隊列是系統(tǒng)內(nèi)核地址空間中的一個內(nèi)部的鏈表。消息可以按照順序發(fā)送

到隊列中,也可以以兒種不同的方式從隊列中讀取。每一個消息隊列用一個唯一

的IPC標識符表示(消息隊列不一定是先進先出,也可以按消息的類型字段取消

息)。

溫馨提示

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

評論

0/150

提交評論