当前位置:首页 » 操作系统 » linux分页内存

linux分页内存

发布时间: 2022-10-05 00:57:31

linux内核:分段和分页的区别

首先说明内核的保护模式和是模式,在计算机刚刚启动的时候处于实模式,在该模式下cpu产生20位的地址,然后计算机经过某种变换转换到保护模式。保护模式下cpu产生32位的地址,也就是说从实模式到保护模式,cpu的寻址空间扩大了。

在计算的发展的初期,intel 8086是16位的cpu,它只能运行在实模式下。在该模式下其寄存器是16位的,但是为了可以寻址20位的地址空间,所以采用了内存的分段模式。

物理内存地址=段基址×16+偏移 这样可以寻址20位的地址空间。

关于现代计算机内存的分段机制,也是为了向下兼容的需要。单纯的向下兼容或许还不够有说服力,因为在现代cpu中产生的就是32的地址,而由分段机制产生的线性地址也是32位的。32位的地址完全可以访问4G内存的任何一个地方,看上去分段机制好像完全没有了作用,其实不然。在多线程,多任务的操作系统中,一个地址能否被一个进程写入,能被什么优先级的进程访问,是否允许执行这些问题有出来了。而解决这些问题需要在地址上添加一些属性,也就是说其地址应该还是高于32位的。这时候有体现了分段机制的作用。

关于分页机制。由分页机制产生线性地址,加入没有分页,这个线性地址就是物理地址。而分页机制就是把线性地址装换成物理地址。关于其原因,一方面在进程产生子进程的时候,会复制内存页,而父子进程无论是代码数据还是产生的地址都是一样的,这样为创建进程提供了便利,可以不必考虑进程在内存中分布的情况而产生地址,至于父子进程的真实物理地址在哪里,那是mmu(内存控制单元)的问题。另一方面,由于进程不知道真实的物理地址子啊什么地方,也为操作系统提高了安全性。

❷ linux内核态是实模式还是分页模式

linux运行在保护模式下,并且在启动保护模式之前准备好了分页式内存管理的页表,在进入保护模式的同时一并开启了分页模式(同时置PE和PG位,即or eax,0x80000001)。
需要注意的是不要把保护模式和分页模式混淆,与实模式相对的是保护模式,与分页式内存管理相对的是分段式内存管理;当然,也有两者结合的段页式。

❸ linux内核参与分页吗

