理论知识

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. 操作系统实验二 进程管理

    进程管理 一.实验目的 1. 理解进程的概念,明确进程和程序的区别. 2. 理解并发执行的实质. 3. 掌握进程的创建.睡眠.撤销等进程控制方法. 二.实验内容与基本要求 用C语言编写程序,模拟实现创 ...

  2. 操作系统——实验二 进程管理

    1.实验目的 (1)加深对进程概念的理解,明确进程和程序的区别. (2)进一步认识并发执行的实质. (3)分析进程竞争资源现象,学习解决进程互斥的方法. 2.实验预备内容 (1)阅读Linux的sch ...

  3. 计算机操作系统实验二 进程管理

    一.实验目的 1.掌握进程的概念,明确进程的含义 2.认识并了解并发执行的实质 二.实验内容 1.编写一段程序,使用系统调用fork( )创建两个子进程.当此程序运行时,在系统中有一个父进程和两个子进 ...

  4. 操作系统 实验一 进程管理与进程同步

    理解安全性算法和银行家算法的核心机制: 针对3类资源.5个进程的情况,设计相应的数据结构,分别表示每个进程占用各类资源的情况: 编程实现安全性算法函数,编制主函数,动态输入资源的占用情况,进程的资源申 ...

  5. Linux进程的创建和父子进程同步,操作系统实验报告_Linux进程创建与通信.doc

    操作系统实验报告_Linux进程创建与通信 2011-2012学年第一学期 专 业: 班 级: 学 号: 姓 名:提交日期:2011年11月实验二 Linux进程创建与进程通信 [实验目的 1. 熟悉 ...

  6. 操作系统实验报告5:进程的创建和终止

    操作系统实验报告5 实验内容 实验内容:进程的创建和终止. 编译运行课件 Lecture 06 例程代码:Algorithm 6-1 ~ 6-6. 实验环境 架构:Intel x86_64 (虚拟机) ...

  7. 操作系统实验一 Linux基本操作|实验二 进程管理

    由于当时没存代码,只有实验文档代码截图,文末也可直接获取实验文档. 操作系统实验 目录 实验一 Linux基本操作 实验二进程管理 实验一 Linux基本操作 1实验目的 1.熟悉在Linux操作系统 ...

  8. 实验报告Linux操作系统基本命令,linux操作系统实验报告全部.doc

    linux操作系统实验报告全部 计算机操作系统 实验报告 学 号:姓 名:提交日期:2014.12.15成 绩: 东北大学秦皇岛分校 [实验题目]熟悉Linux/UNIX操作系统[实验目的]1.熟悉L ...

  9. 操作系统实验报告18:硬盘柱面访问调度算法

    操作系统实验报告18 实验内容 实验内容:硬盘调度. 编写 C 程序模拟实现课件 Lecture25 中的硬盘柱面访问调度算法 包括 FCFS.SSTF.SCAN.C-SCAN.LOOK.C-LOOK ...

最新文章

  1. 磁盘分析工具Ncdu的简单使用和体验
  2. 将台式机组成云服务器_云桌面是什么?用了两年云桌面的真实感受
  3. 有幸见到一朵花的绽放
  4. 【大话数据结构算法】快速排序算法
  5. ASP.NET Core 企业级开发架构简介及框架汇总
  6. P4169-[Violet]天使玩偶/SJY摆棋子【CDQ分治】
  7. UITextView: 响应键盘的 return 事件(收回键盘)
  8. fedora 安装google浏览器失败,报错
  9. Css、javascript、dom(一)
  10. Java编写HTTP请求发送XML报文数据
  11. python练习-word操作(word字体替换)
  12. 指派问题的遗传算法求解 Java实现
  13. 腾讯云账户注销操作教程
  14. Ps 2022 版新增功能及改进
  15. ES6新特性-前端面试问题
  16. 教你用python画一个可爱皮卡丘!
  17. latex添加bibtex参考文献方法及pdf没有参考文献问题
  18. 汇编指令mrs_ARM汇编指令MRS和MSR(转)
  19. 【求职】格灵深瞳 Java 方向面经
  20. php7不支持random函数生成随机字符串

热门文章

  1. python pip安装指定版本unittest_你们想要的unittest用例失败重运行,解决方案来啦!...
  2. java 转账 锁_Java多线程 多个人转账发生死锁
  3. sap 無法建立 activex 元件_安徽陶瓷膜芯元件
  4. java 上下文加载器_如何将JDK6 ToolProvider和JavaCompiler与上下文类加载器一起使用?...
  5. c语言编写服务器的优点,用C语言编写的服务器中记录效率最高的文件是什么?...
  6. c语言计算时间的编程,C语言实现时间戳转日期的算法(推荐)
  7. fastdfs连接mysql_fastDFS文件上传简单案例
  8. f12 卡 谷歌浏览器_干货分享。关于谷歌浏览器的使用技巧,不需要插件
  9. java考察代码_一段简单的关于字符串的 Java 代码竟考察了这么多东西
  10. 用计算机做科学计算是绝对精确的吗,科学计算与数学建模 - osc_3gfjojb2的个人空间 - OSCHINA - 中文开源技术交流社区...