Linux Day06

目录

一、printf输出问题

二、复制进程fork

2.1进程

2.2   pid_t fork(void);

 注意:

2.3逻辑地址和物理地址

2.4写时拷贝技术


 

一、printf输出问题

printf 函数并不会直接将数据输出到屏幕,而是先放到缓冲区中,只有一下三种情况满
足,才会输出到屏幕。
1) 缓冲区满
2) 强制刷新缓冲区 fflush
3) 程序结束时

会出现很长时间后系统打印出hello字符

解决:

1.在hello后面+\n,可以起到强制刷新的作用

2.加上fflush(stdout),强制刷新

二、复制进程fork

2.1进程

进程是一个正在运行的程序;

每个进程都有一个进程控制块,PCB

进程控制块是一个用结构体struct task_struct 实现的

2.2   pid_t fork(void);

函数返回类型 pid_t 实质是 int 类型
fork 函数会新生成一个进程,调用 fork 函数的进程为父进程,新生成的进程为子进程。
在父进程中返回子进程的 pid,在子进程中返回 0,失败返回-1。
结果:

 

 getpid()获取当前进程的pid

getppid()获取当前进程的父进程

 在第10行代码执行后,分成子进程和父进程,两个同时进行

 注意:

程序在运行到fork完,将父进程复制一份成为子进程,整个空间都复制了

2.3逻辑地址和物理地址

当我们把n的值和地址打印后会发现一个很神奇的东西

 运行结果:

 不同的n打印的地址是相同的!!!

 地址:偏移量

 

   父进程的1和子进程的4都是0号逻辑页但是他们物理页不同

举个栗子:

操场排队,你在第三排的第三个位置,这个时候你实际所在位置是操场的东南角的A区,第二天的时候,你在操场的西北角B区,但是你还在你们队伍的第三排第三个位置,

这里的第三排第三个位置是逻辑地址,而操场实际位置就是你的物理地址。每次物理地址不同但是你的逻辑地址一般是不变的。

这时这个n我们就能解释了,他两的偏移量是一样的所以逻辑地址是一样的,都是0x7fff21153c44

但是他两所处空间不同,一个在父进程页面,一个在子进程页面,物理地址不同

2.4写时拷贝技术

写时拷贝:父进程和子进程是同一个逻辑地址,但不是同一个物理地址 一般子进程的pid号是父进程的pid+1
父进程和子进程刚开始是公用同一个物理地址的,但当页内容发生改变时,才会将父进程的内容复制一份给子进程,改变的页表信息独立一个物理地址,页表其余没变的页表信息和父进程一样

 当父子进程有一点不同则就需要复制,但是内容一样时,系统为了优化,节省空间,就不需要拷贝了,进而大大提升效率。

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

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

相关文章

Maven发布项目到Nexus私服

项目pom配置 在项目pom.xml中文件中的仓库配置&#xff0c;Nexus私服如何搭建在这里不介绍了可自行百度。 <distributionManagement><repository><id>releases</id><name>Nexus Release Repository</name><url>http://私服地址:34…

STM32 CubeMX USB_CDC(USB_转串口)

STM32 CubeMX STM32 CubeMX 定时器&#xff08;普通模式和PWM模式&#xff09; STM32 CubeMX一、STM32 CubeMX 设置USB时钟设置USB使能UBS功能选择 二、代码部分添加代码实验效果 ![请添加图片描述](https://img-blog.csdnimg.cn/a7333bba478441ab950a66fc63f204fb.png)printf发…

nginx部署以及反向代理多域名实现HTTPS访问

nginx部署以及反向代理多域名实现 1.nginx部署 1.1 编写nginx部署文件 docker-compose.yml version: 3 services: nginx:restart: always image: nginx:1.20container_name: nginx-mainports:- 80:80- 443:443volumes: # 基础配置- /opt/nginx_main/nginx-info/nginx.conf:/…

C++QT教程2——创建QT项目

文章目录 2 创建Qt项目2.1 使用向导创建2.2 手动创建2.3 .pro文件2.4 一个最简单的Qt应用程序main入口函数中&#xff08;main.cpp&#xff09;arnold_widget.h函数arnold_widget.cpp 参考文章 2 创建Qt项目 2.1 使用向导创建 打开Qt Creator 界面选择 New Project或者选择菜…

在IDEA同一个窗口中同时打开多个独立项目

文章说明 本文主要说明如何在Intellij Idea中同时打开多个独立的Maven项目。 我在使用idea的时候&#xff0c;由于自己负责了很多项目&#xff0c;经常要在不通的代码之间切换来切换去。然后搜索代码的时候也只能搜到当前打开的这个项目。因为这个原因&#xff0c;一些小项目…

策略模式:优雅地实现可扩展的设计

策略模式&#xff1a;优雅地实现可扩展的设计 摘要&#xff1a; 策略模式是一种常用的设计模式&#xff0c;它可以帮助我们实现可扩展的、灵活的代码结构。本文将通过一个计算器案例来介绍策略模式的概念、使用场景以及如何在实际项目中应用策略模式来提高代码的可维护性和可扩…

Babylon.js开发工具链大全

本文介绍Babylon 团队&#xff08;JS 和原生&#xff09;和社区共同创建的所有出色工具的摘要&#xff0c;以帮助开发人员和设计人员创建出色的 3D 体验。 推荐&#xff1a;用 NSDT设计器 快速搭建可编程3D场景。 1、Sandbox 第一个工具Sandbox可能是最简单的&#xff0c;它实…

vue diff 前后缀+最长递增子序列算法

文章目录 查找相同前后缀通过前后缀位置信息新增节点通过前后缀位置信息删除节点 中间部份 diff判断节点是否需要移动删除节点删除未查找到的节点删除多余节点 移动和新增节点最长递增子序列 求解最长递增子序列位置信息 查找相同前后缀 如上图所示&#xff0c;新旧 children 拥…

ubuntu18.04安装docker及docker基本命令的使用

官网安装步骤&#xff1a;https://docs.docker.com/desktop/install/ubuntu/ docker快速教程 Ubuntu-Docker安装和使用 docker-hub 1、常用指令 &#xff08;1&#xff09;镜像操作 # ############################# 以nginx为例 docker images docker pull nginx:1.24 dock…

xLua学习

xLua教程&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/XLua%E6%95%99%E7%A8%8B.md xLua配置&#xff1a;https://github.com/Tencent/xLua/blob/master/Assets/XLua/Doc/configure.md FAQ&#xff1a;https://github.com/Tencent/xLua/blob/maste…

Spring Data JPA源码

导读: 什么是Spring Data JPA? 要解释这个问题,我们先将Spring Data JPA拆成两个部分&#xff0c;即Sping Data和JPA。 从这两个部分来解释。 Spring Data是什么? 摘自: https://spring.io/projects/spring-data Spring Data’s mission is to provide a familiar and cons…

Codeforces Round #890 (Div. 2)

A.Tales of a Sort 题目大意 Alphen has an array of positive integers a a a of length n. Alphen can perform the following operation: For all i i i from 1 to n, replace a i a_i ai​ with max ⁡ ( 0 , a i − 1 ) \max(0,a_i−1) max(0,ai​−1) . Alphen …