【进程复制】

news2024/10/2 14:30:03

目录

  • 地址偏移量
  • fork函数
  • fork练习

地址偏移量

PCB结构体:
struct task_struct {
PID ststus ;

}
页面的内存大小是固定的,不足一页会给一页,大于一页会给一个整页数
比如一页大小为4K,地址除4K商是页号,余数是在该页中的偏移量,此处的商是逻辑页号,在页表中可找到对应的物理页,

fork函数

fork函数作用:进程复制,将PCB等信息复制一份,但是PID不会复制,每个进程的进程号(PID)是唯一的.复制的是fork函数之前的所有内容,且一摸一样。
fork函数头文件:#include<unistd.h>
#include<sys/types.h>
fork函数返回值:返回值是int类型,当前父进程返回值>0,子进程返回值=0.

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
int main(){
int n=0;
char *s=NULL;
pid_t pid=fork();
if(pid==0){//子进程
n=3;
s="child";
}else{//父进程
n=7;
s="parent";
}
for(int i=0;i<n;i++){
printf("pid=%d,ppid=%d,s=%s\n",getpid(),getppid(),s);//getpid()获取当前进程pid,getppid()获取当前进程父进程的pid
sleep(1);
}
return 0;
}

以上代码运行结果:在这里插入图片描述
仔细观察可以发现child出现3次,paret出现7次,一秒钟输出一个paret和一个child,为什么会这么输出呢?
从fork()函数开始进行分裂,父进程的n=7,子进程n=3,分别进入循环,并且首先父进程执行一段,然后子进程执行,子进程n=0之后其子进程结束,父进程继续运行,此处父进程的父进程便是当前终端,可以通过查看当前终端的PID对比得到
注意此处n是否公用一块物理内存,逻辑内存?如果不修改n的值,父子进程n的物理内存是否相同?
此处的n的物理内存不共享(拷贝了一份),逻辑地址相同(偏移量)。没修改n之前是共享物理内存,如果当前逻辑页内容发生改变则改变。
写实拷贝:一种可以推迟甚至免除拷贝数据的技术,内核此时并不会复制整个进程的地址空间,而是让父进程和子进程共享同一拷贝,只有在需要写入的时候,数据才会被复制,从而使各个进程拥有各自的拷贝。

fork练习

问以下几个程序输出几个A
1.

int main(){
printf("A\n");
fork();
}

