进程的创建与并发执行-带答案版课案

合集下载

“操作系统概论”习题解答之并发进程

“操作系统概论”习题解答之并发进程

“操作系统概论”习题解答之并发进程第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就是进程存在的唯一标志。

操作系统实验报告理解Linux下进程和线程的创建并发执行过程。

操作系统实验报告理解Linux下进程和线程的创建并发执行过程。

操作系统上机实验报告实验名称:进程和线程实验目的:理解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是将进程的可执行映像加载到了进程的地址空间中。

第2章 进程管理课后习题解答

第2章 进程管理课后习题解答

第题中,如果修改问题中的同步算法,要求 对写进程优先,即一旦写进程到达,后续的读者进程必须等待, 而无论是否有读者进程在读文件。写出相应进程的程序段。 semaphore fmutex=1, rmutex=1, wmutex=1;que=1;
int rcount=0, wcount=0; void main() { parbegin(reader, writer); }
12
void reader { while(1) { wait(que); wait(rmutex); if(0==readcount) wait(fmutex); readcount++; signal(rmutex); signal(que); …. begin to read wait(rmutex); readcount--; if(readcount==0) signal (fmutex); signal(rmutex); } }
读者—写者问题(读优先) 读者 写者问题(读优先) 写者问题 semaphore rmutex=1,wmutex=1; int readcount=0; = void main() { parbegin(reader,writer); }
读者进程: 读者进程: void reader() { while(1) { wait(rmutex); if (readcount==0) wait(wmutex); readcount++; signal(rmutex); … 读操作 wait(rmutex); readcount--; if (readcount==0) signal(wmutex); signal(rmutex); } }
18
chopstick[ ={1 semaphore chopstick[5]={1,1,1,1,1}; viod main() { parbegin(P0(),P1(),P2(),P3(),P4()); parbegin(P0(),P1(),P2(),P3(),P4()); } Pi() /*i=0,1,2,3,4*/ { while(1) { wait(chopstick[i]); [ ] wait(chopstick[(i+1)%5]); [ ] eating; … signal(chopstick[i]); [ ] signal(chopstick[(i+1) %5]); [ ] thinking; } }

进程并发实验报告

进程并发实验报告

一、实验背景与目的随着计算机技术的发展,多任务处理和多进程并发已经成为操作系统设计中的基本要求。

为了更好地理解进程并发的基本原理和实现方法,我们进行了本次实验。

实验的目的是通过实践操作,加深对进程并发执行的理解,掌握进程创建、同步、互斥等基本概念,并学会使用相关系统调用实现进程的并发控制。

二、实验环境与工具实验环境: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. 进程创建与并发执行通过实验,我们观察到多个进程可以并发执行,并且每个进程的执行时间都会有所不同。

操作系统实验_实验1课案

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

实验二进程管理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。

相关文档
最新文档