shedule()何时被调用

schedule()函数何时被调用,如何被调用也是一个非常重要的问题。在Kernel 2.4里面,schedule()函数可以通过两种方式调用:
一种是主动调度,直接调用函数schedule(),如进程退出,或者进入睡眠状态等。
一种是强制性调度,置位当前进程task_struct里面的need_resched。当是从内核态返回用户态的时候将检查这个位,如果发现已经被置位,会调用schedule();有以下
三种情况可能会置位need_resched:
a. 时钟中断服务程序中,发现进程已经用完自己的时间片,需要被切出CPU;
b. 当唤醒一个睡眠进程时,发现该进程比当前占有CPU的进程更有运行资格;
c. 一个进程通过系统调用改变调度政策、nice值等。
和主动调度相比,强制性调度有一定的调度延时。Kernel2.6的调度时机包含了Kernel 2.4的调度时机(不同的就是need_resched变成了一个bit)同时加入了一个重要的特性--内核可抢占。
Kernel 2.6的一大亮点就是内核可抢占,是Kernel 2.6进程调度优于2.4的一个重要表现。
(1) 何时可以抢占内核
在前面我们已经讲了内核何时可以抢占:当内核进程没有访问内核的关键数据,也就是内核没有被加锁,此时内核代码是可重入的,可以抢占内核。对内核抢占加锁是通过preempt_disable()来实现的,这个宏只是简单的将preempt_count增1就实现了内核的加锁,表明此时已经进入内核的关键数据区域,内核不可被抢占。
(2) 如何抢占内核
中断返回内核时
在前面介绍"preempt_count"的时候已经提到,内核能否抢占是通过操作preempt_count来实现的。注意arch/i386/kernel/entry.S里面以下程序:
ENTRY(resume_kernel)
        cmpl $0,TI_PRE_COUNT(%ebp)      # non-zero preempt_count ?
        jnz restore_all
need_resched:
        movl TI_FLAGS(%ebp), %ecx       # need_resched set ?
        testb $_TIF_NEED_RESCHED, %cl
        jz restore_all
        testl $IF_MASK,EFLAGS(%esp)     # interrupts off (exception path) ?
        jz restore_all
        movl $PREEMPT_ACTIVE,TI_PRE_COUNT(%ebp)
        sti
        call schedule
        movl $0,TI_PRE_COUNT(%ebp)
        cli
jmp need_resched
程序中可以看出,在中断或者异常返回内核空间以后,首先检查preempt_count是否为0,如果不为0,说明已经内核已经禁止被抢占;如果为0,则检查TIF_NEED_RESCHED位,如果已经被置位则检查此次是否是通过中断(通过检查堆栈中EFLAGS的IF位来检查发生此次"中断"前IF是否被置位,如果被置位说明是中断;否则说明是由异常返回内核)返回内核空间的,如果是,则调用schedule()函数进行调度。可见,抢占内核是发生在由中断返回内核空间的时候。
解锁时
解锁通过宏preempt_enable()来完成,此函数完成以下功能:
a. 将当前进程的preempt_count减1
b. 检查TIF_NEED_RESCHED位,如果是0,则返回;否则调用函数preempt_schedule(),此函数将preempt_count置为PREEMPT_ACTIVE(表明正在执行内核抢占),然后直接调用schedule()进行调度。内核代码中直接调用函数schedule()这种情况下是没有任何保护措施的,也就是说调用的代码必须清楚此时进行内核抢占是否安全。

进程调度的分析:http://www.cnblogs.com/quan/articles/1264646.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: schedule函数通常用于在Python中定时执行某个函数或任务。它可以帮助我们在指定的时间间隔内定期执行函数,而不需要手动调用该函数。该函数可以通过使用time模块中的time.sleep()函数来实现。schedule函数的基本语法如下: ```python schedule.every(interval).unit.do(job) ``` 其中, - `interval`:表示时间间隔,可以是一个整数或浮点数,单位由`unit`参数决定。 - `unit`:表示时间间隔的单位,可以是'weeks'、'days'、'hours'、'minutes'、'seconds'、'microseconds'、'milliseconds'中的任意一个。 - `job`:表示要执行的函数或任务。 例如,如果我们想要每隔10秒钟执行一次函数`my_func()`,可以使用如下代码: ```python import schedule import time def my_func(): print("Hello, World!") schedule.every(10).seconds.do(my_func) while True: schedule.run_pending() time.sleep(1) ``` 在上面的代码中,我们首先定义了一个`my_func()`函数,然后使用`schedule.every(10).seconds.do(my_func)`语句来设置每隔10秒钟执行一次该函数。最后,在一个无限循环中,我们不断地调用`schedule.run_pending()`函数来检查是否有任务需要执行,然后使用`time.sleep(1)`函数来让程序休眠1秒钟,以避免CPU占用过高。 ### 回答2: schedule函数的功能是用于实现任务的调度和管理。它可以根据预定的时间表或规则,自动分配和安排多个任务的执行顺序和时间。具体来说,schedule函数可以完成以下几个方面的功能: 1. 创建任务:schedule函数可以接收任务的参数,并将其创建为一个任务对象。任务可以是一个函数、一个方法或一个可调用对象。 2. 设定触发条件:schedule函数可以设置任务的触发条件,例如设置任务的执行时间、执行间隔、定时执行等。这些触发条件可以是时间、日期、事件等。 3. 任务执行:schedule函数可以按照设定的触发条件,在适当的时间触发任务的执行。任务可以是单次执行或者周期性执行,可以是同步执行或者异步执行,可以是并发执行或者顺序执行,具体执行方式根据调度函数的参数而定。 4. 任务管理:schedule函数可以对已创建的任务进行管理,例如取消任务、暂停任务、恢复任务等。这样可以灵活控制任务的执行情况。 通过上述功能,schedule函数可以方便地实现任务的自动化管理和调度,帮助用户高效地处理多个任务。它常用于需要定时执行、自动化处理和后台任务等应用场景,如定时备份、定时数据清理、定时邮件发送等。 ### 回答3: shedule函数是编程中常用的一个函数,它主要用于控制程序的运行顺序和时间安排。shedule函数可以通过指定不同的参数来实现不同的功能。 其中最常见的功能是定时执行任务。通过设置shedule函数的时间参数,我们可以让程序在一定的时间间隔或者指定的时间点执行特定的任务。这个功能常用于需要程序周期性地执行某些操作,比如定时备份数据、定时发送邮件、定时下载文件等。 另外,shedule函数还可以实现延时执行任务的功能。通过设置shedule函数的延时时间参数,我们可以让程序在指定的延时时间之后执行特定的任务。这个功能常用于需要程序等待一段时间后再执行某些操作,比如在用户点击某个按钮后等待几秒钟再弹出对话框。 此外,shedule函数还可以实现并发执行任务的功能。通过设置shedule函数的并发参数,我们可以让多个任务同时执行。这个功能常用于需要同时执行多个耗时任务,以提高程序的执行效率。 总结起来,shedule函数的功能主要包括定时执行任务、延时执行任务和并发执行任务。这些功能可以根据实际需求灵活地使用,以满足程序的不同需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值