【创建进程】fork函数与写时拷贝

文章目录

  • fork函数
    • fork如何返回两个值(fork的工作原理)
    • 如何解释父子进程相互输出printf
  • 写时拷贝

fork函数

#include <unistd.h>
pid_t fork(void);
返回值:自进程中返回0,父进程返回子进程id,出错返回-1

fork函数是一个Unix/Linux系统中常用的系统调用,用于创建一个新的进程新进程称为子进程原进程称为父进程。fork函数的工作原理是将父进程的内存空间完全复制一份给子进程,包括代码段、数据段、堆栈等,但是子进程会有自己独立的进程ID(PID)
fork函数会 返回两次 ,在父进程中返回子进程的PID,在子进程中返回0如果创建失败则返回一个-1返回值的类型为pid_t,实质是int.

一个函数调用一次但是可以返回两次值,这是令人感到奇怪的,我们可以通过代码来观察该现象

观察以下代码:
在这里插入图片描述

我们可以发现,fork函数确实返回了两个值,对于父进程而言,拿到的的就是子进程的pid.对于新建立出来的子进程来说,fork返回值就是0.(27502是bash进程)

对于该相象,我们提出疑问:

fork如何返回两个值(fork的工作原理)

我们将代码以fork函数为界限,划分为上下两个部分,before和after。创建子进程后子进程会向下开始执行after代码,并不会执行before。在fork内部,执行了一部分代码的时候,子进程已经被建立。几乎是瞬间,子进程被调度,父子进程并发往后执行代码,所以return会执行两次

在这里插入图片描述
在这里插入图片描述

当代码执行到fork函数时,由于fork函数是一个系统调用,这个时候需要由linux内核来创建一个子进程,子进程获得与父进程用户级虚拟地址空间相同的(但是独立的)一份副本,包括父进程的栈、数据段、堆和代码,并申请一个PCB
完成这个工作后,子进程也就有了自己的一个PID,fork函数就会将这个PID立即返回给父进程。因为子进程的PID总是非0的,返回值就提供一个明确的方法来分辨程序是在父进程还是在在子进程中执行。所以给子进程返回一个0.

注意,父进程和子进程是并发运行的独立进程,执行的先后顺序由系统的调度算法决定。虽然上述例子是先执行父进程的printf,但是在其它系统上可能不一样
在这里插入图片描述

如何解释父子进程相互输出printf

用fork创建出来的子进程与父进程共享文件。我们注意到以上例子中,父进程和子进程程都把他们的输出显示在屏幕文件中。原因是子进程继承了父进程的所有的打开文件。当父进程调用fork时,stdout(标准输出流)文件是打开的,并指向屏幕。子进程继承了这个文件,因此它的输出也是指向屏幕的

我们可以画进程图来帮助我们理解
在这里插入图片描述

观察现象2:
观察以下代码
在这里插入图片描述
在这里插入图片描述

通过以上例子我们可以得到结论:
1.父子进程的具有相同但是独立的地址空间。在创建子进程时,本地变量val在父进程中和在子进程中都是0。后面因为父进程和子进程是独立的进程,它们都有自己私有的地址空间。无论是父进程还是子进程对val的任何改变都是独立的,不会放映到另一个进程的内存中。这也可以解释为什么父进程和子进程调用它们各自的printf语句时,他们的变量val会有不同的值。

2.虽然父子进程的变量的虚拟地址相同,但是映射的物理地址不同。这也是为什么父子进程的val地址相同,值却不同。发生了写时拷贝。

写时拷贝

写时拷贝,又叫写时复制(Copy-on-write,简称COW)。是一种计算机程序设计领域的优化策略。其核心思想是,如果多个调用者同时请求同一个资源,比如内存中的存储数据,它们会获得相同的指针来指向相同的资源。如果有一个进程想要修改其内容,为了避免影响其它进程,系统这个时候才会真正的复制一份相同的资源给该进程。其它进程所指向的该资源依旧保持不变。这种机制一定程度上减少了系统拷贝资源的次数。只要进程没有修改该资源,就不会有副本被创建,因此多个调用者只是读取操作时可以共享同一份资源

