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

Linuxfork,写时拷贝

1.prinf隐藏的缓冲区

1.思考:为什么会有缓冲区的存在?

2.演示及思考?

1).演示缓存区没有存在感
那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢?
我们用代码演示一下:

比如打开一个main.c,输入内容如下:

 #include <stdio.h>

int main()
 {
    printf("hello");
 }

我们运行的之后直接就打印了hello,好像没有感觉到缓冲区 的存在;
原因是因为此时程序已经结束了,它会刷新缓冲区的内容;

2)演示缓冲区的存在

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
 {
 printf("hello");
 sleep(3);
 exit(0);
}

3.强制刷新
(1)方法一:遇到\n自动刷新
printf("hello\n");
(2)使用fflush刷新屏幕
fflush(stdout);

  1. _exit与exit

exit是先刷新缓冲区,然后再调用_exit(真正的退出);
_exit直接退出,不会刷新缓冲区;

比如如下的代码:

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>

int main()
 {
 printf("hello");
 //fflush(stdout);
 sleep(3);
 _exit(0);//注意这里,不输出hello
 }

5.总结
printf将内容先写入到缓冲区中,缓冲区刷新到界面(屏幕)上的条件是:
(1)缓冲区放满
(2)缓冲区未满,强制刷新缓冲区到屏幕(方法一:\n;方法二:主动刷新:fflush(stdout));
(3)程序结束时,自动刷新缓冲区:exit方法;

6.为什么会有缓冲区的存在?

屏幕是一个硬件设备,是由操作系统来管理的,因此printf打印的时候需要调用操作系统的接口才能完成,这个时候我们需要从用户态切换到内核态,这个开销是比较大的.

2.fork复制进程:

1)shell:

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。

我们就是通过命令解释器(称为shell)(bash是命令解释器中的一种)和内核和系统进行交互的(Windows通过图形界面进行交互的);例如我们把ls交给bash,bash帮我们运行ls,然后把结果给用户;

2)fork如何复制进程?

fork是把已有的进程复制一份,当然把PCB也复制了一份,然后申请一个PID,子进程的PID=父进程的PID+1;

 

如果父子进程想要做不同的事情,那么我们通过返回值来判断;
man fork

代码如下

#include <stdio.h>
#include <unistd.h>
#include <assert.h>
#include <stdlib.h>

int main()
{
    char *s=NULL;
    int n=0;//控制父子进程执行的次数;

    pid_t id=fork();
    assert(id!=-1);

    if(id==0)//子进程
    {
        s="child";
        n=3;
    }
    else//父进程
    {
        s="parent";
        n=7;
    }
     //父子进程
    int i=0;
    for(;i<n;i++)
    {
        printf("s=%s\n",s);
        sleep(1);
    }
    exit(0);
}

父子进程是两个独立的进程,各自执行各自的代码;如果父子进程要做不一样的事情,就通过if  else返回值来操作;

3)fork的时机

fork产生的这个子进程不是从头开始执行的,而是从fork之后开始执行的,就是说fork下面的代码子进程才开始执行,具体的是说从返回值这里子进程开始执行,子进程不会再fork了,所以不会出现子进程再去fork产生一个子进程的问题.
也就是说:从返回值这里开始,父进程返回子进程的PID,子进程返回0;

4)getppid与getpid

getppid:得到一个进程的父进程的PID;
getpid:得到当前进程的PID;

man getpid;
man getppid

3.fork补充:

操作系统精髓与设计原理第101页;

4.如何学好多进程以及面试考点?

1)充分理解多进程的概念(每次程序多执行几次,多理解一下)

2)考点:

fork多以笔试的形式出现;

面试的考点:

例如:

1.我们在进程中看到的地址是进程的物理地址还是逻辑地址?(为什么这么问,单进程不分物理地址和逻辑地址吗);

2.进程同步设计(比如多进程抢夺资源)(难点,用程序实现)

3.fork与文件指针

(1)fork 以后,父进程打开的文件指针位置在子进程里面是否一样?(先open再fork)
(2)能否用代码简单的验证一下?
(3)先fork再打开文件父子进程是否共享偏移量?父进程打开的文件指针位置在子进程里面是否一样?能否用代码简单验证一下.(先fork再open会怎么样?)

4.fork+exec

5.僵死进程原因及处理方法;

5.内存管理相关概念

1.简单分页 逻辑页 物理页 页表的概念:
从哲学层次看操作系统157页(需要详细看)

2.虚拟内存:

虚拟内存提供的三个重要的能力:
1) 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,根据需要在磁盘和主存之间来回传送数据,使得能够运行比内存大的多的进程。
2) 它为每个进程提供了一致的地址空间,从而简化了存储器管理.
3) 它保护每个进程的地址空间不被其他进程破坏 .

6.写时拷贝技术:

