实验3 进程创建模拟实验

合集下载

进程的创建实验报告

进程的创建实验报告

进程的创建实验报告进程的创建实验报告引言:在计算机科学领域中,进程是一个非常重要的概念。

进程是计算机程序的执行实例,它具有独立的内存空间和执行环境。

进程的创建是操作系统中一个关键的操作,本实验旨在通过编写一个简单的程序来演示进程的创建过程。

实验目的:通过实验,我们的目标是深入理解进程的创建过程,并了解操作系统是如何管理进程的。

实验步骤:1. 引入必要的头文件:在开始编写代码之前,我们需要引入一些必要的头文件。

这些头文件包括<sys/types.h>、<sys/wait.h>和<unistd.h>。

这些头文件提供了创建进程所需的函数和数据类型。

2. 创建一个子进程:在主程序中,我们使用fork()函数来创建一个子进程。

fork()函数会在当前进程的基础上创建一个新的进程,这个新进程称为子进程。

子进程和父进程几乎完全相同,只有在返回值上有所区别。

如果fork()函数返回0,表示当前进程是子进程;如果返回一个正整数,表示当前进程是父进程。

3. 子进程的执行:在子进程中,我们可以编写任意的代码来执行特定的任务。

子进程可以使用exec()函数来执行其他程序,或者执行一系列的操作。

在本实验中,我们简单地输出一条信息,以展示子进程的执行过程。

4. 父进程的执行:在父进程中,我们可以编写代码来执行其他任务,或者等待子进程的结束。

在本实验中,我们使用wait()函数来等待子进程的结束。

wait()函数会暂停父进程的执行,直到子进程结束为止。

5. 编译和运行程序:在完成代码编写后,我们需要将程序编译成可执行文件,并运行它。

我们可以使用gcc编译器来编译程序,然后运行生成的可执行文件。

实验结果:在运行程序后,我们可以观察到以下结果:子进程开始执行。

父进程等待子进程结束。

子进程结束。

父进程继续执行。

结论:通过本实验,我们成功地演示了进程的创建过程。

我们了解了操作系统是如何管理进程,并且掌握了使用fork()函数来创建子进程的方法。

电大操作系统实验报告3_ 进程管理实验

电大操作系统实验报告3_ 进程管理实验

电大操作系统实验报告3_ 进程管理实验电大操作系统实验报告 3 进程管理实验一、实验目的进程管理是操作系统的核心功能之一,本次实验的目的是通过实际操作和观察,深入理解进程的概念、状态转换、进程调度以及进程间的通信机制,掌握操作系统中进程管理的基本原理和方法,提高对操作系统的整体认识和实践能力。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C 语言,开发工具为 Visual Studio 2019。

三、实验内容及步骤(一)进程的创建与终止1、编写一个 C 程序,使用系统调用创建一个子进程。

2、在父进程和子进程中分别输出各自的进程 ID 和父进程 ID。

3、子进程执行一段简单的计算任务,父进程等待子进程结束后输出结束信息。

以下是实现上述功能的 C 程序代码:```cinclude <stdioh>include <stdlibh>include <unistdh>int main(){pid_t pid;pid = fork();if (pid < 0) {printf("创建子进程失败\n");return 1;} else if (pid == 0) {printf("子进程:我的进程 ID 是%d,父进程 ID 是%d\n",getpid(), getppid());int result = 2 + 3;printf("子进程计算结果:2 + 3 =%d\n", result);exit(0);} else {printf("父进程:我的进程 ID 是%d,子进程 ID 是%d\n",getpid(), pid);wait(NULL);printf("子进程已结束\n");}return 0;}```编译并运行上述程序,可以观察到父进程和子进程的输出信息,验证了进程的创建和终止过程。

(二)进程的状态转换1、编写一个 C 程序,创建一个子进程,子进程进入睡眠状态一段时间,然后被唤醒并输出状态转换信息。

操作系统进程的创建实验报告

