首页 > 系统相关 >操作系统的内存管理你知道吗

操作系统的内存管理你知道吗

时间:2022-12-21 14:01:16浏览次数:39  
标签:内核 操作系统 管理 brk 内存 Linux 进程 物理

brk()的作用也只是通知​Linux内核哪个范围的堆内存是可用的,真正的物理内存页是在进程实际读写内存的时候才会申请,而且是由内核根据写时复制/需求加载自动完成的,应用程序感知不到这点。

内存管理,是操作系统的主要功能。

操作系统从启动一直到创建0号进程(idle进程),运行的大部分代码都跟内存有关。

操作系统的内存管理,大概分这么几个层次:

1.物理内存管理

物理内存是电脑上的真实内存大小,这个数据可以通过BIOS获取。

在分页之后,物理内存的管理结构是个数组,每项表示1个物理内存页,每页4096字节。

如下图:

操作系统的内存管理你知道吗_应用程序

物理内存的管理结构

在一个简单的内核demo里,物理内存页的管理结构可以只有一项:

atomic_t refs;

即,物理内存页的引用计数:计数为0表示空闲,> 0表示正在使用,具体数字表示共享这一页的进程个数。

简单的内核demo一般是不支持SMP架构的,所以自旋锁(spinlock)也就省了。

在对称多处理器(SMP)的CPU上,因为全局数据结构会被多个CPU并发访问,所以要加自旋锁。

那么,物理内存页的管理结构至少有2项:

atomic_t spinlock;
atomic_t refs;

自旋锁的作用,与应用程序里的锁(mutex)差不多,只是它在获取失败之后会不断地再次获取,直到成功。

void spin_lock(atomic_t* lock)
{
while (spin_trylock(lock) == 0);
}

这就是给自旋锁加锁的函数,while循环直到成功,不成功时就自旋在那里一直转圈,所以叫自旋锁。

它在(对称多处理器)SMP环境里用于保护共享的数据结构:当一个CPU持有自旋锁时,另一个CPU没法访问共享数据。

如果是单个CPU的环境,没必要用自旋锁,直接关闭中断就行了。

单个CPU的情况下,关了中断就可以阻止内核的并发,共享数据也就不会被踩踏了。

但多个CPU必须使用自旋锁,因为关中断只能关闭当前CPU的,没法关其他CPU的:这时需要自旋锁保护共享数据。

物理内存的管理数组,是最重要的全局共享数据。

当需要给一个进程申请内存的时候,哪个内存页是空闲的,哪个已经被使用了,全靠查看这个数组。

加自旋锁的时候一定要先关中断,因为如果在加了锁之后、关中断之前、正好有个中断来了,而在中断处理函数里再次请求加同一个锁,那就会递归死锁了。

Linux内核的关中断加锁的函数叫:spin_lock_irqsave().

Linux内核的分配物理内存页的函数叫:get_free_pages(),它可以分配1页或连续的多页内存。

如果分配多页内存的话,起始地址是要按页数对齐的。

2.虚拟内存管理

虚拟内存都是通过进程的页表管理的。

为了节省物理内存,新创建的进程是与父进程共享同一套物理内存页的。

只有新进程要写某个内存页时,才会给它复制一份新的物理内存页,然后取消该页与父进程的共享,这就是写时复制。

操作系统的内存管理你知道吗_物理内存_02

写时复制的过程

写时复制的过程:

1)申请一个新内存页,

2)把老内存页的内容,复制到新内存页上,

3)把新内存页的地址填入子进程的页表,

4)把老内存页的引用计数减1。

所以,新进程刚被创建出来时,它的用户空间并没有自己的物理内存页,只有当运行需要时才一点点地通过写时复制添加,以让物理内存最大限度的空闲着。

另一个让物理内存最大限度空闲着的机制,就是需求加载:

1)当mmap一个文件时,操作系统并不会直接为这个文件分配内存,并且把它的内容加载到内存里,

2)而是当进程真去读这个文件的某一部分时,才给它申请物理内存页,并且把这一部分内容从磁盘读到内存。

copy on write,load on read.

不到火烧眉毛的时候,Linux系统是不会把物理内存给进程的​

3.用户态的内存函数

以上的这些机制都是OS内核里的,应用程序的代码不需要管这些。

应用程序分配内存的最底层函数,就是brk()系统调用。

操作系统的内存管理你知道吗_物理内存_03

brk()是一个系统调用,它的作用就是修改应用程序的数据段的结尾,从而分配或回收应用程序的堆空间。

操作系统的内存管理你知道吗_物理内存_04

C库里的把它封装成了sbrk()和brk()两个函数,让它使用起来更符合人们的习惯:

sbrk()用于申请内存:void* sbrk(int increment);

