NWPU计算机学院OS课内实验指导_第1页
NWPU计算机学院OS课内实验指导_第2页
NWPU计算机学院OS课内实验指导_第3页
NWPU计算机学院OS课内实验指导_第4页
NWPU计算机学院OS课内实验指导_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

西北工业大学计算机学院

计算机操作系统实验指导

张羽方智毅谷建华编

目录

一、操作系统课内实验目的-1-

二、操作系统实验整体安排和要求-2-

2.1整体安库-2-

2.2课内实验考核方案-2-

2.3实验环境要求-3-

2.3.1硬件环境-3-

2.3.2软件环境-3-

三、熟悉系统的安装与使用-4-

3.1实验一Opensolaris操作系统的安装及使用-4-

3.1.1实验目的-4-

3.1.2实验预习内容-4-

3.1.3实验内容及步骤-4-

3.1.4实验总结-6-

3.2实验二vi编辑器的学习和使用-7-

3.2.1实验目的-7-

3.2.2实验预习内容-7-

3.2.3实验内容及步骤-7-

3.2.4实验总结…...-8-

四、内核监视与动态跟踪实验-9-

4.1概述-9-

4.1.1MDB简介-9-

4.1.2Dtrace简介-11-

4.2实验三系统调用(systemcalls)-14-

4.2.1实验目的-14-

4.2.2实验预习内容-14-

4.2.3实验内容及步骤-14-

4.2.4实验总结-17-

4.3实验四进程与线程(processesandthreads)-18-

4.3.1实验目的-18-

4.3.2实验预习内容-18-

4.3.3实验内容及步骤-18-

4.3.4实验总结-28-

4.4实验五存储管理(memorymanagement)-29-

4.4.1实验目的-29-

4.4.2实验预习内容-29-

4.4.3实验内容及步骤-29-

4.4.4实验总结-29-

4.5实验六文件系统与I/O(filesystem&I/O)-33-

4.5.1实验目的-33-

4.5.2实验预习内容-33-

4.5.3实验内容及步骤-33-

4.5.4实验总结-34-

・、操作系统课内实验目的

一、操作系统课内实验目的

计算机操作系统课内实验作为操作系统课堂理论教学的辅助部分是加强计

算机科学与技术专业实践的重要环节之一。由于操作系统自身的庞大和复杂,造

成学生在学过操作系统课程后,总有一种“雾里看花”的感觉,即只是支离破碎

的了解了一些操作系统局部知识,而很难将这些知识融会贯通,对于运用操作系

统知识从事设计和应用更是无从谈起。本实验课的目的就是力图解决上述问题。

本实验课基于Sunmicrosystem公司的Opensolarisforx86操作系统平台,通

过Opensolaris提供的Dtrace工具,对操作系统的内核进行动态跟踪。在一系列

的实验中,学生通过对操作系统内核中的探针(probe)进行编程,能清晰地看

到内核的动态映像、准确地检测系统的状态,从而使学生加深了对操作系统理论

的理解、提高了学习的兴趣、加强了实践的能力,在一定程度上也培养了学生自

己动手解决操作系统故障的能力。

-1-

:、操作系统实验整体安排和要求

二、操作系统实验整体安排和要求

2.1整体安排

课内实验将按以下三个方面进行:对常用的系统调用命令的使用方式有一个

较熟练的掌握;对典型操作系统的编程基础知识和机制进行学习和了解;运用一

些重要的系统调用编写程序模块,对操作系统中的一些重要概念和典型算法进行

实现或验证。实验内容如下:

第一部分:熟悉系统的安装与使用

实验」Opensolaris操作系统的安装与使用

实验二vi编辑器的学习和使用

第二部分:利用MDB、Dtrace工具对内核进行监视和跟踪

实验三系统调用(systemcall)

实验四进程与线程(processesandthreads)

实验五存储管理(memorymanagement)

实验六文件系统与I/O(filesystem&I/O)

2.2课内实验考核方案

操作系统课内实验考核按照预习报告30%、上机实验35%、实验报告35%

的比例进行。

预习报告内容包括两部分,•是对相关知识学习的书面总结(知识综述和参

考文献);二是对本次实验的分析报告(主要针对涉及算法的题目)。实验报告内

容主要包括本次实验的上机结果(数据结构、程序框图、源程序文档和运行情况)

以及实验中难点分析和心得。

-2-

:、操作系统实验整体安排和要求