参与吧!(答案非常不准确,仅供参考)
页式管理用以将线性地址转化成物理地址,并对访问权限进行检查。每个页面都是一个大小为4KB的连续空间,并按4KB对齐。从80386开始,Intel处理器开始支持页式管理,CR0寄存器的PG标志位用来表示是否支持分页。
1、标准分页
i386采用二级分页,其线性地址的结构如下:
Dir
Page
Offset
其中,Dir有10位,表示页表目录项的下标,指向一个页表;Page有10位,表示一个具体页表中的目录项的下标,指向一个物理页面;Offset有12位,表示在物理页面中的偏移量(单位为字节)。
i386中,从线性地址到物理地址的映射过程为:
(1)从CR3寄存器中取得页目录(页目录中包含1024条记录,每个记录4字节,正好为4KB,占用一个页面)的基地址;
(2)以线性地址中的Dir为下标,从目录中取出相应页表的基地址;
(3)以线性地址中的Page为下标,从页表中取出相应的页面描述结构;
(4)将页面描述符中的基地址与线性地址中的Offset偏移量相加,获得实际的物理地址。
2、页描述表项
在i386中,页目录和页表的结构相同,页描述表项的结构如下:
Address
Avail
G
PS
D
A
PCD
PWT
U/S
R/W
P
其中,Address有20位,表示对应页表或页的物理地址的高20位(由于页总是按4KB对其,故低12位恒为0);Avail有3位,供系统程序员使用;G只有1位,在页目录项中表示该页是否为全局页,在页表项中忽略;PS只有1位,在页表目录项中为1表示为4MB的页,为0表示为4KB的页;D只有1位,在页表目录项中未使用,在页表项中表示该页是否已被更改;A只有1位,表示该页是否已被访问过;PCD只有一位,表示该项是否禁止被缓存;PWT只有一位,为1表示使用write-through缓存策略,0表示使用write-back缓存策略;U/S只有一位,为1表示访问该页是否可以在用户态下访问;R/W只有一位,表示该项是否可写;P只有1位,表示该项是否在内存中。
如果要使用4MB的扩展分页,则要求CR4寄存器中的PSE标志被置1。此时,系统仅采用一级分页策略,线性地址前10位为页表项,后22位为偏移量,且页按4MB对齐,页描述表项中Address仅有高10位有效。
3、物理地址扩展(PAE)分页机制
从Pentium Pro开始,Intel处理器的地址总线宽度增加到了36位,共支持访问64GB的内存。同时,Intel提供了PAE和页大小扩展(PSE-36)两种机制用以将32位的线性地址转化成36位的物理地址。其中,后者从Pentium III开始提供,且未在Linux内核中使用。
要启用PAE机制必须将CR4寄存器中的PAE标志置位。PAE启用后,处理器会对分页机制做如下更改:
(1)将64GB的内存空间划分成2^24个不同页面,页表项的体积扩展为64位,物理地址域扩展为24位;
(2)引入新的最高一级页表,称为页目录指针表(PDPT),其中包含4个64位的项;
(3)CR3寄存器中包含27位的PDPT的高位地址(其低5位地址为0);
(4)当将线性地址映射到4KB的页面时,CR3由高位到低位依次为2位PDPT索引,Array位页目录索引,Array位页表索引,12位页内偏移;当将线性地址映射到4KB的页面时,CR3由高位到低位依次为2位PDPT索引,Array位页目录索引,21位页内偏移。
但是,PAE机制并未增大单个进程能够访问的地址空间,仅仅将内核能够访问的地址空间增加到了64GB。
4、Linux内核中的分页
Linux内核对分页机制的依赖性很强,其使用一种适合32位和64位结构的通用分页模型,该模型使用四级分页,即页全局目录、页上层目录、页中层目录和页表。
对于不同的体系结构,Linux采用的四级页表目录的大小有所不同:对于i386而言,仅采用二级页表,即页上层目录和页中层目录长度为0;对于启用PAE的i386,采用了三级页表,即页上层目录长度为0;对于64位体系结构,可以采用三级或四级页表,具体选择由硬件决定。
linux内核中没有分页内存吗?是的,没有,那么windows的内核为何就有呢?毕竟不是一个家族不好做全方位的评判,我的结论就是linux上的任何的程序只将内核作为一个平台而不依赖内核。这个事实的结果就是在linux内核中不能分配过大的内存,linux内核中唯一可以分配大内存的地方就是vmalloc区域,仅仅放松了对物理内存连续的限制,在vmalloc中分配内存只要求虚拟内存连续,并且事实上最多只能分配128M的内存,这是linux内核中最宽松的限制了。

在linux中,一切功能都可以由用户空间应用程序来解决,就连杀毒程序也不例外,这是因为linux有强大的安全机制,单点验证机制,只要linux保证任何用户不能随意su到root权限就可以了,这事实上就是一个消除一切漏洞的行为,只要操作系统安全机制没有漏洞,只要内核没有漏洞,那么一切恶意程序的得逞完全归结于该恶意程序所利用的用户空间应用程序设计的不足,而且这件事在linux看来,内核完全没有必要过问,正如一个国家的机关只认百姓的请求以及该请求的代理权限,只要认证通过就给与服务而不再对别的情况加以过问,linux只是一个服务者罢了,它不喜欢任何额外的机制要靠内核来完成,也就是说任何用户都不要随意动不动就用内核实现一个机制,只要在用户空间实现就好了。

