《操作系统》实验报告——进程管理
理论知识
Linux——进程管理
1.实验目的
(1)加深对进程概念的理解,明确进程和程序的区别。
(2)进一步认识并发执行的实质。
(3)分析进程争用资源的现象,学习解决进程互斥的方法。
2.实验预备内容
(1)复习课本关于进程控制和进程同步的内容,加深对进程管理概念的理解。
(2)认真阅读实验材料中进程管理部分,分析多个进程的运行情况。
3.实验内容
(1)运行源码
运行上文进程管理中给出的例子,查看自己运行的结果,并进行分析。
(2)进程的创建
自己编写一段程序,使用系统调用fork()创建子进程,认识进程的并发执行。
#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>int main(){pid_t pid;pid=fork();if(pid<0) /* 如果出错 */printf("error occurred!\n");else if(pid==0) /* 如果是子进程 */{printf("我是子进程1,进程号是%d\n",getpid());pid_t pid1;pid1 = fork();if(pid1==0){printf("我是子进程1的子进程,进程号是%d\n",getpid());}}else{printf("我是父进程,进程号是%d\n",getpid());pid=fork();if(pid==0)printf("我是子进程2,进程号是%d\n",getpid());else{pid=fork();if(pid==0)printf("我是子进程3,进程号是%d\n",getpid());}}return 0;}
(3)进程的同步
自己编写一段程序,利用fork()、wait()等系统调用实现父子进程间的同步。
#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{int p1,p2,i;while((p1=fork())==-1);if(p1==0){lockf(1,1,0);for(i=0;i<50000; i++)printf("son%d\n",i);lockf(1,0,0);}else{while((p2=fork())==-1);if(p2==0){lockf(1,1,0);for(i=0;i<50000;i++)printf("daughter%d\n",i);lockf(1,0,0);}else{lockf(1,1,0);for(i=0;i<50000;i++)printf("parent%d\n",i);lockf(1,0,0);}}return 0;
}
附
(四个进程管理的程序)
程序1
#include "stdio.h"
main()
{int i,j,k;
if (i=fork())
{j=wait();
printf("Parent Process!\n");
printf("i=%d,j=%d,k=%d\n",i,j);
}
else
{k=getpid();
printf("Child Process!\n");
printf("i=%d,k=%d\n\n",i,k);
}
}
使用fork()的进程是父进程,通过fork()建立的新进程是子进程。
fork()创建成功,返回值对子进程是0,对父进程是子进程的pid(一个正整数)。
在调用fork()后,父进程和子进程均从下一条语句开始执行。
wait()的功能是阻塞父进程,等待子进程完成后使得父进程继续工作。
wait()的返回值是所等待的子进程的进程标识符。
getpid()返回调用进程的进程标识符,则输出子进程的k与父进程的i,j相等。
输出结果可能是:
Child Process!
i=0,k=9351
Parent Process!
i=9351,j=9351
程序2
#include <stdio.h>
main()
{
int p1,p2;
long i;
char c1;
while ((p1=fork())==-1);
if (p1==0)
{c1='B';write(1,&c1,1);for( i=0;i<3000000;i++) ; c1='b';write(1,&c1,1);
}
else
{while ((p2=fork())==-1);if (p2==0){c1='C';write(1,&c1,1);for( i=0;i<3000000;i++) ;c1='c';write(1,&c1,1);}else{c1='A';write(1,&c1,1);for( i=0; i<3000000; i++) ;c1='a';write(1,&c1,1);}}
}
用fork()创建两个子进程,程序运行时,系统中有1个父进程和2个子进程活动。
每个进程在屏幕上显示两个字符,父进程显示“A”和“a”。
write(1,&c1,1)的函数原型write(fd,buf,count):从buf所指向的内存中输出count个字符的信息到fd所代表的文件中,fd为文件号,buf为一个地址,此处fd=1,代表的就是显示屏,从地址&c1处输出一个字符到屏幕上,就是显示出c1,在每一个进程代码中间都有循环语句起延时作用,能够看出进程调度的效果。
为何不使用printf,printf经过缓冲,使用后,“A”和“a”会一次显示出来,不会交错显示。
可能的输出结果:AbbCca,AaBbCc,ABCcba等等。
程序3
main()
{int m,n,k;
m=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",m);
printf("hee\n");
n=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",n);
printf("ha\n");
k=fork();
printf("PID:%d\t",getpid());
printf("The return value of fork():%d\t\t",k);
printf("ho\n");
}
程序3的简化
main(){
fork();printf(“hee\n”);
fork();printf(“ha\n”);
fork();printf(“ho\n”);
}
为了便于观察,先打印出调用进程的进程标识符,而后是fork()的返回值。
若是
main(){
fork();printf(“hee\n”);
}
打印出
hee (父进程)hee (子进程)
请大家上机抄下结果,画出进程树,在每一个进程结点边上画出标识符。
程序4
#include <stdio.h>
main()
{
int i;
if (fork()==0){for(i=0;i<10000;i++) printf(".......................\n");
}
else
{if (fork()==0){for( i=0; i<10000; i++)printf("#################\n");}else for (i=0;i<10000;i++)printf("******************\n");
}
}
程序4中也是3个进程。
程序5
#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{int p1,p2;while((p1=fork())==-1);if(p1==0)printf("b.My process ID is %d\n",getpid());else{while((p2=fork())==-1);if(p2==0)printf("c.My process ID is %d\n",getpid());else printf("a.My process ID is %d\n",getpid());}return 0;
}
程序6
#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{ int m,n,k;m=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",m);printf("he\n");n=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",n);printf("ha\n");k=fork();printf("PID:%d\t",getpid());printf("The return value of fork():%d\t\t",k);printf("ho\n");return 0;
}
程序7
#include<stdio.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{int p1,p2,i;while((p1=fork())==-1);if(p1==0)for(i=0;i<50000; i++)printf("son%d\n",i);else{while((p2=fork())==-1);if(p2==0)for(i=0;i<50000;i++)printf("daughter%d\n",i);elsefor(i=0;i<50000;i++)printf("parent%d\n",i);}return 0;
}
参考文章
《操作系统》实验报告——进程管理相关推荐
- 操作系统实验二 进程管理
进程管理 一.实验目的 1. 理解进程的概念,明确进程和程序的区别. 2. 理解并发执行的实质. 3. 掌握进程的创建.睡眠.撤销等进程控制方法. 二.实验内容与基本要求 用C语言编写程序,模拟实现创 ...
- 操作系统——实验二 进程管理
1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...
- 计算机操作系统实验二 进程管理
一.实验目的 1.掌握进程的概念,明确进程的含义 2.认识并了解并发执行的实质 二.实验内容 1.编写一段程序,使用系统调用fork( )创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进 ...
- 操作系统 实验一 进程管理与进程同步
理解安全性算法和银行家算法的核心机制: 针对3类资源.5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况: 编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申 ...
- Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc
操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...
- 操作系统实验报告5:进程的创建和终止
操作系统实验报告5 实验内容 实验内容:进程的创建和终止. 编译运行课件 Lecture 06 例程代码:Algorithm 6-1 ~ 6-6. 实验环境 架构:Intel x86_64 (虚拟机) ...
- 操作系统实验一 Linux基本操作|实验二 进程管理
由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...
- 实验报告Linux操作系统基本命令,linux操作系统实验报告全部.doc
linux操作系统实验报告全部 计算机操作系统 实验报告 学 号:姓 名:提交日期:2014.12.15成 绩: 东北大学秦皇岛分校 [实验题目]熟悉Linux/UNIX操作系统[实验目的]1.熟悉L ...
- 操作系统实验报告18:硬盘柱面访问调度算法
操作系统实验报告18 实验内容 实验内容:硬盘调度. 编写 C 程序模拟实现课件 Lecture25 中的硬盘柱面访问调度算法 包括 FCFS.SSTF.SCAN.C-SCAN.LOOK.C-LOOK ...
最新文章
- 磁盘分析工具Ncdu的简单使用和体验
- 将台式机组成云服务器_云桌面是什么?用了两年云桌面的真实感受
- 有幸见到一朵花的绽放
- 【大话数据结构算法】快速排序算法
- ASP.NET Core 企业级开发架构简介及框架汇总
- P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】
- UITextView: 响应键盘的 return 事件(收回键盘)
- fedora 安装google浏览器失败,报错
- Css、javascript、dom(一)
- Java编写HTTP请求发送XML报文数据
- python练习-word操作(word字体替换)
- 指派问题的遗传算法求解 Java实现
- 腾讯云账户注销操作教程
- Ps 2022 版新增功能及改进
- ES6新特性-前端面试问题
- 教你用python画一个可爱皮卡丘!
- latex添加bibtex参考文献方法及pdf没有参考文献问题
- 汇编指令mrs_ARM汇编指令MRS和MSR(转)
- 【求职】格灵深瞳 Java 方向面经
- php7不支持random函数生成随机字符串
热门文章
- python pip安装指定版本unittest_你们想要的unittest用例失败重运行,解决方案来啦!...
- java 转账 锁_Java多线程 多个人转账发生死锁
- sap 無法建立 activex 元件_安徽陶瓷膜芯元件
- java 上下文加载器_如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?...
- c语言编写服务器的优点,用C语言编写的服务器中记录效率最高的文件是什么?...
- c语言计算时间的编程,C语言实现时间戳转日期的算法(推荐)
- fastdfs连接mysql_fastDFS文件上传简单案例
- f12 卡 谷歌浏览器_干货分享。关于谷歌浏览器的使用技巧,不需要插件
- java考察代码_一段简单的关于字符串的 Java 代码竟考察了这么多东西
- 用计算机做科学计算是绝对精确的吗,科学计算与数学建模 - osc_3gfjojb2的个人空间 - OSCHINA - 中文开源技术交流社区...