linux内核概述

用户态和内核态

在理解linux内核之前,首先要知道什么是用户态,什么是内核态,什么是用户进程,什么是内核进程

  • 用户进程:我们编写的程序都属于用户进程
  • 内核进程:以内核态运行在内核地址空间,不与用户直接交互,不需要终端设备,在系统启动后一直处于活跃状态直到关机
  • 用户态:用户进程的大部分时间都处在用户态下,只有需要内核所提供的服务时才会切换到内核态
  • 内核态:用户进程调用系统调用、处理CPU异常、设备向CPU发出中断请求、执行内核线程(进程),这四种情况都需要在内核态执行

用户态和进程态来回切换是一笔很大的开销

什么是进程描述符

保存内存指针、CPU寄存器信息、保存程序将要执行的下一条指令,所以可以保证进程从它停止的地方恢复执行

什么是可重入内核

可重入内核,意味着若干个进程可以同时在内核态下执行。当内核代表某一进程发出一个读磁盘请求时,就让磁盘控制器处理这个请求,然后恢复执行其他进程,当设备满足了读请求时,就会有一个中断通知内核,从而恢复执行之前的进程。所以可重入内核能够挂起因中断而停止执行的进程。

什么是内核控制路径

内核控制路径表示内核处理系统调用、异常、或中断所执行的指令序列。在最简单的情况下,CPU从第一条指令执行到最后一条指令顺序地执行内核控制路径,然而当下面任何一个事件发生时,CPU交错执行内核控制路径:

  • 运行在用户态的进程调用一个系统调用,而相应的内核控制路径无法立即处理这个请求,此时内核控制路径调用调度程序选择一个新的进程运行,发生进程切换,第一个内核控制路径还没完成,而CPU又开始执行其他的内核控制路径。
  • 运行第一个内核控制路径时,CPU检测到异常,该控制路径被挂起,CPU开启第二个新的控制路径处理异常,异常处理完毕后继续运行第一个内核控制路径。
  • CPU正在运行一个启用了中断的内核控制路径时,一个硬件中断发生,第一个内核控制路径还没执行完,CPU开始执行另一个内核控制路径来处理这个硬件中断。当这个硬件中断处理程序终止时,第一个内核控制路径恢复继续运行。
  • 在支持抢占调度的内核中,当前进程被另一个更高优先级的进程开始执行,第一个内核控制路径还没有执行完,又开始执行另一个优先级更高的内核控制路径

什么是进程地址空间

每个进程运行在它的私有地址空间,在用户态运行的进程涉及到私有栈、数据区、代码区。当在内核态运行时,进程访问内核的数据区和代码区,但使用的是另外的私有栈。

如果同一个程序由几个用户同时使用,则这个程序只被装入内存一次,其指令由所有需要他的用户共享,但是数据不被共享,每个用户端拥有独立的数据,这种共享地址空间的操作由内核自动完成以节省内存。

进程之间可以共享部分地址空间,被称作共享内存,可以实现进程间通信。

如果同一文件由几个进程同时打开,那么每个进程地址空间都包含有它的内存映射。

临界区和进程同步

一段代码,进入这段代码的进程必须全部执行完成,其他进程才能进入,这段代码被称为临界区。

进程同步用来处理多个进程同时访问临界区的情况。

常见的两种处理进程同步的方式:

  • 信号量机制:每个数据结构都对应一个信号量对象,其中包含整数变量、等待进程的链表、两个原子方法down和up。每个信号量的初始值都是1,当内核控制路径希望访问这个数据结构时,它在相应的信号量上执行down方法,将计数器-1,如果计数器为0,则允许执行,如果计数器的值小于0,则把正在运行的进程加入到这个信号量链表,然后阻塞该进程(即调用进程调度程序)。当正在访问数据结构的进程处理结束后,执行up方法,对计数器+1,然后允许链表上的另一个进程继续执行
  • 自旋锁:如果修改数据结构的操作所需时间非常短,为了检查信号量,内核必须把进程插入到信号量链表中,然后挂起它,因为这两种操作比较费时,完成这些操作时其他的内核控制路径可能已经释放了信号量。在这些情况下,多处理机系统使用自旋锁,当进程发现锁被另一个进程锁着时,它就不停地旋转,直到锁打开,然后去处理相应的数据结构。
发布了253 篇原创文章 · 获赞 47 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/why444216978/article/details/104884544