实验一-进程控制实验

实验一 进程控制

一、实验目的:

加深对进程概念的理解,明确进程和程序的区别;掌握Linux 操作系统的进程创建和终止操作,体会父进程和子进程的关系及进程状态的变化;进一步认识并发执行的实质,编写并发程序。

二、实验平台:

虚拟机:VMWare9以上

操作系统:Ubuntu12.04以上

编辑器:Gedit | Vim

编译器:Gcc

三、实验内容:

(1)编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示“身份信息”:父进程显示“Parent process! PID=xxx1 PPID=xxx2”;子进程显示“Childx process! PID=xxx PPID=xxx”。多运行几次,观察记录屏幕上的显示结果,并分析原因。

说明:

xxx1为进程号,用getpid()函数可获取进程号;

xxx2为父进程号,用getppid()函数可获取父进程号;

Childx 中x 为1和2,用来区别两个子进程;

wait()函数用来避免父进程在子进程终止之前终止。

程序源码:

#include

#include

#include

#define NUM 2

int main(void)

{

pid_t pid1,pid2;

if((pid1=fork())

printf("创建进程1失败");

}else{

if(pid1==0){

//子进程1执行

printf("Child1 process: ");

printf("PID=%d PPID=%d \n",getpid(),getppid());

sleep(2);

}else{

if((pid2=fork())

printf("创建进程2失败");

}else{

if(pid2==0){ //子进程2执行

printf("Child2 process: ");

printf("PID=%d PPID=%d \n",getpid(),getppid());

}

else{

//父进程执行

wait(); wait(); printf("Parent process: "); printf("PID=%d PPID=%d \n",getpid(),getppid()); exit(0); }

}

}

}

}

执行结果

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ gcc test1.c -o test

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test

Child2 process: PID=2527 PPID=2525

Child1 process: PID=2526 PPID=2525

Parent process: PID=2525 PPID=2127

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test

Child2 process: PID=2530 PPID=2528

Child1 process: PID=2529 PPID=2528

Parent process: PID=2528 PPID=2127

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test

Child2 process: PID=2533 PPID=2531

Child1 process: PID=2532 PPID=2531

Parent process: PID=2531 PPID=2127

实验结果分析:

第一次程序运行结果,两个子进程的PPID 都是2525,是由同一个进程创建。而父进程PID 是2525,父进程PPID 是2127,说明父进程也是一系统进程的子进程。

第二次程序运行结果,父进程PID 是2528,PPID 是2127,说明父进程是由同一进程创建的,父进程也是以子进程的方式存在,且进程ID 是逐渐递增的。

(2)fork()和exec()系列函数能同时运行多个程序,利用上述函数将下面单进程顺序执行的程序single.c 改造成可并发执行3个进程的程序multi_process.c;并用time 命令获取程序的执行时间,比较单进程和多进程运行时间,并分析原因。

//single.c

#include

#define NUM 5

int main(void)

{

void print_msg(char *m);

print_msg("Good ");

print_msg("Morning ");

print_msg("007\n"); //将007替换为本人学号

return 0;

}

void print_msg(char *m)

{

int i;

for(i = 0; i

printf("%s",m);

fflush(stdout);

sleep(1);

}

}

编译运行方法:

#gcc single.c –o single

#time ./single

单线程执行结果:

多线程代码:

#multi_process.c

#include

#include

#include

#define NUM 5

int main(void)

{

pid_t pid[3];

int i;

for(i=1;i

pid[i-1]=fork();

if(pid[i-1]==0||pid[i-1]==-1)

break;

}

if(pid[0]==0){

execl("print","print","Good",NULL);

}

else {

if(pid[1]==0){

execl("print","print","Hello",NULL);

}

else{

if(pid[2]==0){

execl("print","print","[1**********]3",NULL);

}

wait();

wait();

wait();

exit(0);

}

}

return 0;

}

实验分析:第二个实验结果,第二个程序的多线程因为是并发执行,而且是有三个线程,所以在时间上几乎是单线程的1/3,而且因为是并发的,所以打印结果是无序的。

