实验二 进程的创建

合集下载

进程的创建实验报告

进程的创建实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

父进程等待子进程结束。

子进程结束。

父进程继续执行。

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

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

操作系统实验2--进程创建讲解

操作系统实验2--进程创建讲解



Linux是一个多用户、多任务的操作系统 各种计算机资源(如文件、内存、CPU等)的分配 和管理都以进程为单位 为了协调多个进程对这些共享资源的访问,操作系 统要跟踪所有进程的活动,以及它们对系统资源的 使用情况,从而实施对进程和资源的动态管理。

Linux操作系统包括如下3种不同类型的进程,每种 进程都有其自己的特点和属性
dhcpd
gated
启动一个DHCP(动态IP地址分配)服务器
网关路由守候进程,使用动态的OSPF路由选择协议
续表
守 护 进 程 innd linuxconf lpd named netfs network nfsd portmap postgresql routed sendmail smb snmpd squid syslog xfs xntpd identd Usenet新闻服务器 允许使用本地WEB服务器作为用户接口来配置机器 打印服务器 DNS服务器 安装NFS、Samba和NetWare网络文件系统 激活已配置网络接口的脚本程序 NFS服务器 RPC portmap管理器,管理基于RPC服务的连接 一种SQL数据库服务器 路由守候进程,使用动态RIP路由选择协议 邮件服务器sendmail Samba文件共享/打印服务 本地简单网络管理守候进程 激活代理服务器squid 一个让系统引导时起动syslog和klogd系统日志守候进程的脚本 X Window字型服务器,为本地和远程X服务器提供字型集 网络时间服务器 认证服务,在提供用户信息方面与finger类似 功 能 说 明
◦ 交互进程 ◦ 批处理进程 ◦ 守护进程
由shell启动,可在前台 运行,也可在后台运行
批处理进程和终端没有联系 ,它是一个进程序列

计算机操作系统实验二

计算机操作系统实验二

计算机操作系统实验二一、实验目的本实验旨在通过实际操作,深入理解和掌握计算机操作系统中的进程与线程管理。

通过实验,我们将了解进程的创建、执行、阻塞、唤醒等状态以及线程的创建、同步、通信等操作。

同时,通过实验,我们将学习如何利用进程和线程提高程序的并发性和效率。

二、实验内容1、进程管理a.进程的创建与执行:通过编程语言(如C/C++)编写一个程序,创建一个新的进程并执行。

观察和记录进程的创建、执行过程。

b.进程的阻塞与唤醒:编写一个程序,使一个进程在执行过程中发生阻塞,并观察和记录阻塞状态。

然后,通过其他进程唤醒该进程,并观察和记录唤醒过程。

c.进程的状态转换:根据实际操作,理解和分析进程的状态转换(就绪状态、阻塞状态、执行状态)以及转换的条件和过程。

2、线程管理a.线程的创建与同步:编写一个多线程程序,创建多个线程并观察和记录线程的创建过程。

同时,使用同步机制(如互斥锁或信号量)实现线程间的同步操作。

b.线程的通信:通过消息队列或其他通信机制,实现多个线程间的通信。

观察和记录线程间的通信过程以及通信对程序执行的影响。

c.线程的状态转换:根据实际操作,理解和分析线程的状态转换(新建状态、就绪状态、阻塞状态、终止状态)以及转换的条件和过程。

三、实验步骤1、按照实验内容的要求,编写相应的程序代码。

2、编译并运行程序,观察程序的执行过程。

3、根据程序的输出和实际操作情况,分析和理解进程与线程的状态转换以及进程与线程管理的相关原理。

4、修改程序代码,尝试不同的操作方式,观察程序执行结果的变化,进一步深入理解和掌握进程与线程管理。

5、完成实验报告,总结实验过程和结果,提出问题和建议。

四、实验总结通过本次实验,我们深入了解了计算机操作系统中的进程与线程管理原理和实践操作。

在实验过程中,我们不仅学习了如何利用编程语言实现进程和线程的操作,还通过实际操作观察和分析了进程与线程的状态转换以及进程与线程管理的基本原理。

操作系统+实验二__进程创建

操作系统+实验二__进程创建

实验二进程创建实验学时:3实验类型:(验证)一、实验目的1. 理解进程概念以及进程和程序的区别;2. 理解进程并发执行的实质;3. 掌握解决进程同步问题的基本方法;4. 培养学生分析和设计程序的能力。

二、实验条件Linux平台。

三、实验原理及相关知识1.实验相关知识点进程的基本概念;进程控制;进程同步;经典进程的同步问题。

2.系统调用系统调用是一种进入系统空间的办法。

通常,在OS的核心中都设置了一组用于实现各种系统功能的子程序,并将它们提供给程序员使用。

程序员在需要OS提供某种服务的时候,便可以调用一条系统调用命令,去实现希望的功能,这就是系统调用。

因此,系统调用就像一个黑箱子一样,对用户屏蔽了操作系统的具体动作而只是提供了调用功能的接口。

不同的操作系统有各自的系统调用方法。

如windows API,便是windows的系统调用。

Linux 的系统调用与之不同的是源于Linux内核代码完全公开,所以可以细致的分析出其系统调用的机制。

3.系统调用和普通函数的区别(1)运行于不同的系统状态用户程序可以通过系统调用进入系统空间,在核心态执行;而普通函数则只能在用户空间当中运行。

(2)通过软中断切换由于用户程序使用系统调用后要进入系统空间,所以需要调用一个软中断;而普通函数在被调用时则没有这个过程。

4.系统调用的类型系统调用的作用与它属在的操作系统有密切关系。