操作系统进程的创建实验报告
分析showdetail()函数流程图如下:
分析main()函数流程图如下:
三、.思考题
1)进程创建的核心内容是什么?
答:内容是:1、申请空白PCB 2、为新进程分配资源
3、初始化进程控制块4、将新进程插入到就绪队列
2)该设计和实际的操作系统进程创建相比,缺少了哪些步骤?
答缺少的步骤有:只是模拟的创建,并没有分配资源
只是模拟的创建并没有分配资源四实验总结通过本次实验让我对进程的创建有更深的理解是我真真切切的理解到进程和程序的本质区别
一、实验内容
树形图1:
树形图1分析:进程1、2、3是根进程的子进程,相反的根进程是进程1、2、3的父进程,他们分别对应的优先级为2、2、2;接下来进程4、5又是进程1的子进程,进程6、7是进程2的子进程,进程8是进程3的子进程。
四、实验总结
通过本次实验,让我对进程的创建有更深的理解,是我真真切切的理解到进程和程序的本质区别。学会了如何使用基本命令进行调试和运行程序。总之这让我受益非浅。
各个方面都很符合要求,完成很好,体会写得很深入,继续努力ing。
输入如下:
createpc(1,0,2)
createpc(2,0,2)
createpc(3,0,2)
createpc(4,2,3)
createpc(5,2,3)
createpc(6,2,3)
createpc(7,5,3)
createpc(8,5,3)
运行截图如下:
二、函数分析:
分析createpc(para)函数流程图如下:
输入如下:
createpc(1,0,2)
createpc(2,0,2)
createpc(3,0,2)
createpc(4,0,2)

实验三 进程的创建和简单控制

实验三  进程的创建和简单控制

实验三进程的创建和简单控制实验目的:1. 掌握进程的概念和进程的状态,对进程有感性的认识;2. 掌握进程创建方法;3. 认识进程的并发执行,了解进程族之间各种标识及其存在的关系;4. 熟悉进程的创建、阻塞、唤醒、撤销等控制方法。

实验内容:1. 了解有关Linux进程的属性和进程的层次结构;2. 学习有关Linux的前台和后台进程;3. 学习有关Linux命令的顺序执行和并发执行;4. 学习有关挂起和终止进程;5. 了解并发程序的不可确定性,进行简单并发程序设计。

实验步骤:(一)Shell 下的进程控制1. 进入Linux系统。

2. 用ps查看进程。

a) linux的ps命令是用来监视系统进程和资源使用情况的命令,可显示瞬间进程的动态。

b) ps 的参数非常多,常用的参数有:i. -A 列出所有的进程;ii. -w 显示加宽可以显示较多的信息;iii. -au 显示较详细的信息;iv. -aux 显示所有包含其他使用者的进程。

3. 用kill终止某些进程。

a) kill命令通过向进程发送指定的信号来结束进程。

b) 先使用ps查到进程号,再使用kill杀出进程。

4. 用pstree命令显示系统中进程层次结构。

PDF 文件使用 "pdfFactory Pro" 试用版本创建a) pstree指令用ASCII字符显示树状结构,清楚地表达进程间的相互关系。

b) 语法格式pstree [-acGhlnpuUV][-H <程序识别码>][<程序识别码>/<用户名称>](二)Linux 简单进程编程1. 理解系统调用fork()的使用。

a) fork()会产生一个与父程序相同的子程序,唯一不同之处在于其进程号。

图2 系统调用fork()b) 编辑下面的程序,如图3所示,要求实现父进程产生两个子进程,父进程显示字符“a”、两个子进程,分别显示字符“b”、“c”。

计算机操作系统实训教程之进程的创建实验报告

计算机操作系统实训教程之进程的创建实验报告

计算机操作系统实训教程实验报告姓名王学杰专业计算机应用技术班级班课程操作系统实验项目进程的创建【实验目的】.加深对进程、进程树等概念的理解。

.进一步明确进程和程序的区别。

.理解进程并发执行的实质。

.掌握系统中进程的创建方法及并发执行的情况。

【实验内容】.编写一段程序,使用系统调用()创建两个子进程。

当此程序运行时,在系统中有一个父进程和两个子进程活动。

让每一个进程在屏幕上显示一段字符信息。