实验总结

本次实验首先要明确进程和程序的区别,我通过在Linux 操作系统的进程创建和终止操作,运行父进程和子进程,查看运行结果和进程状态的变化。实验过程中也了解了父进程与子进程的运行过程及其机制。

实验一 进程控制

一、实验目的:

加深对进程概念的理解,明确进程和程序的区别;掌握Linux 操作系统的进程创建和终止操作,体会父进程和子进程的关系及进程状态的变化;进一步认识并发执行的实质,编写并发程序。

二、实验平台:

虚拟机:VMWare9以上

操作系统:Ubuntu12.04以上

编辑器:Gedit | Vim

编译器:Gcc

三、实验内容:

(1)编写一段程序,使用系统调用fork()创建两个子进程,当此程序运行时,在系统中有一个父进程和两个子进程活动。让每一个进程在屏幕上显示“身份信息”:父进程显示“Parent process! PID=xxx1 PPID=xxx2”;子进程显示“Childx process! PID=xxx PPID=xxx”。多运行几次,观察记录屏幕上的显示结果,并分析原因。

说明:

xxx1为进程号,用getpid()函数可获取进程号;

xxx2为父进程号,用getppid()函数可获取父进程号;

Childx 中x 为1和2,用来区别两个子进程;

wait()函数用来避免父进程在子进程终止之前终止。

程序源码:

#include

#include

#include

#define NUM 2

int main(void)

{

pid_t pid1,pid2;

if((pid1=fork())

printf("创建进程1失败");

}else{

if(pid1==0){

//子进程1执行

printf("Child1 process: ");

printf("PID=%d PPID=%d \n",getpid(),getppid());

sleep(2);

}else{

if((pid2=fork())

printf("创建进程2失败");

}else{

if(pid2==0){ //子进程2执行

printf("Child2 process: ");

printf("PID=%d PPID=%d \n",getpid(),getppid());

}

else{

//父进程执行

wait(); wait(); printf("Parent process: "); printf("PID=%d PPID=%d \n",getpid(),getppid()); exit(0); }

}

}

}

}

执行结果

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ gcc test1.c -o test

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test

Child2 process: PID=2527 PPID=2525

Child1 process: PID=2526 PPID=2525

Parent process: PID=2525 PPID=2127

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test

Child2 process: PID=2530 PPID=2528

Child1 process: PID=2529 PPID=2528

Parent process: PID=2528 PPID=2127

whtcmiss@whtcmiss-VirtualBox:~/Desktop$ ./test

Child2 process: PID=2533 PPID=2531

Child1 process: PID=2532 PPID=2531

Parent process: PID=2531 PPID=2127

实验结果分析:

第一次程序运行结果,两个子进程的PPID 都是2525,是由同一个进程创建。而父进程PID 是2525,父进程PPID 是2127,说明父进程也是一系统进程的子进程。

第二次程序运行结果,父进程PID 是2528,PPID 是2127,说明父进程是由同一进程创建的,父进程也是以子进程的方式存在,且进程ID 是逐渐递增的。

(2)fork()和exec()系列函数能同时运行多个程序,利用上述函数将下面单进程顺序执行的程序single.c 改造成可并发执行3个进程的程序multi_process.c;并用time 命令获取程序的执行时间,比较单进程和多进程运行时间,并分析原因。

//single.c

#include

#define NUM 5

int main(void)

{

void print_msg(char *m);

print_msg("Good ");

print_msg("Morning ");

print_msg("007\n"); //将007替换为本人学号

return 0;

}

void print_msg(char *m)

{

int i;

for(i = 0; i

printf("%s",m);

fflush(stdout);

sleep(1);

}

}

编译运行方法:

#gcc single.c –o single

#time ./single

单线程执行结果:

多线程代码:

#multi_process.c

#include

#include

#include

#define NUM 5

int main(void)

