虚拟地址空间(下)进程地址空间(上)

一.关于页表组成

1.权限(rwx)

作用:如1.让代码区变成只读的 2.写时拷贝的实现:子进程创建时其页表指向的父进程代码和数据权限都是只读的,子进程试图修改,触发错误,系统开始写时拷贝。

来源:1.可执行程序本身已经包含了区域权限信息,代码区不可写等

2.真实地址是否存在的位(isexits)

作用:节省内存空间:

1.分批加载::系统创建进程先加载进程对应磁盘内一部分数据,将页表记录位记录不存在,等进程使用这部分虚拟地址对应的数据时,再从磁盘加载到指定物理地址位置。2.挂起操作。

二.关于mm_struct初始化时怎么分配各区域的大小

1.可执行程序在编译时,各个区域已经确定,直接给mm_struct初始化,(程序内申请空间实质是扩大程序记录的堆的大小(也就是虚拟空间的大小),给mm_struct,操作系统在需要用的时候再开辟空间),执行时mm_struct给操作系统实时开辟

三.进程地址空间(上)

再谈创建进程:

写时拷贝

是什么:创建子进程,子进程实际指向的代码和数据和父进程相同,修改时再拷贝,互不干扰。

实现:创建子进程时,页表所有位置权限位设为只读,一旦子进程和父进程任意一方对共同数据进行写入,触发缺页中断,系统监测是不是需要写时拷贝,是,将数据拷贝一份,修改页表指向,修改权限。互不干扰。

再谈进程终止

1.进程正常退出:看进程退出码判断运行结果是否正常(return 0,return -1...)

2.进程意外终止:OS提前用信号终止了进程(访问非法等)。看退出信号判断情况:退出码为0则没收到信号,退出信号判断进程是否提前退出了,提前退出原因是什么(kill就是给进程信号,退出进程),正常退出了看退出结果是否正确看退出码

再谈进程等待:

回收等待的进程:子进程结束了,就要将退出信号和退出码存入PCB并等待,直到父进程回收

回收系统调用:

pid_t wait(int *status);进程一直等待,直到有它的子进程退出,

接收退出状况status(若不接受可传入空指针),返回退出进程的pid,失败时返回 -1,并设置 errno 以指示错误原因。

pid_t waitpid(pid_t pid,int *status, int options);进程等待一次,若没退出

pid为要等待的子进程(传入-1为任意),options为0为阻塞等待,WNOHANG非阻塞等待

status:

两个判断status情况的宏:bool WIFEXITED(int status)如果进程正常退出则返回真

int WEXITSTATUS(int status).如果正常退出,提取退出码

进程替换

不是创建新进程,是在原进程的基础上替换新的可执行程序的代码和数据(堆栈重新初始化),PCB不换!

创建一个已有可执行程序为基础的进程,可以先创建一个子进程,再进程替换(bash也是这么做的,只需要全部写时拷贝再替换)

补充:

1.readelf -s 可执行程序名

看可执行程序的各个区域大小

2.野指针实质是页表内没有对应映射,操作系统不给访问,运行错误

3.为什么要用虚拟地址空间

-->1.虚拟地址空间+页表保护内存

--->2.让进程以统一视角看物理内存:加载各个区里的物理地址不必连续,虚拟地址连续,进程不必分别管理一块一块。作用:让代码数据可以加载到内存的任意地址处,页表映射寻找效率高O(1)。

---->3.进程管理和内存管理在系统层面解耦合:进程创建只需创建数据结构,其余的代码加载,进程需要的内存操作(申请空间),操作系统可以先骗过进程,等到使用的时候再真进行内存操作。两者具有滞后性,可以更好的省内存,省资源。

4.环境变量为什么一直能被进程看到

进程虚拟地址空间内就有环境变量表

5.1. 打印错误的代码

#include <errno.h>

变量int errno最近函数的错误码,(依赖于最近的函数内是否设置了错误码,fopen,fork都设置了)