.学习对后台执行程序的控制方式。

.分析程序执行过程中产生的子进程情况。

【实验步骤】一、、编写源代码生成源文件“$ ”。

.编译“$ –”。

.前台运行“$ ”(按组合键终止死循环的程序)。

.多次使用–命令查看进程状态。

.使用命令控制该进程。

二、编写源代码生成源文件“”。

.编译源文件生成可执行程序“”:“$ –”。

.后台运行“$ ”。

.查看进程树“$ ”。

三例编写源代码生成源文件“”。

.编译源文件生成可执行程序“”:“$ –”。

.运行“$ ”。

四编写源代码生成源文件“”。

.编译源文件生成可执行程序“”:“$ –”。

.运行“$”。

五编写源代码生成源文件“”。

.编译源文件生成可执行程序“”:“$ –”。

运行结果如下【实验总结】一、入门知识一个进程,包括代码、数据和分配给进程的资源。

()函数通过系统调用创建一个与原来进程几乎完全相同的进程,也就是两个进程可以做完全相同的事,但如果初始参数或者传入的变量不同,两个进程也可以做不同的事。

一个进程调用()函数后,系统先给新的进程分配资源,例如存储数据和代码的空间。

然后把原来的进程的所有值都复制到新的新进程中,只有少数值与原来的进程的值不同。

相当于克隆了一个自己。

调用的一个奇妙之处就是它仅仅被调用一次,却能够返回两次,它可能有三种不同的返回值:)在父进程中,返回新创建子进程的进程;)在子进程中,返回;)如果出现错误,返回一个负值;二、()与()区别()与()都是创建一个进程,那他们有什么区别呢?总结有以下三点区别:. ():子进程拷贝父进程的数据段,堆栈段():子进程与父进程共享数据段. ()父子进程的执行次序不确定保证子进程先运行,在调用或之前与父进程数据是共享的,在它调用或之后父进程才可能被调度运行。

模拟进程创建、终止、阻塞、唤醒原语--附带注释

模拟进程创建、终止、阻塞、唤醒原语--附带注释

题目:计算机操作系统模拟院系:信息学院专业:计算机科学与技术班级:2013级1班辽宁大学实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。

二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。

三、实验环境:1、硬件:pc 机及其兼容机。

2、软件:Windows XP ,Turbo C 或C++、VC++等。

四、实验内容:1、设计创建、终止、阻塞、唤醒原语功能函数。

2、设计主函数,采用菜单结构(参见后面给出的流程图)。

3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。

五、实验要求:1、进程PCB 中应包含以下内容:2、系统总体结构:进程名:用P1,P2标识。

优先级:为实验题目二做准备。

运行时间:为实验题目二做准备。

状态为:就绪、运行、阻塞,三种基本状态。

指针:指向下一个PCB 。

