86.Linux系统下复制进程fork(逻辑地址和物理地址)

目录

fork复制进程

逻辑地址和物理地址 


fork复制进程

         fork 是一个系统调用,在 Linux/Unix 系统中用于创建一个新的进程,新进程称为子进程。子进程是父进程的副本,它从父进程那里继承了大部分属性和资源,包括代码、数据、打开的文件描述符等。

fork 的基本语法如下:

#include <unistd.h>pid_t fork(void);

fork是复制进程,要把一个已有的进程复制一份,在系统中就多出1个进程,它是怎么做的?
        第一步,先将父进程(原来的这个进程)的PCB先复制1份出来,然后给它申请一个pid,唯一标识这个子进程。原来父进程的pid是5255,子进程是5256,然后接下来把父进程的实体复制一份给子进程,这样,系统中就多出这么一个子进程了。
        我们执行完fork之后,才有的新的PCB节点和子进程的实体子进程执行的代码和父进程是一模一样的,父进程做什么,子进程就做什么,唯一不同的是fork的返回值不同。
        在父进程中,fork的返回值是子进程的pid值,是一个大于0的值,在子进程中,这个fork的返回值是固定的,为0,所以说,哪个进程的fork的返回值是0,这个进程就是子进程,因为fork之后,虽然父子进程执行的代码是同一套,但是有时候我们想让父进程和子进程做不同的事情,我们就写个判断“
if(pid==0)(说明子进程在执行这部分的代码)
else(也就是pid大于0 )(我们让父进程执行这部分的代码)

 

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>int main(){int n = 0;char *s = NULL;__pid_t pid = fork();if(pid==-1){exit(0);}if(pid==0){s = "child";n = 3;}else{s = "parent";n = 7;}for (int i = 0; i < n;i++){printf("s=%s,n=%d,&n=%p,pid=%d,ppid=%d\n", s,n,&n,getpid(),getppid());sleep(1);}exit(0);
}

父子进程用的不是同一块儿空间,物理地址变了,逻辑地址没变

  1. 父子进程用的不是同一块儿空间: 在linux操作系统中,当你使用 fork 创建一个子进程时,操作系统会为子进程分配一块与父进程独立的内存空间。这意味着父进程和子进程不会共享相同的物理内存,它们拥有各自独立的内存副本。

  2. 物理地址变了,逻辑地址没变: 物理地址是计算机内存中存储数据的实际位置,它可能随着进程的内存分配而改变。逻辑地址是程序中使用的地址,通常由操作系统翻译为物理地址。在父子进程的情况下,子进程的物理地址通常会与父进程的不同,因为它们拥有各自的内存空间。然而,逻辑地址通常保持不变,因为进程的代码和数据引用的地址仍然相对于它们自己的内存空间。

这种机制使得父子进程能够独立运行,而不会互相干扰彼此的内存。虽然它们在逻辑地址上看起来好像共享相同的内存,但实际上操作系统在背后进行了地址映射,使它们访问的是各自独立的物理内存空间。这有助于确保进程之间的隔离和安全性。

 

逻辑地址和物理地址 

  1. 逻辑地址: 也称为虚拟地址,是程序中使用的地址。它是相对于进程的内存空间而言的,通常是一个连续的整数地址。逻辑地址是程序员编写代码时使用的地址,但它不直接对应于实际的物理内存位置。逻辑地址提供了一种抽象层,使程序员能够编写不受物理内存布局限制的代码。

  2. 物理地址: 物理地址是计算机内存芯片上的实际存储位置。它对应于计算机的物理硬件,包括 RAM(随机存储器)等。物理地址是实际的存储位置,用于在内存芯片上读取和写入数据。计算机硬件通过物理地址来定位存储器中的特定数据。

        操作系统的内存管理单元负责将逻辑地址翻译为物理地址。这个过程被称为地址映射。操作系统使用页表等数据结构来管理逻辑地址到物理地址的映射,以便确保程序可以访问正确的物理内存位置。逻辑地址和物理地址之间的映射关系是通过操作系统在运行时动态管理的。

        总之,逻辑地址是程序员在编写代码时使用的虚拟地址,而物理地址是实际存储器中的实际位置。操作系统负责将逻辑地址映射到相应的物理地址,从而实现内存管理和进程隔离。这种抽象层允许操作系统更有效地管理内存,同时保护不同进程之间的隔离。