2.3实验环境要求

2.3.1硬件环境

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

ISA、ESA或PCI总线结构,主存最小要求2MB,建议64MB以上。硬盘支持

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

用VGA、EGA、CGA或SUPERVGA的显示卡或显示器,网卡可以使用各种通

用的以太网及局域网卡。

2.3.2软件环境

要求操作系统为Solaris8以上。建议使用Solaris10。

实验工具为dtracejab实验包。

-3-

三、熟悉系统的安装与使用

三、熟悉系统的安装与使用

3.1实验一Opensolaris操作系统的安装及使用

3.1.1实验目的

学习Opensolaris操作系统的安装,体会操作系统为了方便用户,不断改进

的安装过程;熟悉Opensolaris系统的登录和退出,并熟悉它常用命令的操作使

用方法。

3.1.2实验预习内容

Unix/Linux操作系统的发展历程,Solaris操作系统的主要发行版本;对目前

Unix/Linux/Solaris的主流论坛的了解;认真阅读有关Solaris安装资料•,了解磁

盘分区的方式,了解Solaris对硬件(CPU、内存和硬盘空间)的要求、安装过

程;进入和退出系统的命令,有关文件系统中的目录创建、修改和删除,有关文

件系统中的文件建立、删除、编辑、查询、归档和压缩等和有关系统管理等。

3.1.3实验内容及步骤

Solaris操作系统的安装(SAID自动安装盘安装)

1、收集硬件配置资料(硬盘空间大小、显卡类型、显存大小、网卡类型等

基本信息);

2、使用SAID安装Solaris,要求磁盘上已存在一个Solaris分区或一块未分

配、未格式化且可作为主分区的磁盘空间。如果目前系统上只安装了Windows,

那么磁盘上必须要有--块未分配的磁盘空间(大于8GBytes)。因为Solaris安装

程序需要一块未分配的磁盘空间来创建Solaris类型的fdisk主分区,用来存放

Solaris操作系统。如果目前磁盘上所有空间都已分配,可用pqmagic或其它磁盘

分区工具通过减小或删除已有分区来划分出一块未用的磁盘空间。另外,由于磁

盘最多只允许有4个主分区,所以现有主分区数量不要多于3个,以预留一个主

分区给Solaris。安装过程中,已有的FAT/FAT32/NTFS格式的分区将被保留,现

有的Windows系统不会被破坏,而且在安装完Solaris10后Windows系统仍然能

被正常引导。

3、BIOS设置:在BIOS中将系统启动方式设置为光盘引导,保存设置,重

新启动。

-4-

三、熟悉系统的安装与使用

4、光盘安装:系统以光盘方式启动后,安装即自动进行,无需人工进行任

何干预(个别情况下可能会跳出kdmconfig程序提示对Xserver进行选择,根据

提示继续即可)安装结束后,光盘自动弹出。取出光盘,回车,系统将自动重启。

5、启动Solaris操作系统:Solaris通过使用Grub程序来支持多系统的引导。

开机自检过后,屏幕上将出现Grub引导界面,提示对操作系统进行选择,分别

是:

SolarisNevadasnv_50X86

Solarisfailsafe

Windows

选择第一项,启动Solaris11。

说明:SAID预置了对Windows操作系统引导的支持,如果想启动先前安装

的Windows操作系统,可选择第一项,将进入原Windows的引导界面(可对现

有的多个Windows操作系统进行引导)。

6、登录Solaris

以root用户登录,用户名:root;密码:root

Solaris操作系统的使用

(1)登录、退出和关闭系统;

(2)man命令的使用;

(3)—help命令的使用;

(4)1s命令的使用;

(5)cp命令的使用

(6)ps命令的使用

(7)grep命令的使用

(8)head、tail命令的使用

(9)mv命令的使用

(10)echo命令的使用

(ll)whatis命令的使用;

(12)whereis命令的使用;

-5-

三、熟悉系统的安装与使用

(13)find命令的使用;

(14)sort命令的使用;

(15)tar命令的使用;

(16)apropos命令的使用

(17)gzip解压缩归档文件命令的使用;

(18)mkdir命令的使用

3.1.4实验总结

整理出以上命令的使用手册(功能、命令格式、常用参数说明以及命令使用

实例)。

-6-

三、熟悉系统的安装与使用

3.2实验二vi编辑器的学习和使用

3.2.1实验目的