{

pid_t pid[3];

int i;

for(i=1;i

pid[i-1]=fork();

if(pid[i-1]==0||pid[i-1]==-1)

break;

}

if(pid[0]==0){

execl("print","print","Good",NULL);

}

else {

if(pid[1]==0){

execl("print","print","Hello",NULL);

}

else{

if(pid[2]==0){

execl("print","print","[1**********]3",NULL);

}

wait();

wait();

wait();

exit(0);

}

}

return 0;

}

实验分析:第二个实验结果,第二个程序的多线程因为是并发执行,而且是有三个线程,所以在时间上几乎是单线程的1/3,而且因为是并发的,所以打印结果是无序的。

实验总结

本次实验首先要明确进程和程序的区别,我通过在Linux 操作系统的进程创建和终止操作,运行父进程和子进程,查看运行结果和进程状态的变化。实验过程中也了解了父进程与子进程的运行过程及其机制。


相关文章

  • 合肥工业大学操作系统实验报告
  • 合肥工业大学 计算机与信息学院 实验报告 课 程: 计算机操作系统 专业班级: 计算机科学与技术2班 学 号: 姓 名: 实验1 实验环境的使用 一. 实验目的 1. 熟悉操作系统集成实验环境OS Lab的基本使用方法. 2. 练习编译.调 ...查看


  • 实验一处理器调度
  • 操作系统实验 (第一次) 一.实验内容 选择一个调度算法,实现处理器调度. 二.实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪状态进程 个数大于处理器数时,就必须依照某种策略来决定哪些进程优先占用处理器.本实 ...查看


  • 处理器调度时间片轮转法实验报告(C和C含源代码)
  • 实验2处理器调度学院:计算机与软件专业:软件工程日期:2014年5月18日姓名:学号:指导老师: 一.实验题目 按时间片轮转法实现处理器调度的模拟设计与实现 二.实验目的 在采用多道程序设计的系统中,往往有若干个进程同时处于就绪状态.当就绪 ...查看


  • 各种实验报告电子版模版
  • 实验项目四 进程通信 一. 实验类型 本实验为综合性实验. 二. 实验目的 1. 了解什么是消息,熟悉消息传送原理. 2. 了解和熟悉共享存储机制. 3. 掌握消息的发送与接收的实现方法. 三. 实验预备知识 任务一 消息的发送和接收 1. ...查看


  • 大连理工大学操作系统实验报告
  • 大连理工大学 本科实验报告 课程名称:操作系统实验 学院(系):计算机科学与技术学院 专 班 学业:计算机科学与技术级:号:电计 学生姓名: 年月日 实验项目列表序号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...查看


  • 处理器调度实验报告
  • 操作系统实验报告 选题名称 所在院系 专业名称 处理器调度 计算机科学与技术学院 计算机科学与技术学院(日语双学位) 龚德兴.徐莉莉.张文卿. 王俏.何慧楠.刘艳茹.朱静君 姓 名 班 级 指导老师 完成时间 1202班 付老师 2014- ...查看


  • 快速排序问题
  • 快速排序问题 张懿 1问题描述 对于有1,000,000个乱序数据的数据文件执行快速排序. 2 本实验在Windows8.1环境下实现.实验环境 3实验步骤 (1)首先产生包含1,000,000个随机数(数据类型可选整型或者浮点型)的数据文 ...查看


  • 实验1银行家算法(1)
  • 实 验 报 告 实验课程: 学生姓名: 学 号: 专业班级: 操作系统 20 级计算机科学与技术专业 班 2015年 月 日 实验一 银行家算法的模拟 一.实验目的 (1) 加深了解有关资源申请.避免死锁等概念. (2) 体会和了解死锁和避 ...查看


  • 进程调度模拟设计--先来先服务.最高响应比优先调度算法
  • 课 程 设 计 题 目 学 院 专 业 班 级 姓 名 指导教师 进程调度模拟设计-先来先服务.最高响应比优先调度算法 计算机科学与技术学院 计算机科学与技术专业 计算机科学与技术0902班 庞竞强 郭羽成 2011 年 01 月 12 日 ...查看


热门内容