#include <string.h>

 char *strerror(int errnum);根据错误码返回错误原因字符串

(标准C库的功能)

5.2. 退出代码

#include<cstdlib>

void exit(int i);让进程直接退出,通过正常退出机制终止进程,设置退出码i。且刷新缓冲区(缓冲区是语言级别的概念,语言编译了维护,不是操作系统的)

_exit(int i);系统调用,退出不刷新缓冲区

exit语言封装了_exit。

6.数据段(Data Segment) 中的数据在 进程创建之前 就已经存在了。具体来说,这些数据是在 程序编译和链接时 确定的,并存储在可执行文件中。当程序启动时,操作系统会加载可执行文件,并将数据段的内容映射到进程的地址空间中。

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

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

相关文章

【区块链 + 航运物流】丰溯 - 区块链溯源平台 | FISCO BCOS 应用案例

丰溯是顺丰科技推出的区块链溯源平台&#xff0c; 采用 FISCO BCOS 底层开源框架&#xff0c; 为农副食品、 冷链生鲜等企业客户及消费 者提供关键流通节点的溯源信息服务&#xff0c;形成从源头到消费者端全链路透明的信息链。 在商贸消费领域&#xff0c; 溯源一直是保障产品…

iwebsec-SQL数字型注入

1.判断是否存在漏洞 添加and 11发现正常显示&#xff0c;添加and 12无回显条目&#xff0c;则存在sql注入漏洞 2.因为有回显&#xff0c;尝试union联合注入&#xff0c;使用order by判断出有3个字段 3.使用union联合注入查看回显位&#xff0c;发现3三个字段均有回显&#xff…

蓝桥杯每日五题第一日

蓝桥杯每日5题 问题一 班级活动 1.班级活动 - 蓝桥云课 问题描述 小明的老师准备组织一次班级活动。班上一共有 nn 名 (nn 为偶数) 同学&#xff0c;老师想把所有的同学进行分组&#xff0c;每两名同学一组。为了公平&#xff0c;老师给每名同学随机分配了一个 nn 以内的正…

STM32 —— 嵌入式系统、通用计算机系统、物联网三层架构

目录 一、嵌入式系统的概念 二、通用计算机系统与嵌入式系统的比较 用途 硬件 软件 性能与功耗 开发与维护 三、嵌入式系统与物联网的关系 四、物联网的三层架构 1. 感知层&#xff08;Perception Layer&#xff09; 2. 网络层&#xff08;Network Layer&#xff09; …

卡码网25题——掌握ACM输入输出方式(15 至 18)

刷题小记&#xff1a; 本期涉及ACM模式下栈和链表的构建与使用&#xff0c;值得学习。 卡玛网15.神秘字符&#xff08;卡玛网15.神秘字符&#xff09; 题目分析&#xff1a; 若给定2行字符串&#xff0c;其中第一个串的长度为偶数&#xff0c;现要求把第二个串插入到第一个…

前端字段名和后端不一致?解锁 JSON 映射的“隐藏规则” !!!

&#x1f680; 前端字段名和后端不一致&#xff1f;解锁 JSON 映射的“隐藏规则” &#x1f31f; 嘿&#xff0c;技术冒险家们&#xff01;&#x1f44b; 今天我们要聊一个开发中常见的“坑”&#xff1a;前端传来的 JSON 参数字段名和后端对象字段名不一致&#xff0c;会发生…

python中使用单例模式在整个程序中只创建一个数据库连接,节省资源

示例代码&#xff1a; from loguru import logger from pymongo import MongoClient from pymongo.errors import ConnectionFailurefrom llm_engineering.settings import settingsclass MongoDatabaseConnector:_instance: MongoClient | None Nonedef __new__(cls, *args,…

AI小白的第六天:必要的数学知识(一)