通过对vi编辑器的学习和使用,熟悉Unix类环境下的正文编辑程序及其作

用。

3.2.2实验预习内容

认真学习Linux的正文编辑的相关基础知识,了解其编辑方式、插入方式和

命令方式。

3.2.3实验内容及步骤

使用“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行正文到缓冲区g中,AGndd删除

n行正文追加到缓冲区g中,c$从当前光标处删至行尾,”从当前光标处删至行

首,ndw(或dnw)删除n个词。

4、替换正文

P将缓冲区的内容粘贴到当前光标处,AgP将g缓冲区里的内容粘贴到当前

行下,AgP将g缓冲区的内容粘贴到当前行上,rn用字符n替换当前字符。

5、查找定位

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

上半屏。

6、文件操作

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

复前一步的改变,:efilename编辑文件名,:wfilename写文件名,:w!filename

重写文件名,:!cmd运行一个命令,然后返回,75显示当前文件和行号。

-7-

三、熟悉系统的安装与使用

3.2.4实验总结

1)说明vi的三种主要操作方式。

2)对上述各vi操作举例列表说明。

-8-

四、内核监视与动态跟踪实验

四、内核监视与动态跟踪实验

4.1概述

4.1.1MDB简介

MDB(ModularDebugger)是Solaris操作系统自带的内核级调试工具。它

为调试这些程序和方案提供完全可自定义环境,其中包括动态模块工具,它可以

让程序员自己定义调试命令来对执行程序进行特定的分析。每个MDB模块都可

用于在儿种不同的上下文(包括实时的和事后的)中检查程序。Solaris操作系

统包含一组MDB模块,旨在帮助程序员调试Solaris内核以及相关的设备驱动

程序和内核模块。

MDB可提供范围广泛的功能集合,用于分析Solaris内核和其他目标程序。

它可以实现以下功能:

+查找特定线程分配的所有内存

*歹U显内核STREAM的直观图

*确定特定地址所引用的结构类型

*在内核中查找已泄漏的内存块

*分析内存以查找栈跟踪

在Solaris系统中,以共享通用功能的两个命令提供MDB:mdb和kmdbo

可以使用mdb命令以交互方式或在脚本中调试实时用户进程、用户进程核心转

储文件、内核崩溃转储、实时操作系统、目标文件和其他文件。在还需要控制和

停止内核执行时,可以使用kmdb命令调试实时操作系统内核和设备驱动程序。

-9-

四、内核监视与动态跟踪实验

MDBLanguageMDBModuleAPI

DebuggerEngine

disassemblerlibkvmtarget/proctarget

图4-1MDB体系结构

在本实验课中,我们将用MDB来打印一些内核数据结构。

mdb中输入命令的格式是:

expression::dcmd

e.g.0x300acde123::ps

通过

::dmods-IHess

或者::dcmds

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

如果需要了解一个命令的参数,输入

::help命令名

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

::helpps

具体的MDB命令使用方法将在具体的实验中说明。

-10-

四、内核监视与动态跟踪实验

4.1.2Dtrace简介

DTrace是一个用于SolarisTM操作系统的动态跟踪框架。它可用于检查用户

程序和操作系统的行为,可由系统管理员或应用程序开发者使用,适用于实时生

产系统。DTrace允许用户查看系统,以便了解其工作方式、在软件的多个层之

间跟踪性能问题或找出导致异常行为的原因。用户可以使用DTrace来创建自己

的自定义程序,以便动态地检测系统,并对可用Dtrace的编程语言D语言阐明

的任意问题做出快速简明的回答。

DTrace允许所有Solaris用户执行以下操作:

*动态地启用和管理数以千计的探测器

,动态地将逻辑谓词和操作与探测器相关联

*动态地管理跟踪缓冲区和缓冲区策略

4显示和检查来自实时系统或崩溃转储的跟踪数据

DTrace允许Solaris开发者和管理员执行以下操作:

,实现使用DTrace工具的自定义脚本

*实现使用DTrace检索跟踪数据的分层工具

Dtrace工具的动态跟踪功能是通过散布在整个Solaris系统中的儿万个probe

(探测器)来实现的。probe类似于位于系统中受关注位置的一些可编程传感器。

如果要确定系统的状态,可使用DTrace对相应的传感器进行编程,以便记录关

注的信息。当每个probe触发时,DTrace便会从probe中收集数据并向用户报告。

如果未对probe指定任何操作,DTrace将仅记录probe的每次触发。

