【操作系统】多进程拷贝|进程重载

🔥 博客主页: 我要成为C++领域大神
🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】
❤️感谢大家点赞👍收藏⭐评论✍️

本博客致力于分享知识,欢迎大家共同学习和交流。

为什么要进行多进程拷贝?

这涉及到了分时复用原理

分时复用原理

分时复用:在多进程环境下,进程在时间片内与CPU进行交互,时间片用完时进程会被中断,等待下一次CPU使用权限。

时间片:每个进程在运行时会被分配一个时间片,时间片用完后CPU会切换到另一个进程。

多进程拷贝优势:通过多进程处理,可以更高效地利用系统资源(CPU、内存),减少大文件拷贝任务的完成时间。

执行方式对比

串行执行:任务严格按顺序执行,从头到尾依次处理。

优点:简单、易实现。

缺点:不能充分利用系统资源,效率低。

并发执行:多个任务在同一时间段内执行,但不一定同时进行,利用CPU切换完成多个任务。

优点:比串行执行更高效,能更好地利用CPU。

缺点:需要处理进程间的通信和同步问题。

并行执行:物理上同时进行,多个核心或处理器同时执行多个任务。

优点:最高效的执行方式,可以显著缩短任务完成时间。

缺点:需要多核或多处理器支持,复杂度更高。

不要频繁的进程切换,频繁切换会浪费开销,影响系统性能。

多进程可以加快任务完成速度,但需要合理的任务分配和资源管理。

多进程拷贝的优点

1. 提高文件拷贝效率

并行处理:多进程拷贝通过并行处理文件的不同部分,可以显著提高拷贝速度,尤其是对于大文件而言。

减少I/O等待时间:多个进程可以同时进行读取和写入操作,减少了单个进程的I/O等待时间,提高整体效率。

2. 充分利用系统资源

多核CPU的利用:现代计算机通常配备多核CPU,多进程拷贝可以同时利用多个CPU核心,避免资源闲置。

内存利用:多进程可以更好地利用系统内存和缓存,提高数据处理效率。

3. 提高系统响应性

负载分散:通过将文件拷贝任务分散到多个进程,可以减小单个进程的负载,使系统在执行大文件拷贝时仍能保持较好的响应性。

任务中断与恢复:多进程模式下,如果某个进程失败,只需重新启动该进程或重新分配任务,而不必重新开始整个文件拷贝,提高了拷贝任务的健壮性。

应用场景

在需要拷贝超大文件时,单进程的处理速度较慢,而多进程可以显著加快拷贝速度。

在需要同时执行多个文件拷贝任务的场景,多进程可以同时处理多个任务,提高整体处理效率。

多进程拷贝的流程

Process_Copy.c

命令行参数Process_Copy 的输入包括源文件路径、目标文件路径、进程数量(可选,默认为5)。

参数校验:程序首先会检查参数数量和文件路径的有效性。

任务量计算:通过计算源文件大小和进程数量来确定每个进程处理的字节数,处理任务被分成多块。

多进程创建:根据用户指定的进程数量,创建多个子进程(cp_process)。

文件分块:源文件、目标文件、任务量和进程数被传递给每个子进程,子进程负责处理指定块的文件拷贝。

进程重载:对每个子进程使用execl函数进行重载,让其实现copy.c的功能。

关于execl函数的使用,可以看我这期博客【Linux】execl函数详解|进程重载 

Copy.c

任务接收与处理:接收任务并进行位置转换,以便正确处理文件偏移量。

文件操作

打开文件:以读方式打开源文件,以写方式打开目标文件。

文件指针调整:将源文件和目标文件的指针移动到指定位置,确保正确的读取和写入。

读写操作:读取源文件的数据并写入到目标文件中。

关闭文件:完成操作后,关闭文件描述符并退出进程。

流程

执行 Process_Copy ,传入源文件路径、目标文件路径,多线程数量。