另加实验二:模拟进程调度功能/*PCB的组织方式:线性方式*/#include "stdio.h"#include "string.h"#include "windows.h"typedef struct{char p_name[10];//进程名char p_pro;//优先级1-3个级别1.低2.中3.高char p_status;//运行状态0.阻塞1.运行2.就绪int p_runtime;//运行时间int p_wait;//等待时间struct PCB *next;//指针,指向下一个PCB}PCB;void Run(PCB *head)//任何时候保证程序里面至少有一个进程在运行{PCB *p=head->next;//直接将P指向第一个结点while(p!=NULL)//遍历一遍链表,将所有就绪队列等待时间加1,防止前面结点因为唤醒又进入运行状态{if(p->p_status=='2'){p->p_wait++;//将等待时间加1}p=p->next;}p=head->next;//将P重置在第一个结点while(p->p_status!='1' && p!=NULL){if(p->p_status=='2')//防止线性链表前面的结点因为从阻塞唤醒后又进入运行状态{p->p_status='1';p->p_wait=2;}if(p->p_status=='1')//对上一个if进行处理{return;}p=p->next;}return;}void Insert(PCB *head,PCB *temp)//插入链表函数{PCB *p;p=head;//将头结点保存起来while(p->next!=NULL){p=p->next;}p->next=temp;temp->next=NULL;}int Check(PCB *head,PCB *temp){PCB *p=head;while(p->next){p=p->next;if(strcmp(p->p_name,temp->p_name)==0)return 0;}return 1;}void Create(PCB *head)//创建进程函数{int chk=0;PCB *temp;//申请临时存储空间,方便接受数据temp=(PCB *)malloc(sizeof(PCB));system("cls");printf("\t----------进程创建-----------\n");printf("\n请输入进程名:");scanf("%s",temp->p_name);getchar();/*检查进程名称,如果相同则返回主界面*/chk=Check(head,temp);if(chk==0){printf("进程队列已有该名称进程,创建失败,即将返回主界面.\n");system("pause");return;}printf("\n请输入进程优先级(1.低2.中3.高):");scanf("%c",&temp->p_pro);getchar();printf("\n请输入进程运行时间:");scanf("%d",&temp->p_runtime);getchar();temp->p_status='2';temp->p_wait=2;/*printf("\n请输入该进程状态:");scanf("%c",&temp->p_status);getchar();*/Insert(head,temp);//调用插入链表函数system("pause");Run(head);}void Show(PCB *head)//显示队列进程函数{int ready=1,block=1,run=1;PCB *p=head,*q;system("cls");if(p->next==NULL){printf("目前系统中没有进程.请返回主界面创建进程!\n");system("pause");return;}/*列出就绪队列列表*/q=p->next;//指针指到第一个结点printf("\n--就绪队列--\n");while(q){if(q->p_status=='2'){printf("%d)进程名:%s",ready++,q->p_name);printf(" 进程优先级:%c",q->p_pro);printf(" 进程运行时间:%d",q->p_runtime);printf(" 进程等待时间:%d\n",q->p_wait);}q=q->next;}printf("\n");/*列出运行队列列表*/q=p->next;//将指针重置到第一个结点printf("\n--运行队列--\n");while(q){if(q->p_status=='1'){printf("%d)进程名:%s",run++,q->p_name);printf(" 进程优先级:%c",q->p_pro);printf(" 进程运行时间:%d\n",q->p_runtime);//printf(" 进程已运行时间:");}q=q->next;}printf("\n");/*列出阻塞队列列表*/q=p->next;printf("\n--阻塞队列--\n");while(q){if(q->p_status=='0'){printf("%d)进程名:%s",block++,q->p_name);printf(" 进程优先级:%c",q->p_pro);printf(" 进程运行时间:%d",q->p_runtime);printf(" 进程等待时间:%d\n",q->p_wait);}q=q->next;}printf("\n");printf("进程显示完毕.");system("pause");}void Block(PCB *head)//阻塞进程函数char name[10];PCB *p=head;//保护头结点system("cls");printf("\t----------阻塞进程-----------\n");printf("\n输入你要放入阻塞队列的进程名称:");scanf("%s",name);getchar();p=p->next;while(p){if(strcmp(p->p_name,name)==0)break;p=p->next;}if(!p){printf("\n队列中无该进程.\n");system("pause");}if(p->p_status=='1'){printf("\n该进程正在运行.\n");printf("\n将该进程放入阻塞队列\n\n");system("pause");p->p_status='0';printf("\n该进程已经被放入阻塞队列\n");system("pause");}else{if(p->p_status=='0'){printf("\n该进程已在阻塞队列中.\n");system("pause");}if(p->p_status=='2'){printf("\n该进程正在就绪队列中.不可放入阻塞队列\n");system("pause");}}Run(head);void Delete(PCB *head,PCB *temp)/*head为链表头结点,temp为将要删除的结点*/ {PCB *p=head,*q=temp->next;while(p->next!=temp){p=p->next;}p->next=q;free(temp);}void Stop(PCB *head)//终止进程函数{char name[10];PCB *p=head;system("cls");printf("\t----------终止进程-----------\n");printf("\n输入你要终止的进程名称:");scanf("%s",name);getchar();p=p->next;while(p){if(strcmp(p->p_name,name)==0)break;p=p->next;}if(!p){printf("进程队列中无该进程.\n");system("pause");}Delete(head,p);//调用删除结点函数printf("\n进程终止成功\n");system("pause");Run(head);}void Wakeup(PCB *head)//唤醒进程函数{char name[10];PCB *p=head;//保护头结点system("cls");printf("\t----------唤醒进程-----------\n");printf("\n输入你要唤醒的进程名称:");scanf("%s",name);getchar();p=p->next;while(p){if(strcmp(p->p_name,name)==0)break;p=p->next;}if(!p){printf("阻塞队列中无该进程名称.\n");system("pause");return;}if(p->p_status=='0'){printf("该进程正在阻塞队列中.\n");printf("\n将该进程放回就绪队列中\n");system("pause");p->p_status='2';p->p_wait=2;printf("\n该进程已经被放入就绪队列中\n");system("pause");}else{if(p->p_status=='1'){printf("\n该进程正在运行.不可唤醒\n");system("pause");}if(p->p_status=='2'){printf("\n该进程正在就绪队列中.不可唤醒\n");system("pause");}}}void prior_Sche(PCB *head){PCB *p=head->next,*temp=head->next;//保护头结点p,temp为将要删除的结点system("cls");if(p==NULL){printf("目前系统中没有进程.请返回主界面创建进程!\n");system("pause");return;}while(p){if(temp->p_pro < p->p_pro){temp=p;//将此时优先级最大的结点地址给临时空间保存}p=p->next;}printf("\n\n");printf("经过调度,此时程序中运行的进程是:\n");printf("\n 进程名:%s",temp->p_name);printf(" 进程优先级:%c",temp->p_pro);printf(" 进程运行时间:%d\n",temp->p_runtime);printf("\n该进程PCB显示完毕!\n");system("pause");Delete(head,temp);Run(head);}void time_Sche(PCB *head){int ready=1;PCB *p=head,*q,*temp=NULL;//保护头结点p,temp为时间片用完将要删除时,保护的临时结点system("cls");if(p->next==NULL){printf("目前系统中没有进程.请返回主界面创建进程!\n");system("pause");return;}/*列出就绪队列列表*/q=p->next;//指针指到第一个结点printf("\n--就绪队列--\n");while(q){if(q->p_status=='2'){printf("%d)进程名:%s",ready++,q->p_name);printf(" 进程优先级:%c",q->p_pro);printf(" 进程运行时间:%d\n",q->p_runtime--);//printf(" 进程已运行时间:");}if(q->p_runtime==0){temp=q;}q=q->next;}if(temp!=NULL){Delete(head,temp);}printf("\n");system("pause");}void Scheduling(PCB *head)//调度程序{while(1){int choose;system("cls");printf("1.优先级调度\n");printf("2.时间片调度\n");printf("0.返回主菜单\n");printf("\n请输入选项:");scanf("%d",&choose);getchar();switch(choose){case 1:prior_Sche(head);break;case 2:time_Sche(head);break;case 0:{ system("cls"); return;}break;default:{printf("请输入0-2的数字\n");system("pause");system("cls");}break;}}}void Menu(){printf("\t----------模拟系统进程创建、终止、阻塞、唤醒-----------");printf("\n");printf("1.进程创建\n");printf("2.阻塞进程\n");printf("3.唤醒进程\n");printf("4.终止进程\n");printf("5.显示进程\n");printf("6.调度进程\n");printf("0.退出\n");printf("\n\n");printf("\t------------------------完美分割线---------------------\n");printf("功能介绍:\n");printf("阻塞:运行->阻塞;处于运行之外状态,给出提示信息;若进程不存在也给出其他信息\n");printf("唤醒:根据输入的进程名结束进程;不管该进程处于什么状态都将结束;若输入进程不存在,会给出相应信息\n");printf("终止:根据输入的进程名结束进程;不管该进程处于什么状态都将结束;若输入进程不存在,会给出相应信息\n");printf("显示:分别显示就绪队列、阻塞队列、正在运行队列\n\n\n");}main(){PCB *head;head=(PCB *)malloc(sizeof(PCB));//头结点为空head->next=NULL;if(!head){printf("程序有误.即将退出");system("pause");exit(0);}while(1){int choose;system("cls");Menu();printf("请选择使用功能:");scanf("%d",&choose);switch(choose){case 1:Create(head);break;case 2:Block(head);break;case 3:Wakeup(head);break;case 4:Stop(head);break;case 5:Show(head);break;case 6:Scheduling(head);break;case 0:exit(0);break;default:{printf("请输入0-5的数字\n");system("pause");system("cls");}break;//输入'.'会造成bug.}}}/*作者:辰辰辽宁大学*/。