不采用写时拷贝,如何fork?

第一:复制开销比较大;
第二:占用内存空间;
所以我们对fork复制进程的过程就做了一个优化-----写时拷贝技术;

综上,就是fork的时候,子进程直接把父进程的页表复制过来,子进程发生写入(修改)的时候才分配内存复制,然后进行相应的页表修改.

写时拷贝是一种可以推迟甚至免除拷贝数据的技术.

7.我们在进程中看到的地址是进程的物理地址还是逻辑地址?

 printf("s=%s,pid=%d,ppid=%d,n的地址为:%p\n",s,getpid(),getppid(),&n);//打印n的地址

8.进程的逻辑地址与物理地址

父子进程中n的值都不一样,那么我们为什么看到n的地址是相同的呢?

我们在进程中看到的地址就是进程的逻辑地址(进程的4G空间,从0开始,一直往上增长);

32位系统上,都有一个0-4G的地址空间:
在Linux系统上,最上面这1G由内核使用,下面3G是用户在使用;
为什么是4G呢?在32位系统上,能够寻址的范围就是2^32=4294967296字节/1000=4294976K /1000=4294M /1000=4.29 G 约等于4G  .

而我们把所有的地址都编号,

1K=2^10 ,4K=2^12
物理页面能有多少个页面呢?4G/4K=2^32 / 212=2(32-12)=2^20个页面

所以说,父子进程逻辑地址一样,但是物理地址是不一样的;

以前我们的程序都是只有一个进程,我们逻辑地址相同,那么我们的逻辑地址映射过去的物理地址肯定也是相同的一块空间,只有一个进程,就不用刻意去理解逻辑地址和物理地址的差异;对于同一进程,逻辑地址相同,物理地址肯定相同.
现在,我们的程序都是多进程的,逻辑地址相同,对应的物理地址就不一定相同了;也就是说A进程和B进程的逻辑地址相同,就不能说明物理地址一定相同,我们还需要看各自的页表,看看页表是否相同.(页表就是逻辑页和物理页的映射关系);
不同进程的逻辑地址是没有比较的意义的;

9.为什么在程序中不直接使用物理地址呢?

我们无法预知哪些物理地址是空闲的,同时空闲的也是动态变化的,程序在不断的申请释放空间中.

相关文章:

Linuxfork,写时拷贝

1.prinf隐藏的缓冲区 1.思考:为什么会有缓冲区的存在? 2.演示及思考? 1).演示缓存区没有存在感 那为什么我们感觉不到缓冲区的存在呢?我们要打印东西直接就打印了呢? 我们用代码演示一下: 比如打开一个main.c,输入内容如下: #include <stdio.h> int main() { …...

Android控件全解手册 - 自定义实现水波进度

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列...

Halcon Solution Guide I basics(4.1): Blob Analysis 自主练习

文章目录 文章专栏前言自主练习题目输出电路板焊点个数解决方案:正确率&#xff1a;90 文章专栏 我的Halcon开发 CSDN 专栏 Halcon学习 练习项目gitee仓库 CSDN Major 博主Halcon文章推荐 随笔分类 - Halcon入门学习教程 前言 为了更加熟练的掌握Halcon的练习&#xff0c;我之…...

视频网站适合租用服务器吗?

视频网站适合租用服务器吗&#xff1f; 谈到服务器租用&#xff0c;在服务器租用市场中&#xff0c;通常比较常见的用户群体有电商、外贸和视频等网站。在这里相信很多用户都有疑问&#xff1a;租用的服务器适不适合用来建立视频网站呢&#xff1f;接下来我们一起来看看吧~ 首…...

2024年度投资策略:AI大模型和半导体国产化加速

今天分享的是AI系列深度研究报告&#xff1a;《2024年度投资策略&#xff1a;AI大模型和半导体国产化加速》。 &#xff08;报告出品方&#xff1a;东方证券&#xff09; 报告共计&#xff1a;48页 前言: 行情回顾与未来展望 电子板块涨幅转正&#xff0c;信心逐渐回归。截至…...

【Amazon】创建Amazon EFS 文件系统并将其挂载到Amazon EC2实例

文章目录 1. Amazon EFS文件系统2. Amazon EFS文件系统工作原理图3. 创建Amazon EFS 文件系统操作步骤3.1 创建安全组3.2 创建 EFS 文件系统3.3 启动 EC2 实例并挂载文件系统 4.清理资源4.1 终止 EC2 实例4.2 删除 EFS 文件系统 5.参考链接 1. Amazon EFS文件系统 Amazon EFS …...