Process_Copy 计算每个进程的任务量,创建并分配子进程。

每个子进程通过 Copy 执行文件拷贝任务,处理源文件和目标文件的读写操作。

  1. 参数校验 -> 任务量计算 -> 进程创建 -> 子进程执行文件拷贝。
  2. 子进程根据任务量和位置执行读写操作,直到完成整个文件的拷贝。

代码实现

Process_Copy.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
#include <sys/fcntl.h>
#include <sys/wait.h> /* 多进程拷贝样例 */
int Block_Cur(const char* File_Name,int Pro_Number)
{/* 计算每个进程应该拷贝的大小 */int fd;if((fd=open(File_Name,O_RDONLY))==-1){perror("Block_Cur>>file open fail");exit(0);}int fsize;if((fsize=lseek(fd,0,SEEK_END))==-1){perror("Block_Cur>>get filesize fail");exit(0);}if(fsize%Pro_Number==0)return fsize/Pro_Number;else return fsize/Pro_Number+1;}/* Process_Copy SRC DES 30,进程数量可缺省 */
int Check_Pram(int Arg_No,const char* Src_File,int Pro_Number)
{if(Arg_No<3){printf("Error:Pram Error\n");exit(0);}if(access(Src_File,F_OK)!=0){printf("Error:Src_File Not Exist\n");exit(0);}if(Pro_Number<=0 || Pro_Number>80){printf("Error:Pro_Number is Limited\n");exit(0);}return 0;
}int Process_Create(const char* Src_File,const char *Des_File,int Pro_Number,int Blocksize)
{pid_t pid;int i;/* 循环创建空格 */for(i=0;i<Pro_Number;++i){pid=fork();if(pid==0) break;}if(pid>0){/* 父进程工作区 */printf("Parent Process PID:%d wait...\n",getpid());/* 回收僵尸进程 */pid_t zpid;while((zpid=wait(NULL))>0){printf("wait sucess,ZPID:%d\n",zpid);}}else if(pid==0){/* 子进程工作区 */int pos=0;pos=i*Blocksize;char str_Blocksize[10];char str_pos[10];bzero(str_Blocksize,10);bzero(str_pos,10);sprintf(str_Blocksize,"%d",Blocksize);sprintf(str_pos,"%d",pos);execl("/home/cppstudy/code/PROCESS/Process_Copy/copy","copy",Src_File,Des_File,str_Blocksize,str_pos,NULL);}else{perror("fork call failed");exit(0);}
}
int main(int argc,char** argv)
{      int Pro_Number=0;if(argv[3]==0) Pro_Number=5;else Pro_Number=atoi(argv[3]);/* 参数校验 */Check_Pram(argc,argv[1],Pro_Number);/* 任务量分割 */int Block_Size=Block_Cur(argv[1],Pro_Number);/* 进程创建 */Process_Create(argv[1],argv[2],Pro_Number,Block_Size);return 0;
}

Copy.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <string.h>
#include <sys/fcntl.h>int main(int argc,char**argv)
{int blocksize;int pos;ssize_t len;int sfd;int dfd;blocksize=atoi(argv[3]);pos=atoi(argv[4]);char buffer[blocksize];bzero(buffer,sizeof(buffer));printf("Child Process PID:%d copy sucess,File_Name:%s,Blocksize:%d,pos:%d\n",getpid(),argv[1],blocksize,pos);if((sfd=open(argv[1],O_RDONLY))==-1){printf("%s open fail\n",argv[1]);exit(0);}if((dfd=open(argv[2],O_RDWR|O_CREAT,0664))==-1){printf("%s create fail\n",argv[2]);exit(0);}/* 读写指针偏移位置 */lseek(sfd,pos,SEEK_SET);lseek(dfd,pos,SEEK_SET);len=read(sfd,buffer,sizeof(buffer));write(dfd,buffer,len);close(sfd);close(dfd);return 0;
}