屏幕输出一个A,先输出A,然后进程复制,父子进程一块结束。
2.`

int main(){
fork();
printf("A\n");
return 0;
}

此处输出两个A,程序刚开始先进行复制,父进程继续向下运行,输出一个A,子进程也继续输出一个A。
3.

int main(){
printf("A");
fork();
}

输出两个A,程序运行开始A进入缓冲区,然后进行进程复制,子进程将缓冲区也拷贝了一份,所以此处父子进程均有一个缓冲区,接着程序结束,刷新缓冲区,父子进程均输出一个A,所以是两个.
4.

int main(){
for(int i=0;i<2;i++){
fork();
printf("A\n");
}
}

输出六个程序刚开始进入进程复制时 ,i都等于0,我们首先执行父进程,父进程先输出一个A,再次进入循环,父进程又一次进行分裂,分裂之后的父子进程i=1,所以此处的父子进程都会输出一个A,第一次分裂之后的父进程输出三个A,再看第一次分裂之后的子进程,同父进程一样,先输出一个A,再次进入循环,再次分裂,分裂的两个程序都输出A,所以第一次分裂的子进程输出三个A,随意总共输出6个A,如图
在这里插入图片描述
5.

int main(){
for(int i=0;i<2;i++){
fork();
printf("A");
}
}

此题同上一个题区别在于第二次复制时的子进程,将第一次分裂时的两个进程的缓冲区中本来存在的一个A也复制了一份。因此就会是八个,如下图最终的四个进程中在缓冲区中各有两个A,程序结束,刷新缓冲区,输出8个A。
在这里插入图片描述
6.

int main(){
fork()||fork()printf("A\n");
}

此处是三个A,考察返回值。第一次复制,父进程返回值大于1为真,不执行后面程序,输出一个A,子进程此时返回值为0,继续执行第二次复制,第二次分裂不管是子进程还是父进程都会继续执行,执行下面输出A的语句。所以输出三个A。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue(六)——使用脚手架(3)

目录 webStorage localStorage sessionStorage todolist案例中使用 组件自定义事件 绑定 解绑 总结 全局事件总线 消息发布与订阅 nextTick 过渡与动画 webStorage 这不是vue团队开发的&#xff0c;不需要写在xx.vue当中&#xff0c;只需写在xx.html当中即可。 什…

Linux下C++开发笔记--g++命令

目录 1--前言 2--开发环境搭建 3--g重要编译参数 4--实例 1--前言 最近学习在linux环境下进行C开发的基础知识&#xff0c;参考的教程是基于VSCode和CMake实现C/C开发 | Linux篇&#xff0c;非常适合小白入门学习。 2--开发环境搭建 ①安装gcc、g和gdb&#xff1a; sud…

深度学习入门(三十七)计算性能——硬件(TBC)

深度学习入门&#xff08;三十七&#xff09;计算性能——硬件&#xff08;CPU、GPU&#xff09;前言计算性能——硬件&#xff08;CPU、GPU&#xff09;课件电脑提升CPU利用率①提升CPU利用率②CPU VS GPU提升GPU利用率CPU/GPU带宽更多的CPU和GPUCPU/GPU高性能计算编程总结教材…

SpringBoot整合dubbo(一)

第一次整合&#xff0c;使用无注册中心方式 一、首先&#xff0c;项目分为三个模块&#xff0c;如下图&#xff0c;dubbo-interface&#xff08;要发布的接口&#xff09;、dubbo-provider&#xff08;接口的具体实现&#xff0c;服务提供者&#xff09;、dubbo-consumer&#…

【LeetCode-中等】63. 不同路径 II(详解)

题目 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish”&#xff09;。 现在考虑网格中有障碍物。那么从左上角到…

VScode

VScode 下载 VScode&#xff1a;https://code.visualstudio.com/安装 汉化 Chinese (Simplified) 设置 背景色 Atom One Light Theme Color Theme 护眼色 "workbench.colorCustomizations": { // 设置背景颜色// "foreground": "#75a478",&…

List详解

一、List&#xff08;列表&#xff09; 基本的数据类型&#xff0c;列表 在redis中&#xff0c;通过相应操作可以让list变成栈、队列、阻塞队列&#xff01; 在redis中所有的list命令都是以 l 开头的 添加值 将一个值或多个值&#xff0c;插入到列表尾部&#xff08;右&…

深度学习之语义分割算法(入门学习)

>>>深度学习Tricks&#xff0c;第一时间送达<<< 目录 &#x1f4a1; 写在前面 一、前言 二、深度学习的图像分割分类 1.语义分割 2.实例分割 3.全景分割 三、语义分割的基本原理 四、语义分割的常用运算及评价指标 关于算法改进及论文投稿可关注并留…

【附源码】Python计算机毕业设计寿险公司保险业务管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

指令格式学习

计算机的指令格式与机器的字长、存储器的容量及指令的功能都有很大的关系。从便于程序设计、增加基本操作并行性、提高指令功能的角度来看&#xff0c;指令中应包含多种信息。但在有些指令中&#xff0c;由于部分信息可能无用&#xff0c;这将浪费指令所占的存储空间&#xff0…

python web服务windows管理工具

故事背景是这样的。。。 客户需要一些小工具&#xff0c;作为一名开发者&#xff0c;很容易的就写完了。但是呢&#xff0c;客户没有服务器&#xff0c;只能部署在windows上。由于不再一起&#xff0c;维护一个web程序&#xff0c;有时候会有些折腾&#xff0c;所以&#xff0…

Camunda 使用restapi

参考&#xff1a;http://camunda-cn.shaochenfeng.com/reference/rest/task/get-query/ 这里我就举一个流程的例子&#xff1a; 以下接口&#xff0c;除了端口和参数&#xff0c;其他无需改动 POM&#xff1a; rest 就是接口 webapp 是网页 <dependency><groupId&…

安全狗持续4年零失误实力守护金鸡颁奖典礼

11月10日-12日&#xff0c;第35届中国电影金鸡奖颁奖相关活动顺利在厦门举办。 如果用电影的方式回看他们这几天的重保值守任务的话&#xff0c;会是怎么样的? PART 1 背景交代 距离第一次接到此客户的任务&#xff0c;时间已经过去4年。今年这次任务的开启得让时间倒退到5天之…

el-tabs切换按钮定位不准确,部分内容被遮挡(前端vue实战踩坑记录)

在写项目的过程中&#xff0c;特别是vue项&#xff0c;我们最常用到的UI框架就是elementUI&#xff0c;现记录一个今天同事开发遇到的bug。 一、问题描述 页面跳转时&#xff0c;tabs切换按钮被遮挡展示不全&#xff0c;效果如图 正常情况下&#xff0c;右侧的用户后面的…应…

kotlin函数

一、Main函数 fun printHello() {println("Hello World")}printHello() Hello World在main的函数中&#xff0c;执行播放按钮&#xff0c;会编译执行&#xff0c;结果在下面显示&#xff1a; 1.1 Basic Task Create a new Kotlin file.Copy and paste the main()…

Java中方法的注意事项

C有函数&#xff0c;我们Java有方法&#xff01;实参和形参的关系方法重载public static早在初始Java的那一个博客&#xff0c;我好像就给兄弟们说过&#xff0c;在Java中我们把以前认识到的函数叫做是方法&#xff0c;那么如果单单是为了讲一下方法最基本的使用规则&#xff0…

如何从0-1学习渗透测试?

要成为一名渗透测试员&#xff0c;想从基础学习需要先掌握下面这3块&#xff1a;1、学习硬件和网络渗透测试主要涉及网络和部分涉及硬件。2、操作系统和系统架构操作系统和系统架构在渗透测试中起着关键作用。系统操作涉及x86&#xff08;32位&#xff09;和x64&#xff08;64位…

稳定性实践:开关和预案

在稳定性保障中&#xff0c;限流降级的技术方案&#xff0c;是针对服务接口层面的&#xff0c;也就是服务限流和服务降级。这里还有另外一个维度&#xff0c;就是业务维度&#xff0c;所以今天我们就从业务降级的维度来分享&#xff0c; 也就是开关和预案。 如何理解开关和预案…

AI与轨交并行,智慧服务伴乘客出行

“欢迎来到智能客服中心” “请选择您需要的服务” 大部分乘客在地铁站厅总能听见这样的提示音 而发出提示音的 正是智慧升级过后的地铁智能客服服务中心 地铁作为承载万千群众出行的工具 近年客流呈飞速增长态势 因此&#xff0c;轨道交通行业也正积极进行智慧化转型 …

C语言百日刷题第八天

前言 今天是刷题第8天&#xff0c;放弃不难&#xff0c;但坚持一定很酷~ 快来跟我一起刷题吧。刷题第八天目录前言71.打印7层杨辉三角形72.重新排列数组73.冒泡排序74.将数字变成0的操作次数75.四叶玫瑰数71.打印7层杨辉三角形 打印7层杨辉三角形 图案如下&#xff1a; 这个…