在学习的过程中&#xff0c;不管是上代码还是理论学习&#xff0c;其中都掺杂了一些数学知识。俗话说“磨刀不误砍柴工”&#xff0c;而我已经“误了砍柴功”了&#xff0c;现在变成了“亡羊补牢&#xff0c;为时不晚”。 线性代数 线性代数是数学的一个分支&#xff0c;主要…

【Linux】Bash是什么?怎么使用?

李升伟 整理 什么是 Bash&#xff1f; Bash&#xff08;Bourne Again Shell&#xff09;是一种 命令行解释器&#xff08;Shell&#xff09;&#xff0c;广泛用于 Unix 和 Linux 操作系统。它是 Bourne Shell&#xff08;sh&#xff09; 的增强版&#xff0c;提供了更多的功能…

Qt Creator入门

1.创建项目 选择创建项目-Application&#xff08;Qt&#xff09;-Qt Widgets Application-修改名称即可 默认创建有窗口类&#xff0c;myWidget,基类有三种选择&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog 注意&#xff1a; 名称和创建路径不能有中文、…

C语言经典代码练习题

1.输入一个4位数&#xff1a;输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个&#xff14;位数&#xff1a;");scanf("%d",&a);printf("个位&#xff1a;%d\n"…

cls(**dict(data, id=id))灵活地从一个字典生成实例,同时确保某些关键字段(如 id)被正确设置或覆盖

示例代码&#xff1a; classmethoddef from_mongo(cls: Type[T], data: dict) -> T:"""Convert "_id" (str object) into "id" (UUID object)."""if not data:raise ValueError("Data is empty.")id data.pop…

MyBatis XMLMapperBuilder 是如何将 SQL 语句解析成可执行的对象? 如何将结果映射规则解析成对应的处理器?

1. XMLMapperBuilder 如何将 SQL 语句解析成可执行对象 (MappedStatement): XMLMapperBuilder 解析 <select>, <insert>, <update>, <delete> 等 SQL 语句元素时&#xff0c;并不仅仅是简单地读取 SQL 文本&#xff0c;而是要将 SQL 语句和相关的配置…

咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

003-掌控命令行-CLI11-C++开源库108杰

首选的现代C风格命令行参数解析器! &#xff08;本课程包含两段教学视频。&#xff09; 以文件对象监控程序为实例&#xff0c;五分钟实现从命令行读入多个监控目标路径&#xff1b;区分两大时机&#xff0c;学习 CLI11 构建与解析参数两大场景下的异常处理&#xff1b;区分三…

【leetcode hot 100 124】二叉树中的最大路径和

解法一&#xff1a;&#xff08;递归&#xff09;考虑实现一个简化的函数 maxGain(node)&#xff0c;该函数计算二叉树中的一个节点的最大贡献值&#xff0c;具体而言&#xff0c;就是在以该节点为根节点的子树中寻找以该节点为起点的一条路径&#xff0c;使得该路径上的节点值…

谱分析方法

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 ima 知识库 知识库广场搜索&#…

在图像/视频中裁剪出人脸区域

1. 在图像中裁剪人脸区域 import face_alignment import skimage.io import numpy from argparse import ArgumentParser from skimage import img_as_ubyte from skimage.transform import resize from tqdm import tqdm import os import numpy as np import warnings warni…

【软考-架构】11.3、设计模式-新

✨资料&文章更新✨ GitHub地址&#xff1a;https://github.com/tyronczt/system_architect 文章目录 项目中的应用设计模式创建型设计模式结构型设计模式行为型设计模式 &#x1f4af;考试真题题外话 项目中的应用 在实际项目中&#xff0c;我应用过多种设计模式来解决不同…

使用Redis如何实现分布式锁?(超卖)

分布式锁概念 在多线程环境下&#xff0c;为了保证数据的线程安全&#xff0c;锁保证同一时刻&#xff0c;只有一个可以访问和更新共享数据。在单机系统我们可以使用 synchronized 锁、Lock 锁保证线程安全。 synchronized 锁是 Java 提供的一种内置锁&#xff0c;在单个 JVM …