程序员的自我修养(4)

可执行文件的装载与进程

代码经过预编译,编译,汇编,链接过程后生成可执行文件,但可执行文件只有装载到内存程序才可以运行,这节讲可执行文件在linux下的装载过程,以及与进程的关系等等。
1.程序与进程的关系
一个例子,计算机CPU是人,程序菜谱,进程就是炒菜的过程。程序就是预先编译好的指令和数据集合的一个文件,是一个静态的概念。而进程是程序运行时的一个过程。
2.进程虚拟地址空间
程序运行起来后,将会拥有独立的虚拟地址空间,这个地址大小是由CPU位数决定,32位CPU就是0到2的32次方减一。假设32位操作系统我们将有4G的空间,通常以一部分作为操作系统,一部分就留下给进程使用,这些就是可以申请的虚拟地址空间。但是,这些空间由于近代计算机的发展是明显不够的,我们考科一扩展到64位或者使用pae或saw方法。
3.装载的方式
程序执行时所需的指令和数据必须在内存才能够正常运行,最简单的方法是将整个程序直接放入内存,这样程序肯定是能正常运行的,但是肯定会占有大量内存,先现如今,内存还是很昂贵的,明显是不够用。前人就想到了程序运行的时候只要将最常用的数据存放到内存即可,而其它数据放入磁盘,需要的时候在提取至内存。这就提到了两种方法,覆盖装入与页映射。
1.覆盖装入
现在几乎已经淘汰,但是还是值得了解。这种方法主要依靠程序员的在编写的时候将程序分割成若干块,然后使用辅助代码来管理这些模块该何时进入内存,何时被替换。覆盖管理器本身内存很小。
假设有模块A与模块B,之间没有调用关系,互不影响,有一个函数能调用模块A或模块B,那么A与B就共用一片空间,函数调用模块A的时候,模块A之间覆盖这片A与B共同使用的空间,反之一样。当程序一旦很多,这就很需要程序员对各个模块依赖关系组成对应的树状图,从而进行分块和调度策略的分析。
2.页映射
将内存和所有磁盘中的数据与指令按(页)为单位进行划分,以后所有装载和操作的单位就是页,通常一页4K大小,也就是4096字节。我们通常使用先进先出和最少使用算法,当内存使用达到分配的上限,就会最先进入的页会被调出内存,最少使用的页将会调出内存,调入需要的页的数据。
4.进程的建立
进程建立的开始的三件事情,
1.创建一个独立的虚拟地址空间
虚拟空间是由一组页映射函数将虚拟空间的各个页映射至对应的物理空间。那么创建一个虚拟空间并不是创建空间,而是创建映射函数所需要的相应的数据结构,在一些Linux下,创建空间实际上只是分配一个页目录。

2.读取可执行文件头,并且建立虚拟空间与可可执行文件的映射关系
上一步的页映射函数是虚拟空间到物理空间的映射,这一步是虚拟空间与可执行文件的映射关系。我们知道,当程序执行发生页错误时候,物理空间会分配一个物理页,然后将缺少的页面从磁盘读取进入内存,在设置缺少的页面与物理页面的映射关系。那么我们怎么知道这个页在可执行文件那个位置,就需要虚拟空间与可执行文件的映射。

3.将CPU的指令寄存器设置成可执行文件的入口地址,启动运行
就是操作系统执行了一条跳转命令,跳转到了可执行文件的入口,也就是ELF头文件保存的入口地址。

5.操作系统的链接视图与执行视图
执行视图就是将.text,.bss,.data等段分开的视图。链接视图就是将同等属性的段合在一起的视图,例如一代吗段为代表的可读可执行段,以数据段与bss段可读可写的段,以只读数据段为代表的的只读数据段。那么为什么需要这样分配,因为映射到虚拟空间的时候,以页为单位,那么每个段都一个页,会极大的浪费空间,操作系统不管页的内容,只会在乎页的属性,那么我们可以将相同属性的段合在一个页内,就可以极大的节省空间消耗。(这样一个同属性的集合叫做segment)

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

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

相关文章

oled拼接屏在柳州的户外广告中有哪些应用展现?

柳州oled拼接屏是一种高端的显示屏,它采用了OLED技术,具有高亮度、高对比度、高色彩饱和度、高刷新率等优点,能够呈现出更加真实、清晰、细腻的图像效果。 同时,柳州oled拼接屏还具有拼接功能,可以将多个屏幕拼接在一…

vue element select下拉框回显展示数字

vue element select下拉框回显展示数字 问题截图&#xff1a; 下拉框显示数字可以从数据类型来分析错误&#xff0c;接收的数据类型是字符串&#xff0c;但是value是数字类型 <el-form-item prop"classifyLabelId" :label"$t(item.classifyLabelId)"…

GUI-Menu菜单实例

运行代码&#xff1a; //GUI-Menu菜单实例 #include"std_lib_facilities.h" #include"GUI/Simple_window.h" #include"GUI/GUI.h" #include"GUI/Graph.h" #include"GUI/Point.h"struct Lines_window :Window {Lines_window…

常见的网络攻击

​ 1.僵木蠕毒 攻击业内习惯把僵尸网络、木马、蠕虫、感染型病毒合称为僵木蠕毒。从攻击路径来看&#xff0c;蠕虫和感染型病毒通过自身的能力进行主动传播&#xff0c;木马则需要渠道来进行投放&#xff0c;而由后门木马&#xff08;部分具备蠕虫或感染传播能力&#xff09;构…

Mybatis架构简介

