实验一观察进程线程的相关数据结构

合集下载

Windows进程与线程数据结构

Windows进程与线程数据结构

Windows进程与线程数据结构Windows进程与线程数据结构1、引言1.1 目的1.2 背景2、进程与线程概述2.1 进程的定义与特点2.2 线程的定义与特点2.3 进程与线程的关系3、进程数据结构3.1 进程控制块 (Process Control Block, PCB) 3.1.1 PCB的作用与组成3.1.2 PCB中的进程属性3.2 进程地质空间3.2.1 用户态和内核态地质空间3.2.2 虚拟内存管理3.3 进程状态3.3.1 进程的执行状态3.3.2 进程的阻塞状态3.3.3 进程的就绪状态3.4 进程调度算法3.4.1 先来先服务(First-Come, First-Served, FCFS)3.4.2 短作业优先(Shortest Job Next, SJN)3.4.3 优先级调度算法3.4.4 时间片轮转调度算法3.4.5 多级反馈队列调度算法4、线程数据结构4.1 线程控制块 (Thread Control Block, TCB)4.1.1 TCB的作用与组成4.1.2 TCB中的线程属性4.2 线程同步4.2.1 互斥量 (Mutex)4.2.2 信号量 (Semaphore)4.2.3 事件 (Event)4.2.4 临界区 (Critical Section)4.3 线程调度4.3.1 抢占式调度与非抢占式调度4.3.2 线程优先级4.3.3 协同式调度与抢占式调度5、附件附件1、进程与线程数据结构示意图附件2、示例代码法律名词及注释:- 进程:指计算机系统中同一程序的不同执行实例,具有独立的运行空间和资源。

- 线程:是系统内的执行单元,是程序中的一个执行流程,一个进程可以拥有多个线程。

- PCB(Process Control Block):每个进程在操作系统中都对应着一个PCB数据结构,用于保存进程的相关信息。

- 进程地质空间:进程分配的内存空间,用于存放程序、数据和堆栈等信息。

线程实例实验报告总结

线程实例实验报告总结

一、实验目的本次实验旨在通过实例操作,深入了解线程的概念、创建、同步与通信机制,以及线程在实际编程中的应用。

通过实验,提高对线程的理解和运用能力,为以后开发多线程程序打下坚实基础。

二、实验环境1. 操作系统:Windows 102. 开发工具:Visual Studio 20193. 编程语言:C#三、实验内容1. 线程的基本概念线程是程序执行的最小单位,是操作系统进行资源分配和调度的基本单位。

线程具有以下特点:(1)线程是轻量级的,创建、销毁线程的开销较小。

(2)线程共享进程的资源,如内存、文件等。

(3)线程之间可以并发执行。

2. 线程的创建在C#中,可以使用以下方式创建线程:(1)使用Thread类```csharpThread thread = new Thread(new ThreadStart(MethodName));thread.Start();```(2)使用lambda表达式```csharpThread thread = new Thread(() => MethodName());thread.Start();```(3)使用匿名方法```csharpThread thread = new Thread(delegate () { MethodName(); });thread.Start();```3. 线程的同步线程同步是指多个线程在执行过程中,为了防止资源冲突而采取的协调机制。

C#提供了以下同步机制:(1)互斥锁(Mutex)```csharpMutex mutex = new Mutex();mutex.WaitOne();// 线程同步代码mutex.ReleaseMutex();```(2)信号量(Semaphore)```csharpSemaphore semaphore = new Semaphore(1, 1);semaphore.WaitOne();// 线程同步代码semaphore.Release();```(3)读写锁(ReaderWriterLock)```csharpReaderWriterLock rwlock = new ReaderWriterLock();rwlock.AcquireReaderLock();// 读取操作rwlock.ReleaseReaderLock();```4. 线程的通信线程通信是指线程之间传递消息、共享数据的过程。

计算机操作系统实验课实验报告

计算机操作系统实验课实验报告

实验报告实验课程: 计算机操作系统学生姓名:XXX学号:XXXX专业班级:软件2014年12月25日目录实验一熟悉Windows XP中的进程和线程 (3)实验二进程调度 (7)实验三死锁避免—银行家算法的实现 (16)实验四存储管理 (22)实验一熟悉Windows XP中的进程和线程一、实验名称熟悉Windows XP中的进程和线程二、实验目的1、熟悉Windows中任务管理器的使用。

2、通过任务管理器识别操作系统中的进程和线程的相关信息。

3、掌握利用spy++.exe来察看Windows中各个任务的更详细信息。