写在最后:以上就是本篇文章的内容了,感谢你的阅读。如果感到有所收获的话可以给博主点一个赞哦。如果文章内容有遗漏或者错误的地方欢迎私信博主或者在评论区指出~ 

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

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

相关文章

VMware 虚拟机安装 CentOS 7

CentOS 7 1. 下载CentOS 7 iso镜像 Index of /centos/7.9.2009/isos/x86_64/ 2. Vmware安装CentOS 7 安装教程&#xff1a; 超详细VMware CentOS7(最小安装)安装教程_虚拟机最小化安装-CSDN博客 【精选】VMware 安装 Centos7 详细过程_vm虚拟机安装centos7_expectation Fu…

每天一道算法题:125. 验证回文串

难度 简单 题目 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true_ &…

网络原理---封装和分用

文章目录 什么是封装和分用&#xff1f;封装应用层传输层网络层数据链路层物理层 分用物理层数据链路层网络层传输层应用层 什么是封装和分用&#xff1f; 我们前面讲过协议会分层&#xff0c;每一层都有各自的功能。而在数据传输的过程中&#xff0c;得按照顺序把每一层协议都…

Spring加载的过程

1. 环境准备&#xff1a; 在加载过程开始之前&#xff0c;Spring首先会进行环境准备。这包括读取配置文件、初始化配置参数等操作&#xff0c;然后创建应用上下文&#xff08;ApplicationContext&#xff09;容器。Spring支持多种配置方式&#xff0c;如XML配置、注解配置和Jav…

【ArcGIS微课1000例】0077:ArcGIS生成经纬网(shp格式)

使用ArcGIS制图的时候,可以很方便的生成经纬网、方里网及参考格网,但是在需要shp格式的经纬网,进一步在南方cass中使用经纬网的时候,就需要单独生成了。 如下图所示为全球大陆矢量数据,我们基于该数据来生成全球指定间距的经纬网数据。 在ArcGIS中,生成经纬网和方里网均…

音乐推荐与管理系统Python+Django网页界面+协同过滤推荐算法

一、介绍 音乐推荐与管理系统。本系统采用Python作为主要开发语言&#xff0c;前端使用HTML、CSS、BootStrap等技术搭建界面平台&#xff0c;后端使用Django框架处理请求&#xff0c;并基于Ajax等技术实现前端与后端的数据通信。在音乐个性推荐功能模块中采用通过Python编写协…

云原生|kubernetes |kubelet服务加入系统守护进程supervisor(centos7系统下演示通过)

前言&#xff1a; kubelet 是 Kubernetes 集群中的一个重要组件&#xff0c;运行在每个节点上&#xff0c;负责管理该节点上的容器和Pod。它与控制平面&#xff08;如 API Server 和 kube-controller-manager&#xff09;通信&#xff0c;确保节点上的容器与期望的状态保持一致…

ARMday1

1、计算机的组成 输入设备-输出设备-运算器-控制器-存储器 输入设备&#xff1a;键盘、鼠标、手柄、扫描仪 输出设备&#xff1a;显示屏、打印机、音响 存储器&#xff1a;存放数据以及指令、是实现“程序存储控制”的基础、外存、内存、cache、寄存器 控制器&#xff08;…

django安装数据库

使用pip安装django pip3 install django注意我使用的是python3所以用pip3安装&#xff0c;如需安装指定版本 django ..* 检测是否安装成功,不报错&#xff0c;则安装成功 # python3 # import django下边这是报错的 django迁移数据库 再mysql中简历数据库 CREATE DATABA…

chinese-stable-diffusion中文场景文生图prompt测评集合

腾讯混元大模型文生图操作指南.dochttps://mp.weixin.qq.com/s/u0AGtpwm_LmgnDY7OQhKGg腾讯混元大模型再进化&#xff0c;文生图能力重磅上线&#xff0c;这里是一手实测腾讯混元的文生图在人像真实感、场景真实感上有比较明显的优势&#xff0c;同时&#xff0c;在中国风景、动…