操作系统实验报告进程的创建

wait(0);printf("parent process doesn't change the glob and loc:\n");printf("glob=%d,loc=%d\n",glob,loc);exit(0);}运行结果:2、理解vofork()调用:程序代码:#include<stdio、h>#include<sys/types、h>#include<unistd、h>int glob=3;int main(void){pid_t pid;int loc=3;if((pid=vfork())<0){printf("vfork() error\n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes the glob and loc\n");exit(0);}elseprintf ("parent process doesn't change the glob and loc\n");printf("glob=%d,val=%d\n",glob,loc);}运行结果:3、给进程指定一个新的运行程序的函数exec()、程序代码:printe1、c代码:#include<stdio、h>int main(int argc,char * argv[]){int n;char * * ptr;extern char * * environ;for(n=0;n<argc;n++)printf("argv[%d]:%s\n",n,argv[n]);for(ptr=environ; * ptr!=0;ptr++)printf("%s\n",* ptr);exit(0);}file4、c代码如下:#include<stdio、h>#include<sys/types、h>#include<unistd、h>#include<sys/wait、h>char * env_list[]={"USER=root","PATH=/root/",NULL};int main(){pid_t pid;if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execle("/root/print1","print1","arg1","arg2",(char *)0,env_list)<0) printf("execle error!\n");exit(0);}if((waitpid(pid,NULL,0))<0)printf("WAIT ERROR!\n");exit(0);if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execlp("print1","print1","arg1",(char *)0)<0)printf("execle error!\n");exit(0);}exit(0);}运行结果:4、进程终止函数exit()。

