操作系统:进程创建与撤消
操作系统实验报告进程管理

操作系统实验报告进程管理操作系统实验报告:进程管理引言操作系统是计算机系统中的核心软件,负责管理计算机的硬件资源和提供用户与计算机之间的接口。
进程管理是操作系统的重要功能之一,它负责对计算机中运行的各个进程进行管理和调度,以保证系统的高效运行。
本实验报告将介绍进程管理的基本概念、原理和实验结果。
一、进程管理的基本概念1. 进程与线程进程是计算机中正在运行的程序的实例,它拥有独立的内存空间和执行环境。
线程是进程中的一个执行单元,多个线程可以共享同一个进程的资源。
进程和线程是操作系统中最基本的执行单位。
2. 进程状态进程在运行过程中会经历不同的状态,常见的进程状态包括就绪、运行和阻塞。
就绪状态表示进程已经准备好执行,但还没有得到处理器的分配;运行状态表示进程正在执行;阻塞状态表示进程由于某些原因无法继续执行,需要等待某些事件的发生。
3. 进程调度进程调度是操作系统中的一个重要任务,它决定了哪个进程应该获得处理器的使用权。
常见的调度算法包括先来先服务(FCFS)、最短作业优先(SJF)和时间片轮转等。
二、进程管理的原理1. 进程控制块(PCB)PCB是操作系统中用于管理进程的数据结构,它包含了进程的各种属性和状态信息,如进程标识符、程序计数器、寄存器值等。
通过PCB,操作系统可以对进程进行管理和控制。
2. 进程创建与撤销进程的创建是指操作系统根据用户的请求创建一个新的进程。
进程的撤销是指操作系统根据某种条件或用户的请求终止一个正在运行的进程。
进程的创建和撤销是操作系统中的基本操作之一。
3. 进程同步与通信多个进程之间可能需要进行同步和通信,以实现数据共享和协作。
常见的进程同步与通信机制包括互斥锁、信号量和管道等。
三、实验结果与分析在本次实验中,我们使用了一个简单的进程管理模拟程序,模拟了进程的创建、撤销和调度过程。
通过该程序,我们可以观察到不同调度算法对系统性能的影响。
实验结果显示,先来先服务(FCFS)调度算法在一些情况下可能导致长作业等待时间过长,影响系统的响应速度。
操作系统复习-进程管理

2.1 进程与线程进程是指令的集合(错,程序是指令的集合,进程是程序的一次执行过程)优先级是进程调度的重要依据,一旦确定就不能改变(错)在单CPU的系统中,任意时刻都有一个进程处于运行状态(错,可以空转)进程申请CPU得不到满足时,其状态变为阻塞(错!等待CPU的进程处于就绪状态)进程获得CPU运行是通过调度得到的(对)线程是一种特殊的进程(对)进程是程序在一个数据集合上运行的过程,是系统进行资源分配和调度的独立单位(对)进程是PCB结构、程序和数据的集合(对)撤销父进程时,应同时撤销子进程(错!进程撤销可采用两种策略,一种是只撤销指定进程,另一种是撤销指定进程和其子孙进程)线程的切换,可能会引起进程的切换(对)引入线程后,处理机只在线程中切换(错!!)线程是比进程更小的能独立运行的基本单位(错,这句话的成立需要一定的前提条件)线程的引入增加了程序执行的时空开销(错,应为减少)一个进程一定包含多个线程(错)一个进程创建的若干线程共享该进程的程序段和数据段,但是它们有各自的运行栈区(对)中断是进程切换的必要条件,而不是充分条件。
(对)进程的基本特点:动态性,并发性,独立性,异步性,结构性。
在多道程序设计环境下,操作系统分配资源以进程为基本单位在引入线程的操作系统中,资源分配的基本单位是进程,CPU分配的基本单位是线程。
在引入线程的操作系统中,进程是资源分配的基本单位,线程是调度的基本单位从运行状态到就绪状态是由于时间片用完或出现了比现在进程优先级更高的进程(调度程序决定)从就绪状态到运行状态是调度程序决定的从阻塞状态到就绪状态是协作程序决定的从运行状态到阻塞状态是进程自身决定的(只有这个是主动的)对进程的管理和控制使用原语。
(原语包括创建原语,撤销原语,阻塞原语,唤醒原语等)一个进程被唤醒意味着进程变为就绪状态(该进程可能重新占用CPU)。
(唤醒原语的功能是将被被唤醒进程从阻塞队列中移到就绪队列中)降低进程优先级的合理时机是进程的时间片用完。
操作系统基本概念