请注意,每个probe的名称由四个部分组成:

表4-1probe各部分的名称含义

名称含义

提供器(provider)发布此探测器的DTrace提供器的名称。提供器名称通常与执行检测过

程以启用探测器的DTrace内核模块的名称相对应。

模块(module)此探测器对应于特定的程序位置时,为探测器所在模块的名称。该名

称为内核模块的名称或用户库的名称。

函数(function)此探测器对应于特定的程序位置时,为探测器所在程序函数的名称。

名称(name)探测器名称的最后组成部分是一个有助于您了解探测器语义的名称

(如BEGIN或END)。

-11-

四、内核监视与动态跟踪实验

写出完整的人工可读的探测器名称时,用冒号分隔列出该名称的所有四个部

分,如下所示:

#probedescriptions

provider:module:function:name

D语言脚本程序的结构如下:

probedescriptions

/predicate/

(

actionstatements

}

当D脚本执行时,探测器描述所指定的probe就会被打开。当probe被触发

并且predicate(断言)为真时,声明的操作就会执行。

用如下命令查看系统中的所有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-

四、内核监视与动态跟踪实验

Dtrace的体系结构如下图所示:

libdtrace(3LIB)

用户级

dtrace(7D)

一丙核

DTrace

DTrace

图4-2Dtrace体系结构和组件概览

Dtrace脚本的运行方式,是在终端中输入“./filename”,如运行sleep.d脚本

就是在终端中键入"./sleep.d":

#./sleep.d

有些脚本需要带参数,就直接跟在脚本后面输入即可,如:

#./syscall.d1516

脚本的退出有两种情况,一种是自动退出,一种是强制退出。

自动退出又包含了两种情况,一种是在执行脚本时遇到了exit语句;另一种

是通过-c指定了运行的命令,命令结束后,脚本也跟着结束。

强制退出是使用kill或pkill结束脚本,也就是另外运行一个shell,然后运

行kill或pkill结束dtrace进程。或者用Control+C强制推出。

-13-

四、内核监视与动态跟踪实验

4.2实验三系统调用(systemcalls)

4.2.1实验目的

本实验从系统调用入手,让学生看到fork。函数被调用来创建进程的过程,

同时用内核跟踪工具跟踪新创建的进程进行系统调用的过程,对系统调用的调用

层次和调用次数进程统计和打印。

本实验旨在加深学生对进程的理解,区分进程和程序的区别;让学生对操作

系统内核以及系统调用的过程有一个最直观的了解。

4.2.2实验预习内容

复习进程的概念,了解vfork。、forkl()函数的功能和它们的区别,熟悉在

Solaris系统中的进程管理相关命令。

4.2.3实验内容及步骤

1、在桌面环境中打开一个终端(在CDE中右击鼠标,选择工具->终端)。

2、用"#cddtrace」ab”命令进入/dtrace」ab文件夹,所有的实验素材都在

这个文件夹中。本实验的脚本在system_calls子目录中:

#cddtracejab/system__call

#

3、运行fork.d脚本,然后从桌面环境中再打开一个终端,即可看到如下输

出:

#./fork.d

forkldtexecforkedPID1513

forkldtwmforkedPID1512

vforkdttermforkedPID1514

forkldttermforkedPID1515

第一列显示的是调用fork。函数进行进程创建的程序名称,D语言的脚本中

用内置变量execname得到。最后一列是被fork创建的新进程的pid,比如pid为

1515的进程运行是CDE环境下的伪终端程序dttermo

在新打开的终端中运行“echo$$"命令,可以看到该终端的进程号:

#echo$$

1515

#

-14-

四、内核监视与动态跟踪实验

fork.d脚本的输出记录了我们在桌面右击然后打开一个终端的过程中,那些

进程被创建了、被创建的进程pid是多少。

下图是这些进程的关系图:

图4-3启动••个终端的过程

4、在新创建的终端中运行gedit程序,这是一个可视化的文本编辑器。

#gedit

这时将出现gedit程序的编辑窗口,如图4-3所示:

图4-4gedit文本编辑器

并且运行fork.d脚本的终端将有新的输出:

-15-

四、内核监视与动态跟踪实验

dtexecforkedPID1513

fork1dtwmforkedPID1512

vforkdttermforkedPID1514

fork1

;ork1dttermforkedPID1515

shforkedPID1516

进程1516就是刚才启动的gedit对应的进程pid号。

