linux 进程地址空间 之 mm_count vs mm_users

原创 2012年03月27日 14:58:23

首先引用 ULK上面的解释 :

The mm_users field stores the number of lightweight processes that share the mm_struct data structure (see the section "The clone( ), fork( ), and vfork( ) System Calls" in Chapter 3). The mm_count field is the main usage counter of the memory descriptor; all "users" in mm_users count as one unit in mm_count. Every time the mm_count field is decreased, the kernel checks whether it becomes zero; if so, the memory descriptor is deallocated because it is no longer in use.

We'll try to explain the difference between the use of mm_users and mm_count with an example. Consider a memory descriptor shared by two lightweight processes. Normally, its mm_users field stores the value 2, while its mm_count field stores the value 1 (both owner processes count as one).

If the memory descriptor is temporarily lent to a kernel thread (see the next section), the kernel increases the mm_count field. In this way, even if both lightweight processes die and the mm_users field becomes zero, the memory descriptor is not released until the kernel thread finishes using it because the mm_count field remains greater than zero.

If the kernel wants to be sure that the memory descriptor is not released in the middle of a lengthy operation, it might increase the mm_users field instead of mm_count (this is what the try_to_unuse( ) function does; see the section "Activating and Deactivating a Swap Area" in Chapter 17). The final result is the same because the increment of mm_users ensures that mm_count does not become zero even if all lightweight processes that own the memory descriptor die.

The mm_alloc( ) function is invoked to get a new memory descriptor. Because these descriptors are stored in a slab allocator cache, mm_alloc( ) calls kmem_cache_alloc( ), initializes the new memory descriptor, and sets the mm_count and mm_users field to 1.

Conversely, the mmput( ) function decreases the mm_users field of a memory descriptor. If that field becomes 0, the function releases the Local Descriptor Table, the memory region descriptors (see later in this chapter), and the Page Tables referenced by the memory descriptor, and then invokes mmdrop( ). The latter function decreases mm_count and, if it becomes zero, releases the mm_struct data structure.

 

简而言之呢,就是

mm_count 代表了对 mm 本身的引用,而 mm_users 代表对 mm 相关资源的引用,分了两个层次。mm_count类似于 以进程为单位。  mm_users类似于以线程为单位。

内核线程在运行时会借用其他进程的mm_struct,这样的线程叫"anonymous users",
因为他们不关心mm_struct指向的用户空间,也不会去访问这个用户空间.他们只是临时借用.
mm_count记录这样的线程.

mm_users是对mm_struct所指向的用户空间进行共享的所有进程的计数.
也就是说,会有多个进程共享同一个用户空间.

mm_user mm_count

对内存描述符mm_struct中的mm_user和mm_count的理解: (1) mm_user指的就是所有共享此mm_struct描述的进程地址空间的线程数量,即:一个(进程中)线程组中的线程个...
  • wen0605
  • wen0605
  • 2013年03月21日 21:48
  • 1358

linux 内存地址空间管理 mm_struct

Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起。(所依据的代码是2.6.32.60) 无论是内核线程还是用户进程,对于内核来说,无非都是task_struct...
  • yusiguyuan
  • yusiguyuan
  • 2014年09月24日 11:14
  • 1667

VS调试技巧之附加进程

用过VS一段时间的程序员们相信都有过这样的调试经历:每次按下F5进行断点调试时,都要等待好长时间:先让解决方案编译通过,然后启动VS自带的简版IIS作为服务器启动,进而开启浏览器,最后进行相应的操作进...
  • wlccomeon
  • wlccomeon
  • 2014年10月31日 22:47
  • 25712

VS2010调试 多进程

选择启动项目 在“解决方案资源管理器”中,右击项目名,然后在快捷菜单上单击“设为启动项目”。 如果要调试不止一个项目,可以选择多个启动项目。 选择多个启动项目 在“解决方案资源管理器...
  • zhangbinsijifeng
  • zhangbinsijifeng
  • 2015年10月30日 11:38
  • 333

多进程 VS 多线程

在Linux下编程多用多进程编程少用多线程编程。          IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的...
  • zqixiao_09
  • zqixiao_09
  • 2015年12月12日 22:05
  • 1178

VS2013远程调试----使用自带工具+附加进程

网上找了些资料看了写博客,按着上面的步骤操作过,但是资料里的界面在我的编辑器中怎么也找不到类似的,无奈之下只能另寻他法了,发现vs 附加到进程 的弹窗中有一个传输下拉框里面有远程的选项,或许就是这个了...
  • huangli321456
  • huangli321456
  • 2016年11月18日 09:42
  • 2138

Linux 多线程VS多进程

鱼还是熊掌:浅谈多进程多线程的选择 关于多进程和多线程,教科书上最经典的一句话是“进程是资源分配的最小单位,线程是CPU调度的最小单位”,这句话应付考试基本上够了,但如果在工作中遇到类似的选择问题,...
  • Jadentan
  • Jadentan
  • 2016年12月30日 22:58
  • 501

linux下进程无缘无故消失

最近发现每隔一段时间,某一台机器线上的服务总是挂掉,进程直接就消失了,别的机器上的服务都正常跑着,怎么单单某一台的服务的进程就没有了呢,奇怪啊,也没有什么征兆,最后发现:执行 last reboot ...
  • iamlihongwei
  • iamlihongwei
  • 2016年11月23日 18:10
  • 1998

linux 0号进程 1号进程 区别(转)

系统允许一个进程创建新进程,新进程即为子进程,子进程还可以创建新的子进程,形成进程树结构模型。整个linux系统的所有进程也是一个树形结构。树根是系统自动构造的,即在内核态下执行的0号进程,它是所有进...
  • shenwansan_gz
  • shenwansan_gz
  • 2015年02月04日 20:18
  • 1199

Linux进程理解与实践(五)细谈守护进程

一. 守护进程及其特性      守护进程最重要的特性是后台运行。在这一点上DOS下的常驻内存程序TSR与之相似。其次,守护进程必须与其运行前的环境隔离开来。这些环境包括未关闭的文件描述符,控制终端...
  • NK_test
  • NK_test
  • 2015年09月14日 19:26
  • 2086
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:linux 进程地址空间 之 mm_count vs mm_users
举报原因:
原因补充:

(最多只允许输入30个字)