进程的创建与并发执行-带答案版课案
- 格式:doc
- 大小:335.00 KB
- 文档页数:12
“操作系统概论”习题解答之并发进程第7章习题解答1.什么叫并发进程?答:在多道程序设计系统中,作为单个作业可以同时执行,而每一个作业又需要有多个进程的协作来完成。
因此,系统会同时存在着许多进程,在单处理器的情况下,这些进程轮流的占用处理器,即一个进程的工作没有全部完成之前,另一个进程就开始工作,我们说这些可同时执行的进程具有并发性,并且把可同时执行的进程称为“并发进程”。
2.临界区是怎样定义?对临界区的管理应符合哪些要求?答:并发进程中与共享变量有关的程序段称为“临界区”。
对若干个并发进程共享某一变量的相关临界区得管理有三点要求:①一次至多一个进程能够进入临界区,当有进程在临界区执行时,其他想进入临界区执行的进程必须等待。
②不能让一个进程无限制的在临界区执行,即任何一个进入临界区的进程必须有限的时间内退出临界区。
③不能强迫一个进程无限期等待键入它的临界区,即有进程退出临界区时应让一个等待进入临界区的进程进入它的临界区执行。
3.采用PV操作作为同步机构时,假定与某共享变量相关的信号量S的值可在[-1,l]之间,问S的初值是哪个值?当S=-1,S=0,S=l时它们各自的物理含义是什么?答:S的初值是 1.S=-l,表示有一个进程在等待进入临界区执行。
S=0,表示已有一个进程在临界区执行,这时若有进程想进入临界区则必须等待。
S=l,表示无进程在临界区执行,若有进程想进入临界区则可以立即进入。
4.A、B两个火车站之间是单轨连接的,现有许多列车同时到A站,须经A再到达B站,列车出B站后又可分路行驶(如图7-2)为保证行车安全,请你当调度时,你将如何调度列车?请你用PV操作为工具设计一个能实现你的调度方案的自动调度系统。
答:当A、B两站之间无列车停驶时,可让到达A站的一列车进人A、B站之间行驶。
当A石站之间有列车在行驶时,则到达A站者必须在站外等待。
当有列车到达B站后,让等在A站外的一列车进入。
用一个信号量S来控制到达A站的列车能否进入单轨道行驶,S的初始值为l.列车到达A站后,先执行P(S),若无列车在A、B站之间行驶,则执行P(S)后立即进人单轨道行驶,到达B站后,执行V(S),可释放一个等待进入的列车进入行驶。
第二章进程管理2、试画出下面4条语句的前趋图:S2: b:=z+1;S3: c:=a-b;S4: w:=c+1;3、程序在并发执行时,由于它们共享系统资源,以及为完成同一项任务而相互合作,致使在这些并发执行的进程之间,形成了相互制约的关系,从而也就使得进程在执行期间出现间断性。
4、程序并发执行时为什么会失去封闭性与可再现性?因为程序并发执行时,就是多个程序共享系统中的各种资源,因而这些资源的状态就是由多个程序来改变,致使程序的运行失去了封闭性。
而程序一旦失去了封闭性也会导致其再失去可再现性。
5、在操作系统中为什么要引入进程概念?它会产生什么样的影响?为了使程序在多道程序环境下能并发执行,并能对并发执行的程序加以控制与描述,从而在操作系统中引入了进程概念。
影响: 使程序的并发执行得以实行。
6、试从动态性,并发性与独立性上比较进程与程序?a、动态性就是进程最基本的特性,可表现为由创建而产生,由调度而执行,因得不到资源而暂停执行,以及由撤销而消亡,因而进程由一定的生命期;而程序只就是一组有序指令的集合,就是静态实体。
b、并发性就是进程的重要特征,同时也就是OS的重要特征。
引入进程的目的正就是为了使其程序能与其它建立了进程的程序并发执行,而程序本身就是不能并发执行的。
c、独立性就是指进程实体就是一个能独立运行的基本单位,同时也就是系统中独立获得资源与独立调度的基本单位。
而对于未建立任何进程的程序,都不能作为一个独立的单位来运行。
7、试说明PCB的作用?为什么说PCB就是进程存在的唯一标志?a、PCB就是进程实体的一部分,就是操作系统中最重要的记录型数据结构。
PCB中记录了操作系统所需的用于描述进程情况及控制进程运行所需的全部信息。
因而它的作用就是使一个在多道程序环境下不能独立运行的程序(含数据),成为一个能独立运行的基本单位,一个能与其它进程并发执行的进程。
b、在进程的整个生命周期中,系统总就是通过其PCB对进程进行控制,系统就是根据进程的PCB而不就是任何别的什么而感知到该进程的存在的,所以说,PCB就是进程存在的唯一标志。
操作系统上机实验报告实验名称:进程和线程实验目的:理解unix/Linux下进程和线程的创建、并发执行过程。
实验内容:1.进程的创建2.多线程应用实验步骤及分析:一、进程的创建下面这个C程序展示了UNIX系统中父进程创建子进程及各自分开活动的情况。
fork( )创建一个新进程。
系统调用格式:pid=fork( )参数定义:int fork( )fork( )返回值意义如下:0:在子进程中,pid变量保存的fork( )返回值为0,表示当前进程是子进程。
>0:在父进程中,pid变量保存的fork( )返回值为子进程的id值(进程唯一标识符)。
-1:创建失败。
如果fork( )调用成功,它向父进程返回子进程的PID,并向子进程返回0,即fork( )被调用了一次,但返回了两次。
此时OS在内存中建立一个新进程,所建的新进程是调用fork( )父进程(parent process)的副本,称为子进程(child process)。
子进程继承了父进程的许多特性,并具有与父进程完全相同的用户级上下文。
父进程与子进程并发执行。
2、参考程序代码/*process.c*/#include <stdio.h>#include <sys/types.h>main(int argc,char *argv[]){int pid;/* fork another process */pid = fork();if (pid < 0) { /* error occurred */fprintf(stderr, "Fork Failed");exit(-1);}else if (pid == 0) { /* child process */execlp( "/bin/ls", "ls",NULL);}else {/* parent process *//* parent will wait for the child to complete */ wait(NULL);printf( "Child Complete" );exit(0);}}3、编译和运行$gcc process.c –o processs4、运行$./process编辑如图所示:运行如图所示:思考:(1)系统是怎样创建进程的?1,申请空白PCB(进程控制块);2,为新进程分派资源;3,初始化PCB;4,将新进程插入就绪队列;(2)扩展程序,在父进程中输出1到5,在子进程中输出6-10,要求父子进程并发输出;记录实验结果,并给出简单分析。
习题集第二章参考答案一、单项选择题1、 D2、 D3、 B4、 D5、 C6、 B7、 A 8、 B9、 C10、 B11、 C12、 B13、 D14、 C15、 D16、 A17、 B18、 A19、 B20、 D21、 C22、 D23、 B24、 D25、 D26、 B27、 C28、 B29、 A30、 B31、 A32、 B33、 A34、 C二、填空题1 进程2 就绪执行阻塞3 等待的事件发生的4 进程控制块5 进程控制块(或PCB)6 99 1 1007 就绪8 静止阻塞9 阻塞就绪10 共享存储器,管道通信,消息传递11 信号量12 [1-n,1]13 进程控制块(PCB)14 同步互斥信号量15 wait(mutex)signal(mutex)16 顺序性,封闭性,可再现性17 并发18 临界区19 wait, signal20 1,(1-n)或-(n-1)21 722 wait signal23 阻塞就绪三、判断题×√1×2√3×4×5×6×7√8×9×10√11√12×13√四、简答题1、解释进程的顺序性和并发性。
答:进程的顺序性是指进程在顺序的处理器上的执行是严格按序的,只有在前一个操作结束后才能开始后继操作。
进程并发性是指一组进程可以轮流占用处理器,一个进程的工作没有全部完成之前,另一个进程就可开始工作。
把这样的一组进程看做是同时执行的,把可同时执行的进程称为并发进程。
所以,进程的顺序性是对每个进程而言的,进程的并发性是对一组具有顺序性的进程而言的。
一组进程并发执行时各进程轮流占用处理器交替执行,占用处理器的进程按各自确定的顺序依次执行指令。
2、简述进程与程序的区别和联系。
答:区别:(1)进程能真实地描述并发,而程序不能。
(2)动态性是进程的基本特征,进程实体具有创建、执行和撤销的生命周期,而程序只是一组有序指令的集合,存放在某种介质上,是静态的。
操作系统实验--进程的创建h e u(总13页)--本页仅作为文档封面,使用时请直接删除即可----内页可以根据需求调整合适字体及大小--操作系统实验报告哈尔滨工程大学计算机科学与技术学院第三讲进程的创建一、实验概述1. 实验名称进程的创建2. 实验目的1.练习使用EOS API函数CreateProcess创建一个进程,掌握创建进程的方法,理解进程和程序的区别。
2.调试跟踪CreateProcess函数的执行过程,了解进程的创建过程,理解进程是资源分配的单位3. 实验类型验证型实验4. 实验内容(1)准备实验(2)练习使用控制台命令创建EOS应用程序的进程(3)练习通过编程的方式让应用程序创建另一应用程序的进程。
(4)调试Create Process函数(5)调试Ps Create Process函数(6)练习通过编程的方式创建应用程序的多个进程二、实验环境EOS实验系统,WINDOWS XP 操作系统三、实验过程1. 设计思路和流程图2. 算法实现3. 需要解决的问题及解答1).在源代码文件提供的源代码基础上进行修改,要求使用同时创建10个进程。
答:参照实验报告第5,6部分。
2).学习本书第 5 章中的节,了解关于线程的相关知识,然后尝试调试 PspCreateThread 函数,观察线程控制块(TCB)初始化的过程。
3).在 PsCreateProcess 函数中调用了 PspCreateProcessEnvironment 函数后又先后调用了PspLoadProcessImage 和 PspCreateThread 函数,学习这些函数的主要功能。
能够交换这些函数被调用的顺序吗思考其中的原因。
答:PspCreateProcessEnvironment 的主要功能是创建进程控制块并且为进程创建了地址空间和分配了句柄表。
PspLoadProcessImage是将进程的可执行映像加载到了进程的地址空间中。
一、实验背景与目的随着计算机技术的发展,多任务处理和多进程并发已经成为操作系统设计中的基本要求。
为了更好地理解进程并发的基本原理和实现方法,我们进行了本次实验。
实验的目的是通过实践操作,加深对进程并发执行的理解,掌握进程创建、同步、互斥等基本概念,并学会使用相关系统调用实现进程的并发控制。
二、实验环境与工具实验环境:Windows 10操作系统,Visual Studio 2019开发环境。
实验工具:C++编程语言,WinAPI系统调用。
三、实验内容与步骤本次实验主要分为以下几个部分:1. 进程创建与并发执行- 使用CreateProcess函数创建多个进程,并观察它们的并发执行情况。
- 使用GetTickCount函数获取每个进程的执行时间,分析并发执行的效果。
2. 进程同步- 使用互斥锁(mutex)实现进程间的同步,确保同一时刻只有一个进程访问共享资源。
- 使用条件变量(condition variable)实现进程间的条件同步,实现生产者-消费者模型。
3. 进程互斥- 使用信号量(semaphore)实现进程间的互斥,避免资源竞争。
- 使用临界区(critical section)保护共享资源,防止多个进程同时访问。
4. 实验分析- 分析实验结果,总结进程并发、同步和互斥的原理和方法。
- 讨论实验中遇到的问题和解决方法。
四、实验代码示例以下是一个简单的实验代码示例,演示了使用互斥锁实现进程同步的过程:```cpp#include <windows.h>#include <iostream>using namespace std;// 全局互斥锁mutex mtx;void processFunction(){unique_lock<mutex> lock(mtx);cout << "Process " << GetCurrentProcessId() << " is running." << endl;lock.unlock();}int main(){// 创建两个进程CreateProcess(NULL, "process.exe", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL);// 主进程继续执行cout << "Main process is running." << endl;return 0;}```五、实验结果与分析1. 进程创建与并发执行通过实验,我们观察到多个进程可以并发执行,并且每个进程的执行时间都会有所不同。
广州大学学生实验报告开课学院及实验室:计算机科学与工程实验室 2015年11月11日实验课操作系统成绩程名称实验项进程管理与进程通信指导老师陈康民目名称(***报告只能为文字和图片,老师评语将添加到此处,学生请勿作答***)进程管理(一)进程的创建实验一、实验目的1、掌握进程的概念,明确进程的含义2、认识并了解并发执行的实质二、实验内容1、编写一段程序,使用系统调用fork( )创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。
试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
三、实验步骤1、编写一段程序,使用系统调用fork( )创建两个子进程。
代码:#include <stdio.h>main( ){int p1,p2;while((p1=fork( ))= = -1); /*创建子进程p1*/if (p1= =0) putchar('b');else{while((p2=fork( ))= = -1); /*创建子进程p2*/if(p2= =0) putchar('c');else putchar('a');}}运行结果:bca,bac, abc ,……都有可能。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。
代码:#include <stdio.h>main( ){int p1,p2,i;while((p1=fork( ))= = -1); /*创建子进程p1*/if (p1= =0)for(i=0;i<10;i++)printf("daughter %d\n",i);else{while((p2=fork( ))= = -1); /*创建子进程p2*/if(p2= =0)for(i=0;i<10;i++)printf("son %d\n",i);elsefor(i=0;i<10;i++)printf("parent %d\n",i);}}结果:parent…son…daughter..daughter..或parent…son…parent…daughter…等四、分析原因除strace 外,也可用ltrace -f -i -S ./executable-file-name查看以上程序执行过程。
实验五进程的并发执行实验目的1、理解并发进程的基本概念和执行特征;2、理解进程的资源继承和并发执行;3、理解进程的资源竞争和互斥实现。
实验原理1.用到的系统调用(1) 创建子进程fork( )pid=fork( )pid==-1:进程创建失败pid==0:子进程创建成功并且执行子进程pid>0:子进程创建成功并且执行父进程(2) 进程终止 exit(int status)父进程在子进程末尾置exit(0)终止子进程,子进程向父进程发软中断信号。
status是子进程返回给父进程的整数,以备查考(3) 进程等待 wait(int status)父进程通过wait(0)等待子进程终止,直到收到子进程发来的进程终止软中断信号后被唤醒。
(4) 进程互斥 lockf(fd,function,size)fd:被锁定的文件标识stdin==0stdout==1function:对锁定对象的控制0:开锁1:加锁size==0:表示从调用Lockf( )后开始锁定实验设备一台电脑以及Linux系统结果预测(1)进程的资源继承A:Before fork…SonBefore fork…FatherB:Before fork…SonFathe(2)进程的并发执行AAACCCBBB……BBAAACCC……(3) 进程的并发控制代码A:daughter1Daughter2……Children1Children2……代码B: son…daughter……….son…children……(4) 进程的多次创建程序A输出6个test;程序B输出14个test。
实验步骤实验结果(1) 进程的资源继承(2) 进程的并发执行(3) 进程的并发控制(4) 进程的多次创建仙女屋实验分析(1)printf某些内容时,操作系统仅仅是把该内容放到了stdout的缓冲队列里,并没有实际显示到屏幕上。
因此fork后,子进程得到这份拷贝。
而当printf中含有\n时,printf将刷新stdout,因此子进程无法得到这份拷贝,fork 也就只输出一次了。
第一章os引论1. 设计现代OS的主要目标是什么方便性,有效性,可扩充性和开放性.2. OS的作用可表现为哪几个方面 a. OS作为用户与计算机硬件系统之间的接口;b. OS作为计算机系统资源的管理者;c. OS作为扩充机器.3. 试说明推动多道批处理系统形成和发展的主要动力是什么不断提高计算机资源利用率和系统吞吐量的需要;4. 何谓脱机I/O和联机I/O a. 脱机输入输出方式(Off-Line I/O)是为了解决人机矛盾及CPU 和I/O设备之间速度不匹配而提出的.它减少了CPU的空闲等待时间,提高了I/O速度.具体内容是将用户程序和数据在一台外围机的控制下,预先从低速输入设备输入到磁带上,当CPU 需要这些程序和数据时,在直接从磁带机高速输入到内存,从而大大加快了程序的输入过程,减少了CPU等待输入的时间,这就是脱机输入技术;当程序运行完毕或告一段落,CPU需要输出时,无需直接把计算结果送至低速输出设备,而是高速把结果输出到磁带上,然后在外围机的控制下,把磁带上的计算结果由相应的输出设备输出,这就是脱机输出技术.b. 若这种输入输出操作在主机控制下进行则称之为联机输入输出方式.5. 试说明推动分时系统形成和发展的主要动力是什么用户的需要.即对用户来说,更好的满足了人-机交互,共享主机以及便于用户上机的需求.6. 试说明实时任务的类型和实时系统的类型.a. 实时任务的类型按任务执行时是否呈现周期性来划分,分为周期性实时任务和非周期性实时任务;---根据对截止时间的要求来划分,分为硬实时任务和软实时任务;b. 通常把要同达行实时控制的系统统称为实时控制系统,把要求对信息进行实时处理的系统成为实时信息处理系统.7. 实现多道程序应解决哪些问题 a. 处理机管理问题;b. 内存管理问题;c. I/O设备管理问题;d. 文件管理问题;e. 作业管理问题.8. 试比较单道与多道批处理系统的特点及优缺点.a. 单道批处理系统是最早出现的一种OS,它具有自动性,顺序性和单道性的特点;---多道批处理系统则具有调度性,无序性和多道性的特点;b. 单道批处理系统是在解决人机矛盾及CPU和I/O设备之间速度不匹配的矛盾中形成的,旨在提高系统资源利用率和系统吞吐量,但是仍然不能很好的利用系统资源;---多道批处理系统是对单道批处理系统的改进,其主要优点是资源利用率高,系统吞吐量大;缺点是平均周转时间长,无交互能力.9. 实现分时系统的关键问题是什么应如何解决 a. 关键问题:及时接收,及时处理;b. 对于及时接收,只需在系统中设置一多路卡,多路卡作用是使主机能同时接收用户从各个终端上输入的数据;---对于及时处理,应使所有的用户作业都直接进入内存,在不长的时间内,能使每个作业都运行一次.10 为什么要引入实时操作系统更好地满足实时控制领域和实时信息处理领域的需要.11 OS具有哪几大特征它的最基本特征是什么 a. 并发(Concurrence),共享(Sharing),虚拟(Virtual),异步性(Asynchronism).b. 其中最基本特征是并发和共享.12 内存管理有哪些主要功能它们的主要任务是什么 a. 主要功能: 内存分配,内存保护,地址映射和内存扩充等.b. 内存分配的主要任务是为每道程序分配内存空间,提高存储器利用率,以减少不可用的内存空间,允许正在运行的程序申请附加的内存空间,以适应程序和数据动态增长的需要.---内存保护的主要任务是确保每道用户程序都在自己的内存空间中运行,互不干扰.---地址映射的主要任务是将地址空间中的逻辑地址转换为内存空间中与之对应的物理地址.---内存扩充的主要任务是借助虚拟存储技术,从逻辑上去扩充内存容量.13 处理机管理具有哪些功能它们的主要任务是什么 a. 进程控制,进程同步,进程通信和调度.b. 进程控制的主要任务是为作业创建进程,撤销已结束的进程,以及控制进程在运行过程中的状态转换.---进程同步的主要任务是对诸进程的运行进行调节.---进程通信的任务是实现在相互合作进程之间的信息交换.---调度分为作业调度和进程调度.作业调度的基本任务是从后备队列中按照一定的算法,选择出若干个作业,为它们分配必要的资源;而进程调度的任务是从进程的就绪队列中,按照一定的算法选出一新进程,把处理机分配给它,并为它设置运行现场,是进程投入运行.14 设备管理有哪些主要功能其主要任务是什么 a. 主要功能: 缓冲管理,设备分配和设备处理,以及虚拟设备等.b. 主要任务: 完成用户提出的I/O请求,为用户分配I/O设备;提高CPU和I/O设备的利用率;提高I/O速度;以及方便用户使用I/O设备.15 文件管理有哪些主要功能其主要任务是什么 a. 主要功能: 对文件存储空间的管理,目录管理,文件的读,写管理以及文件的共享和保护.b. 主要任务: 对用户文件和系统文件进行管理,以方便用户使用,并保证文件的安全性.16 试在交互性,及时性和可靠性方面,将分时系统与实时系统进行比较.a. 分时系统是一种通用系统,主要用于运行终端用户程序,因而它具有较强的交互能力;而实时系统虽然也有交互能力,但其交互能力不及前者.b. 实时信息系统对实用性的要求与分时系统类似,都是以人所能接收的等待时间来确定;而实时控制系统的及时性则是以控制对象所要求的开始截止时间和完成截止时间来确定的.c. 实时系统对系统的可靠性要求要比分时系统对系统的可靠性要求高.17 是什么原因使操作系统具有异步性特征 a. 程序执行结果是不确定的,即程序是不可再现的.b. 每个程序在何时执行,多个程序间的执行顺序以及完成每道程序所需的时间都是不确定的,即不可预知性.18 试说明在MS-DOS 3.X以前的版本中,其局限性表现在哪几个方面 a. 在寻址范围上,DOS 只有1MB,远远不能满足用户需要.b. DOS试单用户单任务操作系统,不支持多任务并发执行,与实际应用相矛盾.19 MS-DOS由哪几部分组成每部分的主要功能是什么略.20 为什么Microsoft在开发OS/2时,选中了80286芯片设计OS/2的主要目标之一是既能充分发挥80286处理器的能力,又能运行在8086处理器环境下开发的程序.因为在80286内部提供了两种工作方式: 实方式和保护方式,使得Intel 80286处理器不仅提供了多任务并发执行的硬件支持,而且还能运行所有在8086下编写的程序。
实验一一进程创建实验实验一(一)进程的创建实验实验目的1、掌握进程的概念,明确进程的含义2、认识并了解并发执行的实质实验内容1、编写一段程序,使用系统调用fork()创建两个子进程。
当此程序运行时,在系统中有一个父进程和两个子进程活动。
让每一个进程在屏幕上显示一个字符:父进程显示"a",子进程分别显示字符"b"和字符"c"。
试观察记录屏幕上的显示结果,并分析原因。
2、修改上述程序,每一个进程循环显示一句话。
子进程显示"daughter"及"son",父进程显示"parent",观察结果,分析原因。
实验准备(1)阅读LINUX的fork.c源码文件(见附录二),分析进程的创建过程。
(2)阅读LINUX的sched.c源码文件(见附录三),加深对进程管理概念的认识。
实验指导一、进程UNIX中,进程既是一个独立拥有资源的基本单位,又是一个独立调度的基本单位。
一个进程实体由若干个区(段)组成,包括程序区、数据区、栈区、共享存储区等。
每个区又分为若干页,每个进程配置有唯一的进程控制块PCB,用于控制和管理进程。
PCB的数据结构如下:1、进程表项(ProcessTableEntry)。
包括一些最常用的核心数据:进程标识符PID、用户标识符UID、进程状态、事件描述符、进程和U区在内存或外存的地址、软中断信号、计时域、进程的大小、偏置值nice、指向就绪队列中下一个PCB的指针P_Link、指向U区进程正文、数据及栈在内存区域的指针。
2、U区(UArea)。
用于存放进程表项的一些扩充信息。
每一个进程都有一个私用的U区,其中含有:进程表项指针、真正用户标识符u-ruid(readuserID)、有效用户标识符u-euid(effectiveuserID)、用户文件描述符表、计时器、内部I/O参数、限制字段、差错字段、返回值、信号处理数组。
第二章进程和线程作业答案1,2,4,6,7,10,11,12,14, 211.在操作系统中为什么要引入进程概念?它与程序的差别和关系是怎样的?答:由于多道程序的并发执行时共享系统资源,共同决定这些资源的状态,因此系统中各程序在执行过程中就出现了相互制约的新关系,程序的执行出现“走走停停”的新状态。
用程序这个静态概念已经不能如实反映程序并发执行过程中的这些特征。
为此,人们引入“进程(Process)”这一概念来描述程序动态执行过程的性质。
进程和程序是两个完全不同的概念。
进程与程序的主要区别:进程和程序之间存在密切的关系:进程的功能是通过程序的运行得以实现的,进程活动的主体是程序,进程不能脱离开具体程序而独立存在。
2.PCB的作用是什么?它是怎样描述进程的动态性质的?答:PCB是进程组成中最关键的部分。
每个进程有惟一的进程控制块;操作系统根据PCB对进程实施控制和管理,进程的动态、并发特征是利用PCB表现出来的;PCB是进程存在的唯一标志。
PCB中有表明进程状态的信息,该进程的状态包括运行态、就绪态和阻塞态,它利用状态信息来描述进程的动态性质。
4. 用如图2-26所示的进程状态转换图能够说明有关处理机的大量容。
试回答:①什么事件引起每次显著的状态变迁?②下述状态变迁因果关系能否发生?为什么?(A)2→1 (B)3→2 (C)4→1答:(1)就绪→运行:CPU空闲,就绪态进程被调度程序选中运行→阻塞:运行态进程因某种条件未满足而放弃CPU的占用。
阻塞→就绪:阻塞态进程所等待的事件发生了。
运行→就绪:正在运行的进程用完了本次分配给它的时间片(2)下述状态变迁(A)2→1,可以。
运行进程用完了本次分配给它的时间片,让出CPU,从就绪队列中选一个进程投入运行。
(B)3→2,不可以。
任何时候一个进程只能处于一种状态,它既然由运行态变为阻塞态,就不能再变为就绪态。
(C)4→1,可以。
某一阻塞态进程等到的事件出现了,而且此时就绪队列为空,该进程进入就绪队列后马上又被调度运行。
实验二进程管理2.1 进程的创建与并发执行1.实验目的(1) 加深对进程概念的理解,理解进程和程序的区别。
(2) 认识并发进程的实质。
分析进程争用资源的现象,学习解决进程互斥的方法。
(3) 理解系统调用和用户命令的区别。
2.实验类型:验证型3.实验学时:24.实验原理和知识点(1) 实验原理:程序的并发执行具有随机性和不可再现性。
程序并发执行会导致资源共享和资源竞争,各程序向前执行的速度会受资源共享的制约。
程序的动态执行过程用进程这个概念来描述。
由于向前推进的速度不可预知,所以多个进程并发地重复执行,整体上得到的结果可能不同。
但要注意,就其中某单个进程而言,其多次运行结果是确定的。
(2) 知识点:进程、子进程、并发执行的特性;5.实验环境(硬件环境、软件环境):(1)硬件环境:Intel Pentium III 以上CPU,128MB以上内存,2GB以上硬盘(2)软件环境:linux操作系统。
6. 预备知识(1) fork()系统调用头文件:#include <unistd.h> unix standard header/*是POSIX标准定义的unix类系统定义符号常量的头文件,包含了许多UNIX系统服务的函数原型,例如read函数、write函数和getpid函数*/函数原型: pid_t fork(void);/*是Linux下的进程号类型,也就是Process ID _ Type 的缩写。
其实是宏定义的unsigned int类型*/函数功能:fork的功能是创建子进程。
调用fork的进程称为父进程。
如图2.1所示。
子进程是父进程的一个拷贝,它继承了父进程的用户代码、组代码、环境变量、已打开的文件代码、工作目录及资源限制。
fork语句执行后,内核向父进程返回子进程的进程号,向子进程返回0。
父子进程都从fork()的下一句开始并发执行。
返回值:返回值==-1:创建失败。
返回值==0:程序在子进程中。
返回值>0:程序在父进程中。
(该返回值是子进程的进程号)编程提示:虽然子进程是父进程的一个复制品,但父子的行为是不同的。
编程时要抓住内核的返回值。
通过返回值,可以知道是父进程还是子进程,因而可以编写不同行为的代码。
图2.1 fork()创建进程示意图(2) wait()系统调用头文件:#include <sys/wait.h>函数原型:pid_t wait(int *status);函数功能:wait的功能是等待子进程结束。
发出wait调用的进程只要有子进程,就会睡眠直到子进程中的一个终止为止。
若没有子进程,则该调用立即返回。
函数参数:status是子进程退出时的状态信息。
返回值:成功则返回子进程号,否则返回-1。
(3) getpid()系统调用头文件:unistd.h,在VC++6.0下可以用process.h函数原型:pid_t getpid(void);函数功能:wait的功能是将父进程挂起,等待子进程终止。
getpid函数用来取得目前进程的进程ID,许多程序利用取到的此值来建立临时文件,以避免临时文件相同带来的问题。
返回值:目前进程的进程ID。
(4) 其他系统调用exit –终止进程exec –执行一个应用程序nice –改变进程的优先7. 实验内容与步骤(将所有截图换成用户名为你们自己姓名的拼音,并回答所有的问题)(1)运行图2.1所示程序将图2.1中的源程序保存为e201.c在终端中编译gcc –o e201 e201.c运行 ./e201此时,程序为死循环,在该终端中无法继续输入命令执行,于是,我们可以暂时不管这一个终端,而是再新建一个终端,然后键入 ps –e,列出当前所有进程观察屏幕,是否有两个名为e201的进程。
比较它们的进程号,判别哪个是父进程,哪个是子进程。
程序中的while(1);语句是为了不让程序退出来,以便于你观察进程状态。
用kill命令把这两个进程终止。
可见,第一个终端如下图所示,已经从死循环中解救出来了。
当然,最简单粗暴的方法不是关闭相关进程,而是直接通过ctrl+c 强制结束。
对图2.1的程序稍加改进,可看见两个进程的进程号。
(2)编写一段名为e202.c的源程序,使用系统调用fork()创建两个子进程p1和p2。
p1的功能为显示字符'b',p2的功能为显示字符'c',父进程的功能为显示字符'a',父进程和两个子进程并发运行。
不停的运行e202,观察并记录屏幕上的显示结果。
程序设计过程:用while语句控制fork()直到创建成功。
用if语句判别是在子进程中还是在父进程中。
程序运行后会创建三个进程,它们分别是子进程p1、p2、父进程。
这三个进程并发运行。
假定子进程有些任务要做,完成这些任务要花一定时间,因此,可以用一个延时函数简单地模拟这些任务。
//e202.c#include <stdio.h>void delay(int x) /* 延时函数 */{int i,j;for(i=0;i<x;i++)for(j=0;j<x;j++) ;}int main(){int p1,p2;while((p1=fork())==-1); /* 创建子进程p1 */if(p1==0) /* 子进程p1创建成功 */{delay(4096); /* 子进程p1延时*/putchar('b'); /* 子进程p1显示字符'b' */}else{while((p2=fork())==-1); /* 创建子进程p2 */if(p2==0) /* 子进程p2创建成功 */{delay(2048); /* 子进程p2延时*/putchar('c'); /* 子进程p2显示字符'c' */}else{putchar('a'); /* 父进程显示字符'a' */}}return 0;}按向上的光标键、回车,运行刚才的程序。
快速重复这个步骤,观察并记录结果。
请回答问题:屏幕上是否有时显示bac,有时显示bca,…。
为什么会这样呢?(3) 参考(1)完成下列程序设计父子进程同步实验:编写一段程序, 使用系统调用fork()创建一个子进程,子进程求1+2+……+100的和并打印出来,使用系统调用wait()让父进程等待子进程结束。
请贴出源代码截图:请贴出正确运行截图:(4) 已知下列Linux程序执行后, 运行结果如下,请画出进程家族树(以进程号标示进程,注意,每次运行进程号都不一样)。
//Linux程序#include "stdio.h"#include "unistd.h"int main(){int p1,p2,p3;p1=fork();p2=fork();p3=fork();//注:getpid()获取当前进程pidif(p1>0 && p2>0 && p3>0) printf("A:%d\n",getpid()); if(p1==0 && p2>0 && p3>0) printf("B:%d\n",getpid()); if(p1==0 && p2==0 && p3>0) printf("C:%d\n",getpid()); if(p1==0 && p2==0 && p3==0)printf("D:%d\n",getpid()); if(p1==0 && p2>0 && p3==0) printf("E:%d\n",getpid()); if(p1>0 && p2==0 && p3>0) printf("F:%d\n",getpid()); if(p1>0 && p2==0 && p3==0) printf("G:%d\n",getpid()); if(p1>0 && p2>0 && p3==0) printf("H:%d\n",getpid()); sleep(10);return 0;}这些进程构成的进程树为(要画出进程树才有加分哦!):ps f 命令可以查看当前终端进程的进程数关系图8. 心得体会附录pstree的用法格式:pstree以树状图显示进程,只显示进程的名字,且相同进程合并显示。
格式:pstree -p以树状图显示进程,还显示进程PID。
格式:pstree <pid>格式:pstree -p <pid>以树状图显示进程PID为<pid>的进程以及子孙进程,如果有-p参数则同时显示每个进程的PID。
附录 Linux系统调用列表以下是Linux系统调用的一个列表,包含了大部分常用系统调用和由系统调用派生出的的函数。
其中有一些函数的作用完全相同,只是参数不同。
(有点像C++函数重载,但是Linux核心是用C语言写的,所以只能取成不同的函数名)。
还有一些函数已经过时,被新的更好的函数所代替了(gcc在链接这些函数时会发出警告),但因为兼容的原因还保留着,这些函数在前面标上“*”号以示区别。
各系统调用的使用方法,可以通过man命令获得。
二、文件系统控制12五、网络管理七、用户管理八、进程间通信12345。