内存管理(二)

页面置换算法

当发生缺页中断的时候, 系统会在内存中选择一个页面将其换出内存, 而当换出内存的时候如果该页面的内容在内存中发生修改,则必须将该新数据重新写回到磁盘, 然后再将需要换进的数据覆盖掉原来的数据, 而当该数据在内存中没有被修改的时候, 此时就直接用需要换进的内存的内容替换掉要淘汰的数据的内容.注意在换出的时候必须选择一些使用频率较低的页面将其换出.
在大多数计算机中会把最近经常使用的存储块保存到一个高速缓存区中, 当这个高速缓存区装满的时候就需要选择一些存储块将其丢弃

1. 最优页面置换算法

每一个页面用调用该页面前所需要执行的指令数进行标记, 在进行页面置换的时候选择该数字最大的进行换出. 这种算法虽然性能等各方面都比较好, 但是由于操作系统无法获知某个页面要在什么时候被调用, 因此不能实现, 但是可以用来评估一个页面置换算法的性能优劣

2. 先进先出页面置换算法

在先进先出页面置换算法中, 由操作系统维护当前内存中的页面,并且通过链表的形式将其组织起来, 链表的前后顺序按照调入内存的时间排序, 即最先调入内存的页面处于链表的头部, 当有一个新的页面需要访问内存的时候, 此时操作系统将处于链表头部的页面调出, 即在内存中待的最久的页面将其调出, 然后将新的页面插入到链表的尾部

3. 最近未使用页面置换算法

    这里写图片描述
为使得操作系统能够获得更多的有用信息, 系统为每一个页面都设置了两个状态, 当页面被访问的时候设置 R 位, 当页面被写入的时候设置 M 位. 这些位都被放在了一个页表项中(如上图)每次访问的时候更新这些位. 因此有硬件设置这些位是非常有必要的
在系统被启动的时候, 所有的位都被清零. R 位被定期的清零, 为了区别页面是否被访问. 因此利用R位和M位可以将系统中的所有页面划分为以下三种
(0)没有被访问, 没有被修改
(1)没有被访问, 已经被修改
(2)已经访问, 没有修改
(3)已经访问, 已经修改
这样的话, 每一个页面都会有一个编号, 在进行页面置换的时候, 系统往往从当前页面中选择一个编号最小的并且将其淘汰

4. 最近最少使用页面置换算法

在内存中的页面一般在很久的时间内没有使用则该页面在未来的很久时间内也可能被使用的几率会特别小. 根据这个原理, 系统在进行页面置换的时候每次从内存中选择一个未使用时间最长的页面将其换出.

页面置换算法比较

这里写图片描述

局部分配策略和全局分配策略

局部分配策略就是每次在置换的时候选择页面在内存中生存时间最短的页面将其换出, 而全局分配策略则是从内存中随机的换出一个页面. 全局分配策略比局部分配策略要好一点.

1. 页面大小
选择小页面

选择一个正文段, 数据段或者堆栈段很有可能不会恰好转满整个内存, 平均情况下都是最后一个页面时空的. 多余的空间就被浪费, 这个被浪费的空间就叫做内部碎片. 总的来说,选择小的页面比选择大的页面浪费的内存会少一些, 但是选择小的页面也意味着内存中的页表会变得更大, 页面装入页面寄存器所花费的时间就会越长.

2. 未定义外部函数

在任何目标文件中被调用了但没有被定义过的函数就叫做未定义函数. 如 printf 函数

3. 共享库

如果一个程序被启动了两次, 大多数操作系统会自动地共享所有的代码页面. 依赖与不同的进程, 每一个进程都拥有一份私有的副本数据, 如果任何一个进程想要对这个副本数据进行修改, 操作系统变为这个进程将这个副本数据做一个拷贝, 这个拷贝的数据就是该进程私有的数据. 注意当一个共享库被装载或者使用的时候, 此时并不是将共享库中所有的内容装载进内存, 而是根据需要将需要的部分以也为单位将其装入, 因此没有被调用的函数是不会被装载进内存的.
因此共享库可以使得可执行文件更小, 并且节省内存.并且当我们在修改一个 bug 的时候, 如果共享库中的一个函数被更新了, 此时不需要重新编译这个函数程序. 就得二进制文件依然可以使用.

