实验 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天前
|
存储 调度 C++
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
【操作系统】进程与线程的区别及总结(非常非常重要,面试必考题,其它文章可以不看,但这篇文章最后的总结你必须要看,满满的全是干货......)
35 1
|
13天前
|
存储 缓存 安全
Linux基础——冯诺依曼体系结构与操作系统
Linux基础——冯诺依曼体系结构与操作系统
40 1
Linux基础——冯诺依曼体系结构与操作系统
|
1天前
|
机器学习/深度学习 算法 调度
操作系统中的进程调度策略
【6月更文挑战第26天】本文将深入探讨操作系统中的核心组件之一——进程调度。我们将从进程调度的基本概念入手,分析其重要性以及如何影响系统性能。文章将介绍几种常见的进程调度算法,并通过实例展示它们在实际操作系统中的应用。我们还将讨论现代操作系统中进程调度面临的挑战和未来可能的发展方向。
|
10天前
|
Linux 网络安全 虚拟化
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
Linux操作系统第一章(Linux操作系统的带入,vmware-17虚拟化软件运用,FinalShell远程连接Linux )
|
14天前
|
消息中间件 分布式计算 物联网
深入理解操作系统之进程与线程管理
操作系统的核心职责之一是进程与线程管理,它关乎系统的效率和稳定性。本文将剖析进程与线程的基本概念、生命周期以及它们在现代操作系统中的实现机制。通过对比分析,我们将揭示进程与线程的区别、优势及其适用场景,并探讨它们对系统性能的具体影响。进一步,文章将讨论进程间通信(IPC)的几种方式,以及同步和异步处理在多任务环境中的重要性。最后,我们将展望未来操作系统在进程与线程管理方面可能的发展趋势。
|
14天前
|
网络协议 Linux 数据安全/隐私保护
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位
【Linux操作系统】权限管理和粘滞位
|
1天前
|
Unix Shell Perl
技术心得:实例解析shell子进程(subshell)
技术心得:实例解析shell子进程(subshell)
|
1天前
|
关系型数据库 MySQL Linux
Linux操作系统:开源世界的强大引擎
Linux操作系统:开源世界的强大引擎
|
2天前
|
Shell Linux
【linux】进程替换的应用|shell解释器的实现
【linux】进程替换的应用|shell解释器的实现
7 0
|
7天前
|
网络协议 Linux 编译器
【原创】EtherCAT主站IgH解析(二)-- 如何将Igh移植到Linux/Windows/RTOS等多操作系统移植指南
EtherCAT主站方案对比:商业的如Acontis、TwinCAT3和开源的igh、SOEM。SOEM易移植但功能和实时性不足,适合简单应用;igh功能强大,实时性能优秀,基于内核态,适合复杂场景。igh能移植到其他RTOS,但需克服多任务无调度的挑战。依赖操作系统服务如定时器、内存分配,适合Linux内核,但移植到裸机复杂。