班级网站建设流程步骤/武汉网站排名提升

班级网站建设流程步骤,武汉网站排名提升,如何制作一个手机网站,单位邮箱怎么申请fork复制进程 fork通过以下步骤来复制进程: 分配新的进程控制块:内核为新进程分配一个新的进程控制块(PCB),用于存储进程的相关信息,如进程 ID、状态、寄存器值、内存指针等。复制进程地址空间&#xff1…

fork复制进程

fork通过以下步骤来复制进程:

  1. 分配新的进程控制块:内核为新进程分配一个新的进程控制块(PCB),用于存储进程的相关信息,如进程 ID、状态、寄存器值、内存指针等。
  2. 复制进程地址空间:将父进程的地址空间(包括代码段、数据段、堆和栈等)复制到新进程的地址空间中。这意味着新进程将拥有与父进程相同的程序代码和数据。
  3. 复制文件描述符表:父进程打开的文件描述符在子进程中也会被复制,使得子进程可以访问相同的文件资源。
  4. 设置进程状态和 ID:新进程被设置为就绪状态,等待被调度执行。同时,内核为子进程分配一个唯一的进程 ID。
  5. 返回控制:fork系统调用在父进程和子进程中都返回。在父进程中,返回值是子进程的进程 ID;在子进程中,返回值是 0。通过检查返回值,父进程和子进程可以区分彼此,并执行不同的代码路径。

简单来说:fork是把已有的进程复制一份,把对应父进程的PCB也复制了一份,然后申请一个PID,子进程,子进程的PID=父进程的PID+1;

通过这些步骤,fork创建了一个与父进程几乎完全相同的子进程,子进程可以独立于父进程运行,并可以在适当的时候执行自己的代码逻辑。

在Linux上示例:

创建一个main.c,通过if  else返回值来操作父子进程做不一样的事情:

#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);}

多运行几次就会发现每次执行结果不完全一定:

要解释这执行结果不同的原因,我们先了解下printf的缓冲区机制

下面介绍一下printf的缓冲区机制

printf函数通常会将输出先存储在缓冲区中,而不是立即输出到终端或其他目标设备。这样做的目的是为了提高输出效率,减少系统调用的次数。例如,当多次调用printf输出少量数据时,这些数据会先在缓冲区中积累,直到缓冲区满或者遇到特定的条件(如换行符\n),才会将缓冲区中的内容一次性输出。

在Linux上用代码演示一下:

创建一个main.c文件

使用exit(0)命令退出程序

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

编译后运行,结果是三秒后输出hello(注意这里hello后没有加\n,\n会刷新缓冲区,后面会详细总结)

原因是程序执行printf时先将hello放到缓冲区,不是直接打印到屏幕上,然后执行sleep(3)休眠3秒,然后执行到exit(0)时先刷新缓冲区,此时屏幕上显示hello,随后程序结束运行。

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

总结: printf将内容先写入到缓冲区中,缓冲区刷新到界面(屏幕)上的条件是:

(1)缓冲区放满

(2)缓冲区未满,强制刷新缓冲区到屏幕(方法一:\n;方法二:主动刷新:fflush(stdout));

(3)程序结束时,自动刷新缓冲区:exit方法

了解printf缓冲区这一特点后便清楚fork实际的运行结果不确定的原因了:

当使用fork创建子进程时,子进程会继承父进程的内存空间,包括printf函数的缓冲区。如果在父进程中printf了一些内容但缓冲区尚未刷新,那么在fork之后,子进程中也会有一份相同的未刷新缓冲区内容。这可能导致一些意外的输出结果。例如,如果父进程在fork之前调用printf输出了一些字符串但没有换行,然后fork创建了子进程,接着父进程和子进程都继续执行,那么可能会出现父进程和子进程的输出混合在一起的情况,因为它们共享了原来的缓冲区内容,并且在后续的执行中可能会各自刷新缓冲区。

fork的时机:

fork产生的这个子进程不是从头开始执行的,而是从fork之后开始执行的,就是说子进程直接从fork下面的代码开始执行,具体的是说从得到fork的返回值后子进程开始执行,子进程不会再fork了,所以不会出现子进程再去fork产生一个子进程的问题. 也就是说:fork返回值语句,父进程fork返回子进程的PID,子进程fork返回0,二者分别独立执行各自的程序。