如果中断fork.d脚本运行,它将输出本次运行过程中进程创建的统计数据:

WHOWHICHFORKCOUNT

*11

dttermfok1

dttermvf

foo*r12

gnectfo12

shfork*16

bash

该数据显示了每个程序进行进程创建的次数以及用哪个函数进行创建。

5、接下来,在另一个终端中运行syscall.d脚本,这个脚本需要一个参数,

即一个进程的pid,我们用1516这个进程来实验(也就是刚才新启动的文本编辑

器gedit的进程)。

运行脚本"./syscall.d1516",这个脚本记录了它跟踪到的5个gedit进行的

系统调用,并打印出该系统调用函数调用其它内核函数的调用次序

#,/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

[……]

脚本运行结束时打印系统调用和内核函数调用的次数统计情况:

-16-

四、内核监视与动态跟踪实验

——……systemcalls

read2

sigaction1

write2

-kernelcalls

allocbwait2

msgdsize9

releasestr9

getq_noenab10

kmemcachealloc11

apic_setspl18

putnext19

[……]

我们可以去查看一下sigaction()函数的源代码,它位于uts/common/syscall

目录下的sigaction.c文件中。通过代码我们也可以验证上面打印出的调用顺序。

请注意,由于dtrace是动态跟踪工具,而函数流程可能是分支结构,所以打

印出的函数调用关系不是唯一的,每一次所显示的只是那一次运行函数的调用关

系。

如果想一直记录某个进程的系统调用情况并查看它对内核函数的调用关系,

可以运行syscalll.d脚本,它将一直跟踪某个进程的函数调用情况,记录了一个

进程所有的系统调用以及这个系统调用进行的内核函数调用。强行退出时将打印

总的系统调用次数。由于输出很长,这里就不再赘述。

4.2.4实验总结

1、通过实验结果解释一下从CDE桌面启动一个终端,发生了哪些进程创建

的过程?

2、观看syscalLd的打印输出,然后在源代码中查看被调用的函数,了解这

些函数的功能。

-17-

四、内核监视与动态跟踪实验

4.3实验四进程与线程(processesandthreads)

4.3.1实验目的

通过实验查看进程的结构proc」的信.息,加深对进程概念的认识;查看内核

线程被阻塞时同步对象的类型;查看在TS(分时)调度等级队列中的内核线程

时间片剩余的情况,体会时间片轮转调度算法;查看进程间通信(IPC)机制中

系统调用的次序。

通过以上几个实验,加深学生对理论知识的理解,让学生对课堂所学知识有

直观的认识。

4.3.2实验预习内容

学习Solaris操作系统的两级调度模型,浏览内核源代码中proc结构、klwp

结构和kthread结构的定义,了解相关字段的含义,了解fork函数的功能,了解

内核线程调度等级的概念。学习IPC的各种机制模型,如共享内存、消息队列、

信号量等。

4.3.3实验内容及步骤

本次实验分四个部分,需要的脚本和程序在/dtrace」ab/proc_thread目录下

1用MDB工具查看进程数据结构proc_to

1、打开一个终端,键入命令"mdb-k”进入MDB:

bash-3.00#mdb-k

Loadingmodules:[unixkrtldgenunixspecfsdtraceuppc

pcplusmpufsipsctpusbauhcis1394fctlncalotszfs

randomnfsspppcryptoptmipc]

2、在命令行提示符下输入命令“ps”,查看当前系统中运行的进程:

-18-

四、内核监视与动态跟踪实验

.>

DHDpGD

SIDSIUIDFLAGSADDRNAME

RoooO

R3ooO00x00000001fec1dd7csched

R2ooO00x00020001d3224278fsflush

R1ooO00x00020001d3224ae0pageout

R:ps119800x42004000d3225348init

Rpl7188378700x42014000d47cd1e8gpdf

89766300x42004000d47cf388mozilla

-8238

R87387

737300x42014000d32130f0dtterm

R740738740740

R53052753053000x42004000d3213958sh

R52852752852800x42004000d320f1c8Xorg

R525152452400x42004000d321c010fbconsole

00x42000000d3217880snmpd

其中倒数第二列“ADDR”是该进程结构proc_t的首地址,我们要使用它来

查看进程结构。

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-

四、内核监视与动态跟踪实验

这里打印了该进程结构proc」的各自段的值,其含义请查阅相关资料。这里

给出一些比较重要的字段的含义:

