实验 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的执行效率




相关文章
|
7月前
|
存储 Unix Shell
确定Shell脚本在操作系统中的具体位置方法。
这对于掌握Linux的文件系统组织结构和路径方面的理解很有帮助,是我们日常工作和学习中都可能使用到的知识。以上讲解详细清晰,应用简便,是每一个想要精通操作系统的计算机爱好者必备的实用技能。
210 17
|
7月前
|
Web App开发 Linux 程序员
获取和理解Linux进程以及其PID的基础知识。
总的来说,理解Linux进程及其PID需要我们明白,进程就如同汽车,负责执行任务,而PID则是独特的车牌号,为我们提供了管理的便利。知道这个,我们就可以更好地理解和操作Linux系统,甚至通过对进程的有效管理,让系统运行得更加顺畅。
228 16
|
6月前
|
监控 Shell Linux
Linux进程控制(详细讲解)
进程等待是系统通过调用特定的接口(如waitwaitpid)来实现的。来进行对子进程状态检测与回收的功能。
135 0
|
6月前
|
存储 负载均衡 算法
Linux2.6内核进程调度队列
本篇文章是Linux进程系列中的最后一篇文章,本来是想放在上一篇文章的结尾的,但是想了想还是单独写一篇文章吧,虽然说这部分内容是比较难的,所有一般来说是简单的提及带过的,但是为了让大家对进程有更深的理解与认识,还是看了一些别人的文章,然后学习了学习,然后对此做了总结,尽可能详细的介绍明白。最后推荐一篇文章Linux的进程优先级 NI 和 PR - 简书。
209 0
|
6月前
|
存储 Linux Shell
Linux进程概念-详细版(二)
在Linux进程概念-详细版(一)中我们解释了什么是进程,以及进程的各种状态,已经对进程有了一定的认识,那么这篇文章将会继续补全上篇文章剩余没有说到的,进程优先级,环境变量,程序地址空间,进程地址空间,以及调度队列。
135 0
|
6月前
|
Linux 调度 C语言
Linux进程概念-详细版(一)
子进程与父进程代码共享,其子进程直接用父进程的代码,其自己本身无代码,所以子进程无法改动代码,平时所说的修改是修改的数据。为什么要创建子进程:为了让其父子进程执行不同的代码块。子进程的数据相对于父进程是会进行写时拷贝(COW)。
186 0
|
4月前
|
Ubuntu Unix Linux
操作系统的最强入门科普(Unix/Linux篇)
下期文章,小枣君会重点聊聊Windows和macOS那条线。敬请关注! 如果大家觉得文章不错,还请帮忙多多转发!谢谢!
|
4月前
|
Web App开发 缓存 Rust
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
676 0
Vanilla OS:下一代安全 Linux 发行版
|
10月前
|
运维 自然语言处理 Ubuntu
OS Copilot-操作系统智能助手-Linux新手小白的福音
OS Copilot 是阿里云推出的一款操作系统智能助手,专为Linux新手设计,支持自然语言问答、辅助命令执行和系统运维调优等功能。通过简单的命令行操作,用户可以快速获取所需信息并执行任务,极大提升了Linux系统的使用效率。安装步骤简单,只需在阿里云服务器上运行几条命令即可完成部署。使用过程中,OS Copilot不仅能帮助查找命令,还能处理文件和复杂场景,显著节省了查找资料的时间。体验中发现,部分输出格式和偶尔出现的英文提示有待优化,但整体非常实用,特别适合Linux初学者。
494 10

热门文章

最新文章