补充系统调用函数:getppid和getpid(头文件<unistd.h>

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

getpid:得到当前进程的PID;

我们在原先的代码中增加这两个函数调用:

#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,pid=%d,ppid=%d\n",s,getpid(),getppid());sleep(1);}exit(0);}

运行结果如下图:

观察发现父进程的父进程pid对应bash的pid,这里的bash是系统命令解释器:

此处拓展介绍一下命令解释器:

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

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

 回归正题——fork

fork背后多采用写时拷贝技术

写时拷贝技术

写时拷贝是一种延迟拷贝的策略。在fork创建子进程时,并不立即复制父进程的所有内存页面,而是让父进程和子进程共享这些页面,并将这些页面标记为只读。只有当父进程或子进程试图对某个共享页面进行写操作时,操作系统才会为该页面分配新的内存空间,并将原页面的内容复制到新的页面中,然后让进行写操作的进程在新的页面上进行修改。

 如果不使用写时拷贝技术

第一:复制开销比较大; 第二:占用内存空间;

使用写时拷贝技术:

父子进程逻辑地址一样,但是物理地址是不一样的(多进程逻辑地址相同,对应的物理地址不一定相同)

简单来说就是fork的时候,子进程直接把父进程的页表复制过来,子进程发生写入(修改)的时候才分配内存复制,然后进行相应的页表修改,因此写时拷贝是一种可以推迟甚至免除拷贝数据的技术。

内容来源内核与设计22页:


到此fork及其背后运用的写时拷贝技术就介绍完啦!

如果觉得有用可以点个赞,谢谢支持呀,会持续输出更新知识点,感兴趣可以关注一下!

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

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

相关文章

TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket

DAY13.1 Java核心基础 TCP协议 TCP 协议是面向连接的运算层协议&#xff0c;比较复杂&#xff0c;应用程序在使用TCP协议之前必须建立连接&#xff0c;才能传输数据&#xff0c;数据传输完毕之后需要释放连接 就好比现实生活中的打电话&#xff0c;首先确保电话打通了才能进…

Web爬虫利器FireCrawl:全方位助力AI训练与高效数据抓取

Web爬虫利器FireCrawl&#xff1a;全方位助力AI训练与高效数据抓取 一、FireCrawl 项目简介二、主要功能三、FireCrawl应用场景1. 大语言模型训练2. 检索增强生成&#xff08;RAG&#xff09;&#xff1a;3. 数据驱动的开发项目4. SEO 与内容优化5. 在线服务与工具集成 四、安装…

【C#】CS学习之Modbus通讯

摘要 本文详细描述了如何在在C#的Winform应用程序中使用NModbus库实现Modbus通讯&#xff0c;包括读取保持寄存器、以及相应的UI界面设计和事件处理。 前言 ​应用场景 Modbus 从站广泛应用于工业自动化领域&#xff1a; 1、传感器数据采集&#xff08;如温度、压力等&#xf…

windows环境下NER Python项目环境配置(内含真的从头安的perl配置)

注意 本文是基于完整项目的环境配置&#xff0c;即本身可运行项目你拿来用 其中有一些其他问题&#xff0c;知道的忽略即可 导入pycharm基本包怎么下就不说了&#xff08;这个都问&#xff1f;给你一拳o(&#xff40;ω*)o&#xff09; 看perl跳转第5条 1.predict报错多个设备…

使用DDR4控制器实现多通道数据读写(四)

在创建完DDR4的仿真模型后&#xff0c;我们为了实现异步时钟的读写&#xff0c;板卡中在PL端提供了一组差分时钟&#xff0c;可以用它通过vivado中的Clock Wizard IP核生成多个时钟&#xff0c;在这里生成两个输出时钟&#xff0c;分别作为用户的读写时钟&#xff0c;这样就可以…

企业数字化20项目规划建设方案微服务场景与数据应用(50页PPT)(文末有下载方式)

资料解读&#xff1a;企业数字化 2.0 项目规划建设方案微服务场景与数据应用 详细资料请看本解读文章的最后内容。 在数字化浪潮的席卷下&#xff0c;企业数字化转型已成为提升竞争力、实现可持续发展的关键路径。这份《企业数字化 2.0 项目规划建设方案微服务场景与数据应用》…

蓝桥杯之AT24C02的页写页读

一、原理&#xff1a; 1、页写&#xff1a;一次性向AT24C02里的多个数据存储单元地址写入多个数据 &#xff08;1&#xff09;在AT24C02的页写模式下&#xff0c;每次写入数据后&#xff0c;存储单元地址会自动加1。 &#xff08;2&#xff09;一页有8个数据存储单元&#xff…

【C++网络编程】第2篇:简单的TCP服务器与客户端

一、TCP通信流程回顾 1. 服务器端流程 1. 创建Socket → socket() 2. 绑定地址和端口 → bind() 3. 开始监听 → listen() 4. 接受客户端连接 → accept() 5. 接收/发送数据 → recv()/send() 6. 关闭连接 → closesocket()2. 客户端流程 1. 创建Socket → socket() 2. 连接…

Spring IoC DI入门

一、Spring&#xff0c;Spring Boot和Spring MVC的联系及区别 Spring是另外两个框架的基础&#xff0c;是Java生态系统的核心框架&#xff0c;而SpringMVC是Spring 的子模块&#xff0c;专注于 Web 层开发&#xff0c;基于 MVC 设计模式&#xff08;模型-视图-控制器&#xff…

【uniapp】记录tabBar不显示踩坑记录

由于很久没有使用uniapp了&#xff0c;官方文档看着又杂乱&#xff0c;底部tab导航栏一直没显示&#xff0c;苦思许久&#xff0c;没有发现原因&#xff0c;最后网上搜到帖子&#xff0c;list里的第一个数据&#xff0c;pages 的第一个 path 必须与 tabBar 的第一个 pagePath 相…

Zabbix安装(保姆级教程)

Zabbix 是一款开源的企业级监控解决方案&#xff0c;能够监控网络的多个参数以及服务器、虚拟机、应用程序、服务、数据库、网站和云的健康状况和完整性。它提供了灵活的通知机制&#xff0c;允许用户为几乎任何事件配置基于电子邮件的告警&#xff0c;从而能够快速响应服务器问…

穿透递归的本质:从无限梦境到可控魔法的蜕变之路

穿透递归的本质&#xff1a;从无限梦境到可控魔法的蜕变之路&#xff08;C实现&#xff09; 一、递归&#xff1a;程序员的盗梦空间 在计算机科学的宇宙中&#xff0c;递归是最接近魔法本质的编程范式。它像一面镜子中的镜子&#xff0c;引导我们通过自我相似性破解复杂问题。…

1.5.4 掌握Scala内建控制结构 - 条件循环

本次实战主要围绕Scala语言中的内建控制结构&#xff0c;特别是条件循环进行学习和实践。通过while循环和do-while循环两种结构&#xff0c;分别实现了计算1到100的累加和以及打印所有水仙花数的任务。在while循环中&#xff0c;首先定义了初始条件和循环条件&#xff0c;然后通…

MySQL程序

博主主页: 码农派大星. 数据结构专栏:Java数据结构 数据库专栏:数据库 JavaEE专栏:JavaEE 软件测试专栏:软件测试 关注博主带你了解更多知识 1. mysqld (MySQL服务器) mysqld也被称为MySQL服务器&#xff0c;是⼀个多线程程序&#xff0c;对数据⽬录进⾏访问管理(包含数据库…

0321美团实习面试——技能大致内容

专业技能 1.掌握盒⼦模型&#xff0c;Flex响应式布局和BFC等问题 盒⼦模型 Flex布局 媒体查询 结合Handleresize.ts监听设备 BFC 2.掌握原型链&#xff0c;异步&#xff0c;事件循环和闭包等问题 原型链 异步 class Promise {static resolve(value) {if (value instanceof…

分布式任务调度

今天我们讲讲分布式定时任务调度—ElasticJob。 一、概述 1、什么是分布式任务调度 我们可以思考⼀下下⾯业务场景的解决⽅案: 某电商平台需要每天上午10点&#xff0c;下午3点&#xff0c;晚上8点发放⼀批优惠券 某银⾏系统需要在信⽤卡到期还款⽇的前三天进⾏短信提醒 某…

STM32-汇编2、外设

1.异常处理 reserved保留 &#xff1b;将所有异常都初始化成一个函数 2.nop 空指令&#xff0c;什么不干&#xf…

汇能感知高品质的多光谱相机VSC02UA

VSC02UA概要 VSC02UA是一款高品质的200万像素的光谱相机&#xff0c;适用于工业检测、农业、医疗等领域。VSC02UA 包含 1600 行1200 列有源像素阵列、片上 10 位 ADC 和图像信号处理器。它带有 USB2.0 接口&#xff0c;配合专门的电脑上位机软件使用&#xff0c;可进行图像采集…

多模态RAG框架(二)OmniSearch (Self-adaptive Planning Agent) and Dynamic VQA Dataset

OmniSearch&#xff1a;Benchmarking Multimodal RAG with Dynamic VQA Dataset and Self-adaptive Planning Agent 文章链接&#xff1a;2411.02937 Github链接&#xff1a;Alibaba-NLP/OmniSearch: Repo for Benchmarking Multimodal Retrieval Augmented Generation with …

Multisim学习-04 示波器的使用

我们选择一个信号源来说明示波器的使用。 模拟电路中平常一般用ac&#xff0c;am&#xff0c;fm&#xff0c;clock就可以演示了。 截图说明&#xff1a; 1&#xff09;波的周期时长&#xff0c;首先应该调整这个参数&#xff0c;它的倒数就是频率。这个参数如果不适合&#xf…