严格意义上讲,Linux并不严格区分进程和线程,众所周知,进程是资源分配的基本单位而线程是系统调度的基本单位,但是在Linux中,task_struct作为内核调度的实体,即一个线程,如果其使用的资源完全独立于其他task_struct,那就可以看作一个”进程”,如果其使用的资源完全是另一个task_struct,那就可以看作一个”线程”,如果其使用的资源部分是自己的,部分是其他task_struct的,那就可以看作一个”X程”,扯远了,下图中的task_struct表示一个进程。

当我们malloc一块内存的时候,本质上是调用brk()移动当前进程的堆指针,在内核中的表现为构建相应的虚拟内存结构vm_area_struct,这个vm_area_struct描述了一块虚拟地址空间,其中还保存着相应的权限信息,这些结构构建好之后变使malloc()返回,当用户去写这块分配出来的内存的时候,MMU会发现进程的PT并没有相应的映射表项,进而触发PageFault,内核的PageFault核心处理函数是do_page_fault(),这个函数会检查相应的vm_area_struct权限是否正确,如果检查通过,就会通过buddy分配器(注意不是slab,slab只给内核用)分配相应的内存并修改PT,如此这块虚拟地址空间才真正可用。