根据操作系统的性质不同,它们所提供的系统调用会有一定的差异,不过对于普通操作系统而言,应该具有下面几类系统调用:(1)进程控制类型;(2)文件操纵类型;(3)进程通信类型;(4)信息维护类型。

5.系统调用的实现机制由于操作系统的不同,其系统调用的实现方式可能不一样,然而实现机制应该是大致相同的,一般包含下面几个步骤:(1)设置系统调用号,在系统当中,往往设置多条系统调用命令,并赋予每条系统调用命令一个唯一的系统调用号。

根据分配系统调用号方式的不同分为:直接方式和参数表方式。

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

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

操作系统实验报告(进程的创建)实验题目进程的创建小组合作否姓名班级学号一、实验目的1、了解进程的创建。

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

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

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

二.实验环境Windows 系统的计算机一台,安装了Linux虚拟机三、实验内容与步骤1、fork()系统调用的使用例子程序代码:#include#include#includeint 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#include#includeint 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代码:#includeint main(int argc,char * argv[]){int n;char * * ptr;extern char * * environ;for(n=0;n<argc;n++)< p="">printf("argv[%d]:%s\n",n,argv[n]);for(ptr=environ; * ptr!=0;ptr++)printf("%s\n",* ptr);exit(0);}file4.c代码如下:#include#include#include#includechar * 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、认识并了解并发执行的实质二.实验内容:1、编写一段程序,使用系统调用fork( )创建两个子进程。

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

让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。

试观察记录屏幕上的显示结果,并分析原因。

2、修改上述程序,每一个进程循环显示一句话。

子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。

三.实验准备(1)阅读LINUX的fork.c源码文件,分析进程的创建过程。

(2)阅读LINUX的sched.c源码文件,加深对进程管理概念的认识。

四.思考(1) 系统是怎样创建流程?(2) 可执行文件加载时进行了哪些处理?(3) 当首次调用新创建的进程时,其入口在哪里?五.源代码:1、#include <stdio.h>main( ){int p1,p2;while((p1=fork( ))= = -1);if (p1= =0) putchar('b');else{while((p2=fork( ))= = -1);if(p2= =0)putchar('c');elseputchar('a');}}2、#include <stdio.h>main( ){int p1,p2,i;while((p1=fork( ))= = -1);if (p1= =0)for(i=0;i<10;i++)printf("daughter %d\n",i);else{while((p2=fork( ))= = -1); i f(p2= =0)for(i=0;i<10;i++)printf("son %d\n",i);elsefor(i=0;i<10;i++)printf("parent %d\n",i);}}六.思考:1)系统创建进程时要先创建父进程,然后再创建子进程,从进程并发执行来看,父进程与子进程的输出内容会叠加在一起。

操作系统实验报告(进程的创建).doc

操作系统实验报告(进程的创建).doc

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()。

实验二 进程的创建和控制

实验二  进程的创建和控制

实验二进程的创建和控制( 2学时)[实验目的]:(1)加深对进程概念的理解,明确进程和程序的区别。

(2)进一步认识并发执行的实质。

(3)加深对进程管理概念的理解。

(4)分析进程的创建过程。

[实验预备内容]:(1)阅读Linux的fork.c源码文件。

(2) a. Linux/UNIX的进程和CPU管理类命令:(8个)b.Linux/UNIX进程和CPU管理类系统调用:c.Linux/UNIX进程和CPU管理类系统调用(1):与进程建撤和状态有关的系统调用(13个)e. Linux/UNIX进程和CPU管理类系统调用(3):与进程调度有关的系统调用f. Linux/UNIX进程管理类系统调用(4):与进程跟踪/进程运行时间有关的系统调用(2个)g.Linux/UNIX进程和CPU管理类系统调用(5):其他与进程和CPU管理有关的系统调用(6个)h.Linux线程库常用函数[实验内容]:(1) 进程的创建编写一段程序,使用系统调用fork ( ) 创建两个子进程。

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

让每一个进程在屏幕上显示一个字符:父进程显示字符“a”;子进程分别显示字符“b”和字符“c”。

试观察记录屏幕上的显示结果,并分析原因。

<程序># include<stdio.h>main ( ){int p1,p2;while ((pl = fork ( )) = = -1 );/* 创建子进程p1 */if (pl==0) /* 子进程创建成功*/putchar (‘b’);else{while ((p2 = fork ( )) = = -1);/* 创建另一个子进程*/if ( p2 = = 0) /* 子进程创建成功*/putchar (‘c’);else putchar(‘a’);/* 父进程执行*/}}<运行结果>bca(有时会出现bac)分析:从进程并发执行来看,输出bac,acb等情况都有可能。

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

实验二进程的创建
一、实验目的
1、掌握进程的概念,明确进程的含义
2、认识并了解并发执行的实质
二、实验内容
1、编写一段程序,使用系统调用fork( )创建两个子进程。

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

让每一个进程在屏幕上显示一个字符:父进程显示'a',子进程分别显示字符'b'和字符'c'。

试观察记录屏幕上的显示结果,并分析原因。

2、修改上述程序,每一个进程循环显示一句话。

子进程显示'daughter …'及'son ……',父进程显示'parent ……',观察结果,分析原因。

三、实验准备
(1)阅读LINUX的fork.c源码文件,分析进程的创建过程。

(2)阅读LINUX的sched.c源码文件,加深对进程管理概念的认识。

四、思考
(1) 系统是怎样创建流程?
(2) 可执行文件加载时进行了哪些处理?
(3) 当首次调用新创建的进程时,其入口在哪里?
五、参考程序
1、
#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');
}
}
2、
#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);
else
for(i=0;i<10;i++)
printf("parent %d\n",i);
}
}。

相关文档
最新文档