操作系统实验报告(进程的创建)范文

实验题目进程的创建小组合作否姓名班级学号一、实验目的1、了解进程的创建。

2、了解进程间的调用以及实现。

3、分析进程竞争资源的现象,学习解决互斥的方法。

4、加深对进程概念的理解,认识并发执行的本质。

二.实验环境Windows 系统的计算机一台,安装了Linux虚拟机三、实验内容与步骤1、fork()系统调用的使用例子程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;printf("before fork();glod=%d,loc=%d.\n",glob,loc);if((pid=fork())<0){printf("fork() error. \n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes glob and loc: \n");}elsewait(0);printf("parent process doesn't change the glob and loc:\n");printf("glob=%d,loc=%d\n",glob,loc);exit(0);}运行结果:2、理解vofork()调用:程序代码:#include<stdio.h>#include<sys/types.h>#include<unistd.h>int glob=3;int main(void){pid_t pid;int loc=3;if((pid=vfork())<0){printf("vfork() error\n");exit(0);}else if(pid==0){glob++;loc--;printf("child process changes the glob and loc\n");exit(0);}elseprintf ("parent process doesn't change the glob and loc\n");printf("glob=%d,val=%d\n",glob,loc);}运行结果:3、给进程指定一个新的运行程序的函数exec().程序代码:printe1.c代码:#include<stdio.h>int main(int argc,char * argv[]){int n;char * * ptr;extern char * * environ;for(n=0;n<argc;n++)printf("argv[%d]:%s\n",n,argv[n]);for(ptr=environ; * ptr!=0;ptr++)printf("%s\n",* ptr);exit(0);}file4.c代码如下:#include<stdio.h>#include<sys/types.h>#include<unistd.h>#include<sys/wait.h>char * env_list[]={"USER=root","PATH=/root/",NULL};int main(){pid_t pid;if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execle("/root/print1","print1","arg1","arg2",(char *)0,env_list)<0) printf("execle error!\n");exit(0);}if((waitpid(pid,NULL,0))<0)printf("WAIT ERROR!\n");exit(0);if((pid=fork())<0){printf("fork error!\n");exit(0);}else if(pid==0){if(execlp("print1","print1","arg1",(char *)0)<0)printf("execle error!\n");exit(0);}exit(0);}运行结果:4、进程终止函数exit()。