微机原理_5

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案,请将选定的答案填涂在答题纸的相应位置上。) 8086微处理器CLK引脚输入时钟信号是由(提供。 A. 8284 B. 8288 C.8287 D. 8289 2.下面4个寄存器中,不能作为间接寻址的寄存器是(…...

我的128天创作纪念日

嘿&#xff0c;大家好&#xff01;今天我想和大家聊一聊CSDN创作者128天纪念日的话题。 机缘 首先&#xff0c;让我们来谈谈机缘。作为CSDN创作者&#xff0c;我们都有自己的创作机缘。可能是因为对某个领域感兴趣&#xff0c;可能是因为想要分享自己的知识和经验&#xff0c…...

【高可用架构】Haproxy 和 Keepalived 的区别

Haproxy 和 Keepalived 的区别 1.负载均衡器介绍2.Haproxy 和 Keepalived 的基本概念和特点2.1 Haproxy2.2 Keepalived 3.Haproxy 和 Keepalived 的区别3.1 功能上的区别3.2 架构上的区别3.3 配置上的区别 4.总结 1.负载均衡器介绍 负载均衡器是一种解决高并发和高可用的常用的…...

python-opencv 人脸68点特征点检测

python-opencv 人脸68点特征点检测 不是很难&#xff0c;主要还是掉包&#xff0c;来看一下代码啊&#xff1a; # coding: utf-8 # 导包 import numpy as np import dlib import cv2class face_emotion(object):def __init__(self):# 人脸检测器对象&#xff0c;通过它拿到人…...

无线网络下VMWare+CentOS7使用桥接模式无法联通网络问题

因为最近新配了台带无线网卡的主机&#xff0c;所以准备把所有的内容都转移到新电脑上&#xff0c;其中就包括虚拟机 安装好VMWareCentOS7选择桥接模式 然后我们去修改一下网络配置 cd /etc/sysconfig/network-scripts/进入这个ifcfg-ens33文件 我们修改箭头所示内容&#xff…...

vue2.x中使用JS与路由守卫配置、vue2.x中使用TS与路由守卫的配置和vuex的配置以及TS在vue2.x中的使用说明

vue2.x 事件修饰符 <button click.stop.self"handleDelete(item)"></button>在使用 $confirm 时&#xff0c;使用 await 方式时&#xff0c;需要添加 catch 回调&#xff0c;否则无法获取 $confirm 关闭和取消时的标识值&#xff0c;并且后续代码停止执…...

C语言第三十二弹---打印整数二进制的奇数位和偶数位

使用C语言打印整数二进制的奇数位和偶数位。 思路&#xff1a;分别实现奇数位和偶数位&#xff0c;那么二进制只有0 和 1 那么如何判断一个数的二进制位是0还是1呢?那我们就可以使用位操作符&与1比较&#xff0c;都是1证明该二进制位是1&#xff0c;为0证明该二进制位是0…...

车载电子电器架构 ——电子电气架构设计方案概述

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 注:本文1万多字,认证码字,认真看!!! 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证…...

《C++PrimePlus》第10章 对象和类

10.1 过程性编程和面向对象编程 10.2 抽象和类 10.3 类的构造函数和析构函数 类的定义和使用&#xff08;买卖股票&#xff09; 头文件stock10.h #ifndef __STOCK00__H__ #define __STOCK00__H__#include <string>class Stock { // pravate的内容只能通过public访问 p…...

实现极坐标图表QPolarChart的角度轴范围是[0,360]时,0度在水平右侧

目录 参考角度轴范围是[0,360]时&#xff0c;0度在水平右侧.h.cpp 参考 Qt数据可视化(QPolarChart雷达图) 默认QPolarChart的范围是[0,360]时&#xff0c;0度在垂直上方 如官方例子QValueAxis角度轴范围是[-100,100] 角度轴范围是[0,360]时&#xff0c;0度在水平右侧 原理&am…...

讲述 什么是鸿蒙 为什么需要鸿蒙 为什么要学习鸿蒙

首先 我们为什么要学习鸿蒙开发&#xff1f; 因为 鸿蒙发展前景巨大 鸿蒙自发布依赖 一直受社会各界关注 强两百的 App厂商 大部分接受了与鸿蒙的合作 硬件也有非常多与鸿蒙合作的厂商 鸿蒙的合作企业基本已经覆盖整个互联网客户的主流需求 所以鸿蒙的崛起不过是早晚的问题 …...

【深度学习笔记】05 线性回归

线性回归 线性回归基于几个简单的假设&#xff1a; 首先&#xff0c;假设自变量 x \mathbf{x} x和因变量 y y y之间的关系是线性的&#xff0c; 即 y y y可以表示为 x \mathbf{x} x中元素的加权和&#xff0c;这里通常允许包含观测值的一些噪声&#xff1b; 其次&#xff0c;我…...

二叉树算法—后继节点

与其明天开始&#xff0c;不如现在行动&#xff01; 文章目录 1 后继节点1.1 解题思路1.2 代码实现 &#x1f48e;总结 1 后继节点 1.1 解题思路 二叉树节点结构定义如下&#xff1a; public static class Node { public int cal; public Node left; public Node right; public…...

C语言做一个恶作剧关机程序

一、项目介绍 C语言实现一个简单的"流氓软件"&#xff0c;一个可以强制关机恶作剧关机程序&#xff0c;输入指定指令可以解除 二、运行截图 然后当你输入“n”才可以解锁关机。 三、完整源码 #include <stdlib.h> #include <stdio.h> #include <s…...

Mac + iPhone 绝配?这5个神级联动技巧真香!

如果你手边有一台Mac和一部iPhone&#xff0c;那你可能已经体会到了什么叫“生态绑架”——这可不是贬义&#xff0c;而是那种用过就回不去的顺滑。从在电脑上回手机短信&#xff0c;到复制一段话直接贴在另一块屏幕上&#xff0c;苹果用一套闭环的魔法&#xff0c;让你心甘情愿…...

吃灰安卓机变身 OpenClaw 服务器 — 完整手册乙

前言 在使用 kubectl get $KIND -o yaml 查看 k8s 资源时&#xff0c;输出结果中包含大量由集群自动生成的元数据&#xff08;如 managedFields、resourceVersion、uid 等&#xff09;。这些信息在实际复用 yaml 清单时需要手动清理&#xff0c;增加了额外的工作量。 使用 kube…...

学习困难的情绪困扰解决方案是什么?

社交障碍的干预方法与学习效果关係分析 社交障碍不仅影响到学生的日常生活&#xff0c;也对他们的学习效果产生深远影响。有效的社交障碍干预方法可以帮助学生提升与同伴的互动能力&#xff0c;从而增加课堂参与感。通过心理辅导和实地训练&#xff0c;学生能够逐步克服内心的羞…...

一款基于 .NET 开源、跨平台应用程序自动升级组件讼

基础示例&#xff1a;单工作表 Excel 转 TXT 以下是将一个 Excel 文件中的第一个工作表转换为 TXT 的完整步骤&#xff1a; 1. 加载并读取Excel文件 from spire.xls import * from spire.xls.common import * workbook Workbook() workbook.LoadFromFile("示例.xlsx"…...

从零构建8086汇编IO交互程序:环境搭建、中断调用与模块化设计

1. 环境搭建&#xff1a;让8086汇编在现代系统上跑起来 第一次接触8086汇编时&#xff0c;最让我头疼的不是汇编语法本身&#xff0c;而是怎么让这些古董代码在现代电脑上运行。我的主力机是Win11 64位系统&#xff0c;而8086汇编需要16位DOS环境——这就像试图在智能手机上运行…...

include-media插件生态:8个实用插件提升开发效率

include-media插件生态&#xff1a;8个实用插件提升开发效率 【免费下载链接】include-media &#x1f4d0; Simple, elegant and maintainable media queries in Sass 项目地址: https://gitcode.com/gh_mirrors/in/include-media include-media是一个功能强大的Sass媒…...

BetterGI原神AI助手:300%效率提升的终极自动化游戏指南

BetterGI原神AI助手&#xff1a;300%效率提升的终极自动化游戏指南 【免费下载链接】better-genshin-impact &#x1f4e6;BetterGI 更好的原神 - 自动拾取 | 自动剧情 | 全自动钓鱼(AI) | 全自动七圣召唤 | 自动伐木 | 自动刷本 | 自动采集/挖矿/锄地 | 一条龙 | 全连音游 - …...

Spring Data 2026 新特性深度解析:数据访问的新高度

Spring Data 2026 新特性深度解析&#xff1a;数据访问的新高度别叫我大神&#xff0c;叫我 Alex 就好。今天我们来聊聊 Spring Data 2026 的新特性&#xff0c;这个版本带来了许多令人兴奋的功能&#xff0c;让数据访问变得更加简单和高效。一、Spring Data 2026 概述 Spring …...

论文图表不用手画!Paperxie AI 科研绘图:让学术可视化效率拉满

paperxie-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图https://www.paperxie.cn/drawinghttps://www.paperxie.cn/drawing 一、 科研人的 “画图焦虑”&#xff0c;终于有解了 做科研、写论文&#xff0c;最磨人的从来不是实验本身&#xff0c;而是画图…...

别再只盯着复现了!从CVE-2022-10270看企业内网向日葵客户端的隐形风险与排查指南

企业内网向日葵客户端隐形风险排查实战手册 向日葵远程控制软件在企业内网中的广泛使用&#xff0c;为IT运维带来了便利&#xff0c;同时也埋下了安全隐患。2022年曝光的CVE-2022-10270漏洞让企业安全团队意识到&#xff0c;仅依靠终端用户自主更新远远不够。本文将系统性地介绍…...