王琪-Linux下的虚拟内存管理
- 格式:doc
- 大小:71.71 KB
- 文档页数:4
linux的内存管理器任务和职责
Linux的内存管理器的任务和职责如下:
1. 分配和回收内存:Linux的内存管理器负责分配和回收系统的物理内存。
它根据需要将内存分配给进程和系统服务,当它们不再需要时,将它们释放回内存池。
2. 内存映射和交换:内存管理器对于内存映射和交换也负有主要职责。
内存映射是将文件映射到虚拟内存空间或将虚拟内存空间映射到设备文件的过程。
交换则是将不再活跃的进程的内存数据移到磁盘中,以释放物理内存。
3. 内存页缓存:内存页缓存可以提高文件系统的性能,内存管理器可以管理这些缓存,确保缓存的内容始终与磁盘上的文件同步。
4. 虚拟内存管理:内存管理器负责将虚拟内存空间映射到物理内存,同时还需要处理由于内存不足而产生的页面置换和页面调度。
5. 保护和安全性:内存管理器通过设置页面权限位和进行用户空间和内核空间之间的分离来提供保护和安全性。
linux 虚拟内存调度策略在Linux操作系统中,虚拟内存管理是一项非常重要的任务。
虚拟内存管理的目的是将物理内存和进程的虚拟地址空间进行映射,以实现更高的内存利用率和更好的系统性能。
其中,虚拟内存调度策略是指操作系统决定哪些页面应该被载入总是内存,以及哪些页面应该被置换出去的算法和策略。
Linux操作系统中实现虚拟内存调度的主要算法有三种:最佳(OPT)、先进先出(FIFO)和最近最少使用(LRU)。
下面将分别介绍它们的原理和特点。
首先是最佳算法(OPT)。
该算法是一种理想化的调度算法,它会选择即将最远被访问的页面进行置换,以最大限度地减少缺页中断的次数。
然而,实际中很难预测出未来访问的页面,所以最佳算法并不实用。
其次是先进先出算法(FIFO)。
该算法简单地基于页面进入内存的先后顺序进行调度,最早进入内存的页面将被最早置换出去。
FIFO算法易于实现和理解,但它存在“负载顺序相关性”的问题,即一些短期使用但很快不再使用的页面会长时间停留在内存中。
最后是最近最少使用算法(LRU)。
该算法根据页面上次被访问的时间来进行调度,最长时间没有被访问的页面将被置换出去。
LRU算法通常能够更好地反映出进程的访问模式,但它需要记录每个页面的访问时间,并需要较大的额外开销。
在Linux内核中,通常采用近似LRU算法进行虚拟内存调度,因为完全实现LRU算法的开销比较大。
近似LRU算法通常使用一种称为“时钟算法”的变种,该算法通过维护一个时钟指针和页面上的访问标志位来模拟LRU算法的行为。
时钟算法首先遍历内存中的页面,将访问标志位置0。
然后,当产生缺页中断时,操作系统将检查指针指向的页面是否被访问过,如果被访问过,则将其标志位设置为1并将指针移动到下一个页面;如果没有被访问过,则置换该页面。
这种近似LRU算法以较低的开销实现了比FIFO算法更好的页面替换策略。
除了上述的调度算法外,Linux还提供了其他一些优化策略来提高虚拟内存管理的效率,如惰性页面回收、页面聚集、页面合并等。
Linux设置虚拟内存创建swap⽂件1. 进⼊/usr⽬录[root@localhost usr]$ pwd/usr[root@localhost usr]$2. 创建swap⽂件夹,并进⼊该⽂件夹[root@localhost usr]# mkdir swap[root@localhost usr]# cd swap/[root@localhost swap]# pwd/usr/swap[root@localhost swap]#3. 创建swapfile⽂件,使⽤命令dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096[root@localhost swap]# dd if=/dev/zero of=/usr/swap/swapfile bs=1M count=4096记录了4096+0 的读⼊记录了4096+0 的写出4294967296字节(4.3 GB)已复制,15.7479 秒,273 MB/秒[root@localhost swap]#查看swap⽂件1. 使⽤命令du -sh /usr/swap/swapfile,可以看到我们创建的这个swap⽂件为4g[root@localhost swap]# du -sh /usr/swap/swapfile4.1G /usr/swap/swapfile[root@localhost swap]#将⽬标设置为swap分区⽂件1. 使⽤命令mkswap /usr/swap/swapfile将swapfile⽂件设置为swap分区⽂件[root@localhost swap]# mkswap /usr/swap/swapfilemkswap: /usr/swap/swapfile: warning: don't erase bootbits sectorson whole disk. Use -f to force.Setting up swapspace version 1, size = 4194300 KiBno label, UUID=5bd241ff-5375-449d-9975-5fdd429df784[root@localhost swap]#激活swap区,并⽴即启⽤交换区⽂件1. 使⽤命令swapon /usr/swap/swapfile[root@localhost swap]# swapon /usr/swap/swapfile[root@localhost swap]#2. 使⽤命令free -m来查看现在的内存,可以看到⾥⾯的Swap分区变成了4095M,也就是4G内存。
linux下虚拟内存如何设置Linux操作系统诞生于1991 年10 月5 日(这是第一次正式向外公布时间)。
Linux存在着许多不同的Linux版本,但它们都使用了Linux 内核。
下面是店铺带来的关于linux下虚拟内存如何设置的内容,欢迎阅读!linux下虚拟内存如何设置:swap空间就是虚拟内存,在物理内存不足时,有较大的用处。
查看内存空间大小:free -m // m表示显示的字节单位是m(megabytes)下面我们就来增加系统的 Swap 大小。
1.首先用命令free查看系统内 Swap 分区大小。
free -mtotal used free shared buffers cachedMem: 1002 964 38 0 21 410-/+ buffers/cache: 532 470Swap: 951 32 929可以看到 Swap 只有951M,不符合 Oracle-xe-client 的安装要求。
2.创建一个 Swap 文件。
mkdir swapcd swapsudo dd if=/dev/zero of=swapfile bs=1024 count=100000 出现下列提示,上面命令中的 count 即代表swap文件大小。
记录了 100000+0 的读入记录了 100000+0 的写出102400000 字节 (102 MB) 已复制,0.74704 秒,137 MB/秒把生成的文件转换成 Swap 文件sudo mkswap swapfileSetting up swapspace version 1, size = 102395 kBno label, UUID=09fde987-5567-498a-a60b-477e302a988b3.激活 Swap 文件。
sudo swapon swapfile再次查看 free -m 的结果。
total used free shared buffers cachedMem: 1002 967 34 0 22 410-/+ buffers/cache: 534 467Swap: 1053 32 1021添加成功。
第九章虚拟存储的设计与实现9.1 内存管理概述管理存储器是操作系统最重要的功能之一。
一个好的操作系统,需要能够有效地管理及利用存储器。
本章将介绍对内存进行管理的基本方法和策略,包括连续分配存储管理方法、非续存储管理方法以及分段和分页式管理方法。
9.1.1 连续分配存储管理方法连续分配存储管理方法即为一个用户程序分配一个连续的内存空间。
在一些简单的操作系统之中,这种分配方式简洁有效。
连续分配方式曾广泛应用于二十世纪六七十年代的操作系统中,它实现起来比较方便,而且所需的硬件支持最少,因此现在一些简单的操作系统中仍然在使用。
连续分配方式还可以细分为单一连续分配、固定分区分配和动态分区分配几种。
单一连续分配是最简单的存储管理方式,只适合于单系统单任务的操作系统。
使用时内存分为系统区和用户区两个区。
操作系统在系统区,而用户程序和数据存放在用户区。
固定分区分配方式将内存划分为多个固定大小的分区。
因为分区固定所以缺乏灵活性:当程序太小时会造成内存空间的浪费;而程序太大时,分区又不足以容纳致使程序无法运行。
不过虽然分区使用效率不高,但是如果一个操作系统控制多个相同对象时,这种内存管理方式却是最高效的。
动态分配方式则是为了避免固定分区分配效率不高的情况,二十根据进程实际需要,动态分配连续的内存空间。
动态分配方式采用一些寻表的方式,查找能符合程序需要的空闲内存分区。
不过虽然提高了使用效率,却增加了系统运行开销,而且内存空闲表本身也会占用一部分内存资源。
在动态分区存储管理方式中,主要的操作是分配和回收内存。
现在的连续分配往往增加可重定位分区分配,即内存回收时,由于碎片不能被利用。
可重定位分区分配通过对程序实现成定位,从而可以将内存块进行搬移,将小块拼成大块,将小空闲“紧凑”成大空闲,腾出较大的内存以容纳新的程序进程。
9.1.2 非连续存储管理机制连续分配方式会形成许多“碎片”,虽然可以通过“紧凑”方式将许多碎片拼接成可用的大块空间,但开销也很大。
Linux操作系统中的内存管理和优化技术在Linux操作系统中,内存管理是一项非常重要的任务。
因为在计算机系统中,内存是最主要的资源之一,也是最容易被浪费或滥用的资源之一。
因此,在Linux系统中要做好内存管理,就必须要清楚该系统如何使用内存、怎样管理内存,以及如何优化内存使用。
一、Linux内存的分类在Linux系统中,我们一般将内存分为两种类型:物理内存和虚拟内存。
物理内存是指计算机实际存在的内存,而虚拟内存是指计算机中的硬盘空间,它在计算机中被用作为一种虚拟化内存的技术。
这种技术使得计算机可以虚拟出额外的内存空间,从而提高系统的内存使用效率。
二、Linux内存的使用在Linux系统中,内存不是一次性分配给所有程序使用的,而是按需分配的。
当系统需要更多内存时,它会从空闲的内存中分配出一部分,然后再使用这些内存来支持系统进程和应用程序。
此外,Linux系统中还有一个内存缓存,它可以帮助系统将经常被访问的数据存储在内存中,以便快速响应用户请求。
三、Linux内存管理在Linux系统中,内存管理模块负责管理系统的内存使用。
这个模块会跟踪系统内存使用情况,并将一部分内存分配给正在运行的进程和应用程序。
此外,如果系统内存使用过量,内存管理模块还能回收不必要的内存,并将其分配给更需要的进程或应用程序。
四、Linux内存优化技术1. 内存调整在Linux系统中,我们可以使用内存调整技术来优化内存使用。
这种技术可以通过修改内核参数来增加系统的内存使用效率。
我们可以使用sysctl命令来修改内核参数。
2. 内存抖动在Linux系统中,如果内存使用过量,就会出现内存抖动的情况。
内存抖动是指系统频繁地将一页内存从内存中换出,然后再将其换入内存。
这种过程会导致系统速度变慢,因此我们需要采取一些措施来优化内存使用。
我们可以在系统中使用Swap分区和Swap文件来降低内存抖动的风险。
3. 内存清理在Linux系统中,我们可以使用内存清理技术来优化内存使用。
Linux下的虚拟内存管理
王琪
成都信息工程学院计算机学院,成都,中国,610200
444687196@
摘要:一般来说,计算机内存容量是有限制的,但是某些比较大的进程在运行的时候所需要的内存空间可能超过内存的总量,这可能会导致这种情况:运行的某个进程,物理内存容纳不下该进程的全部代码,数据和堆栈,只能容纳一部分。
于是,产生了虚拟存储器技术。
Abstract: Generally, a computer memory capacity is limited., but some relatively large processes is running with the memory required which may exceed the total amount of memory. This may result in this case: For running process, the process of physical memory can’t fit all the code, data and stack. It can fit only a fraction. Thus virtual memory technology generates.
关键字:linux;虚拟内存;进程;虚拟内存技术
1、虚拟存储器的思想
一个进程的代码,数据,对象的总量可能会超过所使用的物理内存的容量,操作系统负责把现在使用的那部分资源保存在内存中,而把其他部分保存在磁盘上,当需要用到不在内存中的某一部分的时候,由操作系统把那部分调入内存,同时把已经在内存中的但是暂时用不到的部分调出。
这些操作对于用户来说都是透明的。
2、Linux支持的虚拟内存(virtual memory)
虚拟内存是指使用磁盘当做RAM的扩展,这样可用的内存的大小就增大了。
内核会将暂时不用的内存块的内容孝道硬盘上去,这样内存就可以腾出空间了。
这些操作对于用户来说是完全透明的。
当然,读写硬盘的速度比读取内存的速度慢的多,所以程序部会想直接在内存中运行那么快,但是用户一般不会感觉出来。
用作虚拟内存的硬盘部分被陈为交换空间。
3、地址映射
进程的线性地址分为四部分:页面目录索引(PGD)、页面中间目录索引(PMD)、页面表索引(PT)和偏移量。
线性地址到物理地址的映射采用的是三级转换方式。
(l)从CR3寄存器中找到页目录的基址。
(2)以线性地址的最高位段作为下标,在PGD中找到确定中间目录的表项的指针。
(3)以线性地址的次位段作为下标,在PMD中找到确定页面表的表项的指针。
(4)在线性地址的接下来位段为下标,在PTE中找到页的指针。
(5)在线性地址最后的位段,为在此页中偏移量。
这样,最终完成了线性地址到物理地址的转换。
但是,就1386微处理器来说,CPU实际上不是按三层而是按两层的模型来进行地址映射,这就需要将虚拟的三层映射落实到具体的两层映射,跳过中间的PMD层次。
4、进程的内存组织
4.1线性区描述符(VMA)
内核使用一个或者多个VMA来跟踪进程使用的内存区间。
每个VMA代表进程地址空间的一块单独连续的区间。
但是进程的两个VMA可以不连续,区间的划分并不仅取决于地址的连续性,也取决于对虚拟页面的访问权,如果一个地址范围内的前半段和后半页有不同的访问权或者其他属性,就要分成两个区间。
进程所用的VMA以链表的形式存储,但是VMA数目较大的话,会创建以个AVL树来存储他们,因为AVL 树中的搜索速度很更快。
4.2内出描述符(mm_struct)
内存描述符管理一个进程的所有的VMA。
每一个进程包含一个mm成员。
Mm成员可以用来判断两个任务是否在同一线程组中。
因为两个具有相同mm成员的任务管理者同一块全局内存区域。
mm_struct结构
体的mmap 成员指向VMA 链表。
若进程的VMA 以AVL 树的形式存储,则mmap_avl 成员指向树的根节点,加快查找速度。
4.3 vm_operations_struct
一个VMA 可能代表一个普通的内存空间,也可能是对应于一个文件,共享内存、交换设备等特别的对象而建立的一块内存区域。
对象类型vm_operations_struct 抽象了各种可能提供给被映射对象的操作,比如打开、关闭之类。
一旦VMA 映射为一个对象,那未它的vm_ops 成员就会使一个非空指针,指向仪个表示被映射对象所提供操作的vm_operations_struct 结构体。
5、页面交换
5.1 页面换出
Linux 使用最近最少使用(LRU )算法来选择要抛弃的页面。
交换后台进程(kswapd )依次检查系统中的每个进程以确定谁最合适交换出去。
从内存中换出的页存放在交换区中。
每个交换区都由一个页插槽序列组成,也就是说,使用4096字节大小的块来包含一个换出页。
交换区的第一个的第一个页槽用来存放有关这个交换区的信息。
每个活动的交换区在内存中都用自己的swqp_info_struct 描述符。
图1、交换区数据结构
页面换出中,Linux
专设一个定期将页面换出的kswap 线程。
Kswap 使用内核的空间,其代码静态
地连接在内核中,可以直接调用内核中的各种子程序。
MAX_SWAPFILES (32)
swap_info
swap_info_struct
交换
区
计数向量
swap_header
swap_file swap_map
swap_device 1
2
0 1
32767
3276
8
1 1
空闲槽
已用槽
永久槽
缺陷槽
0:这个槽是空闲的。
正数:被填充成一个换出页的内容 32767:存放在此槽中的为持久页
图2、页面换出调用函数
5.2、页面换入
在i386CPU 将一个线性地址映射成物理地址时,只要看到相应页面表项或者目录项中的P 标志位为0,就认为页面映射失败,产生一次页面异常。
P 标志位为0有两个原因:1、物理页面不在内存,映射也也尚未建立。
2、物理页面不在内存,但是映射已经建成。
第一种情况调用do_no_page()函数,第二种情况调用do_swap_page()函数。
图2、换入页面do_swap_page()
lookup_swap_cache()
!page
直接从交换区中读入
N
查看相应的页是否还
留在交换区中
Y
swapin_readahead( )
read_swap_cache( )
预读页面到活跃页面队列以及交换区的换入/换出队列
从活跃队列中找到并读入页面
把转入不活跃脏页面 洗净,使其可立即分配 扫描活跃页面队列,试图 找到可转入不活页的页面
kswapd()
do_try_to_free_pages()
检查发现页面短缺,则设法释放和换出若干页面 page_launder()
refill_inactive()
经过page_launder 后仍缺页,则将 活跃页转为不活跃并换出
refill_inactive_scan()
swap_out()
找出一个进程,扫描其映射表 找出可以转入不活跃的页面
参考文献:
[1] 胡军国,Linux操作系统应用教程,北京:中国铁道出版社,2013。