模拟进程创建、终止、阻塞、唤醒原语操作系统原理

1 模拟进程创建、终止、阻塞、唤醒原语操作系统原理 操作系统原理 题 目:模拟进程创建、终止、阻塞、唤醒原语院(部): 管理工程学院专 业: 信息管理与信息系统班 级: 信管姓 名: 学 号: 实验题目一:模拟进程创建、终止、阻塞、唤醒原语一、题目类型:必做题目。 二、实验目的:通过设计并调试创建、终止、阻塞、唤醒原语功能,有助于对操作系统中进程控制功能的理解,掌握操作系统模块的设计方法和工作原理。 三、实验环境: 1、硬件:pc机及其兼容机。 2、软件:WindowsOS,TurboC或C++、VC++、VS.net、Java等。 四、实验内容: 1、设计创建、终止、阻塞、唤醒原语功能函数。 2、设计主函数,采用菜单结构(参见后面给出的流程图)。 3、设计“显示队列”函数,目的能将就绪、阻塞队列中的进程信息显示在屏幕上,以供随时查看各队列中进程的变化情况。 五、算法流程图 开始 系统主菜单1…创建2…阻塞3…唤醒4…终止5…显示0…退出请输入您需要的功能(0-5): 2

输入选择=? 543210 退出创建阻塞唤醒终止显示 结束 六、程序清单#include#includestructpcb{ charname[10]; intstatus; intorder; inttime; intwtime; intytime;}pcb[11];//该结构体用于存储已经输入的进程structghost{ charname[10]; intstatus; intorder; inttime;}ghost[11];//该结构体用于优先级调度时,进程的优先级排序chara_name[10];inti=0,y,a=0,x,z,jilu;voidinsert();voidblock();voidrouse();voidstop();voidoutPut();voidcontrol();//实验二添加函数voidorder_control();//实验二添加函数voidtime_control();//实验二添加函数voidinsert(){ jilu=0;//jilu是一个用于判断的变量,在重复时进行判断跳过 if(i>=10) printf(“进程已经存在10个,无法继续添加进程\n“); else { printf(“请输入插入pcb的数据:\n“); printf(“1、进程名:“); scanf(“%s“,&pcb[i].name); printf(“2、该进程的优先级(1-10):“); scanf(“%d“,&pcb[i].order); 3

实验创建进程


安全属性
LPSECURITY_ATTRIBUTES lpThreadAttributes , //新进程对应
线程安全属性
BOOL bInheritHandles ,//指定父进程对象句柄是否能被子进程
继承
DWORD dwCreationFlags , //指定创建进程附加标记,即指定
新创建进程特征
LPVOID lpEnvironment ,//指定新进程使用环境,NULL表示同
用CreateProcess函数来创建一个新进程
BOOL CreateProcess( LPCTSTR lpApplicationName , //指定可执行程序名
LPTSTR lpCommandLine , //命令行字符串,可认为NULL
LPSECURITY_ATTRIBUTES lpProcessAttributes , //新进程对象
传递NULL。
LPTSTR lpCurrentDirectory
lpCurrentDirectory参数是一个指向空终止字符串,用来 指定子进程当前路径,这个字符串必须是一个完整路径名, 包含驱动器标识符,假如此参数为NULL,那么新子进程 将于调用进程(父进程)用有相同驱动器和目录。
CreateProcess(“….exe”,…, CREATE_NO_WINDOW,NULL,NULL,…)
实验创建进程
第5页
父进程框架
void main() {
程序框架 //为创建进程做准备工作
//创建子进程 If(创建失败)
返回
Else(创建成功)
父进程框架 //执行计算1——100和
//等子进程执行完,读取子进程文件内容,并输出。 }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档