2024-09-28 地址空间与进程控制

一、进程地址空间 Pt.2

同一个变量,地址相同,其实是虚拟地址相同,内容不同其实是被映射到了不同的物理地址

1. 页表

内存保护与页表标志位
        在操作系统中,页表用于管理内存的访问权限。每个页表项通常包含一组标志位,这些标志位决定了内存页面可以进行哪些类型的操作。例如,“rwx”标志位分别表示读(r)、写(w)和执行(x)权限。

字符串常量所在的内存区域
        字符串常量 "hello" 通常被放置在程序的只读数据段中。这个段的主要特点是只读,不允许写入操作。在页表中,对应于这个内存区域的页表项会被设置成只读(r-),不允许写(w)和执行(x)操作。

为什么 char* str = "hello"; *str = 'H'; 会崩溃?
        当你执行 char* str = "hello"; *str = 'H'; 时,str 指向了一个只读段的起始地址。在这个地址处,你试图进行写入操作 *str = 'H';。然而,由于页表项中的写保护标志位(w)没有被设置,操作系统不允许对该内存区域进行写入操作。当你的程序试图写入一个只读的内存区域时,操作系统会抛出一个异常(通常是段错误,Segmentation Fault),因为这违反了内存保护机制。

 存在位(Present Bit):指示该页是否存在于物理内存中。
        通过检查存在位,操作系统能够决定何时加载页、何时挂起页,从而动态地调整内存的使用。这样一来,系统能够更高效地利用有限的物理内存,减少不必要的内存占用。

2. 地址空间 mm_struct

mm_struct 是一个重要的结构体,用于表示一个进程的内存管理信息,包括虚拟地址空间的布局、页表、内存映射等。每个进程都有一个 mm_struct 实例,内核通过它来跟踪该进程的内存使用情况。

可执行程序编译的时候,各个区域的大小信息已经有了。

当一个新进程被创建时,内核会分配一个 mm_struct 实例并初始化它的各个成员,比如设置虚拟地址范围、页表等。这一步骤是确保进程能够正确使用其内存空间的重要环节。如果没有正确初始化,就可能导致进程在访问其地址空间时出现问题,甚至导致系统崩溃。
 

可执行程序:(1)分段;(2)包含属性。
操作系统(进程管理)和编译器、编译原理、可执行程序也有关系。

【Q】当程序请求堆内存时,本质上是在开辟物理内存吗?
【A】不是直接开辟物理内存。当程序请求堆内存时,操作系统实际上是在虚拟内存空间中分配一块区域给这个请求。MMU(内存管理单元)会将程序使用的虚拟地址空间映射到实际的物理内存上。这意味着操作系统首先会在虚拟内存中为请求分配地址空间,并调整堆的大小;而真正的物理内存页只有在数据实际需要被访问时,才会由操作系统进行分配和映射。这种方式提高了内存资源的管理和利用效率。

3. 虚拟地址空间 + 页表:保护内存

【Q】什么是野指针?为什么有野指针程序崩溃了?

【A】指针指向的虚拟地址不对。不符合权限或者不存在正确映射,系统把该进程杀掉了。

4. 其他

(1)进程管理 和 内存管理 在系统层面上 解耦合 了。

进程管理负责创建、调度和终止进程,维护进程状态;而内存管理负责分配、回收和保护内存资源。虽然它们在操作系统中密切相关,但可以独立发展和优化。虚拟内存技术允许操作系统为每个进程提供一个独立的地址空间,即使这些进程实际上共享相同的物理内存。这不仅增强了安全性,也使得进程管理可以独立于实际内存资源的分配情况。

(2)让进程以统一的视角看待物理内存。

【Q】可执行程序的代码和数据可以加载到物理内存的任意位置还是必须加载到特定位置?

【A】任意位置都可,除了极少数特殊情况。

把“无序”变“有序”


地址空间本质是一个struct mm_struct。

上述内容都是OS自动完成的,只要把进程管理好了,地址空间自然就管理好了。

【Q】全局变量、字符常量具有全局性,在程序运行期间都会有效,为什么?

【A】在地址空间中,随着进程,一直存在。全局变量的虚拟地址可以一直被大家看到。


二、进程控制

1. 进程创建