操作系统基本概念操作系统是指计算机系统中的核心软件,它是一组管理计算机硬件与软件资源、控制程序运行、提供用户接口、实现文件管理和网络通信等功能的程序集合。
操作系统的基本概念主要包括四个方面:进程管理、存储管理、文件系统和设备管理。
1.进程管理:进程是指正在运行的程序的实例,它是计算机系统中最基本的运行单位。
操作系统通过进程管理来控制和分配计算机系统中的资源。
进程管理包括进程的创建与撤销、进程状态的转换(就绪、运行、等待)、进程调度和进程间通信等。
进程调度是操作系统的核心功能之一,它决定了计算机系统中各个进程的运行顺序和调度策略。
常见的调度算法包括先来先服务(FCFS)、短作业优先(SJF)、最高优先级优先(PRIORITY)和时间片轮转(RR)等。
2.存储管理:存储管理是操作系统管理计算机的内存资源,它主要包括内存分配与回收、地址映射和内存保护等。
操作系统通过存储管理来实现程序的加载和运行、保护不同进程的内存空间和实现虚拟内存等功能。
内存分配与回收是存储管理的核心功能之一,它负责为不同的进程分配内存空间,以满足程序的运行需求。
常见的内存分配算法包括首次适应算法(FFA)、最佳适应算法(BFA)和最坏适应算法(WFA)等。
地址映射是操作系统将逻辑地址转换为物理地址的过程,它涉及到页表、分段表等数据结构来实现。
通过地址映射,操作系统能够为进程提供一致性的内存访问,实现虚拟内存等功能。
3.文件系统:文件系统是操作系统管理计算机存储设备上的文件和目录的方法,它通过文件、目录和文件操作来为用户管理和存储数据。
文件系统还提供了对文件的共享、保护和存取控制等功能。
常见的文件系统包括FAT、NTFS(Windows操作系统)、EXT2/3/4(Linux操作系统)等。
文件系统通过将文件组织为目录树的结构,方便用户对文件进行管理和存取。
文件操作是文件系统的核心功能之一,包括文件的创建、删除、读取和写入等。
文件系统通过文件操作接口提供给用户对文件的操作和访问。
操作系统课程的主要内容

操作系统课程的主要内容1、操作系统的发展,分类,特征,功能,结构,内核,多道程序设计,并发,处理机状态等等。
2、功能主要有:(1)处理机管理:可归结为进程管理,包括以下方面–进程控制。
创建进程,撤销进程,控制进程的运行状态转换。
–进程调度。
从就绪的进程队列中选择一进程并把处理机分配给它,设置现场并是指投入运行。
–进程同步。
设置进程同步信息,以协调系统中各进程的运行。
–进程通信。
负责进程间的信息交换。
–死锁。
死锁如何解决的各种方法。
–线程。
线程的实现方式,和进程的关系。
(2)存储管理:为多道程序的运行提供良好的环境,并提高利用率,包括以下方面:地址重定位。
实现逻辑地址到物理地址的转换。
存储分配。
为每道程序分配内存空间,并在作业结束后收回其所占用内存。
存储保护。
保证每道程序之间不能互相侵犯,尤其是不能侵犯操作系统。
存储扩充。
通过建立虚拟存储系统来实现内存逻辑上的扩充。
(3)设备管理:设备管理的主要目标是方便的设备使用、提高CPU与I/O设备利用率。
主要包括:缓冲管理:设立I/O缓冲区,并对缓冲区进行有效管理。
设备分配:按一定策略和设备使用情况,分配并回收设备。
设备处理:即设备驱动程序,实现CPU和设备控制器之间的通讯等。
设备独立性和虚拟设备:独立性指应用程序独立于物理设备,使用户编程与实际使用的设备无关,增强了可移植性。
虚拟设备指将低速的设备改造为高速的共享设备。
(4)信息管理(文件系统管理):对用户文件和系统文件进行管理,解决文件资源的存储、共享、保密和保护。
包括以下方面:目录管理:为每一文件建立目录项,并对目录实施有效的组织与管理。
文件的读写管理和存取控制:解决信息安全问题。
系统设口令“哪个用户”、用户分类“哪个用户组”、文件权限“针对用户或用户组的读写权”。
文件存储空间管理:解决如何存放信息,以提高空间利用率和读写性能。
软件管理:软件的版本、相互依赖关系、安装和拆除等。
(5)用户接口目标是提供一个友好的用户访问操作系统的接口。
操作系统:进程创建与撤消

