首页 > 系统相关 >Linux系统内存管理API

Linux系统内存管理API

时间:2024-08-05 09:53:36浏览次数:17  
标签:映射 int void API 内存 Linux include 虚拟内存

Linux系统内存管理API

遵循POSIX标准的内存管理API:
#include <unistd.h>
​
//  brk和sbrk在内部维护一个指针p(void*),p指针指向当前堆内存中已经映射成功的最后一个字节的下一个地址位置
void *sbrk(intptr_t increment);
功能:根据参数increment来调整p的位置,既可以映射内存,也可以取消映射
incremen:移动增量
    >0  p+incremen  映射内存
    0   p           获取p的位置
    <0  p+incremen  取消映射
返回值:移动前,p指针的位置  
​
int brk(void *addr);
功能:通过直接移动p到addr地址位置,来映射和取消映射
addr:   直接移动到的位置
    > p     映射内存
    < p     取消映射    
返回值:成功0 失败-1
    
注意:sbrk和brk都可以单独映射、取消映射,但是一般都会配合一起使用,通过sbrk映射内存,通过brk取消映射
注意:sbrk和brk只能对虚拟内存进行映射、取消映射,无法做到精细化管理,只是维护一个位置指针

练习:计算出100~100000之间的所有素数,存储在堆内存,尽量不浪费内存

#include <stdio.h>      
#include <unistd.h>
#include <stdbool.h>
​
bool is_prime(int num)
{
    for(int i=2; i<=num/2; i++)
    {
        if(0 == num%i) return false;
    }
    return true;
}
​
int main(int argc,const char* argv[])
{
    int* start = sbrk(0);
    for(int i=100; i<100000; i++)
    {
        if(is_prime(i))
        {
            int* p = sbrk(4);
            *p = i;
        }
    }
​
    int* p = start,*end = sbrk(0);
    while(p < end)
    {
        printf("%d ",*p++);
    }
    brk(start);
}
Linux系统提供的内存管理函数:
#include <sys/mman.h>
//  mmap和munmap底层不维护任何东西
//  通过mmap映射内存,是以一页为单位来映射的
​
void *mmap(void *addr, size_t length, int prot, int flags,int fd, off_t offset);
功能:
    1、用户空间的虚拟内存与物理内存建立映射关系
    2、用户空间的虚拟内存与文件建立映射关系
addr:想要映射的虚拟内存的首地址,如果是NULL,则由操作系统自动计算
length:要映射的字节数
prot:映射后的内存权限
    PROT_EXEC  执行权限  
    PROT_READ  读权限  
    PROT_WRITE 写权限     
    PROT_NONE  无权限  
        如果要有多个权限,进行按位或操作
flags:设置参数
    MAP_SHARED  共享映射,映射的内容对其它进程是可见的,如果此时映射给文件,相当于可以输出到文件中
    MAP_PRIVATE 私有映射,映射的内容其它进程不可见
    MAP_ANON    拒绝对文件进行映射,会忽略fd、offset参数
    MAP_FIXED   如果提供了addr无法进行映射,则直接失败,系统不会自动调整
fd:文件描述符,类似于文件指针,如果不使用则给0即可
offset:映射文件后从该偏移值开始操作文件
返回值:映射成功后的虚拟内存首地址,失败返回0xFFFFFFFF
​
int munmap(void *addr, size_t length);
功能:取消映射
addr:已经映射的内存首地址
length:内存字节数
返回值:成功0 失败-1
#include <stdio.h>                                                                                                                                              
#include <sys/mman.h>
​
int main(int argc,const char* argv[])
{
    FILE* fp = fopen("t.txt","r+");
    if(NULL == fp)
    {
        perror("fopen");
        return -1;
    }
​
    //  转换成文件描述符
    int fd = fileno(fp);
​
    printf("----\n");
    char* str = mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARED|MAP_FILE,fd,0);
    printf("----\n");
    if((void*)-1 == str)
    {
        perror("mmap");
        return 0;
    }
    //  往映射后的虚拟内存写入数据 
    printf("----%s\n",str);
    sprintf(str,"hello worldxxxxxxxxxxiid\n");