缺页中断处理

(1)硬件陷入内核, 在对应的堆栈中板寸程序计数器. 大多数机器将当前的指令各种信息保存在特殊的 CPU 寄存器中.
(2)启动一个汇编代码例程来保存寄存器和其他易失的信息. 这个例程往往将操作系统作为一个函数来调用.
(3)发生中断的时候, 操作系统会尝试发现需要哪个虚拟页面.
(4)当知道了虚拟地址的时候, 此时操作系统便对这个地址进行检查, 并且检查存取和保护是否一致. 如果不一致, 则操作系统向对应的进程发送一个信号, 将该进程杀死. 如果没有发生任何错误机制, 则操作系统拿着这个虚拟地址去检查时候存在一个空闲的页框, 如果没有一个空闲的页框, 那么操作系统便执行页面置换算法寻找一个页面将其换出.
(5)如果选择换出的页面被修改过, 那么系统将安排该数据写回到磁盘, 挂起缺页中断的进程.
(6)如果该页面shiganjingde,那么操作系统在磁盘中查找需要调入的页面在磁盘中的位置, 然后将该页面装入到内存中. 并将发生缺页中断的进程挂起
(7)当磁盘访问中断的时候, 此时说明该页面已经被调入到内存, 页表已经对该页进行相应的更新, 对应该页表的页框也发生了更新, 即标记为正常状态.
(8)对缺页中断的指令以及程序计数器的内容做以修改.
(9)调度引起缺页中断的进程, 操作系统返回调用它的汇编例程
(10)恢复寄存器, 返回用户态

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

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

相关文章

两个栈实现一个队列/两个队列实现一个栈

http://blog.csdn.net/sinat_30472685/article/details/70157227 1两个栈实现一个队列 1.原理分析: 队列的主要操作有两个:入队操作和出队操作,出队时从队头出,入队是从队尾插入,入队的操作和入栈的操作类似&#xff0…

UVa1588