更新权限为只读 ➡️ 子进程写入 ➡️ 触发了系统错误 ➡️ 缺页中断,进行系统检测 ➡️ 如果判定是否需要进行写时拷贝 ➡️ 如是,申请内存,发生拷贝,修改页表,恢复执行、读写权限(父子进程权限都被修改)

【Q】为什么要写时拷贝?

【A】因为 写入操作 != 对目标区域进行覆盖的操作,如:count++。

2. 进程终止

(1)退出码

main函数的返回值返回给父进程或者系统。

echo $? 命令行中最近一个程序退出时对应的退出码。

紧跟上次第二次用 echo $? 为何返回0?
因为 echo $? 本身也是一个程序执行

退出码:表示错误原因,0表示成功,非0表示错误
为什么失败?用不同的数字约定或表明出错的原因

提供的(通常指C++):perror, strerror, errno

Linux中的错误码:0 ~ 133

errnum = 0, its errstr = Success
errnum = 1, its errstr = Operation not permitted
errnum = 2, its errstr = No such file or directory
errnum = 3, its errstr = No such process
errnum = 4, its errstr = Interrupted system call
errnum = 5, its errstr = Input/output error
errnum = 6, its errstr = No such device or address
errnum = 7, its errstr = Argument list too long
errnum = 8, its errstr = Exec format error
errnum = 9, its errstr = Bad file descriptor
errnum = 10, its errstr = No child processes
errnum = 11, its errstr = Resource temporarily unavailable
errnum = 12, its errstr = Cannot allocate memory
errnum = 13, its errstr = Permission denied
errnum = 14, its errstr = Bad address
errnum = 15, its errstr = Block device required
errnum = 16, its errstr = Device or resource busy
errnum = 17, its errstr = File exists
errnum = 18, its errstr = Invalid cross-device link
errnum = 19, its errstr = No such device
errnum = 20, its errstr = Not a directory
errnum = 21, its errstr = Is a directory
errnum = 22, its errstr = Invalid argument
errnum = 23, its errstr = Too many open files in system
errnum = 24, its errstr = Too many open files
errnum = 25, its errstr = Inappropriate ioctl for device
errnum = 26, its errstr = Text file busy
errnum = 27, its errstr = File too large
errnum = 28, its errstr = No space left on device
errnum = 29, its errstr = Illegal seek
errnum = 30, its errstr = Read-only file system
errnum = 31, its errstr = Too many links
errnum = 32, its errstr = Broken pipe
errnum = 33, its errstr = Numerical argument out of domain
errnum = 34, its errstr = Numerical result out of range
errnum = 35, its errstr = Resource deadlock avoided
errnum = 36, its errstr = File name too long
errnum = 37, its errstr = No locks available
errnum = 38, its errstr = Function not implemented
errnum = 39, its errstr = Directory not empty
errnum = 40, its errstr = Too many levels of symbolic links
errnum = 41, its errstr = Unknown error 41
errnum = 42, its errstr = No message of desired type
errnum = 43, its errstr = Identifier removed
errnum = 44, its errstr = Channel number out of range
errnum = 45, its errstr = Level 2 not synchronized
errnum = 46, its errstr = Level 3 halted
errnum = 47, its errstr = Level 3 reset
errnum = 48, its errstr = Link number out of range
errnum = 49, its errstr = Protocol driver not attached
errnum = 50, its errstr = No CSI structure available
errnum = 51, its errstr = Level 2 halted
errnum = 52, its errstr = Invalid exchange
errnum = 53, its errstr = Invalid request descriptor
errnum = 54, its errstr = Exchange full
errnum = 55, its errstr = No anode
errnum = 56, its errstr = Invalid request code
errnum = 57, its errstr = Invalid slot
errnum = 58, its errstr = Unknown error 58
errnum = 59, its errstr = Bad font file format
errnum = 60, its errstr = Device not a stream
errnum = 61, its errstr = No data available
errnum = 62, its errstr = Timer expired
errnum = 63, its errstr = Out of streams resources
errnum = 64, its errstr = Machine is not on the network
errnum = 65, its errstr = Package not installed
errnum = 66, its errstr = Object is remote
errnum = 67, its errstr = Link has been severed
errnum = 68, its errstr = Advertise error
errnum = 69, its errstr = Srmount error
errnum = 70, its errstr = Communication error on send
errnum = 71, its errstr = Protocol error
errnum = 72, its errstr = Multihop attempted
errnum = 73, its errstr = RFS specific error
errnum = 74, its errstr = Bad message
errnum = 75, its errstr = Value too large for defined data type
errnum = 76, its errstr = Name not unique on network
errnum = 77, its errstr = File descriptor in bad state
errnum = 78, its errstr = Remote address changed
errnum = 79, its errstr = Can not access a needed shared library
errnum = 80, its errstr = Accessing a corrupted shared library
errnum = 81, its errstr = .lib section in a.out corrupted
errnum = 82, its errstr = Attempting to link in too many shared libraries
errnum = 83, its errstr = Cannot exec a shared library directly
errnum = 84, its errstr = Invalid or incomplete multibyte or wide character
errnum = 85, its errstr = Interrupted system call should be restarted
errnum = 86, its errstr = Streams pipe error
errnum = 87, its errstr = Too many users
errnum = 88, its errstr = Socket operation on non-socket
errnum = 89, its errstr = Destination address required
errnum = 90, its errstr = Message too long
errnum = 91, its errstr = Protocol wrong type for socket
errnum = 92, its errstr = Protocol not available
errnum = 93, its errstr = Protocol not supported
errnum = 94, its errstr = Socket type not supported
errnum = 95, its errstr = Operation not supported
errnum = 96, its errstr = Protocol family not supported
errnum = 97, its errstr = Address family not supported by protocol
errnum = 98, its errstr = Address already in use
errnum = 99, its errstr = Cannot assign requested address
errnum = 100, its errstr = Network is down
errnum = 101, its errstr = Network is unreachable
errnum = 102, its errstr = Network dropped connection on reset
errnum = 103, its errstr = Software caused connection abort
errnum = 104, its errstr = Connection reset by peer
errnum = 105, its errstr = No buffer space available
errnum = 106, its errstr = Transport endpoint is already connected
errnum = 107, its errstr = Transport endpoint is not connected
errnum = 108, its errstr = Cannot send after transport endpoint shutdown
errnum = 109, its errstr = Too many references: cannot splice
errnum = 110, its errstr = Connection timed out
errnum = 111, its errstr = Connection refused
errnum = 112, its errstr = Host is down
errnum = 113, its errstr = No route to host
errnum = 114, its errstr = Operation already in progress
errnum = 115, its errstr = Operation now in progress
errnum = 116, its errstr = Stale file handle
errnum = 117, its errstr = Structure needs cleaning
errnum = 118, its errstr = Not a XENIX named type file
errnum = 119, its errstr = No XENIX semaphores available
errnum = 120, its errstr = Is a named type file
errnum = 121, its errstr = Remote I/O error
errnum = 122, its errstr = Disk quota exceeded
errnum = 123, its errstr = No medium found
errnum = 124, its errstr = Wrong medium type
errnum = 125, its errstr = Operation canceled
errnum = 126, its errstr = Required key not available
errnum = 127, its errstr = Key has expired
errnum = 128, its errstr = Key has been revoked
errnum = 129, its errstr = Key was rejected by service
errnum = 130, its errstr = Owner died
errnum = 131, its errstr = State not recoverable
errnum = 132, its errstr = Operation not possible due to RF-kill
errnum = 133, its errstr = Memory page has hardware error
(2)进程终止的方式

