首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

调用mmap回调时是否保留了mmap_sem?

调用mmap回调时是否保留了mmap_sem取决于具体的实现。mmap_sem是Linux内核中用于对内存映射操作进行同步的信号量。它的作用是保护对虚拟内存区域的并发访问,以防止多个进程同时修改同一内存区域的映射关系。

在一些实现中,调用mmap回调时会保留mmap_sem,以确保在回调期间不会发生竞争条件。这样可以防止其他进程或线程在回调期间修改映射关系,从而保证回调的正确执行。

然而,并不是所有的实现都会保留mmap_sem。具体是否保留mmap_sem取决于内核版本、操作系统配置以及应用程序的需求。在某些情况下,为了提高性能或避免死锁等问题,可能会选择在回调期间释放mmap_sem。

总之,调用mmap回调时是否保留mmap_sem是一个实现相关的问题,需要根据具体情况来确定。在编写应用程序时,应该遵循操作系统的规范和最佳实践,并根据具体需求进行适当的同步操作,以确保内存映射的正确性和安全性。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云云服务器(ECS):https://cloud.tencent.com/product/cvm
  • 腾讯云云原生容器服务(TKE):https://cloud.tencent.com/product/tke
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析等):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

User space lowmemorykiller-OOM reaper

我们知道,UMLK 的目的是回收内存,其通过判处一些屌丝进程(低优先级占用大内存)的死刑(Kill)来回收内存,典型的丢兵帅策略。然而,如果kill的进程的memory回收太慢,可能就达不到目的。...关于内核应如何处理内存,是否应允许内存过度使用,内存不足意味着什么以及在出现这种情况应采取的措施,意见不一。 似乎只在一件事上达成了普遍共识:OOM情况很糟,内核对OOM情况的处理甚至更糟。...目前缺乏可分配的memory并不意味着系统无法分配memory;考虑到调用OOM的代价很高,如果内核能够从某个地方获取一些内存,就不要trigger OOM。...OOM reaper 仍然必须使用mmap_sem锁来释放页面,这意味着如果有其他进程在使用mmap_sem,那么回收内存则可能会阻塞。 但是,与目前的内核相比,“大大降低”了阻塞的可能性。...另一个潜在的问题是,如果目标进程在被杀死正在core dump,则回收其页面可能会损坏core dump。

1.2K20

【Linux 内核 内存管理】mmap 系统调用源码分析 ③ ( vm_mmap_pgoff 函数执行流程 | vm_mmap_pgoff 函数源码 )

文章目录 一、vm_mmap_pgoff 函数执行流程 二、vm_mmap_pgoff 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " ,...如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 在 sys_mmap_pgoff 系统调用函数 中 , 最后调用了 vm_mmap_pgoff 函数..." 权限 ; 然后 , 如果 读写 " 信号量 " 权限 申请通过 , 那么调用 do_mmap_pgoff 函数 , 执行 创建 " 内存映射 " 的过程 , 特别注意 , 这是 创建 " 内存映射...ret) { if (down_write_killable(&mm->mmap_sem)) return -EINTR; ret = do_mmap_pgoff(file, addr,...len, prot, flag, pgoff, &populate, &uf); up_write(&mm->mmap_sem); userfaultfd_unmap_complete