运行结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/359308.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FEP分液漏斗Teflon耐酸碱四氟耐腐蚀耐高温250ml

FEP分液漏斗&#xff1a;也叫特氟龙分液漏斗、特氟龙梨型分液漏斗等。广泛应用于痕量分析、超痕量分析、ICP-MS分析、同位素分析等实验。 规格参考&#xff1a;125ml、250ml、500ml、1000ml 其主要特性有&#xff1a; 1.内壁对溶剂无粘贴性和吸附&#xff0c;可完全排空&…

Springboot 权限认证框架 -- SA-Token 简介(一)

引言 现今的软件开发中&#xff0c;权限认证与访问控制是每一个应用都必不可少的功能。SA-Token是一个简单、安全、易用的权限认证框架&#xff0c;它主要解决登录认证、权限认证、Session会话、单点登录等功能。SA-Token以其轻量级、零学习成本的特点&#xff0c;迅速赢得了开…

无重复字符串的排列组合

题目链接 无重复字符串的排列组合 题目描述 注意点 字符都是英文字母字符串长度在[1, 9]之间字符串每个字符均不相同 解答思路 字符串中有n个字符&#xff0c;则其排列组合的数量为n * (n - 1) * (n - 2) * … * 1可以深度优先遍历找到字符串的所有排列组合&#xff0c;且…

用Java获取键盘输入数的个十百位数

这段Java代码是一个简单的程序&#xff0c;用于接收用户输入的一个三位数&#xff0c;并将其分解为个位、十位和百位数字&#xff0c;然后分别打印出来。下面是代码的详细解释&#xff1a; 导入所需类库: import java.util.Scanner;&#xff1a;导入Scanner类&#xff0c;用于从…

【源码+文档+调试讲解】牙科就诊管理系统

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本牙科就诊管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息…

网络编程(七)网络超时检测

文章目录 一、概念二、实现方式&#xff08;一&#xff09; 使用select实现超时检测1. select函数补充说明&#xff1a;2. 使用示例3. 输出结果 &#xff08;二&#xff09; 使用setsockopt函数1. 函数定义2. 获取发送缓冲区和接收缓冲区的大小3. 端口复用4. 设置超时时间 &…

【C++】文件处理(IO流)

文章目录 C IO流1. C语言IO2. CIO2.1 C标准IO流2.2 C文件IO流2.3 C IO 文件常用函数总结表2.4 C stringstream C IO流 回顾一下&#xff0c;C语言中IO输入输出的 1. C语言IO C语言中常用的输入输出函数有如下几种&#xff1a;前者是格式化标准输入输出&#xff0c;后者是格式化…

探秘分布式一致性(共识)算法 :Raft

1.前言 Raft 算法是 Multi-Paxos 算法的一种&#xff0c;是一种强一致性算法。核心就是通过日志复制的方式达到整个集群的副本一致。 Raft 算法的三个核心概念就是 Leader 的选举、日志复制、节点变更。本文也将从这三个方面进行探讨。之后再聊聊 Raft 算法的几个应用场景。 2.…

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-27含并行连结的网络GoogLeNet

27含并行连结的网络GoogLeNet import torch from torch import nn from torch.nn import functional as F import liliPytorch as lp import matplotlib.pyplot as pltclass Inception(nn.Module):# c1--c4是每条路径的输出通道数def __init__(self, in_channels, c1, c2, c3, …

免费内网穿透工具 ,快解析内网穿透解决方案

在IPv4公网IP严重不足的环境下&#xff0c;内网穿透技术越来越多的被人们所使用&#xff0c;使用内网穿透技术的好处有很多。 1&#xff1a;无需公网ip 物以稀为贵&#xff0c;由于可用的公网IP地址越来越少&#xff0c;价格也是水涨船高&#xff0c;一个固定公网IP一年的成本…

C++ 矩阵的最小路径和解法

