可重入内核和进程地址空间--深入理解linux内核

    可重入内核,是指多个进程可以同时处于内核态下,也就是说可以多个进程可以并发的执行内核代码。对于但处理器来说某一时刻只能有一个进程被CPU处理,其他处于内核态的进程处于阻塞或者挂起等待状态。
   

    对于linux来说,可重入内核代码包含可重入函数和非可重入函数。

   可重入函数是指运行时只改变局部数据结构,不改变全局数据结构;

    不可重入函数是指运行该函数时也需要改变全局数据结构。

    所以,如果有多个进程进入不可重入函数时,需要相应的锁机制来保证同一时刻只有一个进程改变涉及到的全局数据。
    一个内核代码指令序列,我们可以成为内核控制路径(kernel control path).


    当有多个进程处于内核态时,则多个内核控制路径需要交错的被CPU运行,具体情况有以下几种:
    (1)进程A进入内核态,执行内核控制路径P1; 进程B进入内核态,执行内核控制路径P2.  P1先被执行,当由于某些原因,P1被阻塞,那么CPU会进行进程切换,切换到进程B,执行P2. 这种情形是两个进程内的不同内核控制路径交错进行。
    (2) 进程A进入内核态,执行内核控制路径P1.CPU执行p1过程中,发生异常。则P1被挂起,CPU执行进程A的内核控制路径P2.当P2执行完后,P1被激活,CPU继续执行P1.P2和P1都在进程A的上下文环境中。这种情形是同一个进程内的多个内核控制路径交错进行。
    (3)进程A进入内核态,CPU运行A的内核控制路径P1.此时有硬件中断到来,则该P1被挂起,CPU开始执行处理此硬件中断的中断指令,即运行内核控制路径P2.内核处理完硬件中断后,继续执行P1.
    (4)进程A进入内核态,CPU运行A的内核控制路径P2,此时有处于内核态的且高优先级的进程B抢断CPU。则CPU开始运行进程B的内核控制路径。


    处于内核态和用户态的进程都有自己的进程地址空间(process address space).、每个进程都有自己的内存地址空间。处于用户态的进程,其进程地址空间包含代码区,数据区,以及私有栈。
处于内核态的进程,其代码区和数据区都是共享内核的,但是拥有自己的私有栈。也就是不同的内核控制路径,共享内核的代码区和数据区,但还有自己的私有栈。
    进程-->用户态:  代码区、数据区、私有栈。
           -->内核态:  私有栈。 代码区和数据区时内核提供的共享区。
    因此,当内核控制路径交错运行时,只有私有栈是每个路径自己的,其他都是共享内核的。

   不同的进程有自己的进程地址空间,当进程之间需要通信时,可以共享自己的部分进程地址空间,或者使用内存映射技术将共享的内存区域映射到自己的地址空间上。

 

你可能感兴趣的:(可重入内核和进程地址空间--深入理解linux内核)