表4-1proc_t部分字段

字段含义

p_execvnode指针,指向一个ELF文件,最终指向磁盘

上的该进程对应的可执行文件o

P-as指向该进程的进程地址空间

P_PPid父进程的pid

p_parent指向父进程proc_t结构的指针

p_child指向第一个子进程结构的指针

p_next^pjDrev维护进程链表的指针,指向前后的进程结构

p_orphan孤儿指针,在其子进程被kill后,指向其子进程

创建的子进程。

P_pidp指向一个pid结构体,里面描述了一些pid信息

pjwpid最近分配给该进程的Iwp的id号

pjwpcnt该进程拥有的Iwp数量

p_utime该进程的用户态时间片

p_stime该进程的系统时间片

P.doorjist该进程的door链表的首节点地址

3、可以再继续跟踪一些指针,可以得到丰富的信息,比如我们再查看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

)

[……]

这里打印的是管理该进程地址空间的一个段结构的信息,s.base是段的首地

址,s_size是该段的大小,s_data是该段的段地址。如果再跟踪s_data的话,还

可以看到这个进程运行的机器指令。

关闭终端,结束该实验。

-20-

四、内核监视与动态跟踪实验

2查看阻塞线程的同步对象类型

Solaris操作系统是基于线程的两级调度,最终被处理机调度的是内核线程

(kthread),在不同的调度等级上的调度策略不同,比如在分时(TS)等级上是

基于优先级的抢占式、时间片轮转调度。而在系统内核中,各线程之间会由于一

些同步事件而被阻塞,比如进程间通信、读写互斥,条件变量不满足等,也可能

是用户程序造成的等待。

这里用sleep.d脚本跟踪被阻塞线程的同步对象类型。当一个内核线程在同

步对象上休眠时,将激活该脚本里sched:::sleep探针,此时系统会设置Iwpsinfo

结构的一个字段pjstype,以表示同步对象的类型,见下表:

表4-2同步对象类型

阻塞类型含义

SOBJ_MUTEX内核互斥同步对象

SOBJ_RWLOCK读写锁同步对象

SOBJ_CV条件变量同步对象

SOBJ_SEMA信号量同步对象

SOBJ_USER用户级同步对象

SOBJ_USER_PI优先级继承的用户级同步对象

SOBJ_SHUTLE互动同步对象(与Solaris门相关)

1、打开一个终端,进入/dtrace_lab/proc_thread目录,运行sleep.d脚本:

bash-3.00#./sleep.d

2、再打开一个终端,运行,一些程序,如gedit、starsuite(类似office的办公

软件)。然后按Control+C结束sleep.d脚本,就可以看到如下结果(节选):

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-

四、内核监视与动态跟踪实验

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……]

可以看到发生阻塞得线程号、线程的地址、阻塞的同步对象类型以及被阻塞

的次数。在一个线程的生命周期内,线程的地址可以看作是这个线程的唯一标识。

3查看线程调度中各线程时间片的剩余情况

TS等级的线程是按时间片轮转来调度的。内核函数ts」ick()将检查各线程的

盛誉时间片情况。如果一个线程时间片用完,则该函数将阻塞这个线程。下面是

ts_tick()函数的定义:

staticvoid

ts_tick(kthread_t*t);

内核进入该函数的时候将激活一个probe,在这个probe中我们利用当前线

程指针(即ts_tick()函数的参数)得到该线程剩余的时间片(请参阅相应部分源

代码)。

1、打开一个终端,运行ts.d脚本

bash-3.00#./ts.d

2、在另一个终端中运行一个计算质数的程序(这个程序需要大量地占用

CPU):

bash-3.00#./calculate

-22-

四、内核监视与动态跟踪实验

然后可以看到脚本的输出如下:

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的进程对应的内核线程在某个时刻还

有TICKSLEFT个时间单位剩余。CNT是这种情况出现的次数。

4进程间通信中系统调用的关系及通信数据的显示

Solaris系统提供的进程间通信(IPC)机制主要有共享内存、信号量、消息

队列以及Solaris门几种。我们这里选择消息队列来进行实验。

消息队列是系统内核地址空间中的一个内部的链表。消息可以按照顺序发送

到队列中,也可以以儿种不同的方式从队列中读取。每一个消息队列用一个唯一

的IPC标识符表示(消息队列不一定是先进先出,也可以按消息的类型字段取消

息)。

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论