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




相关实践学习
CentOS 7迁移Anolis OS 7
龙蜥操作系统Anolis OS的体验。Anolis OS 7生态上和依赖管理上保持跟CentOS 7.x兼容,一键式迁移脚本centos2anolis.py。本文为您介绍如何通过AOMS迁移工具实现CentOS 7.x到Anolis OS 7的迁移。
相关文章
|
1月前
|
安全 Linux 数据安全/隐私保护
Vanilla OS:下一代安全 Linux 发行版
【10月更文挑战第30天】
54 0
Vanilla OS:下一代安全 Linux 发行版
|
3月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
22天前
|
存储 Shell Linux
Linux 如何更改默认 Shell
Linux 如何更改默认 Shell
30 0
Linux 如何更改默认 Shell
|
27天前
|
NoSQL Linux PHP
如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤
本文介绍了如何在不同操作系统上安装 Redis 服务器,包括 Linux 和 Windows 的具体步骤。接着,对比了两种常用的 PHP Redis 客户端扩展:PhpRedis 和 Predis,详细说明了它们的安装方法及优缺点。最后,提供了使用 PhpRedis 和 Predis 在 PHP 中连接 Redis 服务器及进行字符串、列表、集合和哈希等数据类型的基本操作示例。
52 4
|
1月前
|
缓存 Linux 开发者
Linux内核中的并发控制机制:深入理解与应用####
【10月更文挑战第21天】 本文旨在为读者提供一个全面的指南,探讨Linux操作系统中用于实现多线程和进程间同步的关键技术——并发控制机制。通过剖析互斥锁、自旋锁、读写锁等核心概念及其在实际场景中的应用,本文将帮助开发者更好地理解和运用这些工具来构建高效且稳定的应用程序。 ####
40 5
|
1月前
|
Linux 数据库
Linux内核中的锁机制:保障并发操作的数据一致性####
【10月更文挑战第29天】 在多线程编程中,确保数据一致性和防止竞争条件是至关重要的。本文将深入探讨Linux操作系统中实现的几种关键锁机制,包括自旋锁、互斥锁和读写锁等。通过分析这些锁的设计原理和使用场景,帮助读者理解如何在实际应用中选择合适的锁机制以优化系统性能和稳定性。 ####
54 6
|
2月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
77 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
1月前
|
人工智能 安全 Linux
|
1月前
|
算法 调度
探索操作系统的心脏:内核与进程管理
【10月更文挑战第25天】在数字世界的复杂迷宫中,操作系统扮演着关键角色,如同人体中的心脏,维持着整个系统的生命力。本文将深入浅出地剖析操作系统的核心组件——内核,以及它如何通过进程管理来协调资源的分配和使用。我们将从内核的概念出发,探讨它在操作系统中的地位和作用,进而深入了解进程管理的机制,包括进程调度、状态转换和同步。此外,文章还将展示一些简单的代码示例,帮助读者更好地理解这些抽象概念。让我们一起跟随这篇文章,揭开操作系统神秘的面纱,理解它如何支撑起我们日常的数字生活。
|
1月前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。