看看windows下的杀毒程序这一简单的使用内核来完成的程序,正是由于windows不能保证复杂但是薄弱的用户空间机制都是安全的,才会动用内核来实现更高级别的安全管理,它没有linux的那种简单但是可以信赖的单点验证机制。正如微软建议的那样,在没有别的办法的时候请实现一个驱动程序,在DriverEntry中完成一切。既然微软会建议程序员编写内核驱动,那么微软的操作系统当然也把内核空间的开发开放给了程序员,于是DDK成了很大一部分人最后的救命稻草,既然将内核驱动的开发开放给了程序员,那么如何使用内存就不应该有任何限制,再者windows希望用一种简单一致的机制管理所有的不管是用户空间还是内核空间的内存,于是内核空间的内存管理和用户空间的内存管理大体上没有区别,都可以使用分页内存,说一句可能让windows的粉丝不愿意听的话:我们windows实现的不是很安全,所以你们可以用内核这个最高级别的执行绪以权势压人。反观linux,开源的linux难道没有将内核开放给程序员吗?不,绝对的开放,看看lkml的热闹程度吧!但是不同的是,linux下开发内核是完全为了内核本身的机制扩展而不涉及任何用户策略,linux的内核和用户应用分得比较开,不信你去内核邮件列表去问一个应用的问题,看看有没有人骂。

❹ elasticsearch使用中的问题

目前主要通过插件的形式来控制:
常用的插件主要包括:elasticsearch-http-basic,search-guard,shield

配置名 默认值 说明
http.basic.enabled true 开关,开启会接管全部HTTP连接
http.basic.user "admin" 账号
http.basic.password "admin_pw" 密码
http.basic.ipwhitelist ["localhost", "127.0.0.1"] 白名单内的ip访问不需要通过账号和密码,支持ip和主机名,不支持ip区间或正则
http.basic.trusted_proxy_chains [] 信任代理列表
http.basic.log false 把无授权的访问事件添加到ES的日志
http.basic.xforward "" 记载代理路径的header字段名

第二步:shutdown你要升级的节点

第三步:升级重启该节点,并确认该节点重新加入到了集群中
第四步:重复2-3步,升级重启其它要升级的节点。
第五步:重启启动集群的shard均衡

1、内存优化
在bin/elasticsearch.in.sh中进行配置
修改配置项为尽量大的内存:
ES_MIN_MEM=8g
ES_MAX_MEM=8g
两者最好改成一样的,否则容易引发长时间GC(stop-the-world)

elasticsearch默认使用的GC是CMS GC
如果你的内存大小超过6G,CMS是不给力的,容易出现stop-the-world
建议使用G1 GC
注释掉:
java_OPTS=”$JAVA_OPTS -XX:+UseParNewGC”
JAVA_OPTS=”$JAVA_OPTS -XX:+UseConcMarkSweepGC”

JAVA_OPTS=”$JAVA_OPTS -XX:=75″
JAVA_OPTS=”$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly”
修改为:
JAVA_OPTS=”$JAVA_OPTS -XX:+UseG1GC”
JAVA_OPTS=”$JAVA_OPTS -XX:MaxGCPauseMillis=200″

如果G1 GC优点是减少stop-the-world在几率,但是CPU占有率高。
需要更优化的性能,你可以参考
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/G1GettingStarted/index.html

2、合理配置主节点和数据节点
配置文件:conf/elasticsearch.yaml
node.master: true
node.data: true

3、设置合理的刷新时间
建立的索引,不会立马查到,这是为什么elasticsearch为near-real-time的原因
需要配置index.refresh_interval参数,默认是1s。
你可以像
http://zhaoyanblog.com/archives/299.html
文件中一样,调用接口配置
也可以直接写到conf/elasticsearch.yaml文件中
index.refresh_interval:1s
这样所有新建的索引都使用这个刷新频率。