再次回到第二个例子中:
当使用fork创建子进程的时候,子进程获得父进程的一份用户级的虚拟地址空间相同的一份副本。根据写时拷贝的机制,此时系统并不会马上给子进程深拷贝父进程的资源,而是先给子进程共享同一片地址空间,并将该页面标记为只读。一旦父进程或者是子进程对该空间进行写入操作,系统才会真正的拷贝一份副本。

在这里插入图片描述

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

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

相关文章

LiveGBS流媒体平台GB/T28181功能-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播

LiveGBS支持-大屏播放上大屏支持轮巡播放分屏轮巡值守播放监控视频轮播大屏轮询播放轮播 1、轮播功能2、分屏展示3、选择轮播通道4、配置轮播间隔(秒)5、点击开始轮播6、轮播停止及全屏7、搭建GB28181视频直播平台 1、轮播功能 视频监控项目使用过程中&#xff0c;有时需要大屏…

Java 模拟Spring,实现IOC和AOP的核心(一)

在这里我要实现的是Spring的IOC和AOP的核心&#xff0c;而且有关IOC的实现&#xff0c;注解XML能混合使用&#xff01; 参考资料&#xff1a; IOC&#xff1a;控制反转&#xff08;Inversion of Control&#xff0c;缩写为IoC&#xff09;&#xff0c;是面向对象编程中的一种…

OpenLayers基础教程——使用WebGL加载海量数据(1)

1、前言 最近遇到一个问题&#xff1a;如何在OpenLayers中高效加载海量的场强点&#xff1f;由于项目中的一些要求&#xff0c;不能使用聚合的方法加载。一番搜索之后发现&#xff1a;OpenLayers中有一个WebGLPoints类&#xff0c;使用该类可以轻松应对几十万的数据量&#xf…

3D高斯泼溅的崛起

沉浸式媒体领域正在以前所未有的速度发展&#xff0c;其中 3D 高斯溅射成为一项关键突破。 这项技术在广泛的应用中看起来非常有前景&#xff0c;并且可能会彻底改变我们未来创建数字环境以及与数字环境交互的方式。 在本文中&#xff0c;我们将通过与摄影测量和 NeRF 等前辈进…

【软考高项】十五、信息系统工程之系统集成

1、集成基础 定义&#xff1a;通过硬件平台、网络通信平台、数据库平台、工具平台、应用软件平台将各类资源有机、高效地集成到一起&#xff0c;形成一个完整的工作台面 基本原则包括:开放性、结构化、先进性和主流化 2、网络集成 包括&#xff1a;传输子系统、交换子系统、…

Google的MELON: 通过未定位图像重建精确3D模型的突破性算法

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

QML TextField 默认无法鼠标选中内容

1.import QtQuick.Controls 2.0 后的TextField默认无法选中内容如下图&#xff1a; 2.增加属性设置 selectByMouse: true 可以选中内容了 TextField{ selectByMouse: true text:"1234567890987654321" } 效果如下:

安装调试kotti_ai:AI+互联网企业级部署应用软件包@riscv+OpenKylin

先上结论&#xff1a;riscvOpenKylin可以安装pyramidkottikotti_ai 但是paddle_serving_client无法安装&#xff0c;项目的AI实现部分需要改用其它方法&#xff0c;比如onnx。最终onnx也没有装成&#xff0c;只好用飞桨自己的推理。 安装kotti pip install kotti 安装kotti和…

【Git】第一课:Git的介绍

简介 什么是Git? Git是一个开源的分布式版本控制系统&#xff0c;用于跟踪代码的改变和协同开发。它最初由Linus Torvalds为了管理Linux内核开发而创建&#xff0c;现已成为开源软件开发中最流行的版本控制系统&#xff0c;没有之一。Git允许多人同时在不同的分支上工作&…

将main打包成jar;idea打包main为jar包运行

将main打包成jar&#xff1b;idea打包main为jar包运行 适用场景&#xff1a;可以封装一些小工具。 配置jar Maven中添加 <packaging>jar</packaging>将其打包为jar。 设置运行入口main 编译jar 看到jar输出 运行效果&#xff1a; 其中&#xff0c;三方依赖也被…