//  str[0] = 'a';   
    //  取消映射
    munmap(str,100);
​
    fclose(fp);
}

标签:映射,int,void,API,内存,Linux,include,虚拟内存
From: https://blog.csdn.net/zzt_is_me/article/details/140919134

相关文章

  • Linux基础第一天
    Linux基础第一天Linux简介Linux是一种开源的操作系统,因此,Linux是一种免费的操作系统,可以在多种计算机设备上运行,包括台式机、笔记本电脑、服务器和嵌入式系统等。Linux操作系统具有稳定性、安全性和可扩展性等优点,广泛应用于服务器领域、云计算、超级计算机和移动设备等各种......
  • Linux中的目录结构和文件管理学习
    目录Linux的目录结构文件的查看和检索catmorelessheadtailgrep文件的压缩和解压缩压缩命令解压缩命令归档命令vim文本编辑器文本编辑器的作用文本编辑器的三种模式命令模式末行模式编辑模式Linux的目录结构/root:管理员的宿主(家)目录。/home:普通用户的......
  • Linux用户-sudo命令
    作者介绍:简历上没有一个精通的运维工程师。希望大家多多关注我,我尽量把自己会的都分享给大家,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。Linux是一个多用户多任务操作系统,这意味着它可以同时支持多个用户登录并使用系统。但是我们之前所有的操作都是基于超级......
  • 如何使用Tar命令在Linux系统中解压各种文件格式
    如何使用Tar命令在Linux系统中解压各种文件格式大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!tar命令是Linux系统中一个非常强大的工具,主要用于归档和压缩文件。它支持多种压缩格式,如.tar、.gz、.bz2、.xz等。本文将详细介绍如何使用tar命令解压各......
  • 堆和栈的区别:深入理解计算机内存管理
    堆和栈的区别:深入理解计算机内存管理大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在计算机科学中,内存管理是一个关键的概念。堆(Heap)和栈(Stack)是计算机内存管理中的两个重要区域,各自有不同的特点和用途。理解这两者的区别对于优化程序性能和调试程......
  • 身份证OCR识别API
    身份证OCR识别API是一种能够自动识别身份证上文字信息的技术,广泛应用于需要快速录入身份证信息的业务场景中。目前,市场上有多家公司提供这项服务,包括微信、腾讯云、华为云和阿里云等。微信的身份证OCR识别接口支持小程序调用,能够识别身份证正反面的所有字段,如姓名、性别、民族......
  • Linux 系统问题分析常用命令整理
    lsof在许多Linux或者类Unix系统里都有lsof命令,它常用于以列表的形式显示所有打开的文件和进程。打开的文件包括磁盘文件、网络套接字、管道、设备和进程。使用这条命令的主要情形之一就是在无法挂载磁盘和显示正在使用或者打开某个文件的错误信息的时候。常用的参数列表:l......
  • linux centos7部署zookeeper以及kafka
    一、部署zookeeper集群1.服务器配置,最好是在同一网段的IP服务器IP地址主机名node1192.168.116.6zknode1node2192.168.116.16zknode2node3192.168.116.26zknode31.1改主机名临时改主机名命令hostnametest1永久修改主机名hostnamectlset-hostnamezknode1注:要想更改后......
  • Jenkins API用户认证方式
    1、概述Jenkins的API可以通过用户名+密码或者用户名+Token的方式来进行认证,这篇文章以具体示例来说明具体的使用方式。2、Jenkins环境本文示例基于Jenkins2.452.3版本进行演示,详细的环境构建可参考《Centos7下安装配置最新版本Jenkins(2.452.3)》这篇博文。3、Jenkin......
  • 拯救PyCharm:击退IDE内存泄漏的策略
    拯救PyCharm:击退IDE内存泄漏的策略PyCharm,作为一款功能强大的集成开发环境(IDE),在处理大型项目或长时间开发过程中,可能会遇到内存泄漏的问题,导致IDE运行缓慢甚至崩溃。本文将提供一系列解决方案,帮助你诊断和解决PyCharm中的内存泄漏问题。1.内存泄漏的影响内存泄漏会逐渐......