实验 Linux Shell实现模拟多进程并发执行【操作系统】

简介: 实验 Linux Shell实现模拟多进程并发执行【操作系统】

参考文章

VIM

进程及 fork() 系统调用详解

添加一个系统调用

【实验楼】Linux Shell实现模拟多进程并发执行

简单样例

vim的用法

hello.c

#include<stdio.h>
int main(){
  printf("hello");
}


输入vim hello.c进入vim编辑器

键盘敲a,就可以编辑

保存并退出 ESC 输入:wq,即返回终端



添加一个系统调用【实验】

fork.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void) {
  pid_t pid;
  printf("Before fork..\n");
  switch (pid = fork()) {
  case -1:
    printf("fork call fail\n");
    fflush(stdout);
    exit(1);
  case 0:
    printf("I am child.\n");
    printf("The pid of child is :%d\n", getpid());
    printf("The pidof child`s parent is :%d\n", getppid());
    printf("Child exiting...\n");
    exit(0);
  default:
    printf("I am father.\n");
    printf("The pid of parent is %d\n", getpid());
    printf("The pid of parent`s child is %d\n", pid);
  }
  printf("After fork,program exiting..\n");
  exit(0);
}




Linux Shell实现模拟多进程并发执行【实验】

test1 串行

**这种情况下,程序顺序执行,每个循环3秒,共需15秒 **

test1.sh

#!/bin/bash
for ((i=0;i<5;i++));do
{
  sleep 1;echo 1>>aa && echo "done!"
}
done
cat aa| wc -l
rm aa




test2 并行

这个实例实际上就在上面基础上多加了一个后台执行&符号,此时应该是5个循环任务并发执行,最后需要3s左右时间。

test2.sh

#!/bin/bash
for ((i=0;i<5;i++));do
{
  sleep 1;echo 1>>aa && echo "done!"
}&
done
wait
cat aa| wc -l
rm aa




练习

CPU管理的直观想法

视频链接

CPU管理的直观想法

查找资料

关于int main(int argc,char* argv[])

C语言通过dos编译和运行程序

C语言获取程序运行时间

计时函数clock()与数据类型clock_t

说明

完成任务之前你要知道以下知识

  1. 关于int main(int argc,char* argv[])的知识
  2. 如何在dos命令下运行C语言
  3. 如何获取程序运行时间

关于1 请看《关于int main(int argc,char* argv[])》
关于2 请看 《C语言通过dos编译和运行程序》

关于3 请看《C语言获取程序运行时间》 和以下time.c

获取运行时间的简单样例

time.c

#include<time.h>
#include<stdio.h> 
int main(){
  clock_t start, finish;     //定义第一次调用CPU时钟单位的实际,可以理解为定义一个计数器,单位毫秒 
  double Total_time;        //定义一个double类型的变量,用于存储时间单位
  start = clock();        //获取进入要测试执行时间代码段之前的CPU时间占用值
  //所测代码开始
  int i = 100000000L;while (i--);    //循环 0假
  //所测代码结束
  finish = clock();    //获取执行完后的CPU时间占用值
  Total_time = (double)(finish - start) / CLOCKS_PER_SEC;    //单位换算,换算成秒
  printf("\n函数运行时间:%0.6f秒 \n", Total_time); //打印小数点的后三位,毫秒为单位,计算机最低以皮秒-纳秒等为最低单位
  return 0;
} 

运行结果:


--------------------------------------------------------------进入正题-----------------------------------------------------------


注意要有新建file.txt以便进行IO操作来存储结果


sum.c

#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(int argc ,char * argv[]){
  clock_t start, finish;     //定义第一次调用CPU时钟单位的实际,可以理解为定义一个计数器,单位是毫秒 
  double Total_time;        //定义一个double类型的变量,用于存储时间单位
  start = clock();        //获取进入要测试执行时间代码段之前的CPU时间占用值
  int i,to,sum=0;
  FILE *fp;
  fp = fopen ("file.txt", "w");
  to=atoi(argv[1]);
  for (i=1;i<=to;i++){
    sum=sum+i;
//    int a=1+0;  //计算语句 
    fprintf(fp,"%d",sum);
  }
  finish = clock();    //获取执行完后的CPU时间占用值
//  Total_time = (double)(finish - start) / CLOCKS_PER_SEC;    //单位换算,换算成秒
  Total_time = (double)(finish - start); 
  printf("\n函数运行时间:%0.6f毫秒 \n", Total_time); //打印小数点的后三位,秒为单位
  return 0;
} 

cmd中运行

1.把fprintf语句换成计算语句


2.把计算语句换成fprintf语句

注意改代码之后,先运行一下,为了把可执行.exe文件也改变

或者执行命令gcc sum.c -o sum


file.txt存储从1叫到1000的结构



最后分析

结论:IO操作会影响CPU的执行效率




相关文章
|
存储 Linux API
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
在计算机系统的底层架构中,操作系统肩负着资源管理与任务调度的重任。当我们启动各类应用程序时,其背后复杂的运作机制便悄然展开。程序,作为静态的指令集合,如何在系统中实现动态执行?本文带你一探究竟!
【Linux进程概念】—— 操作系统中的“生命体”,计算机里的“多线程”
|
并行计算 Linux
Linux内核中的线程和进程实现详解
了解进程和线程如何工作,可以帮助我们更好地编写程序,充分利用多核CPU,实现并行计算,提高系统的响应速度和计算效能。记住,适当平衡进程和线程的使用,既要拥有独立空间的'兄弟',也需要在'家庭'中分享和并行的成员。对于这个世界,现在,你应该有一个全新的认识。
496 67
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
765 17
|
Web App开发 缓存 Rust
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
456 16
|
Unix Linux
对于Linux的进程概念以及进程状态的理解和解析
现在,我们已经了解了Linux进程的基础知识和进程状态的理解了。这就像我们理解了城市中行人的行走和行为模式!希望这个形象的例子能帮助我们更好地理解这个重要的概念,并在实际应用中发挥作用。
298 20
|
Linux Shell
shell_42:Linux参数移动
总的来说,参数移动是Linux shell脚本中的一个重要概念,掌握它可以帮助我们更好地处理和管理脚本中的参数。希望这个解释能帮助你理解和使用参数移动。
362 18
|
存储 网络协议 Linux
【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件
本文详细介绍了Linux中的进程IO与系统调用,包括 `open`、`write`、`read`和 `close`函数及其用法,解释了文件描述符(fd)的概念,并深入探讨了Linux中的“一切皆文件”思想。这种设计极大地简化了系统编程,使得处理不同类型的IO设备变得更加一致和简单。通过本文的学习,您应该能够更好地理解和应用Linux中的进程IO操作,提高系统编程的效率和能力。
773 34
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
334 0

热门文章

最新文章