① main 函数 return

② exit() 是一个标准库函数,定义在 <stdlib.h> 中。它的主要用途是从当前程序中退出,并且通知父进程有关退出的状态码。当调用 exit() 时,会触发以下行为:
        清理资源:自动调用已注册的终止处理程序(cleanup handlers),
                          这些处理程序通常是通过 atexit() 注册的。
        缓冲区刷新:对标准 I/O 流进行缓冲区的刷新操作,确保未完成的输出被写入到文件或设备。
        通知父进程:向父进程发送一个信号,指示该进程已结束,并提供一个退出状态码。

③ _exit() 是一个系统调用,定义在 <unistd.h> 中。它比 exit() 更底层,主要用于直接终止进程而不做额外的清理工作。具体来说:
        直接终止:立即终止进程,不会执行任何标准库提供的清理工作。
        不刷新缓冲区:不刷新标准 I/O 缓冲区,这意味着任何未完成的输出将被丢弃。
        不通知父进程:直接向内核报告进程已结束,并传递退出状态码给父进程。
【注】这个缓冲区,一定不在操作系统内部,而是语言级缓冲区(C/C++)

3. 进程等待

回收子进程的僵尸状态

wait 函数的作用就是用来等待任意一个子进程,可以返回子进程的 pid (大于0成功,小于0失败)。