【题目描述】 传送门 【题目分析】 刚开始想了一会没有想到什么很好的算法,看到了长度最多为100,就知道自己想的没有什么意义了,直接暴力,把每一种填法都试一下就知道了。适当剪枝一下(一个简单的乐观函数&#xff…

转:C++中const、volatile、mutable的用法

const修饰普通变量和指针 const修饰变量,一般有两种写法: const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是:const修饰的类型为TYPE的变量value是不可变的。对于一个非指针的类型TYPE,无论怎么写&…

数据链路

广播信道的数据链路层 局域网的优点 网络为一个单位所拥有, 地理范围和站点数有限 局域网具有广播特性, 可以从一个站点方便地访问到整个网络. 各个主机之间可以共享资源, 无论是局域网上的硬件资源还是局域网上的软件资源 便于系统的扩展换和演化, 各个设备之间的位置可灵…

UVa11809

【题目描述】 传送门 【题目分析】 终于把这道题做完了,之前一直连题意都看不懂。实在不行上网找了一下大佬的博客,看懂题意后自己写,发现读入很难处理,就又学习了一下大佬的读入方法,用的是C里面的sstream&#xf…

数据链路层:基本概念

数据链路层的定义 对数据链路层有对上的网络层接口. 对下提供物理层的接口. 定义合适的传输差错率 对传输流进行管理, 以免快速的传输的数据被淹没. 比如发送端发送信号太快, 接受方接受速度较慢, 此时数据链路层就需要提供一定的功能解决这个问题 物理层上传输的基本单元是…

C++的沉迷与爱恋

每年的 09/28 於我都是一个特殊的日子 -- 不只是因为教师节。今年很特殊地没有普天同庆,那麽我就写篇文章自己庆祝一下好了。我於今年七月发表了一本着作《多型与虚拟》和一本译作《深度探索C物件模型》,获得很大的回响。这些作品都不是针对 C 的完全初学…

Insertion Sort——打表找规律

【题目描述】 Insertion sort is a simple sorting algorithm that builds the final sorted array one item at an iteration.More precisely, insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. At each iteration…

数据链路层: 可靠性传输 六个协议

可靠性传输 1. 差错控制 发送方将数据帧发送, 但是当发送方发送的是一个 1的时候此时接受方却接受的是一个 0. (1)校验 接收方如果帧校验接受到的帧没有问题, 则对发送方发送一个肯定性的确认, 当对这个数据帧进行校验发现这个帧有问题的时候, 此时接受方一种是将这个数据帧…

c语言实现配置文件的读写

配置文件的格式如下&#xff1a; key1 value1 key2 value2 . . . 名值对以一个链接&#xff0c;一条记录以换行符分割 头文件&#xff1a; #include<stdio.h> #include<stdlib.h> #include <string.h> 函数原型&#xff1a; void trim(char *strIn, char *…

Educational Codeforces Round 73 (Rated for Div. 2)

A 很简单的一个模拟&#xff0c;只要前面的数字有两个以上就能合成后面的&#xff0c;我们进行一遍合成看能不能出现2048就可以了。 #include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> #include<iostream> #include&…

数据链路层: HDLC

一. 协议机 发送方和接收方. 同时有限状态机把协议形式化为一个四元组 (S,M,I,T), 其中你S表示进程和信道可能进入的集合, M 表示数据帧的状态, I 表示进程的初始状态, T 表示两两状态之间的转化. 每个系统状态可以分为发送状态, 接受状态和信道状态. 把状态用一个点进行表示,…

Miller_Rabin算法

为了测试一个大整数是不是素数&#xff0c;我们不能够使用传统的测试是否有因子的方法&#xff0c;因为那样的时间复杂度至少也是O(n)O(n)O(n)&#xff0c;空间复杂度是O(n)O(n)O(n)&#xff08;使用线性筛数法&#xff09;&#xff0c;时间复杂度还好说&#xff0c;空间复杂度…

bob-tong 字符串函数之Strtok()函数

https://www.cnblogs.com/Bob-tong/p/6610806.html Strtok()函数详解&#xff1a; 该函数包含在"string.h"头文件中 函数原型&#xff1a; char* strtok (char* str,constchar* delimiters ); 函数功能&#xff1a;   切割字符串&#xff0c;将str切分成一个个子…

数据链路层:SLIP(串型线路IP) PPP(点对点协议)

SLIP 没有差错控制, 传输时必须知道对方IP, 传输使用于低速业务 19.2k.应用非常受限 PPP协议 1. PPP协议功能 处理错误检测 支持多协议(IP, IPX, DECnet 等) 连接时允许协商 IP 地址 允许身份验证 2. PPP 的组成 串型链路上封装数据报, 即支持异步链路也支持面向 比特…

Honeycomb——BFS

【题目描述】 传送门 【题目分析】 看起来很复杂好像还要建图什么的&#xff0c;其实直接在原图上BFS就可以了&#xff0c;设置一下方向数组&#xff0c;然后直接跑就可以了。 【AC代码】 #include<cstdio> #include<cstring> #include<algorithm> #inc…

C语言中strspn()函数和strcspn()函数的对比使用

C语言strspn()函数&#xff1a;计算字符串str中连续有几个字符都属于字符串accept 头文件&#xff1a;#include <string.h> strspn() 函数用来计算字符串 str 中连续有几个字符都属于字符串 accept&#xff0c;其原型为&#xff1a; size_t strspn(const char *str, con…

Codeforces Round #587 (Div. 3)

A 只要每两个都不一样就可以&#xff0c;一旦出现两个一样的就改一个。 #include<cstdio> #include<cstring> #include<algorithm> #include<climits> #include<cctype> #include<queue> #include<set>using namespace std;typede…

信道分配 以太网

1.频分复用 将信道分为多个频带, 用户得到某个频带后,在通信的过程中, 自始至终都都占用这个信道.即频分复用中, 所有用户同时占用不同频带的信道 2. 时分信道 将时间划分为一段一段的等长时分复用帧, 每个用户在不同时间占用相同的数据帧 3. CSMA/CD 载波监听多点接入/碰撞…

strpbrk函数

http://blog.csdn.net/tommy_wxie/article/details/7554332 函数原型&#xff1a;extern char *strpbrk(char *str1, char *str2) 参数说明&#xff1a;str1待比较的字符串&#xff0c;str2为指定被搜索的字符串。 所在库名&#xff1a;#include <string.h> …