mm_user mm_count

本文深入解析Linux内核中mm_struct中的mm_user和mm_count属性,阐述它们如何用于跟踪共享进程地址空间的线程数量以及mm_struct的引用次数。解释了当线程退出时mm_user的减一操作,以及在其他进程或线程引用时mm_count的增加机制。详细讨论了当所有使用者消失后,系统如何回收进程地址空间占用的内存。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对内存描述符mm_struct中的mm_user和mm_count的理解:

(1) mm_user指的就是所有共享此mm_struct描述的进程地址空间的线程数量,即:一个(进程中)线程组中的线程个数。当本进程中的线程退出时,mm_user减1,但只有当所有共享此进程空间的线程退出时,会对mm_count减1,否则不减。

(2)mm_count指的就是对mm_struct本身此结构体的引用次数。不管本进程中有多少线程,在没有其他进程或线程引用的情况下,此mm_count为1,因为本进程中的所有线程共享一个进程地址空间,就是创建线程,fork()时,直接将主线程task_struct中的mm域直接给了被fork出来的task_struct的mm域。当有其他进程或线程(除本进程中的线程)引用此mm_struct时,则mm_count加1。

(3)当本进程中的线程退出时,mm_user会减1,如果mm_user减到0了,则会对mm_count减1,如果此时mm_count也为0了,说明该进程空间么有任何使用者了,则会归还此进程地址空间占的内存给系统。
WITH vpd_parking_lot AS ( SELECT CAST(patch_id AS VARCHAR) AS patch_id, parking_lot_name, free, map_type, map_update_time, poi_type, city_code, status, CAST(EXTRACT(EPOCH FROM AGE(map_update_time)) / 86400 AS INT) AS release_date, CASE WHEN free = true THEN 1 -- 1 为公共停车场 ELSE 0 -- 2 为私人订制 END AS map_category, CASE WHEN CAST(EXTRACT(EPOCH FROM AGE(map_update_time)) / 86400 AS INT) > 30 THEN (NOW() - INTERVAL '31 day')::DATE ELSE map_update_time::DATE END AS start_date FROM rc.dwi_ncasd_parking_lot_info WHERE status = 0 AND map_type = 'unmanned_avp' AND CAST(EXTRACT(EPOCH FROM AGE(map_update_time)) / 86400 AS INT) > 30 ), enter_count AS ( SELECT LEFT(map_id, 16) AS patch_id, COUNT(*) AS patch_enter_count, software_version , COUNT(DISTINCT mdc_id) AS enter_user_count FROM kpi.dwi_kpi_10106_avp_map_build WHERE patch_id IN (SELECT patch_id FROM vpd_parking_lot) AND event_time BETWEEN TO_TIMESTAMP('2025-03-21 06:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2025-03-21 11:59:59', 'YYYY-MM-DD HH24:MI:SS') GROUP BY patch_id, software_version ), success_count AS ( SELECT LEFT(map_id, 16) AS patch_id, software_version , COUNT(*) AS patch_success_count FROM kpi.dwi_kpi_10106_avp_map_build WHERE patch_id IN (SELECT patch_id FROM vpd_parking_lot) AND event_time BETWEEN TO_TIMESTAMP('2025-03-21 06:00:00', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2025-03-21 11:59:59', 'YYYY-MM-DD HH24:MI:SS') AND map_enter_fail_flag = 0 -- 进图成功 GROUP BY patch_id, software_version ), avp_active_count AS ( SELECT CAST(avp_patch_id_org AS VARCHAR) AS avp_patch_id_org, COUNT(*) AS patch_avp_active_count, software_version , COUNT(DISTINCT mdc_id) AS avp_user_count
最新发布
03-25
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值