三、实验结果分析1、启动操作系统自带的任务管理器:方法:直接按组合键Ctrl+Alt+Del,或者是在点击任务条上的“开始”“运行”,并输入“taskmgr.exe”。

2、调整任务管理器的“查看”中的相关设置,显示关于进程的以下各项信息,并完成下表:表一:统计进程的各项主要信息3、启动办公软件“Word”,在任务管理器中找到该软件的登记,并将其结束掉。

再从任务管理器中分别找到下列程序:winlogon.exe、lsass.exe、csrss.exe、smss.exe,试着结束它们,观察到的反应是任务管理器无法结束进程,原因是该系统是系统进程。

4、在任务管理器中找到进程“explorer.exe”,将之结束掉,并将桌面上你打开的所有窗口最小化,看看你的计算机系统起来什么样的变化桌面上图标菜单都消失了、得到的结论 explorer.exe是管理桌面图标的文件(说出explorer.exe进程的作用)。

5、运行“spy++.exe”应用软件,点击按钮“”,切换到进程显示栏上,查看进程“explorer.exe”的各项信息,并填写下表:进程:explorer.exe 中的各个线程6、注意某些线程前有“+”,如图所示:,说明二者之间的差异前有“+”其器线程下有窗口。

四、心得体会通过本次实验,我了解到了windows系统中进程的管理与操作,我了解了如何切出任务管理器,任务管理器应用与其他与进程相关的知识,明白了有些系统程序不能够关闭,系统中的进程与线程虽然很多,但是其中有许多关联,只要弄清楚其中的关联那么就能够运用好进程与线程,达到我们的目的。

进程管理实验报告_共10篇 .doc

进程管理实验报告_共10篇 .doc

★进程管理实验报告_共10篇范文一:_进程管理实验报告进程管理实验报告一、进程与线程1.实验目的:1.通过本实验学习Linux中创建进程的方法。

2.学习系统调用fork的使用方法。

3.学习系统调用exec族调用的使用方法。

2.实验准备1.进程的创建创建一个进程的系统调用很简单,只要调用fork函数就可以了。

#includepid_tfork();当一个进程调用了fork以后,系统会创建一个子进程,这个子进程和父进程是不同的地方只有它的进程ID和父进程ID,其他的都一样,就像父进程克隆(clone)自己一样,当然创建两个一模一样的进程是没有意义的,为了区分父进程和子进程,我们必须跟踪fork调用返回值。

当fork调用失败的时候(内存不足或者是用户的最大进程数已到)fork返回—1,否则fork的返回值有重要的作用。

对于父进程fork返回子进程ID,而对于fork 子进程返回0,我们就是根据这个返回值来区分父子进程的。

2.关于fork的说明使用该函数时,该函数被调用一次,但返回两次,两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID。

将子进程ID返回给父进程的理由是:因为一个进程的子进程可以多于一个,所以没有一个函数可以是一个子进程获得其所有子进程的进程ID。

而fork函数使子进程得到的返回值是0的理由是:一个子进程只会有一个父进程,所以子进程总是可以调用函数getpid获得其父进程的进程ID。

3.系统调用exec族调用的说明父进程创建子进程后,子进程一般要执行不同的程序。

为了调用系统程序,我们可以使用系统调用exec族调用。

Exec族调用有以下五个函数:intexecl(constchar*path,constchar*arg,?);intexeclp(constchar*file,constchar*arg,?);intexecle(constchar*path,constchar*arg,?);intexecv(constchar*path,constchar*argv[]);intexecvp(constchar*file,constchar*argv[]);exec族调用可以执行给定程序。

观察进程线程的相关数据结构

观察进程线程的相关数据结构

目录:一、 查看执行体进程块(EPROCESS) 二、查看内核进程块(KPROCESS)三、查看系统中的正在运行的进程四、查看进程的相关信息五、查看线程的相关信息六、查看某个未知的对象一、 查看执行体进程块(EPROCESS)Windows 进程线程的相关数据结构如下图所示:每个 Windows 进程都有一个执行体进程块(EPROCESS),它位于系统空间中,记录着与进程相关的很多信息。

实验步骤:1) 启动 WinDbg 到内核调试模式。