2.1K10
  • mmap的系统调用

    mmap()返回的地址,len是映射区的大小。...二、mmap的系统调用 0.查找mmap在内核中的系统调用函数 我现在用的内核版是4.19.40,首先在应用层参考上面解析编写一个mmap使用代码,然后编译成程序,在使用strace工具跟踪其函数调用,...可以发现mmap也是调用底层的mmap系统调用,然后我们寻找一下底层的带6个参数的mmap系统调用有哪些: 可以看到,arm64和X86的系统调用位于不同文件。...在这里需要在调用vma_link前置 addr = vma->vm_start; vm_flags = vma->vm_flags; } else if (vm_flags & VM_SHARED...上面的源码在不断的设置一些标记位,这些标记位就决定了进程在访问这些内存内核的行为,mmap仅负责创建一个映射而已。

    1.4K30

    glibc nptl库pthread_mutex_lock和pthread_mutex_unlock浅析

    , fault it in and * start all over again. */ up_read(&curr->mm->mmap_sem); ret = get_user(...} } //如果timeout是正常定时,则设置过期时间 expire = timeout + jiffies; //设置定时器,process_timeout是定时器超时后,的函数...Linux内核定时器函数是通过软中断完成的,在每次时钟中断后,会设置时钟软中断标志,然后会唤醒ksoftirqd内核线程对时钟软中断进行处理,时钟软中断处理函数会遍历定时器链表,如果有超时的定时器则进行函数回...可以看到注册的函数是process_timeout,也就是说在休眠时间内如果没有其它进程唤醒休眠进程,在休眠时间到之后会触发process_timeout函数。...再看process_timeout函数: /* * timer:定时器 * function:定时器到期后触发的函数 * data:表示当前进程的task_struct * */ static

    1.7K20

    mlock技术分析和使用以及问题

    分析: 1,mlock 代码:linux-4.0.4/mm/mlock.c中,实现了mlock/munlock/mlockall/munlockall系统调用: ?...另外,这里需要注意一点,在执行这段函数的过程中,是需要使用信号量mm->mmap_sem的。如果这里需要处理的地址空间比较大,那么就意味着mm->mmap_sem被占用的时间会比较长。...所以,不能在启动同步执行这个mlock,否则Guest启动慢了10S是一个比较尴尬的情况。所以,可以选择使用多线程,用一个线程,后台执行就行了吧。 然而,新的问题又来了。...在2节中提到mm->mmap_sem被__mm_populate长时间占用。...再继续分析linux-4.0.4/arch/x86/mm/fault.c: 分析__do_page_fault(进程发生page fault的时候,处理的handler)函数会发现,这里也需要使用mm->mmap_sem

    4.8K110

    Linux进程的内存管理之malloc和mmap

    通过《Linxu进程的内存管理》,我们知道了进程内存的最小单位是vma,根据不同的用处又划分了不同类型的vma,比如 heap: 动态分配和释放的内存 stack: 存放局部变量和实现函数调用 mmap...malloc 在linux标准libc库种,malloc函数的实现会根据分配内存的size来决定使用哪个分配函数,当size小于等于128KB调用brk分配;当size大于128KB调用mmap...分配内存,将heap段的最高地址指针mm->brk往高地址扩展。释放内存,把mm->brk向低地址收缩。 ?...= 0; up_write(&mm->mmap_sem); userfaultfd_unmap_complete(mm, &uf); if (populate) mm_populate(oldbrk..., newbrk - oldbrk); return brk; out: retval = mm->brk; //释放信号量 up_write(&mm->mmap_sem); return

    5K11

    【Linux 内核 内存管理】内存映射相关数据结构 ④ ( vm_area_struct 结构体成员分析 | vm_ops 成员 | vm_operations_struct 结构体成员分析 )

    进程内存 ) 博客中 , 介绍了内存映射的原理 , 分配 " 虚拟内存区域 " 后 , 第一次访问会产生 " 缺页异常 " , 之后对于 " 文件映射 " , 如果没有映射 " 物理内存页 " , 就会...fault 函数 , 将 文件中的数据 读取到 " 物理内存页 " 中 ; fault 函数指针 , 指向的函数 , 就是在 fault 函数调用 ; int (*fault)(struct..., 如果是 第一次 写该 内存映射 , 会生成 " 页错误异常 " , " 异常处理程序 " 会执行 " 写复制 " 机制 , 调用该 page_mkwrite 函数指针指向的函数 , 通知该 "...文件页 " 马上要变成可写状态 , 此时 " 文件系统 " 会检查该 写操作 是否合法 , 是否允许修改该 文件页 , 是否需要等待以便进入合适的状态再进行写操作 ; /* notification.... */ struct list_head anon_vma_chain; /* Serialized by mmap_sem & * page_table_lock */ struct

    1.8K30

    (好文重发)朴英敏:用crash工具分析Linux内核死锁的一次实战

    这里是要获取被某个线程mm的mmap_sem锁,而这个锁又被另外一个线程持有。 3、推导读写锁 要想知道哪个线程持有了这把锁,我们得先用汇编推导出这个锁的具体值。...x0和x28寄存器存放的就是sem的值,那x21自然就是mm_struct的地址了,因为mm_struct的mmap_sem成员的offset就是104(0x68),用whatis命令可以查看结构体的声明...因此我们只需要知道x21或者x28就知道mm和mmap_sem锁的值。...分析到这里我们知道watchdog线程是在读取1651线程的proc节点被阻塞了,原因是这个进程的mm,它的mmap_sem锁被其他线程给拿住了,那到底是谁持了这把锁呢?...代码中确实是存在持mmap_sem的地方,并且是读者,因此可以确定是2124持有的读写锁阻塞了watchdog在内的19个线程。

    4.6K34

    一文读懂 Linux 内存分配全过程

    struct rb_node vm_rb; // 红黑树的节点, 用于保存到内存分区红黑树中 ... }; 我们对 vm_area_struct 对象进行了简化,只保留了本文需要的字段...虚拟内存分配 在《你真的理解内存分配》一文中说过,调用 malloc 申请内存,最终会调用 brk 系统调用来从堆空间中分配内存。...down_write(&mm->mmap_sem); // 对内存管理对象进行上锁 ... // 判断堆空间的大小是否超出限制, 如果超出限制, 就不进行处理 rlim = current...goto out; set_brk: mm->brk = brk; // 设置堆空间的顶部位置(brk指针) out: retval = mm->brk; up_write(&mm->mmap_sem...在《你真的理解内存分配》一文中介绍过,当对没有映射的虚拟内存地址进行读写操作,CPU 将会触发 缺页异常。内核接收到 缺页异常 后, 会调用 do_page_fault 函数进行修复。

    1.6K41

    【Linux 内核 内存管理】mmap 系统调用源码分析 ④ ( do_mmap 函数执行流程 | do_mmap 函数源码 )

    文章目录 一、do_mmap 函数执行流程 二、do_mmap 函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移是内存页大小的整数倍..., 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 在 sys_mmap_pgoff 系统调用函数 中 , 最后调用了 vm_mmap_pgoff 函数 , 继续向下执行 ; 在 vm_mmap_pgoff...函数 中 , 核心处理过程就是调用 do_mmap 函数 , 这是 " 内存映射 " 创建的主要函数逻辑 ; 一、do_mmap 函数执行流程 ---- do_mmap 函数 , 主要功能是 创建 "...mmap_region 函数 , 创建 " 虚拟内存区域 " ; addr = mmap_region(file, addr, len, vm_flags, pgoff, uf); 二、do_mmap...函数源码如下 : /* * The caller must hold down_write(¤t->mm->mmap_sem). */ unsigned long do_mmap(struct

    2K10

    Linux内存管理2.6 -反向映射RMAP(最终版本)

    struct list_head same_vma; /* locked by mmap_sem & page_table_lock */---链表节点,通常把anon_vma_chain添加到vma...父进程创建子进程 父进程通过fork系统调用创建子进程,子进程会复制父进程的进程地址空间VMA数据结构作为自己的进程地址空间,并且会复制父进程的PTE页表项内容到子进程的页表中,实现父子进程共享页表。...fork()系统调用实现在kernel/fork.c中,在dup_mmap()中复制父进程的地址空间和父进程的PTE页表项: static int dup_mmap(struct mm_struct *...(); down_write(&oldmm->mmap_sem); flush_cache_dup_mm(oldmm); uprobe_dup_mmap(oldmm, mm);.../* * Not linked in yet - no deadlock potential: */ down_write_nested(&mm->mmap_sem,

    56680
    领券