【PyQt学习篇 · ⑪】:QPushButton和QCommandLinkButton的使用

文章目录 构造函数菜单设置扁平化默认处理右键菜单QCommandLinkButton的使用 构造函数 QPushButton的构造函数如下&#xff1a; """QPushButton(parent: Optional[QWidget] None)QPushButton(text: Optional[str], parent: Optional[QWidget] None)QPushButt…

【QT】 Qt自定义ui控件

在使用Qt的ui设计时&#xff0c;Qt为我们提供了标准的窗口控件&#xff0c;但是在很多复杂工程中&#xff0c;标准窗口控件并不能满足所有的需求&#xff0c;这时就需要我们自定义控件。我们自定义的类既可以作为独立的窗口显示&#xff0c;又可以作为一个控件显示。 我们要实现…

Flink SQL DataGen Connector 示例

Flink SQL DataGen Connector 示例 1、概述 使用 Flink SQL DataGen Connector&#xff0c;可以快速地生成符合规则的测试数据&#xff0c;可以在不依赖真实数据的情况下进行开发和测试。 2、使用示例 创建一个名为 “users” 的表&#xff0c;包含 6 个字段&#xff1a;id…

【Leetcode】349. 两个数组的交集

题意 给定两个数组&#xff0c;编写一个函数来计算它们的交集。 说明&#xff1a; 输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。 思路 这道题目&#xff0c;主要要学会使用一种哈希数据结构&#xff1a;unordered_set&#xff0c;这个数据结构可以解决…

Flask的一种启动方式和三种托管方式

1. 原生启动 Flask 支持使用原生的 app.run() 方法来启动应用程序。这种方法是最简单、最基本的启动方式&#xff0c;适用于开发环境和小型应用程序。 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return Hello, World!if __name__ __main__…

2023NOIP A层联测25-滈葕

给定一个 01 权有向图&#xff0c;给每个点赋予 ABCD 中的一个字母使得每条有向边 ( u , v , w ) (u,v,w) (u,v,w) 都满足 w 1 ⟺ ( a u , a v ) ∈ { ( A , B ) , ( A , D ) , ( B , A ) , ( B , D ) , ( C , A ) , ( C , B ) , ( C , D ) } w1\Longleftrightarrow(a_u,a_v…

Docker从入门到上天系列第一篇:Docker简介以及Docker存在的定位和意义

大神推荐:作者有幸结识技术大神孙哥为好友获益匪浅,现在把孙哥作为朋友分享给大家。 孙哥链接:孙哥个人主页 作者简介:一个颜值99分,只比孙哥差一点的程序员。 本专栏简介:话不多说,让我们一起干翻Docker 本文章简介:话不多说,让我们讲清楚首先讲清楚Docker是什么 文章…

JVM线上问题排查基本操作

1. 要解决的问题 CPU 飚高&#xff0c;内存溢出&#xff0c;频繁 GC 2. CPU 飚高 2.1 定位问题的思路 首先找到 CPU 飚高的那个 Java 进程&#xff0c;因为你的服务器会有多个 JVM 进程。 然后找到那个进程中的 “问题线程”&#xff0c; 最后根据线程堆栈信息找到问题代码。…

数据结构HW1

1.(10分) 编程实现矩阵乘法&#xff08;源文件命名matrix.c&#xff09;。函数定义如下&#xff1a; int matmult (int a[][], int b[][]) { // 注意判断a、b维度可能不匹配&#xff0c;且可能是空矩阵 } #include<stdio.h>// 定义矩阵的最大维度 #define MAX_ROWS…

【Redis】hash数据类型-常用命令

文章目录 前置知识常用命令HSETHGETHEXISTSHDELHKEYSHVALSHGETALLHMGET关于HMSETHLENHSETNXHINCRBYHINCRBYFLOAT 命令小结 前置知识 redis自身就是键值对结构了&#xff0c;哈希类型是指值本⾝⼜是⼀个键值对结构&#xff0c;形如key"key"&#xff0c;value{{field1…