Linux内核详解(二)

来源:互联网 发布:苹果6s移动数据怎么开 编辑:程序博客网 时间:2024/06/07 02:27
Linux调度程序

Linux调度程序负责决定执行哪个(处于可运行状态的)进程,何时执行以及执行多长时间。


多进程操作系统分为两种:抢占式和非抢占式;Linux实现了抢占式机制,即有调度程序决定何时挂起一个正在运行的进程,而让其他进程能够执行;非抢占式下的进程除非自己主动挂起(yield),否则将会一直执行。


调度策略决定何时让什么进程运行。进程可以被分为I/O密集型(比如GUI)和cpu密集型(键盘输入)两种;通常从系统的响应速度来看,调度策略往往是降低cpu密集型进程的调度频率,而延长其运行时间。Linux为了保证交互式应用和桌面系统的性能,更倾向于优先调度I/O密集型进程。

主要调度策略有:

    • 基于优先级的调度:进程执行是基于时间片的,时间片是指分配给每个可运行进程的cpu时间;此时调度程序总是选择时间片未用尽而且优先级最高的进程运行。
    • 完全公平调度(CFS):CFS采用的方法是完全摒弃时间片而是分配给进程一个处理器使用比重,从而确保了进程调度的公平性以及将切换频率置于不断变动中。CFS允许每个进程运行一段时间、循环轮转、选择运行最少的进程作为下一个运行进程,它在所有可运行进程总数的基础上计算一个进程应该运行多久,而不是依靠nice值来计算时间片。

    在Linux内核中采用了CFS来实现进程调度。


    Linux系统调用

    在现代操作系统中,内核提供了用户进程和内核进行交互的一组接口,即系统调度。系统调度的作用的主要有三个:

    • 为用户空间提供一种硬件的抽象接口;
    • 保证了系统的稳定和安全;
    • 实现多进程和虚拟内存。


    在Linux中,系统调用是用户空间处理异常和陷入之外访问内核的唯一方法。要访问系统调用,通常是通过C库中定义的函数调用(API)来进行的;在Linux中每个系统调用都有一个系统调用号,这样就可以通过这个唯一的系统调用号关联系统调用。


    应用程序通过软中断通知内核执行一个系统调用,它是通过引发一个异常使得系统切换到内核态去执行异常处理程序(实际上也就是系统调用处理程序system_call)。在陷入内核之前,用户进程就把相应系统调用号放到eax寄存器中传递给内核,这样系统调用处理程序一旦运行就可以从eax中取得数据(其他一些参数输入也可以通过寄存器传递)。


    内核在执行系统调用时处理进程上下文,current指针指向当前引发系统调用的进程。在进程上下文中,内核可以休眠(比如阻塞或调用schedule),并且可以被抢占,当系统调用返回时,控制器仍然在system_call中,它最终会负责切换到用户态。

    0 0
    原创粉丝点击