对于 waitpid 的参数而言,
        pid > 0 即指定一个子进程,pid == -1 即为任意子进程
        wait(-1, nullptr, 0) 等同于 wait(nullptr)

        wstatus:不仅仅包含进程退出码。
                        帮助父进程获取子进程正常退出的信息(输出型),
                        32个 bit 位,是一个位图。
                        只考虑低16位,下标15 ~ 8对应的元素是正常退出的退出码。

一般而言,父进程创建子进程,父进程就要等待子进程(等待的时候,子进程不退,父进程就会阻塞在 wait 函数内部),直至子进程结束。

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

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

相关文章

二:Python学习笔记--基础知识(1) 变量,关键字,数据类型,赋值运算符,比较运算符

目录 1. 变量 2. python关键字 3. python数据类型 3.1 数字类型 整型 int 浮点型 float 内置函数-type 3.2 字符串类型 3.3 布尔类型 3.4 空类型 3.5 列表类型 3.6 元组类型 3.7 字典类型 4. python赋值运算 5. python比较运算符 1. 变量 组成&#xff1a;必须是数…

基于SSM的BBS社区论坛系统源码

运行环境&#xff1a;ideamysql5.7jdk8maven 使用技术&#xff1a;ssmmysqlshirolayui 功能模块&#xff1a;用户管理、模板管理、帖子管理、公告管理、权限管理等

yolov9目标检测/分割预测报错AttributeError: ‘list‘ object has no attribute ‘device‘常见汇总

这篇文章主要是对yolov9目标检测和目标分割预测测试时的报错&#xff0c;进行解决方案。 在说明解决方案前&#xff0c;严重投诉、吐槽一些博主发的一些文章&#xff0c;压根没用的解决方法&#xff0c;也不知道他们从哪里抄的&#xff0c;误人子弟、浪费时间。 我在解决前&…

Lampiao靶机入侵实战

07-Lampiao靶机入侵实战 一、扫描采集信息 1、获取IP地址 nmap -sn 192.168.81.0/24获得IP地址为&#xff1a;192.168.81.1282、获取端口信息 由于nmap默认情况下只扫描常用的1000个端口&#xff0c;覆盖面并不全&#xff0c;所以建议全端口扫描 nmap -p 1-65535 192.168.…

DiffusionDet: Diffusion Model for Object Detection—扩散模型检测论文解析

DiffusionDet: Diffusion Model for Object Detection—扩散模型检测论文解析 这是一篇发表在CVPR 2023的一篇论文&#xff0c;因为自己本身的研究方向是目标跟踪&#xff0c;之前看了一点使用扩散模型进行多跟踪的论文&#xff0c;里面提到了DiffusionDet因此学习一下。 论文…

读数据工程之道:设计和构建健壮的数据系统21数据获取

1. 数据获取 1.1. 数据获取是将数据从一个地方移动到另一个地方的过程 1.1.1. 数据获取与系统内部获取是不同的 1.2. 数据获取是数据工程生命周期中将数据从源系统移入存储的一个中间步骤 1.3. 数据集成则是将来自不同来源系统的数据组合到一个新的数据集 1.4. 数据获取的…

数字后端零基础入门系列 | Innovus零基础LAB学习Day6

今天没有具体的数字IC后端lab实验。今天的重点是熟悉掌握静态时序分析STA中的几类timing path以及setup和hold检查机制&#xff08;包含setup和hold计算公式&#xff09;。 芯片流片失败的那些故事 数字后端零基础入门系列 | Innovus零基础LAB学习Day5 等大家把今天内容学习…

QT获取本机所有IP地址以及修改本机IP(注意区分Windows和Linux环境)

QT 获取本机所有 IP 地址 Chapter1 QT 获取本机所有 IP 地址获取本机所有 IP 地址&#xff0c;包括 IPV6的地址&#xff0c;需要引用 QNetworkInterface1.检索所有网络接口&#xff1a;2.获取接口的详细信息&#xff1a;3.获取接口的 IP 地址&#xff1a;4.用于网络诊断和监控&…

KEYSIGHT E4980A是德E4980AL 精密LCR表