brk()用于回收内存:int brk(void* addr);

实际上,Linux系统只有1个brk()系统调用,它既设置进程数据段的末尾,又会把这个值返回给应用程序。

操作系统的内存管理你知道吗_自旋锁_05

Linux内核的头文件里,brk()系统调用的处理函数sys_brk()是这么定义的,如上图。

如果想直接使用系统调用,可以使用Linux的syscall()函数,依次传入调用号和参数列表,就可以看到哪些是真实的系统调用,哪些是C库的封装。

syscall()函数的声明是:long syscall(long number, ...);

它的参数是可变的,系统调用的参数最多只有6个,因为寄存器的个数有限。

在sbrk() 和 brk()的基础上再封装,就是人们经常使用的malloc() 和 free()了。

malloc() 申请的内存是一块块的,可以不按次序释放,而不影响使用。

brk() 和 sbrk() 申请的内存必须按次序释放,因为它会修改进程的数据段结尾:

数据段结尾(brk)之外的堆空间如果被使用,就属于段错误。

所以,Linux man手册里说明了,应用程序不要用sbrk()和brk()申请和释放内存。

brk()的作用也只是通知Linux内核哪个范围的堆内存是可用的,真正的物理内存页是在进程实际读写内存的时候才会申请,而且是由内核根据写时复制/需求加载自动完成的,应用程序感知不到这点。

Linux还会把不常用的物理内存页交换到磁盘上(即swap分区),以腾出更多的内存。

所以,在内存不足时,磁盘的读写频次也会升高。


标签:内核,操作系统,管理,brk,内存,Linux,进程,物理
From: https://blog.51cto.com/u_12148962/5959892

相关文章

  • 基于Springboot+Mybatis+mysql+element-vue高校就业管理系统
    @目录一、系统介绍二、功能展示1.用户登陆注册2.个人信息(学生端)3.查看企业岗位信息(学生端)4.我的应聘(学生端)5.学生信息管理(辅导员)6.三方协议书审核(辅导员)7.查看班级就业......
  • 基于Springboot+Element-Vue-Admin实现简单权限管理系统
    @目录一、系统介绍二、功能展示1.用户登陆2.用户管理3.权限管理、权限设置4.菜单管理三、数据库展示四、其它1.数据库表2.获取源码一、系统介绍系统主要功能:系统实现了用......
  • 基于SpringBoot+html超市进销存管理系统
    @目录一、系统介绍二、功能展示1.用户登陆2.进货管理(货物管理员)3.退货管理(货物管理员)4.商品销售、商品销售退货(商品管理员)5.管理商品、商品类别、供应商、客户(商品管理......
  • 内存屏障(Memory Barrier)(一)什么是写屏障?
    ​​《内存屏障(MemoryBarrier)(一)什么是写屏障?》​​《内存屏障(MemoryBarrier)(二)什么是读屏障?》《内存屏障(MemoryBarrier)(三)volatile关键字是怎么实现的?》目录​​为什么要有......
  • 内存屏障(Memory Barrier)(二)什么是读屏障?
    ​​《内存屏障(MemoryBarrier)(一)什么是写屏障?》​​《内存屏障(MemoryBarrier)(二)什么是读屏障?》《内存屏障(MemoryBarrier)(三)volatile关键字是怎么实现的?》目录​​一、Store......
  • 软件管理(六)平行沟通
    目录​​一、利益点不同​​​​二、沟通方式语气很重要​​​​并不总是那么容易​​​​总结​​在之前我们说了,怎么让你在公司内争取资源,在领导支持下做成事情的向上沟......
  • 软件管理(五)向下沟通怎么让你的团队高效工作与成长?
    目录​​一、什么是向下沟通​​​​二、技术人总是免不了要带团队​​​​三、正反示例​​​​反例​​​​正例​​​​四、见人下菜​​​​五、总结​​关于怎么提升......
  • 软件管理(四)向上沟通怎么影响你的职业发展机会
    目录​​一、什么是向上管理?​​​​二、为什么要进行向上管理?​​​​三、向上沟通​​​​反面​​​​正面​​​​最后​​什么是向上管理?就是管理你的上司,你的老板,其......
  • 操作系统概念:笔记
    OperationSystemConcepts目录OperationSystemConceptsPart2PROCESSMANAGEMENTChap3Process(Someconcept)3.1ProcessConcept3.1.1Process3.1.2ProcessStat......
  • 教你如何轻松搞定云上打印管理
    摘要:加快自主创新,满足数字化用户多场景文印需求。本文分享自华为云社区《有了司印云打印,云上打印管理轻松搞定!》,作者:云商店。作为与职场和个人办公息息相关的工作场景,打......