2) 在调试器命令窗口(Debugger Command window)底行命令输入行(以“kd>”为前缀,下面简称“底行命令行”)键入命令“dt _eprocess”或“dt _EPROCESS”(命令dt _eprocess 功能是显示_eprocess 结构的详细信息,详细用法参见WinDbg 帮助文档),输出如下(由于EPROCESS 结构中包含的内容过多,在此仅列出一小部分):我们可以观察到在显示的信息中,最左边一列是十六进制数,表示 EPROCESS 结构中的变量(结构体,指针等)相对与起始地址的偏移量,中间一列为EPROCESS 结构中的变量名,最右边为变量的类型。

例如:第一行中的+0x000 表示Pcb,即EPROCESS 结构的起始地址,_KPROCESS 为Pcb 的类型。

+0x094 处的UniqueProcessId 就是平时我们说的PID,它为一个32 位系统指针。

关于EPROCESS 结构的详细定义可在源文件“..\base\ntos\inc\ps.h”中找到。

二、 查看内核进程块(KPROCESS)在查看执行体进程块(EPROCESS)时我们看到其中的第一个变量是Pcb,其类型为_KPROCESS。

我们可以通过dt 命令查看KPROCESS 实验内容:观察进程线程的相关数据结构华南师范大学计算机学院尹传勇整理2012年8月23日19:13在查看执行体进程块(EPROCESS)时我们看到其中的第一个变量是Pcb,其类型为_KPROCESS。

Windows进程与线程数据结构

Windows进程与线程数据结构

《操作系统原理实验》Windows进程与线程数据结构主讲:黄伯虎Windows 体系结构简化的windows 结构图Kernel: 由低层次的操作系统功能构成,比如线程调度、中断和异常分发、多处理器同步等。

提供了一些例程和基本对象。

执行体可以利用这些对象实现更高层次的功能。

Executive: 包含了基本的操作系统服务,包括内存管理、进程和线程管理、安全性、I/O 、网络和跨进程通信等。

Windows基本对象暴露给windows API的执行体对象执行体对象:指由执行体的各种组件(比如进程管理器、内存管理器、I/O子系统等)所实现的对象。

用户可见。

内核对象:指由Windows内核实现的一组更为基本的对象。

内核对象对用户而言是不可见的,只能在执行体内部被创建和使用。

Windows进程的组成(从最高抽象层次看)一个私有的虚拟地址空间一个可执行的程序:定义了代码和数据,并被映射到进程的虚拟地址空间。

一个已经打开句柄的列表:指向各种资源,比如信号量、文件,该进程的所有线程都可访问这些系统资源。

一个被称为访问令牌的安全环境:标识与该进程关联的用户、安全组和特权一个被称为进程ID的唯一标识至少一个执行线程Windows进程的关键数据结构执行体进程块(EPROCESS)执行体进程对象的对象体,包括进程ID、父进程ID、程序名、进程优先级、内存管理信息、设备映像等。

核心进程块(KPROCESS)内核进程对象的对象体,又称PCB,包括线程调度时需要的信息,如进程状态、线程时间片等。

进程环境块(PEB)包括用户态代码需要和修改的信息。

Windows环境子系统核心态部件win32k.sys为每个进程建立的进程信息数据结构WIN32KPROCESSWindows环境子系统进程csrss(用户态)为每个进程建立的进程信息数据结构Process environmentblockWin32 process blockHandle tableProcess address spaceSystem address spaceProcess block (EPROCESS)PCB组成线程的基本部件一组代表处理器状态的CPU寄存器中的内容两个栈:一个用于当线程在内核模式下执行的时候,另一个用于线程在用户模式下执行的时候。

查看程序的进程和线程实验报告

查看程序的进程和线程实验报告

查看程序的进程和线程实验报告篇一:程序实验2:11-多线程编程---实验报告程序实验二:11-多线程编程实验专业班级实验日期 5.21 姓名学号实验一(p284:11-thread.c)1、软件功能描述创建3个线程,让3个线程重用同一个执行函数,每个线程都有5次循环,可以看成5个小任务,每次循环之间会有随即等待时间(1-10s)意义在于模拟每个任务到达的时间是随机的没有任何的特定规律。