描述 给定一个 n * m 的矩阵 a,从左上角开始每次只能向右或者向下走,最后到达右下角的位置,路径上所有的数字累加起来就是路径和,输出所有的路径中最小的路径和。 数据范围: 1≤𝑛,𝑚≤5001≤n,m≤500,矩阵中任意值都满足 0≤𝑎𝑖,𝑗≤1000≤ai,j​≤100 要求…

基于豆瓣电影TOP250的可视化设计

本文要完成的目的&#xff0c;实现豆瓣电影TOP250的可视化 思路 讲解思路&#xff0c;采用倒推的方式&#xff0c; 首先确定可视化图表&#xff0c;也就是最终的效果。这样就能确定需要那些基础数据根据需要的数据进行按需爬取存储。 本篇文章完成前两步。可视化图表设计 和 …

搜维尔科技:「案例」NBA新科冠军与Xsens运动捕捉的缘分

北京时间昨日&#xff0c;凯尔特人在主场106比88击败独行侠&#xff0c;以总比分4比1获胜&#xff0c;夺得队史第18冠&#xff0c;超越湖人队&#xff08;17冠&#xff09;成为历史上夺冠次数最多的球队。凯尔特人队上一次夺冠还是在2007-2008赛季。 凯尔特人队主力Jayson Tat…

采用C#+uni-app 公众号预约挂号系统源码 医院公众号1分钟搞定网上“挂缴查”攻略!

采用C#uni-app 公众号预约挂号系统源码 医院公众号1分钟搞定网上“挂缴查”攻略&#xff01; 医院就诊人数持续增多&#xff0c;为保障就诊人员安全便捷就医&#xff0c;减少排队等候时间&#xff0c;进一步提升就医体验&#xff0c;医院微信公众号上线缴费、查询等功能。就诊人…

Python+Pytest+Yaml+Request+Allure框架源代码之(一)common公共方法封装

common模块&#xff1a; get_path.py&#xff1a;获取路径方法 # -*- coding: UTF-8 -*- import os# 项目根目录 BASE_DIR os.path.dirname(os.path.dirname(os.path.abspath(__file__)))# 配置文件目录 CONFIG_DIR os.path.join(BASE_DIR,config)# 测试用例文件目录 TESTCA…

高速缓存存储器(Chche)

为了解决CPU和主存之间速度不匹配的问题&#xff0c;计算机系统中引入了高速缓存&#xff08;Chche&#xff09;的概念。 基本想法&#xff1a;使用速度更快但容量更小、价格更高的SRAM制作一个缓冲存储器&#xff0c;用来存放经常用到的信息&#xff1b;这样一来&#xff0c;…

如何打包数据库文件

使用 mysqldump 命令&#xff1a; mysqldump -u username -p database_name > output_file.sql username 是数据库的用户名。database_name 是要导出的数据库名称。output_file.sql 是导出的 SQL 文件名&#xff0c;可以自定义。 示例&#xff1a; mysqldump -u root -p…

Python-正则表达式

目录 一、打开正则表达式 二、正则表达式的使用 1、限定符 &#xff08;1&#xff09;x*&#xff1a;*表示它前面的字符y 可以有0个或多个&#xff1b; &#xff08;2&#xff09;x&#xff1a;表示它前面的字符可以出现一次以上&#xff1b;&#xff08;只可以匹配多次&…

C++必修:模版的入门到实践

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;C学习 贝蒂的主页&#xff1a;Betty’s blog 1. 泛型编程 首先让我们来思考一个问题&#xff0c;如何实现一个交换函数&#x…

晨持绪科技:开好一家抖音小店运营怎么做

在数字时代&#xff0c;抖音小店以其独特的社交媒体优势迅速崛起&#xff0c;成为许多创业者的新宠。但如何有效运营&#xff0c;却是一门学问。首要任务是确定你的小店定位&#xff0c;这关系到后续的产品选择、目标客户群及营销策略。定位明确后&#xff0c;接下来便是挑选适…