欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

“Address(地址)”指 图纸加密 的进程的逻辑地址空间

点击: 次  来源:昆山软开发 时间:2018-04-23

原文出处: 暗无天日

相识内存分派机制(共享映射与请求分页)

通过 pmap 呼吁,可以获取用户历程逻辑地点空间中映射的内存信息:

pmap -x $pid

个中 -x 暗示获取具体信息。

下面是一个例子:

pmap -x $(pidof emacs) |head -20

个中,“Address(地点)”指的历程的逻辑地点空间。

“Kbytes”列暗示的是对应逻辑地点的容量,以Kb为单元

“RSS”列暗示的是实际利用的物理内存容量,由于分页机制的存在,这个值一般要比”Kbytes”的值要少。

“Mapping”列为逻辑内存的映射方法,个中”[annon]“暗示通过malloc函数来分派的堆空间(匿名内存),”[stack]“为历程的栈空间,这两种映射都是将物理内存映射到历程的逻辑内存上去。 而”emacs-25.3″,”libpixbufloader-svg.so”等文件名则暗示它们执行的是文件映射,他们对应的是磁盘上的文件。当这些文件被读入高速缓存后,昆山软件开发,相应的内存空间被映射成历程的逻辑内存。

当呈现多个措施配合利用沟通的文件映射(共享库)时,它们可以共享磁盘高速缓存中的同一空间,从而节减物理内存的利用量,劳务派遣管理系统,这种技能就是”共享映射”技能。

除了共享库外,历程的fork也利用了共享映射技能。 当父历程fork子历程时,Linux内核并差池内存中的内容举办实际上的复制,而是将映射到父历程逻辑地点空间内的那部门内容原封不动地共享映射到子历程的逻辑地点空间内。 但为了防备父历程和子历程的内存操纵彼此影响,Linux内核在举办共享映射时,相应的内存区域会临时配置为写掩护。 当某一方历程试图操纵内存时,会激发只读异常。内核检测到这个异常后,会复制操纵的这个内存页,从而使两个历程都可举办独立写入。 这种在写入时复制的机制叫做“写时复制(copy-on-write)”

另一方面,历程将可执行文件或共享库文件内容读入内存并映射到历程逻辑地点空间上时,并不会读入全部的文件内容,而是先标志”该文件的内容已经被映射到逻辑地点空间内”. 当历程会见逻辑地点空间时,由于不存在对应的物理内存,昆山软件公司,会激发换页错误的异常。内容检测到该异常后会将所需部门以内存页为单元读入内存中。 这种只读入所需内容的机制,叫做请求分页。

相识内存释放机制

当其他历程需要新的物理内存时,就涉及到如何将另有数据残余的物理内存释放或换出来的问题了。

当需要新物理内存时,会优先释放Inactive(file)和Active(file)中记录的内存页,只需要将脏数据写入文件中再释放内存页即可。

而Inactive(anon)和Active(anon)内存页则需要将内容互换到物理磁盘上的swap中后再释放。 详细来说,Linux会在历程页表上做一个标志,标志出换出内存所对应的逻辑地点。 当历程会见该逻辑地点时,会发生相应物理内存不存在的异常,Linux内核检测到这个异常后,会再次将数据从swap中加载入空闲内存,并从头设置页表信息。

Linux内核利用两种机制来加速换出处理惩罚速度:

  • 一种是预读。

    当某一个内存页需要换入时,Linux内核会将其后的几个内存页一起换入。因为历程持续会见多个内存页的大概性很大。预读的页数为内核参数 vm.page-cluster 抉择为 2^vm.page-cluster.

  • 另一种是互换缓存。

    即在换入某个内存页后,物理磁盘上互换空间中仍然保存原数据,这种状态的内存会记录在“互换缓存”的列表上。这样当需要再次换出记录在“互换缓存”上的内存页的数据时,就无需再次换入了。

  • 每个历程的内存利用环境可以通过查察 /proc/历程ID/status 来查察

    cat /proc/$(pidof emacs)/status
    Name: emacs
    Umask:  0022
    State:  S (sleeping)
    Tgid: 6769
    Ngid: 0
    Pid:  6769
    PPid: 1
    TracerPid:  0
    Uid:  1000  1000  1000  1000
    Gid:  1000  1000  1000  1000
    FDSize: 64
    Groups: 986 998 1000 
    NStgid: 6769
    NSpid:  6769
    NSpgid: 6769
    NSsid:  6769
    VmPeak:   567040 kB
    VmSize:   567040 kB
    VmLck:         0 kB
    VmPin:         0 kB
    VmHWM:    241176 kB
    VmRSS:    241176 kB
    RssAnon:    204544 kB
    RssFile:     36604 kB
    RssShmem:       28 kB
    VmData:   231712 kB
    VmStk:      1596 kB
    VmExe:      2332 kB
    VmLib:     47832 kB
    VmPTE:      1008 kB
    VmSwap:        0 kB
    HugetlbPages:        0 kB
    CoreDumping:  0
    Threads:  4
    SigQ: 1/15456
    SigPnd: 0000000000000000
    ShdPnd: 0000000000000000
    SigBlk: 0000000000000000
    SigIgn: 0000000004381000
    SigCgt: 00000001db816eff
    CapInh: 0000000000000000
    CapPrm: 0000000000000000
    CapEff: 0000000000000000
    CapBnd: 0000003fffffffff
    CapAmb: 0000000000000000
    NoNewPrivs: 0
    Seccomp:  0
    Cpus_allowed: 3
    Cpus_allowed_list:  0-1
    Mems_allowed: 1
    Mems_allowed_list:  0
    voluntary_ctxt_switches:  12951
    nonvoluntary_ctxt_switches: 21641

    个中较量有用的项有:

    VmData

    data段的巨细

    VmExe

    text段的巨细

    VmHWM

    当前物理内存利用量的最大值

    WmLck

    用mlock锁定的内存巨细

    VmLib

    共享库的利用量

    VmPTE

    页面表的巨细

    VmPeak

    当前物理内存的最大值

    VmRSS

    物理内存的实际利用量

    VmSize

    逻辑地点的巨细

    VmStk

    仓库的巨细

    VmSwap

    互换空间的利用量