2、程序流程设计3.部分程序代码注释(关键函数或代码)#include#include#include#define T_NUMBER 3#define P_NUMBER 5#define TIME 10.0void *thrd_func(void *arg ){(本文来自:小草范文网:查看程序的进程和线程实验报告) int thrd_num=(int)arg;int delay_time =0;int count =0;printf("Thread %d is staraing\n",thrd_num);for(count=0;count {delay_time =(int)(rand()*TIME/(RAND_MAX))+1;sleep(delay_time);printf("\tTH%d:job%d delay =%d\n",thrd_num,count,delay_time);}printf("%d finished\n",thrd_num);pthread_exit(NULL);}int main(){pthread_t thread[T_NUMBER];int no=0,res;void * thrd_ret;srand(time(NULL));for(no=0;no {res=pthread_create(&thread[no],NULL, thrd_func,(void*)no);if(res!=0){printf("Creay th %d faild\n",no);exit(res);}}printf("success\nwaiting\n");for(no=0;no {res=pthread_join(thread[no],&thrd_ret);if(!res){printf("t %d joined\n",no);}else{printf("T %djoined faild\n",no);}}return 0;}4.编译、运行方法及结果(抓屏)5.结果分析由运行结果可以看出,创建线程、释放资源按照顺序,而每个线程的运行和结束是独立与并行的。

Linux操作系统--进程线程(2)

Linux操作系统--进程线程(2)

Linux操作系统--进程线程(2)前言在本系列的上一篇博文里,我已经介绍了进程/线程的基本含义以及一些相关数据结构,现在我们来看看Linux中进程的管理。

进程链表Linux内核定义了一个list_head结构,数据结构定义struct list_head {struct list_head *next;struct list_head *prev;};字段next 和prev 分别表示通用双向链表向前和向后的指针元素!list_head字段的指针中存放的是另一个list_head字段的元素,而不是本身的数据结构地址。

如图在我们上一篇博客介绍到的进程描述符(task_struct)也有这个结构体,称为进程链表。

进程链表是一个双向循环链表,它把所有进程的描述符链接起来。

每个task_struct结构都包含一个list_head类型的字段tasks,这个结构的prev和next分别指向前面和后面的task_struct元素。

这个链表是一个循环的双向链表,开始的时候只有init_task这一个进程,它是内核的第一个进程,它的初始化是通过静态分配内存,"手动"(其它的进程初始化都是通过动态分配内存初始化的)进行的,每新建一个进程,就通过SET_LINKS宏将该进程的task_struct结构加入到这条双向链表中,不过要注意的是如果一个进程新建一个线程(不包括主线程),也就是轻量级进程,它是不会加入该链表的。

通过宏for_each_process可以从init_task开始遍历所有的进程。

#define for_each_task(p)for (p = &init_task ; (p = p->next_task) != &init_task ; )可运行队列(runqueue)当内核寻找一个新进程在CPU上运行时,必须只考虑可运行进程(即处在TASK_RUNNING状态的进程)。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验一
观察进程线程的相关数据结构
(实验指导)
广州中医药大学
操作系统课程组
目录:
一、二、三、四、五、六、观察执行体进程块(EPROCESS) (3)
观察内核进程块(KPROCESS) (4)
观察系统中的正在运行的进程 (5)
观察进程的相关信息 (7)
观察线程的相关信息 (9)
观察某个未知的对象 (10)
Windows NT 的内核模式组件体现了基本的面向对象设计原则。

例如,它们通常并不会直接进入另一个组件的数据结构来访问该组件所维护的信息。

相反,它们利用正式的接口来传递参数,以及访问或修改相应的数据结构。

虽然Windows 内部普遍地使用了对象来表达共享的系统资源,但是,从严格意义上讲,Windows 并不是一个面向对象的系统。

为了移植性的考虑,Windows 操作系统的大多数代码是用 C 语言编写的,只有那些需要直接与系统硬件进行通信的部分(比如中断陷阱处理器——Interrupt trap handler),或者对性能极端敏感的操作系统部分(比如环境切换——Context switching),才是用汇编语言编写的。

不过C 语言并不直接支持面向对象的概念,比如数据类型的动态绑定、多态函数或者类继承等。

因此,Windows 中C 语言版本的对象实现只是借用了(但并不依赖于)特定面向对象语言的特性。

Windows NT 是基于对象的操作系统,它将进程和线程也作为对象来管理。

下面我们就通过WinDbg 来观察进程、线程的一些相关数据结构。

一、观察执行体进程块(EPROCESS)
Windows 进程线程的相关数据结构如下图所示:
每个Windows 进程都有一个执行体进程块(EPROCESS),它位于系统空间中,记录着与进
程相关的很多信息。

实验步骤:
1) 启动WinDbg 到内核调试模式。

(参见“WinDbg 简介/启动kernel mode 调试”)。