小贴士1:规划索引、分片 以及集群增长情况

ES使得创建大量索引和超大量分片非常地容易,但更重要的是理解每个索引和分片都是一笔开销。如果拥有太多的索引或分片,单单是管理负荷就会影响到ES集群的性能,潜在地也会影响到可用性方面。这里我们专注于管理负荷,但运行大量的索引/分片依然会非常显着地影响到索引和检索性能。

我们发现影响管理负荷的最大因素是集群状态数据的大小,因为它包含了集群中每个索引的所有mapping数据。我们曾经一度有单个集群拥有超过900MB的集群状态数据。该集群虽然在运行但并不可用。

让我们通过一些数据来了解到底发生了什么 。。。。。。

假如有一个索引包含50k的mapping数据(我们当时是有700个字段)。如果每小时生成一个索引,那么每天将增加24 x 50k的集群状态数据,或者1.2MB。如果需要在系统中保留一年的数据,那么集群状态数据将高达438MB(以及8670个索引,43800个分片)。如果与每天一个索引(18.25MB,365个索引,1825个分片)作比较,会看到每小时的索引策略将会是一个完全不同的境况。

幸运的是,一旦系统中有一些真实数据的话,实际上非常容易做这些预测。我们应当能够看到集群必须处理多少状态数据和多少索引/分片。在上到生产环境之前真的应该演练一下,以便防止凌晨3:00收到集群挂掉的电话告警。
小贴士3: 内存设置

Linux把它的物理RAM分成多个内存块,称之为分页。内存交换(swapping)是这样一个过程,它把内存分页复制到预先设定的叫做交换区的硬盘空间上,以此释放内存分页。物理内存和交换区加起来的大小就是虚拟内存的可用额度。

内存交换有个缺点,跟内存比起来硬盘非常慢。内存的读写速度以纳秒来计算,而硬盘是以毫秒来计算,所以访问硬盘比访问内存要慢几万倍。交换次数越多,进程就越慢,所以应该不惜一切代价避免内存交换的发生。

ES的mlockall属性允许ES节点不交换内存。(注意只有Linux/Unix系统可设置。)这个属性可以在yaml文件中设置:

bootstrap.mlockall: true
在5.x版本中,已经改成了bootstrap.memory_lock: true.

mlockall默认设置成false,即ES节点允许内存交换。一旦把这个值加到属性文件中,需要重启ES节点才可生效。可通过以下方式来确定该值是否设置正确:

curl http://localhost:9200/_nodes/process?pretty
如果你正在设置这个属性,请使用-DXmx选项或ES_HEAP_SIZE属性来确保ES节点分配了足够的内存。

Elasticsearch默认使用服务发现(Zen discovery)作为集群节点间发现和通信的机制。Azure、EC2和GCE也有使用其他的发现机制。服务发现由discovery.zen.*开头的一系列属性控制。

在0.x和1.x版本中同时支持单播和多播,且默认是多播。所以要在这些版本的ES中使用单播,需要设置属性discovery.zen.ping.multicast.enabled为false。

从2.0开始往后服务发现就仅支持单播了。

首先需要使用属性discovery.zen.ping.unicast.hosts指定一组通信主机。方便起见,在集群中的所有主机上为该属性设置相同的值,使用集群节点的名称来定义主机列表。

属性discovery.zen.minimum_master_nodes决定了有资格作为master的节点的最小数量,即一个应当“看见”集群范围内运作的节点。如果集群中有2个以上节点,建议设置该值为大于1。一种计算方法是,假设集群中的节点数量为N,那么该属性应该设置为N/2+1。
初步判断该设置可以有效防止脑裂问题

小贴士5:当心DELETE _all

必须要了解的一点是,ES的DELETE API允许用户仅仅通过一个请求来删除索引,支持使用通配符,甚至可以使用_all作为索引名来代表所有索引。例如:

curl -XDELETE ‘ http://localhost:9200/*/ ’
这个特性非常有用,但也非常危险,特别是在生产环境中。在我们的所有集群中,已通过设置action.destructive_requires_name:true来禁用了它。

这项配置在1.0版本中开始引用,并取代了0.90版本中使用的配置属性disable_delete_all_indices。

小贴士6:使用Doc Values

2.0及以上版本默认开启Doc Values特性,但在更早的ES版本中必须显式地设置。当进行大规模的排序和聚合操作时,Doc Values相比普通属性有着明显的优势。本质上是将ES转换成一个列式存储,从而使ES的许多分析类特性在性能上远超预期。

为了一探究竟,我们可以在ES里比较一下Doc Values和普通属性。

当使用一个普通属性去排序或聚合时,该属性会被加载到属性数据缓存中。一个属性首次被缓存时,ES必须分配足够大的堆空间,以便能保存每一个值,然后使用每个文档的值逐步填充。这个过程可能会耗费一些时间,因为可能需要从磁盘读取他们的值。一旦这个过程完成,这些数据的任何相关操作都将使用这份缓存数据,并且会很快。如果尝试填充太多的属性到缓存,一些属性将被回收,随后再次使用到这些属性时将会强制它们重新被加载到缓存,且同样有启动开销。为了更加高效,人们会想到最小化或淘汰,这意味着我们的属性数量将受限于此种方式下的缓存大小。

相比之下,Doc Values属性使用基于硬盘的数据结构,且能被内存映射到进程空间,因此不影响堆使用,同时提供实质上与属性数据缓存一样的性能。当这些属性首次从硬盘读取数据时仍然会有较小的启动开销,但这会由操作系统缓存去处理,所以只有真正需要的数据会被实际读取。

Doc Values因此最小化了堆的使用(因为垃圾收集),并发挥了操作系统文件缓存的优势,从而可进一步最小化磁盘读操作的压力。

❺ Linux下如何释放内存,swap分区满了怎么办

swap的作用可简单描述为:
当内存不够用时,将存储器中的数据块从DRAM移到swap的磁盘空间中,以释放更多的空间给当前进程使用.
当再次需要那些数据时,就可以将swap磁盘中的数据重新移到内存,而将那些不用的数据块从内存移到swap中.
2)数据从内存移动交换区的行为被称为页面调用,发生在后台的页面调用没有来自应用程序的干涉.
3)swap空间是分页的,每一页的大小和内存页的大小一样.
4)并不是一定要给每个系统划分SWAP,比如大多数的嵌入式就没有swap.

##在执行以上操作以后,查看你的swap分区还是满了,你首先查看一下你实际的内存剩多少空间,然后在查看自己的swap空间用了多少,首先提前保证实际剩余的内存比你的swap的内存的空间要大,然后执行一下操作,否则会宕机的!
首先我们停掉swap分区,查看swap分区
swapon -s 会查看到你的swap分区是挂在哪里!
然后比如说我的是挂到/dev/sda2
swapoff /dev/sda2
停止是需要一段时间的,因为他会把内存释放到实际内存当中,
然后在启动我们的swap分区
swapon -a
我们的swap分区内存已经成功释放到了实际内存当中!

❻ linux内存分页分段地址转换由什么实现

分页所完全是系统实现,咱们看不到,分段是用户程序决定到,分页中用到了页表和快表,!

❼ linux中使用什么函数可以获取操作系统下内存分页的大小