操作系统实验报告试验一:进程创建与撤销计科112康岩岩2011008142202013/4/10实验一:进程创建与撤消一、实验目的1、加深对进程概念的理解和进程创建与撤消算法;2、进一步认识并发执行的实质。
二、实验内容本实验完成如下三个层次的任务:(1)系统级—以普通用户身份认识windows的进程管理。
通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。
(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。
(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。
三、实验步骤1、windows的进程管理以下是win7的人物管理器,可以进行进程的查看、创建、撤销等操作,由于操作比较简单与琐碎,这里不再具体描述。
2、VC++/Java/C#的进程创建与撤销工具对于本次试验,我使用C#进行进程创建、撤销等测试,具体内容在下面给出。
3、进程创建与撤销的模拟实现(1)总体设计:此次程序完全由c#实现,能够通过窗体界面详细地生动地显示进程的运行状态。
下面一步一步的进行实现①数据定义:类PCB的定义如下:class PCB{string pcbName; //进程名int pcbId; //IDlong startTime; //开始时间long pcbRuntime = 0; //运行时间int pcbLeve; //线程优先级}对于所有的进程信息,用以下表储存:Dictionary<int,Hashtable>ThreadTable=new Dictionary<int,Hashtable>();容器ThreadTable用来储存所有进程简直key 表示进程id,值为Hashtable,储存的为线程信息,②函数CREATE(PCB pcb)—进程创建:创建进程需要传入一个PCB 对象,然后启动一个单独的线程来操作该对象,操作该对象就是把线程运行的状态传送给PCB同时PCB也唯一地标示其所在的线程。
操作系统第4章答案(上)

赵盈盈2011210593 第四章作业上1. 解释名词:程序的顺序执行;程序的并发执行。
答:程序的顺序执行:一个具有独立功能的程序独占cpu直到得到最终结果的进程。
程序的并发执行:两个或两个以上程序在计算机系统中同时处于一开始执行且尚未结束的状态。
2. 什么是进程?进程与程序的主要区别是什么?答:进程:进程是具有独立功能的程序关于某个数据集合的一次运行活动,进程是系统进行资源分配和调度的独立单元。
进程和程序的区别:●程序是静态的,进程是动态的●进程有程序和数据两部分组成●进程具有生命周期,有诞生和消亡,是短暂的;而程序是相对长久的●进程能更真实的描述并发,而程序不行。
●一个进程可以对应多个程序。
一个程序可以对应多个进程●进程可以创建其他进程,程序不能3. 图1所示,设一誊抄程序,将f中记录序列正确誊抄到g中,这一程序由get、copy、put三个程序段组成,它们分别负责获得记录、复制记录、输出记录。
请指出这三个程序段对f中的m个记录进行处理时各种操作的先后次序,并画出誊抄此记录序列的先后次序图(假设f中有1,2,…,m个记录,s,t为设置在主存中的软件缓冲区,每次只能装一个记录)。
图1 改进后的誊抄过程答:4. 进程有哪几种基本状态?试画出进程状态变迁图,并标明发生变迁的可能原因。
答:进程基本状态:运行、就绪、等待就绪到运行:调度程序选择一个新的进程运行 运行到就绪:运行进程用完了时间片或运行进程被中断,因为一个高优先级的进程处于就绪状态运行到等待:OS 尚未完成服务或对一资源的访问尚不能进行或初始化I/O 且必须等待结果 或等待某一进程提供输入(IPC )等待到就绪:当所有的事件发生时5. 什么是进程控制块?它有什么作用?答:PCB :为了便于系统控制和描述进程的活动过程,在操作系统核心中为进程定义的一个专门的数据结构。
作用:系统用PCB 来控制和管理进程的调用,PCB 也是系统感知进程存在的唯一标志GCGPCP G… CP6. n 个并发进程共用一个公共变量Q ,写出用信号灯的p 、v 操作实现n 个进程互斥时的程序描述,并说明信号灯值的取值范围。
操作系统的功能与分类

操作系统的功能与分类随着计算机技术的不断发展,操作系统作为计算机系统的重要组成部分,扮演着至关重要的角色。
操作系统是一种控制和管理计算机硬件、软件资源的系统软件,它提供了一系列功能,使得计算机可以高效地运行。
本文将探讨操作系统的功能与分类。
一、功能1. 进程管理操作系统负责管理计算机中运行的各个进程。
它通过分配CPU时间片、调度进程的执行、保护进程等机制,实现了进程的创建、撤销、挂起与唤醒等操作。
进程管理的目标是提高计算机的资源利用率和系统的响应速度。
2. 内存管理操作系统负责管理计算机的内存空间。
它通过内存分配、地址转换、内存保护等机制,确保每个程序都能够得到足够的内存空间,并且互不干扰。
内存管理还包括内存回收和交换技术,以及虚拟内存的支持,以提高内存的利用率和系统的性能。
3. 文件系统操作系统管理计算机中的文件和文件夹。
它提供了对文件的创建、读取、写入和删除等操作,以及对文件夹的创建、重命名和删除等操作。
文件系统还负责文件的存储分配、磁盘空间管理和文件权限控制等功能,以保证文件的安全性和可靠性。
4. 设备管理操作系统管理计算机的各种输入输出设备。
它通过设备驱动程序和中断处理机制,控制和调度设备的使用。
设备管理包括对设备的初始化、请求设备资源、分配设备时间片等操作,以确保设备的正常工作和高效利用。
5. 用户界面操作系统提供了用户与计算机之间的交互界面。
它可以是命令行界面、图形用户界面或者基于触摸屏的用户界面等形式。
用户界面使得用户能够方便地操作计算机,执行各种命令和任务。
二、分类操作系统根据其结构特点和应用领域的不同,可以分为以下几类:1. 批处理操作系统批处理操作系统适用于对大量相同类型的任务进行自动化处理的场景。
它接收用户提交的一批作业,按照预定的顺序进行处理,并输出结果。
批处理操作系统主要用于科学计算、数据处理和批量生产等场景。
2. 分时操作系统分时操作系统适用于多用户共享计算机资源的场景。
操作系统的基本功能

操作系统的基本功能操作系统是计算机系统中的核心软件之一,承担着管理和控制计算机硬件以及支持用户软件运行的重要任务。
操作系统的基本功能涵盖了各种方面,下面将从进程管理、内存管理、文件系统管理以及设备管理四个方面来介绍操作系统的基本功能。
一、进程管理进程管理是操作系统中的核心功能之一,它负责对计算机系统中所有的进程进行管理和控制。
进程是指正在运行的一个程序的实例,每个进程都拥有自己的内存空间、CPU时间片以及相关资源。
操作系统通过进程管理来实现进程的创建、撤销、调度和通信等功能。
1. 进程创建:操作系统负责接收用户或其他进程的请求,创建新的进程,为其分配资源,并初始化进程控制块(PCB)等数据结构。
2. 进程撤销:操作系统可以根据用户或系统的请求,撤销已经运行完毕或出现错误的进程,回收相关资源,并释放进程所占用的内存空间。
3. 进程调度:操作系统通过进程调度算法来决定每个时刻应该运行哪些进程,以实现多道程序同时运行的效果。
4. 进程通信:操作系统提供进程间通信的机制,使得不同进程之间可以通过共享内存、管道、消息队列等方式进行信息的交换和共享。
二、内存管理内存管理是操作系统的另一个基本功能,主要负责管理计算机系统中的内存资源,包括内存的分配与回收、地址映射等。
1. 内存分配:操作系统负责为各个进程分配内存空间,以满足其运行所需。
常见的内存分配算法包括连续分配、离散分配、虚拟内存等。
2. 内存回收:当进程运行结束或者被撤销时,操作系统将回收其所占用的内存空间,以便于为其他进程提供空间。
3. 地址映射:操作系统通过地址映射机制,将逻辑地址(用户程序使用的地址)转换为物理地址(内存中的实际地址),以实现对内存的有效访问。
三、文件系统管理文件系统管理是操作系统的另一个重要功能,它负责对存储设备上的文件进行管理和控制,包括文件的创建、读写、删除以及文件的组织和保护等。
1. 文件创建与删除:操作系统提供文件管理接口,使用户或应用程序能够方便地创建新文件或删除已有文件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告试验一:进程创建与撤销计科112康岩岩2011008142202013/4/10实验一:进程创建与撤消一、实验目的1、加深对进程概念的理解和进程创建与撤消算法;2、进一步认识并发执行的实质。
二、实验内容本实验完成如下三个层次的任务:(1)系统级—以普通用户身份认识windows的进程管理。
通过windows的“任务管理器”观察进程的状态,进行进程的创建、切换和撤销。
(2)语言级—以普通程序员身份认识高级语言VC++/Java/C#的进程创建与撤销工具。
(3)模拟级—以OS设计师身份编程模拟实现进程创建与撤销功能,并在屏幕上观察进程活动的结果。
三、实验步骤1、windows的进程管理以下是win7的人物管理器,可以进行进程的查看、创建、撤销等操作,由于操作比较简单与琐碎,这里不再具体描述。
2、VC++/Java/C#的进程创建与撤销工具对于本次试验,我使用C#进行进程创建、撤销等测试,具体内容在下面给出。
3、进程创建与撤销的模拟实现(1)总体设计:此次程序完全由c#实现,能够通过窗体界面详细地生动地显示进程的运行状态。
下面一步一步的进行实现①数据定义:类PCB的定义如下:class PCB{string pcbName; //进程名int pcbId; //IDlong startTime; //开始时间long pcbRuntime = 0; //运行时间int pcbLeve; //线程优先级}对于所有的进程信息,用以下表储存:Dictionary<int,Hashtable>ThreadTable=new Dictionary<int,Hashtable>();容器ThreadTable用来储存所有进程简直key 表示进程id,值为Hashtable,储存的为线程信息,②函数CREATE(PCB pcb)—进程创建:创建进程需要传入一个PCB 对象,然后启动一个单独的线程来操作该对象,操作该对象就是把线程运行的状态传送给PCB同时PCB也唯一地标示其所在的线程。
一个PCB对象的创建可通过一个与使用这交互的界面实现,使用者在交互窗体上输入进程名称,优先级,然后根据输入创建相应对象;killProcess(int id)—进程终止:由于每个进程都具有不用的pcbid,所以要结束一个进程需要将其id作为参数传入,在窗体应用程序上,使用者只需选中进程列表总相应进程后,即可选择执行中止函数。
③主界面设计:利用C#的各种控件可以很方便地设计出界面,界面截图如下:2-运行界面(2)详细设计:此程序主要是用来实现进程的创建与撤销以及进行进程状态的实时显示,这一系列通过界面的交互操作来完成。
由于本程序需要用C#来进行实现,关于进程的创建及界面操作都具有其语言特色,比如需要用到事件、托管之类。
创建线程的函数如下,其中参数有交互窗体产生,主要包括进PcbName、PcbId及创建时间private void createProcess(PCB pcb) {//启动的线程函数为runParameterizedThreadStart ParStart = newParameterizedThreadStart(run);hread thread = new Thread(ParStart);//设置pcb的起始时间为当前时间pcb.StartTime = DateTime.Now.ToFileTime();Hashtable hash=new Hashtable();//将线程信息和pcb信息存入hash表hash.Add("thread",thread);hash.Add("pcb",pcb);//将hash表存入记录线程状态的总表this.ThreadTable.Add(pcb.PcbId,hash);thread.Start(pcb); //启动线程}run 函数定义如下/// <summary>/// 线程运行的函数/// </summary>/// <param name="o">具有唯一pcbid的PCB对象,用来标示线程,也用来显示储存线程运行状态</param>private void run(object o) {//定义委托,用来调用函数显示某一进程的状态GetNowFileTimeCallBack call = new GetNowFileTimeCallBack(updatePcbListTime);PCB pcb = (PCB)o;int pcbId = pcb.PcbId;while (true) {//得到运行时间ong runtime = DateTime.Now.ToFileTime() - pcb.StartTime;//回调信息his.BeginInvoke(call, pcbId, runtime);try {Thread.Sleep(1000);}catch (Exception e) { }}}在run函数中有句代码如下:this.BeginInvoke(call, pcbId, runtime);此句代码回调了两个参数给updatePcbListTime,分别是进程的PcbId即当前线程的运行时间,有了这连个参数便可以在主界面上更新进程运行的时间,这个操作设计到c#对控件的有关操作,这里不再详细介绍,后面在源代码中会给出。
进程的撤销:使用着在进程列表中选择一项进程,直接点击“结束进程”按钮即可,结束进程的函数如下:private void killProcess(int id){//根据id从进程信息表中得到进程信息Hashtable h=ThreadTable[id];Thread t=(Thread)h["thread"];//得到id对应的线程try{if (t != null && t.IsAlive) {t.Abort(); //停止线程}}catch (Exception e) {MessageBox.Show(e.Message);}ThreadTable.Remove(id); //信息表中删除线程数据romoveListViewItem(id); //界面列表中删除数据his.ProcessCount = ThreadTable.Count; //更新进程数目}以上便是进程撤销的函数,由于涉及到界面更新等操作,所以略显复杂了一些。
四、实验总结用C#进行线程的创建与撤销代码相对来说比较简单,因为封装比较多,我们能做的就是创建与调用。
当然,代码中也有一些复杂的地方,不是对线程的操作,而是关于界面的显示与操作,单个线程容易创建与撤销,但难的是合理的“监控”与组织多个线程并及时进行状态的显示。
本来想过用C语言在控制台上完成这次试验,但考虑到控制台的交互性太差,而且C语言代码相对复杂,最后还是放弃了。
虽然用程序语言实现了进程创建(当然,这是在并不会理论的情况下),但还是没弄清理论的实质。
可能理论更抽象些吧。
在平常的编程中,虽然经常遇到过要使用多线程的问题,但没有去试过从操作系统的角度去考虑线程的运行,在以后的学习中,我想还是会深入了解与学习这方面的东西的。
五、附录PCB类的定义:class PCB{string pcbName; //进程名int pcbId; //IDlong startTime; //开始时间long pcbRuntime = 0; //运行时间 int pcbLeve; //线程优先级public string PcbName{get { return pcbName; }set { pcbName = value; }}public int PcbId{get { return pcbId; }set { pcbId = value; }}public long StartTime{get { return startTime; } set { startTime = value; } }public long PcbRuntime{get { return pcbRuntime; } set { pcbRuntime = value; } }public int PcbLeve{get { return pcbLeve; }set { pcbLeve = value; }}}主窗体(包含所有操作):using System;using System.Collections.Generic;using ponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Windows.Forms;using System.Threading;using OsTest.os.boject;using OsTest.os.form;using System.Collections;namespace OsTest{public partial class MainForm : Form{public MainForm(){InitializeComponent();}private void button2_Click(object sender, EventArgs e){if(this.listView1.SelectedItems.Count<1){return;}killProcess(this.selectId);}private void killProcess(int id){//根据id从进程信息表中得到进程信息Hashtable h=ThreadTable[id];Thread t=(Thread)h["thread"];//得到id对应的线程try{if (t != null && t.IsAlive){t.Abort(); //停止线程}}catch (Exception e) {MessageBox.Show(e.Message);}ThreadTable.Remove(id); //信息表中删除线程数据romoveListViewItem(id); //界面列表中删除数据this.ProcessCount = ThreadTable.Count; //更新进程数目}int processCount = 0;public int ProcessCount{get { return processCount; }set {processCount = value;this.toolStripStatusLabel1.Text = "进程数:" + processCount;}}/// <summary>/// 根据进程id删除列表中相对于的进程信息/// </summary>/// <param name="id">进程id</param>private void romoveListViewItem(int id) {//锁定列表控件,避免多个线程同时操作lock (this.listView1){foreach (ListViewItem li in this.listView1.Items){int liId = int.Parse(li.SubItems[1].Text.ToString());if (liId != id){continue;}li.Remove();return;}}}/// <summary>/// 用于存放进程数据的表/// </summary>private Dictionary<int,Hashtable> ThreadTable=new Dictionary<int,Hashtable>();private void createProcess(PCB pcb) {//启动的线程函数为runParameterizedThreadStart ParStart = new ParameterizedThreadStart(run);Thread thread = new Thread(ParStart);//设置pcb的起始时间为当前时间pcb.StartTime = DateTime.Now.ToFileTime();Hashtable hash=new Hashtable();//将线程信息和pcb信息存入hash表hash.Add("thread",thread);hash.Add("pcb",pcb);//将hash表存入记录线程状态的总表this.ThreadTable.Add(pcb.PcbId,hash);thread.Start(pcb); //启动线程}private delegate void GetNowFileTimeCallBack(int pcbId,long now);/// <summary>/// 更新显示进程列表的窗口/// </summary>/// <param name="pcbId"></param>/// <param name="now"></param>private void updatePcbListTime(int pcbId,long now){foreach(KeyValuePair<int,Hashtable> p in ThreadTable){PCB pcb=(PCB)p.Value["pcb"];if(pcb.PcbId==pcbId){pcb.PcbRuntime = now;//更新运行时间updateListView(pcb);break;}}}/// <summary>/// 更新列表控件/// </summary>/// <param name="pcb"></param>private void updateListView(PCB pcb) {lock (this.listView1){foreach (ListViewItem li in this.listView1.Items){int liId = int.Parse(li.SubItems[1].Text.ToString());if(liId!=pcb.PcbId){continue;}li.SubItems[3].Text=(pcb.PcbRuntime / 10000000) + "s";return;}ListViewItem newLi = new ListViewItem(pcb.PcbName);newLi.SubItems.Add(pcb.PcbId + "");newLi.SubItems.Add(pcb.PcbLeve + "");newLi.SubItems.Add(pcb.PcbRuntime / 10000000 + "s");this.listView1.Items.Add(newLi);this.ProcessCount = ThreadTable.Count;}}/// <summary>/// 线程运行的函数/// </summary>/// <param name="o">具有唯一pcbid的PCB对象,用来标示线程,也用来显示储存线程运行状态</param>private void run(object o) {//定义委托,用来调用函数显示某一进程的状态GetNowFileTimeCallBack call = new GetNowFileTimeCallBack(updatePcbListTime);PCB pcb = (PCB)o;int pcbId = pcb.PcbId;while (true){//得到运行时间long runtime = DateTime.Now.ToFileTime() - pcb.StartTime;//回调信息this.BeginInvoke(call, pcbId, runtime);try{Thread.Sleep(1000);}catch (Exception e) {}}}/// <summary>/// 关闭窗口/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void MainForm_FormClosing(object sender, FormClosingEventArgs e){ToolStripMenuItem2_Click(sender,e);}/// <summary>/// 点击菜单的新建按钮,创建进程/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ToolStripMenuItem1_Click(object sender, EventArgs e){CreateForm cf = new CreateForm();//显示创建PCD对象的窗体if (cf.ShowDialog(this) == DialogResult.OK){PCB pcb = cf.Pcb; //得到对象createProcess(pcb); //创建进程}}int selectId = 0;private void listView1_ItemSelectionChanged(object sender, ListViewItemSelectionChangedEventArgs e){selectId=int.Parse(e.Item.SubItems[1].Text.ToString());}/// <summary>/// 退出程序/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void ToolStripMenuItem2_Click(object sender, EventArgs e){System.Environment.Exit(0);}}}。