【精选】计算机操作系统

您所在的位置:网站首页 程序被装入内存后 【精选】计算机操作系统

【精选】计算机操作系统

2023-11-16 10:16| 来源: 网络整理| 查看: 265

目录 多层结构的存储系统主存储器寄存器高速缓存(Cache)磁盘缓存主存和辅存的关系 程序的装入方式程序为什么要装入内存什么是目标模块(目标程序)(.obj文件)绝对装入方式可重定位装入方式动态运行时装入方式(感觉像动态重定位) 程序的链接静态链接方式静态链接步骤 装入时动态链接的装入

多层结构的存储系统

存储器一般要满足 存储器访问速度快(要跟上cpu),存储量大,价格便宜 存储器一般分为三层:CPU寄存器,主存,辅存 主存储器和子磁盘缓存均属于操作系统存储管理的管理范畴 所以再掉电后他们中存储的信息就不再存在 在这里插入图片描述 CPU寄存器:寄存器 主存:高速缓存,主存储器,磁盘缓存 辅存:固定磁盘,可移动存储介质 硬盘是你存放东西的地方 内存是cpu读取数据暂时存放数据的地方

主存储器

也可以说是内存或主存,可执行存储器 用于保存进程运行时的程序和数据,CPU一般是从主存储器中取得指令和数据的 然后将这些指令放入到主存储器,在访问时 才被临时赋值到高速缓存中 这样可以避免CPU去访问内存 因为主存储器的访问速度很慢 实际上是没办法满足CPU对指令的执行速度的 为了缓解这一矛盾就引入了寄存器和高速缓存

寄存器

寄存器一般是存储处理机运行时的数据 寄存器和CPU的执行速度是相同的 但是造价昂贵容量很小 应该是这几个存储器中最小的

高速缓存(Cache)

主要用于备份主存中较常用的数据 减少CPU对主存储器的访问次数 也就是在进程开始的时候 会把进程所需要的数据和程序备份到高速缓存中 高速缓存容量远大于寄存器 但比内存小两到三个数量级

磁盘缓存

磁盘IO速度远低于主存的访问速度 所以磁盘IO速度是最低的 为了缓和主存访问速度和磁盘IO速度之间的矛盾设置了磁盘缓存 主要作用是:暂时存放频繁使用的一部分磁盘数据和信息,减少主存对磁盘的访问次数。 磁盘缓存并不是真实存在的存储器,而是利用主存中的部分存储空间暂时存放从磁盘中读出的信息

主存和辅存的关系

主存也可以看作是辅存的高速缓存,因为辅存中的数据必须复制到主存方能使用,繁殖 数据也必须先存在主存中 才能输出到辅存

程序的装入方式

编译:编译程序对用户源程序进行编译,形成若干个目标模块(编译程序就是写的代码 编译程序应该是编译器 编译就是将代码编译成目标程序 ) 链接:由链接程序将目标模块以及他们所需要的库函数链接在一起,形成一个完整的装入模块 装入:装入程序将装入模块装入内存

程序为什么要装入内存

用户程序要在系统中运行,必须先将他装入内存,也就是该程序在执行时所需要的指令和数据必须在内存中,然后再将其转变为一个可执行的程序 而最简单的就是将整个程序装入内存 简单来说 你通过编译形成的这些模块必须要放到内存中才能使用啊

那么程序被装入内存后 我们怎么直到哪个进程在内存的哪个位置呢? 被执行的程序存在内存中的首地址是被存在基址寄存器中 而不执行的程序存在内存中的首地址是存储在PCB中

什么是目标模块(目标程序)(.obj文件)

源程序是指未经编译的,按照一定的程序设计语言规范书写的,人类可读的文本文件(应该就是程序员写的代码) 源程序经编译可直接被计算机运行的机器码集合 我的理解是将代码通过编译器编译形成电脑可以读懂的二进制的机器码文件 目标程序尽管已经是机器指令,但是还不能运行,因为目标程序还没有解决函数调用问题,需要将各个目标程序与库函数连接,才能形成完整的可执行程序 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 我们在vs中创建了两个源文件 然后点击生成解决方案 我们会发现生成了两个obj文件 正好是我们源文件名的名字 这两个obj文件就是源程序通过编译生成的目标程序(模块)

绝对装入方式

就是直接将装入模块放置到绝对地址上 不需要通过地址映射 因为是单个目标模块的装入所以无需进程链接 这种方式只允许将目标模块装入内存中实现指定的位置 在计算机系统很小,且仅能运行单道程序时将产生绝对地址(物理地址) 因为在单道程序中可以预知经编译后所得到的目标模块应放在内存的什么地方 这种方式的程序中的相对地址(逻辑地址)就是绝对地址(物理地址)

缺点:如果程序或数据被修改 可能要更改程序中的所有地址

可重定位装入方式

可重定位装入方式可将装入模块装入到内存中任何允许的位置 所以可以用于多道程序环境中 但是该方式并不允许程序运行时在内存中移动 简单来说就是先装入为相对地址 然后再根据地址映射变为绝对地址 什么是重定位? 官方说法:把装入时对目标程序中指令和数据地址的修改过程称为重定位 简单来说:将相对地址变成绝对地址 什么时候要用到重定位: 进程装入内存的时候需要,执行过程中进程可能被换出去然后再存回来也要,引用外部命令符号的时候也要算存储地址 为什么叫相对地址? 就是每个程序有一套以0为起始地址的自己的地址 而这些地址都不是真实的存放在计算机存储器中的 而是虚拟的 相对于自己起始地址的地址 怎么将相对地址变成绝对地址? 将程序内部的逻辑地址与程序相对于内存的起始地址相加得到绝对地址 什么是静态重定位?: 地址变换在进程装入时一次完成的 以后不再改变称为静态重定位

动态运行时装入方式(感觉像动态重定位)

装入程序在把装入模块装入内存后 并不立即把装入模块中的逻辑地址转换为物理地址 而是把这种地址转换推迟到程序真正要执行时才进行 在装入内存后的所有地址都仍是逻辑地址

程序的链接

链接程序的功能:将各个目标模块以及他们所需要的库函数装配成一个完整的装入模块,也就是一个完整的可执行程序 用白话来讲一下为什么要链接: 首先目标模块就是我们写的不同源文件编译生成的机器可以看懂的文件 每个文件里面包含了我们想实现的功能 如果你的主文件中的主函数调用了其他源文件中的函数fun 如果不进行链接 CPU就根本不知道去哪找这个被调用的函数fun 所以这就是链接的作用

静态链接方式

在程序运行之前,先将各目标模块及他们所需要的库函数链接成一个完整的装配模块,以后不再拆开 先进行链接的方式称为静态链接方式 先进行链接所形成的一个完整的装入模块被称为可执行文件

静态链接步骤

对相对地址进行修改 在这里插入图片描述 有三个模块A,B,C 长度分别为L,M,N。 模块A需要调用模块B,模块B要调用模块C 。 B和C都属于外部调用符号(应该main函数就是编译出来的就是主程序,而主程序调用的外部函数编译出来的就是外部调用程序(符号)) 因为是A调用B,B调用C则 A中调用的外部调用符号B和原模块B的相对地址都加上L(他们原来的相对起始地址是0 现在变成L了) B中调用的外部调用符号C和原模块C的相对地址都加上L+M(他们原来的相对起始地址是0现在变成L+M)

装入时动态链接的装入

在装入内存时 边装入边链接 目标模块是分开存放的 装入一个目标模块时,若发生一个外部模块调用事件,将引起装入程序去找出相应的外部目标模块,并将他装入内存 优点:便于修改和更新,比那与实现对目标模块的共享



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3