system(执行shell命令)相关函数fork,execve,waitpid,popen表头文件#include定义函数intsystem(constchar*string);函数说明system()会调用fork()产生子进程,由子进程来调用/bin/sh-cstring来执行参数string字符串所代表的命令,此命令执行完后随即返回原调用的进程。在调用system()期间SIGCHLD信号会被暂时搁置,SIGINT和SIGQUIT信号则会被忽略。返回值如果system()在调用/bin/sh时失败则返回127,其他失败原因返回-1。若参数string为空指针(NULL),则返回非零值。如果system()调用成功则最后会返回执行shell命令后的返回值,但是此返回值也有可能为system()调用/bin/sh失败所返回的127,因此最好能再检查errno来确认执行成功。附加说明在编写具有SUID/SGID权限的程序时请勿使用system(),system()会继承环境变量,通过环境变量可能会造成系统安全的问题。范例#includemain(){system(“ls-al/etc/passwd/etc/shadow”);}执行-rw-r--r--1rootroot705Sep313:52/etc/passwd-r---------1rootroot572Sep215:34/etc/shadow

❽ linux分页一块多大

linux中一块的容量为4KB

❾ linux中多级分页的重点是什么

"重点"是”point“的意思吗?
使用多级页表的point在于节省页表本身的体积。尤其是在虚拟地址64bit的情况下,物理内存一般远小于2^64字节。如果用一级页表的话,假设页面大小4KB = 2^12B,题主自己可以算算,有2^52个页表。而用多级页表,就可以只有一个顶级页表,二级三级页表可以很“稀疏”(可以理解为“少”),这样就大大减少了页表个数。

❿ linux分页机制二级页表问题

linux下的分段分页机制将一个逻辑地址转换到物理地址的问题?????
一个逻辑地址经过分段后得到的是线性地址,我挺郁闷的这个线性地址到底如何得到的???应为linux的线性地址是个32位的地址,高10为保存目录项,中间10位保存页表项,然后低12为对应物理页偏移地址。。。。然而这个逻辑地址是经过选择子选出来的段基址,加上段内偏移,出来确实是个32位地址。。。似乎这个中间的步骤被屏蔽了是吧???我想知道这里面是如果把逻辑地址转换成这个分成三个部分索引的线性地址!前面是段基址然后段偏移就出来个线性地址这叫我无法接受,刨根究底!求助。。。。求助!
【分页机制对应用程序,操作系统本身的程序都是有作用的。】

这是问题问的比较深入了,弄明白这个问题就要研究操作系统究竟怎么分配和使用内存。
一般,不管是操作系统还是应用程序都要先分配内存然后才是内存寻址和使用,而如何分配不同的系统肯定不同。操作系统种类很多,xp,2000,linux,unix。。。但一般原理还是差不多的。

以linux操作系统为例,
应用程序的内存肯定是由操作系统管的,os按分页策略给应用程序分配内存。
那么操作系统呢,这就是你关心的点了?
开机加电的时候linux操作系统内核代码进入内存,一般这些内存是连续的,但这些内存在后面使用时仍能适用分页机制去寻址,不过是页面正好是连续的罢了。
而随着操作系统运行,内核程序也会继续要求内存,这时候内存管理程序负责分配内存空间,这里面有不少细节了,暂时就不啰嗦了,但无论怎么分的,分配后使用这些内存的时候,指令地址都会以分页机制进行寻址找到分配的内存。
所以,分页机制是整个系统的内存寻址机制,对应用程序和操作系统本身都启作用。

热点内容
linux的gz解压命令 发布:2024-05-05 18:24:13 浏览:310
服务器机柜属于什么辐射 发布:2024-05-05 18:02:10 浏览:335
存储成本计算 发布:2024-05-05 18:02:10 浏览:583
如何把手机改安卓10 发布:2024-05-05 17:39:07 浏览:497
我的世界怎么扩容服务器内存 发布:2024-05-05 17:19:54 浏览:48
java读取文件字符 发布:2024-05-05 17:15:18 浏览:11
三星怎么应用加密 发布:2024-05-05 17:13:18 浏览:152
cad字体在那个文件夹 发布:2024-05-05 17:08:20 浏览:331
什么时候用编译器 发布:2024-05-05 17:08:20 浏览:766
应急救援脚本 发布:2024-05-05 17:08:17 浏览:338