Linux内核详解(二)

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中,它最终会负责切换到用户态。

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值