文章目录 1.整体架构图2. 基础支撑层2.1 类型转换模块2.2 日志模块2.3 反射工具模块2.4 Binding 模块2.5 数据源模块2.6缓存模块2.7 解析器模块2.8 事务管理模块3. 核心处理层3.1 配置解析3.2 SQL 解析与 scripting 模块3.3 SQL 执行3.4 插件4. 接口层1.整体架构图 MyBatis 分…

智能优化算法——灰狼优化算法(PythonMatlab实现)

目录 1 灰狼优化算法基本思想 2 灰狼捕食猎物过程 2.1 社会等级分层 2.2 包围猎物 2.3 狩猎 2.4 攻击猎物 2.5 寻找猎物 3 实现步骤及程序框图 3.1 步骤 3.2 程序框图 4 Python代码实现 5 Matlab实现 1 灰狼优化算法基本思想 灰狼优化算法是一种群智能优化算法&#xff0c;它的…

ChatGPT:探索人工智能语言模型的前沿技术

一、ChatGPT的背景和原理 ChatGPT是由OpenAI开发的基于GPT-3.5架构的语言模型。它通过大规模的预训练和微调过程&#xff0c;学习了海量的文本数据&#xff0c;并能够生成连贯、有逻辑的回答。ChatGPT使用了自注意力机制和深度神经网络&#xff0c;能够对上下文进行理解和生成有…

C++学习笔记1

Hello World程序的组成部分 可以分为两部分&#xff1a; &#xff08;1&#xff09;以#开头的是预处理器编译指令 &#xff08;2&#xff09;int main() 开头的是程序的主体 预处理编译指令#include 定义&#xff1a;预处理器是一个在编译前运行的工具 #include 是让预处理器获…

java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显示…

linux shell脚本操作日期记录

最近碰到个需求&#xff0c;按日导出每日的数据&#xff0c;然后导入另一个数据库。需要写个日期相关的脚本。这里总结下 #!/bin/bashfunction dateFunc(){echo "从${2}到${3}" nextdate -d "$2" %sstart${2}e…

mysql取24小时数据

MySQL是一种常用的关系型数据库管理系统。在进行实时数据处理时&#xff0c;我们常常需要查询最近24小时的数据来进行分析和处理。下面我们将介绍如何使用MySQL查询最近24小时的数据。 SELECT * FROM table_name WHERE timestamp_column > DATE_SUB(NOW(), INTERVAL 24 HOU…

cocos creator Richtext点击事件

组件如图 添加ts自定义脚本&#xff0c;定义onClickFunc点击方法&#xff1a; import { Component, _decorator} from "cc";const { ccclass } _decorator; ccclass(RichTextComponent) export class RichTextComponent extends Component{public onClickFunc(even…

二十七、数据可视化

一、数据可视化是什么 借助图形来清晰有效表达信息的方式成为可视化&#xff0c;可视化可以帮助我们更好地传递信息。 二、数据可视化的基本流程 1、整理数据 数据可视化的基础还是数据&#xff0c;要将数据图表化&#xff0c;首先要整理数据&#xff0c;明确要把哪些数据图…

ffmpeg分离左右声道到多音轨

早期的视频文件将多语言放在了左右声道&#xff0c;手机上播放时&#xff0c;很多播放器并没有切换声道的功能&#xff0c;所以需要做分离 导出单声道视频 ffmpeg -i 01.rmvb -c:v h264 -af pan"stereo| c0FR | c1FR" -acodec aac 01.mp4 这里的FR是右声道&#x…

C++入门学习(2)

思维导图&#xff1a; 一&#xff0c;缺省参数 如何理解缺省参数呢&#xff1f;简单来说&#xff0c;缺省参数就是一个会找备胎的参数&#xff01;为什么这样子说呢&#xff1f;来看一个缺省参数就知道了&#xff01;代码如下&#xff1a; #include<iostream> using std…

【个人笔记】linux命令之ls

目录 Linux中一切皆文件ls命令常用参数常用命令lscpu lspci Linux中一切皆文件 理解参考&#xff1a;为什么说&#xff1a;Linux中一切皆文件&#xff1f; ls命令 ls&#xff08;英文全拼&#xff1a; list directory contents&#xff09;命令用于显示指定工作目录下之内容…

实现大文件传输的几种方法,并实现不同电脑间大文件传输

随着网络技术的快速发展&#xff0c;大文件的传输需求越来越多&#xff0c;如何在不同的电脑之间实现大文件的快速传输&#xff0c;是一个挑战&#xff0c;下面介绍几种常用的方法可以解决这个问题。 1、利用局域网传输&#xff1a;把两台电脑接入同一个网络环境&#xff0c;通…

每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户

文章目录 每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户每日语录第26题 中级题: 活跃时长的均值1. 需求列表思路分析 答案获取加技术群讨论附表文末SQL小技巧 后记 每天一道大厂SQL题【Day27】脉脉真题实战(三)连续两天活跃用户 大家好&#xff0c;我是Maynor。…

【Android 】Prebuilt预编译

Android提供了Perbuilt编译方式&#xff0c;处理已经编译好的库或配置文件 Perbuilt:针对独立文件的操作。 Multi_Perbuilt:针对多个文件&#xff0c;对多个文件进行判断&#xff0c;调用Prebuilt依次处理。 上面的就是copy usb_modeswitch.conf 文件到 OUT 下面的 etc目录&am…

AtCoder Beginner Contest 310-D - Peaceful Teams(DFS)

Problem Statement There are N sports players. Among them, there are M incompatible pairs. The i-th incompatible pair (1≤i≤M) is the Ai​-th and Bi​-th players. You will divide the players into T teams. Every player must belong to exactly one team, an…