2) 在调试器命令窗口(Debugger Command window)底行命令输入行(以“kd>”为前缀,下面
简称“底行命令行”)键入命令“dt _eprocess”或“dt _EPROCESS”(命令dt _eprocess 功
能是显示_eprocess 结构的详细信息,详细用法参见WinDbg 帮助文档),输出如下(由于EPROCESS 结构中包含的内容过多,在此仅列出一小部分):
我们可以观察到在显示的信息中,最左边一列是十六进制数,表示EPROCESS 结构中的变量(结构体,指针等)相对与起始地址的偏移量,中间一列为EPROCESS 结构中的变量名,最右边为变量的类型。

例如:第一行中的+0x000 表示Pcb,即EPROCESS 结构的起始地址,_KPROCESS 为Pcb 的类型。

+0x094 处的UniqueProcessId 就是平时我们说的PID,它为一个32 位系统指针。

关于EPROCESS 结构的详细定义可在源文件
“..\base\ntos\inc\ps.h”中找到。

二、观察内核进程块(KPROCESS)
在查看执行体进程块(EPROCESS) 时我们看到其中的第一个变量是Pcb ,其类型为
_KPROCESS。

我们可以通过dt 命令观察_KPROCESS 中的内容。

实验步骤:
在底行命令行键入命令“ dt _kprocess ”或“dt _KPROCESS”,输出如下(未列出全部内容):
关于KPROCESS 结构的详细定义可在源文件“..\base\ntos\inc\ke.h”中找到。

通过观察源文件我们可以看出,KPROCESS 的结构跟上图中我们利用WinDbg 观察到的结果是一致
的。

三、观察系统中的正在运行的进程
实验步骤:
1)在底行命令行键入命令“!process 0 0”,可以显示出当前系统中所有进程的基本信息。


下图:
进程地址进程Cid 号父进程Cid 号
进程映像名会话ID进程Peb 结构地址
Cid 在内核中是Client id 的意思,其实就是进程的Pid 号,这里Cid 号是以十六进制来表
示的。

以上图最后一个进程(Image:explorer.exe)为例,我们可以用命令“ .for mats ”将它转换为十
进制,在底行命令行键入命令“ .formats 0x0464 ”,显示结果如下:
2)在底行命令行键入命令“g”,或者点击菜单“Debug->Go”,使虚拟机恢复运行,打开虚
拟机中windows 系统任务管理器观察进程的信息,如下图:
从任务管理器中可以看到,进程(Image Name: explorer.exe)的PID 值为1124(十进制),正
好对应了从WinDbg 中看到的Cid:0464(十六进制)。

3)点击WinDbg 菜单“Debug->Brea k”使虚拟机暂停执行。

四、观察进程的相关信息
我们仍以进程(Image: explorer.exe)为例来观察。

实验步骤:
1)在底行命令行键入命令“!process 813b6770 1”(813b6770 是被观察进程的地址,不同的
机器中这一地址会不同,也可以将进程地址换为进程的PID,即“!process04641”,命令中最后的1 表示显示信息的详细程度,可以取值0—7),显示信息如下图(未列出全部信息):
上图中标记的是当前进程的内存使用量,可以看出和任务管理器中看到的结果一致。

3)用命令“dt _eprocess 813b6770”观察EPROCESS 结构中的详细信息,如下:
4)用命令“dt _kprocess 813b6770“进一步观察Pcb 中的内容(图略)。

可以看出此时显示的是具体数据结构的值而不是其定义(区别于命令“dt _EPROCESS”和“dt _KPROCESS”)
五、观察线程的相关信息
实验步骤:
1)键入命令“!process 0 0 ”,显示出系统中所有进程信息。

2)选取一个进程(Image: explorer.exe”,在底行命令行输入命令“!process 0464 2”(0464 为进程PID,不同的机器会有所不同),显示信息如下:
4)随便选取其中的一个线程,这里选择了最后一个,先后键入命令“!thread 81221db 0”和“!thread 81221db0 6”(81221db0 为选取的线程地址),显示该线程的信息,可以看出显示的详细程度不同。

5)在底行命令行输入命令“ dt _ethread 81221db0 ”观察该线程ETHREAD 详细内容(图略)。

6)输入命令“dt _kthread81221db0”观察Tcb(KTHREAD)中的内容,(图略)。

六、观察某个未知的对象
如果不知道某个对象或者变量是什么,可以用“!Object address”来观察此地址的对象信息。

例如下图:
红线之上是用命令“ !process 0 0 ” 获得的一个进程信息,红线之下是用“ !object 813c5c50 ”来观察它的信息,可知它是一个进程。

当然,在使用这个命令有时候会出现如下图所示的错误,这个说明输入的地址不是一个对象(因为你输入的地址可以是任意的)。

相关文档
最新文档