当前位置: 首页 > news >正文

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(随机存储器)等。物理地址是实际的存储位置,用于在内存芯片上读取和写入数据。计算机硬件通过物理地址来定位存储器中的特定数据。

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

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

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

相关文章:

  • Scala语言用Selenium库写一个爬虫模版
  • 【监控指标】监控系统-prometheus、grafana。容器化部署。go语言 gin框架、gRPC框架的集成
  • python-全自动二维码识别
  • ST7789LCD调试笔记
  • superset study day01 (本地启动superset项目)
  • AWS:EC2实例创建步骤
  • 文件重命名自动化:批量处理让生活更简单
  • 2024上海国际人工智能展(CSITF)“创新驱动发展·科技引领未来”
  • 【Linux】第十站:git和gdb的基本使用
  • 软件架构师
  • 吴恩达《机器学习》5-6:向量化
  • 腾讯云16核服务器配置有哪些?CPU型号处理器主频性能
  • 分享zframe_send使用过程中 的一个小问题
  • React Native自学笔记
  • 为什么大家会选择通配符SSL证书?
  • #Java异常处理
  • $translatePartialLoader加载失败及解决方式
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • C++11: atomic 头文件
  • C++类中的特殊成员函数
  • centos安装java运行环境jdk+tomcat
  • Git的一些常用操作
  • JavaScript/HTML5图表开发工具JavaScript Charts v3.19.6发布【附下载】
  • JavaScript-Array类型
  • Laravel 中的一个后期静态绑定
  • mysql_config not found
  • mysql外键的使用
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Sublime Text 2/3 绑定Eclipse快捷键
  • Webpack 4 学习01(基础配置)
  • 阿里云Kubernetes容器服务上体验Knative
  • 微信小程序--------语音识别(前端自己也能玩)
  • 译自由幺半群
  • Spring Batch JSON 支持
  • # Java NIO(一)FileChannel
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (12)Linux 常见的三种进程状态
  • (2)STM32单片机上位机
  • (3)nginx 配置(nginx.conf)
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)fread与fwrite详解
  • (待修改)PyG安装步骤
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (强烈推荐)移动端音视频从零到上手(上)
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (四)Controller接口控制器详解(三)
  • (转)fock函数详解
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • (转)拼包函数及网络封包的异常处理(含代码)
  • ***原理与防范
  • .net refrector
  • @GlobalLock注解作用与原理解析
  • @property括号内属性讲解
  • @WebService和@WebMethod注解的用法