DEYOv2: Rank Feature with Greedy Matchingfor End-to-End Object Detection

摘要 与前代类似&#xff0c; DEYOv2 采用渐进式推理方法 来加速模型训练并提高性能。该研究深入探讨了一对一匹配在优化器中的局限性&#xff0c;并提出了有效解决该问题的解决方案&#xff0c;如Rank 特征和贪婪匹配 。这种方法使DEYOv2的第三阶段能够最大限度地从第一和第二…

【IEEE】Multimodal Machine Learning: A Survey and Taxonomy

不废话&#xff0c;先上思维导图&#xff0c;哈哈哈&#xff01; 论文题目Machine Learning: A Survey and Taxonomy作者Tadas Baltrusaitis , Chaitanya Ahuja , and Louis-Philippe Morency状态已读完会议或者期刊名称IEEE TRANSACTIONS ON PATTERN ANALYSIS AND MACHINE IN…

电机与直线模组选型

一。普通电机选型 普通电机选型&#xff08;一&#xff09; 三相异步电机 定子&#xff1a;产生旋转磁场 转子&#xff1a;切割磁场&#xff0c;产生洛伦兹力 结构简单&#xff0c;成本低&#xff0c;稳定 效率较低&#xff0c;转速不稳定 N60f/P 定子旋转速度&#xff1a;150…

ubuntu系统下如何使用vscode编译和调试#小白入门#

编程环境&#xff1a;ubuntu系统为18.04.1&#xff0c;vscode版本为1.66.2 一、VSCode切换中文显示&#xff1a; 1、vscode安装完成后启动,在左侧externsions中搜索“简体中文”插件&#xff0c;并完成安装&#xff1a; 2、选择右下角齿轮形状的"Manage"&#xff…

运动想象 (MI) 迁移学习系列 (14) : EEGNet-Fine tuning

运动想象迁移学习系列:EEGNet-Fine tuning 0. 引言1. 主要贡献2. 提出的方法2.1 EEGNet框架2.2 微调 3. 实验结果3.1 各模型整体分类结果3.2 算法复杂度比较3.3 不同微调方法比较 4. 总结欢迎来稿 论文地址&#xff1a;https://www.nature.com/articles/s41598-021-99114-1#cit…

【HTTP完全注解】范围请求

范围请求 范围请求是HTTP的一种内容协商机制&#xff0c;该机制允许客户端只请求资源的部分内容。范围请求在传送大的媒体文件&#xff0c;或者与文件下载的断点续传功能搭配使用时非常有用。 范围请求的工作流程 范围请求通过在HTTP请求标头Range中表明需要请求的部分资源的…

可视化日记——极坐标绘制雷达图

目录 一、创建极坐标 二、数据集准备 三、划分角度 四、指定半径 五、绘制 一、创建极坐标 Python中没有直接画雷达图的函数&#xff0c;若要绘制需要先创建画布和极坐标轴域&#xff0c;再设定角度与半径的参数&#xff08;极坐标中角度与半径确定一个点的位置&#xff…

专业135+总分400+重庆邮电大学801信号与系统考研经验重邮电子信息与通信工程,真题,大纲,参考书。

今年分数出来还是比较满意&#xff0c;专业801信号与系统135&#xff0c;总分400&#xff0c;没想到自己也可以考出400以上的分数&#xff0c;一年的努力付出都是值得的&#xff0c;总结一下自己的复习心得&#xff0c;希望对大家复习有所帮助。专业课&#xff1a;&#xff08;…

(ROOT)KAFKA详解

生产篇 使用 /** Licensed to the Apache Software Foundation (ASF) under one or more* contributor license agreements. See the NOTICE file distributed with* this work for additional information regarding copyright ownership.* The ASF licenses this file to Y…

设计模式学习笔记 - 设计原则与思想总结:2.运用学过的设计原则和思想完善之前性能计数器项目

概述 在 《设计原则 - 10.实战&#xff1a;针对非业务的通用框架开发&#xff0c;如何做需求分析和设计及如何实现一个支持各种统计规则的性能计数器》中&#xff0c;我们讲解了如何对一个性能计数器框架进行分析、设计与实现&#xff0c;并且实践了一些设计原则和设计思想。当…