Keysight E4980A 精密 LCR 表为各种元件测量提供了精度、速度和多功能性的最佳组合。 E4980A 在低阻抗和高阻抗范围内提供快速测量速度和出色的性能&#xff0c;是元件和材料的一般研发和制造测试的终极工具。 LAN、USB 和 GPIB PC 连接可提高您的设计和测试效率。 Keysight E4…

大语言模型的Scaling Law【Power Low】

NLP-大语言模型学习系列目录 一、注意力机制基础——RNN,Seq2Seq等基础知识 二、注意力机制【Self-Attention,自注意力模型】 三、Transformer图文详解【Attention is all you need】 四、大语言模型的Scaling Law【Power Low】 文章目录 NLP-大语言模型学习系列目录一、什么是…

练习LabVIEW第十九题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第十九题&#xff1a; 创建一个程序把另外一个VI的前面板显示在Picture控件中 开始编写&#xff1a; 在前面板放置一个二…

iOS AVAudioSession 详解【音乐播放器的配置】

前言 在 iOS 音频开发中&#xff0c;AVAudioSession 是至关重要的工具&#xff0c;它控制着应用的音频行为&#xff0c;包括播放、录音、后台支持和音频中断处理等。对于音乐播放器等音频需求强烈的应用&#xff0c;设计一个合理的 AVAudioSession 管理体系不仅能保证音频播放…

一文详解高光谱数据python处理包spectral(SPy)

一、基本操作 读取高光谱数据文件 import spectral # 读取ENVI格式的高光谱图像 # image的后缀可以是.raw、.spe、.lan等 # 代码里img对象&#xff0c;类似于rasterio库的dataset对象&#xff0c;可以用它来读取高光谱数据 img spectral.envi.read_envi(filemy_data.hdr, im…

【LeetCode】修炼之路-0008- String to Integer (atoi)【python】

题目 基本思路 其实题目已经说了如何实现了&#xff0c;我们按照给定的思路实现即可 1. 问题四大要求详解 1.1 处理空格 (Whitespace) 忽略字符串开头的任何空格字符 (" ")例如: " 123" 应该被处理为 “123”Python实现: 可以使用 strip() 方法或循环处…

Python浪漫之星星与文字构造的错位图

效果图&#xff1a; 完整代码&#xff1a; import tkinter as tk import random import math from tkinter.constants import *width 888 height 500 heartx width / 2 hearty height / 2 side 11class Star:def __init__(self, canvas, x, y, size):self.canvas canvas…

精准医疗沟通新体验:开源语音识别(ASR)如何提升医生与患者对话

需求背景&#xff1a;一家远程医疗公司在为偏远地区提供在线医疗服务的过程中&#xff0c;发现传统手动记录方式效率太低&#xff0c;无法满足需求&#xff0c;影响就诊的效率。 解决方案&#xff1a;使用思通数科的ASR平台&#xff0c;公司可以实现多话者对话转录和自动病历生…

MySql中的事务、MySql事务详解、MySql隔离级别

文章目录 一、什么是事务&#xff1f;二、事务四大特性ACID2.1、原子性&#xff08;Atomicity&#xff09;2.2、一致性&#xff08;Consistency&#xff09;2.3、隔离性&#xff08;Isolation&#xff09;2.4、持久性&#xff08;Durability&#xff09; 三、事务操作/事务的用…

MySQL-27.多表查询-案例

一.数据准备 -- 分类表 create table category (id int unsigned primary key auto_increment comment 主键ID,name varchar(20) not null unique comment 分类名称,type tinyint unsigned not null comment 类型 1 菜品分类 2 套餐分类,sort …

今日所学1024和1026

1 简便方法&#xff1a; 在文件夹里找到dll的文件路径&#xff0c;然后在系统变量里添加对应路径&#xff0c; 就不会报错了。 2关于报Qt插件的错,解决办法如下 1026Github的2FA 超级详细的github双重验证密码忘记或者获取不了了怎么办&github recovery code忘记怎么办…

计算机网络:网络层 —— IPv4 地址与 MAC 地址 | ARP 协议

文章目录 IPv4地址与MAC地址的封装位置IPv4地址与MAC地址的关系地址解析协议ARP工作原理ARP高速缓存表 IPv4地址与MAC地址的封装位置 在数据传输过程中&#xff0c;每一层都会添加自己的头部信息&#xff0c;最终形成完整的数据包。具体来说&#xff1a; 应用层生成的应用程序…