导航:首页 > 源码编译 > 调度原理算法和系统

调度原理算法和系统

发布时间:2023-06-13 05:39:40

⑴ 进程调度的linux 原理

1,SCHED_OTHER 分时调度策略,
2,SCHED_FIFO实时调度策略,先到先服务
3,SCHED_RR实时调度策略,时间片轮转
实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。
SHCED_RR和SCHED_FIFO的不同:
当采用SHCED_RR策略的进程的时间片用完,系统将重新分配时间片,并置于就绪队列尾。放在队列尾保证了所有具有相同优先级的RR任务的调度公平。
SCHED_FIFO一旦占用cpu则一直运行。一直运行直到有更高优先级任务到达或自己放弃。
如果有相同优先级的实时进程(根据优先级计算的调度权值是一样的)已经准备好,FIFO时必须等待该进程主动放弃后才可以运行这个优先级相同的任务。而RR可以让每个任务都执行一段时间。
相同点:
RR和FIFO都只用于实时任务。
创建时优先级大于0(1-99)。
按照可抢占优先级调度算法进行。
就绪态的实时任务立即抢占非实时任务。
所有任务都采用linux分时调度策略时。
1,创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。
2,将根据每个任务的nice值确定在cpu上的执行时间(counter)。
3,如果没有等待资源,则将该任务加入到就绪队列中。
4,调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。
5,此时调度程序重复上面计算过程,转到第4步。
6,当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。
所有任务都采用FIFO时,
1,创建进程时指定采用FIFO,并设置实时优先级rt_priority(1-99)。
2,如果没有等待资源,则将该任务加入到就绪队列中。
3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu,该FIFO任务将一直占有cpu直到有优先级更高的任务就绪(即使优先级相同也不行)或者主动放弃(等待资源)。
4,调度程序发现有优先级更高的任务到达(高优先级任务可能被中断或定时器任务唤醒,再或被当前运行的任务唤醒,等等),则调度程序立即在当前任务堆栈中保存当前cpu寄存器的所有数据,重新从高优先级任务的堆栈中加载寄存器数据到cpu,此时高优先级的任务开始运行。重复第3步。
5,如果当前任务因等待资源而主动放弃cpu使用权,则该任务将从就绪队列中删除,加入等待队列,此时重复第3步。
所有任务都采用RR调度策略时
1,创建任务时指定调度参数为RR,并设置任务的实时优先级和nice值(nice值将会转换为该任务的时间片的长度)。
2,如果没有等待资源,则将该任务加入到就绪队列中。
3,调度程序遍历就绪队列,根据实时优先级计算调度权值(1000+rt_priority),选择权值最高的任务使用cpu。
4,如果就绪队列中的RR任务时间片为0,则会根据nice值设置该任务的时间片,同时将该任务放入就绪队列的末尾。重复步骤3。
5,当前任务由于等待资源而主动退出cpu,则其加入等待队列中。重复步骤3。
系统中既有分时调度,又有时间片轮转调度和先进先出调度
1,RR调度和FIFO调度的进程属于实时进程,以分时调度的进程是非实时进程。
2,当实时进程准备就绪后,如果当前cpu正在运行非实时进程,则实时进程立即抢占非实时进程。
3,RR进程和FIFO进程都采用实时优先级做为调度的权值标准,RR是FIFO的一个延伸。FIFO时,如果两个进程的优先级一样,则这两个优先级一样的进程具体执行哪一个是由其在队列中的未知决定的,这样导致一些不公正性(优先级是一样的,为什么要让你一直运行?),如果将两个优先级一样的任务的调度策略都设为RR,则保证了这两个任务可以循环执行,保证了公平。 调度程序运行时,要在所有处于可运行状态的进程之中选择最值得运行的进程投入运行。选择进程的依据是什么呢?在每个进程的task_struct 结构中有这么四项:
policy, priority , counter, rt_priority
这四项就是调度程序选择进程的依据.其中,policy是进程的调度策略,用来区分两种进程-实时和普通;priority是进程(实时和普通)的优先级;counter 是进程剩余的时间片,它的大小完全由priority决定;rt_priority是实时优先级,这是实时进程所特有的,用于实时进程间的选择。
首先,Linux 根据policy从整体上区分实时进程和普通进程,因为实时进程和普通进程度调度是不同的,它们两者之间,实时进程应该先于普通进程而运行,然后,对于同一类型的不同进程,采用不同的标准来选择进程:
对于普通进程,Linux采用动态优先调度,选择进程的依据就是进程counter的大小。进程创建时,优先级priority被赋一个初值,一般为0~70之间的数字,这个数字同时也是计数器counter的初值,就是说进程创建时两者是相等的。字面上看,priority是“优先级”、counter是“计数器”的意思,然而实际上,它们表达的是同一个意思-进程的“时间片”。Priority代表分配给该进程的时间片,counter表示该进程剩余的时间片。在进程运行过程中,counter不断减少,而priority保持不变,以便在counter变为0的时候(该进程用完了所分配的时间片)对counter重新赋值。当一个普通进程的时间片用完以后,并不马上用priority对counter进行赋值,只有所有处于可运行状态的普通进程的时间片(p->;;counter==0)都用完了以后,才用priority对counter重新赋值,这个普通进程才有了再次被调度的机会。这说明,普通进程运行过程中,counter的减小给了其它进程得以运行的机会,直至counter减为0时才完全放弃对CPU的使用,这就相对于优先级在动态变化,所以称之为动态优先调度。至于时间片这个概念,和其他不同操作系统一样的,Linux的时间单位也是“时钟滴答”,只是不同操作系统对一个时钟滴答的定义不同而已(Linux为10ms)。进程的时间片就是指多少个时钟滴答,比如,若priority为20,则分配给该进程的时间片就为20个时钟滴答,也就是20*10ms=200ms。Linux中某个进程的调度策略(policy)、优先级(priority)等可以作为参数由用户自己决定,具有相当的灵活性。内核创建新进程时分配给进程的时间片缺省为200ms(更准确的,应为210ms),用户可以通过系统调用改变它。
对于实时进程,Linux采用了两种调度策略,即FIFO(先来先服务调度)和RR(时间片轮转调度)。因为实时进程具有一定程度的紧迫性,所以衡量一个实时进程是否应该运行,Linux采用了一个比较固定的标准。实时进程的counter只是用来表示该进程的剩余时间片,并不作为衡量它是否值得运行的标准,这和普通进程是有区别的。上面已经看到,每个进程有两个优先级,实时优先级就是用来衡量实时进程是否值得运行的。
这一切看来比较麻烦,但实际上Linux中的实现相当简单。Linux用函数goodness()来衡量一个处于可运行状态的进程值得运行的程度。该函数综合了上面提到的各个方面,给每个处于可运行状态的进程赋予一个权值(weight),调度程序以这个权值作为选择进程的唯一依据。
Linux根据policy的值将进程总体上分为实时进程和普通进程,提供了三种调度算法:一种传统的Unix调度程序和两个由POSIX.1b(原名为POSIX.4)操作系统标准所规定的“实时”调度程序。但这种实时只是软实时,不满足诸如中断等待时间等硬实时要求,只是保证了当实时进程需要时一定只把CPU分配给实时进程。
非实时进程有两种优先级,一种是静态优先级,另一种是动态优先级。实时进程又增加了第三种优先级,实时优先级。优先级是一些简单的整数,为了决定应该允许哪一个进程使用CPU的资源,用优先级代表相对权值-优先级越高,它得到CPU时间的机会也就越大。
? 静态优先级(priority)-不随时间而改变,只能由用户进行修改。它指明了在被迫和其他进程竞争CPU之前,该进程所应该被允许的时间片的最大值(但很可能的,在该时间片耗尽之前,进程就被迫交出了CPU)。
? 动态优先级(counter)-只要进程拥有CPU,它就随着时间不断减小;当它小于0时,标记进程重新调度。它指明了在这个时间片中所剩余的时间量。
? 实时优先级(rt_priority)-指明这个进程自动把CPU交给哪一个其他进程;较高权值的进程总是优先于较低权值的进程。如果一个进程不是实时进程,其优先级就是0,所以实时进程总是优先于非实时进程的(但实际上,实时进程也会主动放弃CPU)。
当policy分别为以下值时:
1) SCHED_OTHER:这是普通的用户进程,进程的缺省类型,采用动态优先调度策略,选择进程的依据主要是根据进程goodness值的大小。这种进程在运行时,可以被高goodness值的进程抢先。
2) SCHED_FIFO:这是一种实时进程,遵守POSIX1.b标准的FIFO(先入先出)调度规则。它会一直运行,直到有一个进程因I/O阻塞,或者主动释放CPU,或者是CPU被另一个具有更高rt_priority的实时进程抢先。在Linux实现中,SCHED_FIFO进程仍然拥有时间片-只有当时间片用完时它们才被迫释放CPU。因此,如同POSIX1.b一样,这样的进程就象没有时间片(不是采用分时)一样运行。Linux中进程仍然保持对其时间片的记录(不修改counter)主要是为了实现的方便,同时避免在调度代码的关键路径上出现条件判断语句 if (!(current->;;policy&;;SCHED_FIFO)){...}-要知道,其他大量非FIFO进程都需要记录时间片,这种多余的检测只会浪费CPU资源。(一种优化措施,不该将执行时间占10%的代码的运行时间减少到50%;而是将执行时间占90%的代码的运行时间减少到95%。0.9+0.1*0.5=0.95>;;0.1+0.9*0.9=0.91)
3) SCHED_RR:这也是一种实时进程,遵守POSIX1.b标准的RR(循环round-robin)调度规则。除了时间片有些不同外,这种策略与SCHED_FIFO类似。当SCHED_RR进程的时间片用完后,就被放到SCHED_FIFO和SCHED_RR队列的末尾。
只要系统中有一个实时进程在运行,则任何SCHED_OTHER进程都不能在任何CPU运行。每个实时进程有一个rt_priority,因此,可以按照rt_priority在所有SCHED_RR进程之间分配CPU。其作用与SCHED_OTHER进程的priority作用一样。只有root用户能够用系统调用sched_setscheler,来改变当前进程的类型(sys_nice,sys_setpriority)。
此外,内核还定义了SCHED_YIELD,这并不是一种调度策略,而是截取调度策略的一个附加位。如同前面说明的一样,如果有其他进程需要CPU,它就提示调度程序释放CPU。特别要注意的就是这甚至会引起实时进程把CPU释放给非实时进程。 真正执行调度的函数是schele(void),它选择一个最合适的进程执行,并且真正进行上下文切换,使得选中的进程得以执行。而reschele_idle(struct task_struct *p)的作用是为进程选择一个合适的CPU来执行,如果它选中了某个CPU,则将该CPU上当前运行进程的need_resched标志置为1,然后向它发出一个重新调度的处理机间中断,使得选中的CPU能够在中断处理返回时执行schele函数,真正调度进程p在CPU上执行。在schele()和reschele_idle()中调用了goodness()函数。goodness()函数用来衡量一个处于可运行状态的进程值得运行的程度。此外,在schele()函数中还调用了schele_tail()函数;在reschele_idle()函数中还调用了reschele_idle_slow()。这些函数的实现对理解SMP的调度非常重要,下面一一分析这些函数。先给出每个函数的主要流程图,然后给出源代码,并加注释。
goodness()函数分析
goodness()函数计算一个处于可运行状态的进程值得运行的程度。一个任务的goodness是以下因素的函数:正在运行的任务、想要运行的任务、当前的CPU。goodness返回下面两类值中的一个:1000以下或者1000以上。1000或者1000以上的值只能赋给“实时”进程,从0到999的值只能赋给普通进程。实际上,在单处理器情况下,普通进程的goodness值只使用这个范围底部的一部分,从0到41。在SMP情况下,SMP模式会优先照顾等待同一个处理器的进程。不过,不管是UP还是SMP,实时进程的goodness值的范围是从1001到1099。
goodness()函数其实是不会返回-1000的,也不会返回其他负值。由于idle进程的counter值为负,所以如果使用idle进程作为参数调用goodness,就会返回负值,但这是不会发生的。
goodness()是个简单的函数,但是它是linux调度程序不可缺少的部分。运行队列中的每个进程每次执行schele时都要调度它,因此它的执行速度必须很快。
//在/kernel/sched.c中
static inline int goodness(struct task_struct * p, int this_cpu, struct mm_struct *this_mm)
{ int weight;
if (p->;;policy != SCHED_OTHER) {/*如果是实时进程,则*/
weight = 1000 + p->;;rt_priority;
goto out;
}
/* 将counter的值赋给weight,这就给了进程一个大概的权值,counter中的值表示进程在一个时间片内,剩下要运行的时间.*/
weight = p->;;counter;
if (!weight) /* weight==0,表示该进程的时间片已经用完,则直接转到标号out*/
goto out;
#ifdef __SMP__
/*在SMP情况下,如果进程将要运行的CPU与进程上次运行的CPU是一样的,则最有利,因此,假如进程上次运行的CPU与当前CPU一致的话,权值加上PROC_CHANGE_PENALTY,这个宏定义为20。*/
if (p->;;processor == this_cpu)
weight += PROC_CHANGE_PENALTY;
#endif
if (p->;;mm == this_mm) /*进程p与当前运行进程,是同一个进程的不同线程,或者是共享地址空间的不同进程,优先选择,权值加1*/
weight += 1;
weight += p->;;priority; /* 权值加上进程的优先级*/
out:
return weight; /* 返回值作为进程调度的唯一依据,谁的权值大,就调度谁运行*/
}
schele()函数分析
schele()函数的作用是,选择一个合适的进程在CPU上执行,它仅仅根据'goodness'来工作。对于SMP情况,除了计算每个进程的加权平均运行时间外,其他与SMP相关的部分主要由goodness()函数来体现。
流程:
①将prev和next设置为schele最感兴趣的两个进程:其中一个是在调用schele时正在运行的进程(prev),另外一个应该是接着就给予CPU的进程(next)。注意:prev和next可能是相同的-schele可以重新调度已经获得cpu的进程.
②中断处理程序运行“下半部分”.
③内核实时系统部分的实现,循环调度程序(SCHED_RR)通过移动“耗尽的”RR进程-已经用完其时间片的进程-到队列末尾,这样具有相同优先级的其他RR进程就可以获得CPU了。同时,这补充了耗尽进程的时间片。
④由于代码的其他部分已经决定了进程必须被移进或移出TASK_RUNNING状态,所以会经常使用schele,例如,如果进程正在等待的硬件条件已经发生,所以如果必要,这个switch会改变进程的状态。如果进程已经处于TASK_RUNNING状态,它就无需处理了。如果它是可以中断的(等待信号),并且信号已经到达了进程,就返回TASK_RUNNING状态。在所以其他情况下(例如,进程已经处于TASK_UNINTERRUPTIBLE状态了),应该从运行队列中将进程移走。
⑤将p初始化为运行队列的第一个任务;p会遍历队列中的所有任务。
⑥c记录了运行队列中所有进程最好的“goodness”-具有最好“goodness”的进程是最易获得CPU的进程。goodness的值越高越好。
⑦遍历执行任务链表,跟踪具有最好goodness的进程。
⑧这个循环中只考虑了唯一一个可以调度的进程。在SMP模式下,只有任务不在cpu上运行时,即can_schele宏返回为真时,才会考虑该任务。在UP情况下,can_schele宏返回恒为真.
⑨如果循环结束后,得到c的值为0。说明运行队列中的所有进程的goodness值都为0。goodness的值为0,意味着进程已经用完它的时间片,或者它已经明确说明要释放CPU。在这种情况下,schele要重新计算进程的counter;新counter的值是原来值的一半加上进程的静态优先级(priortiy),除非进程已经释放CPU,否则原来counter的值为0。因此,schele通常只是把counter初始化为静态优先级。(中断处理程序和由另一个处理器引起的分支在schele搜寻goodness最大值时都将增加此循环中的计数器,因此由于这个原因计数器可能不会为0。显然,这很罕见。)在counter的值计算完成后,重新开始执行这个循环,找具有最大goodness的任务。
⑩如果schele已经选择了一个不同于前面正在执行的进程来调度,那么就必须挂起原来的进程并允许新的进程运行。这时调用switch_to来进行切换。

⑵ 操作系统的进程调度算法[总结]

操作系统的进程调度算法直接关系到用户的使用体验。

如果把用户的体验时间,引入到计算机里面,我们引入以下几个概念。

周转时间,指作业从提交系统开始,直到作业完成为止的时间间隔。包括:

是指作业周转时间与作业实际运行服务时间的比值。
平均周转时间和平均带权周转时间是衡量批处理系统调度算法的重要准则。

先来先服务调度算法(First Come First Served, FCFS)是最简单的调度算法,可以用于作业调度和进程调度。
按照作业进入系统后备作业队列的先后次序来挑选作业,加入就绪队列,等待执行。

FCFS是非抢占式的,易于实现,效率不高,性能不好.
有利于长作业(CPU繁忙性)而不利于短作业(I/O繁忙性)。

服务时间:作业需要运行的时间
完成时间 = 开始时间 + 服务时间
等待时间 = 开始时间 - 提交时间
周转时间 = 完成时间 - 提交时间
带权周转时间 = 周转时间 / 服务时间
响应比 = (等待时间 + 服务时间) / 服务时间 = 等待时间/服务时间 + 1

该算法每次从后备作业队列中挑选估计服务时间最短的一个或几个作业,
将他们调入内存,分配必要的资源,创建进程并放入就绪队列。
在进程调度中的原理类似。

SJF是非抢占式的,优先照顾短作业,具有很好的性能,降低平均等待时间,提高吞吐量。
但是不利于长作业,长作业可能一直处于等待状态,出现饥饿现象;
完全未考虑作业的优先紧迫程度,不能用于实时系统。

高响应比优先调度算法(Highest Reponse Ratio First, HRRF)是非抢占式的,主要用于作业调度。
基本思想:每次进行作业调度时,先计算后备作业队列中每个作业的响应比,挑选最高的作业投入系统运行。
响应比 = (等待时间 + 服务时间) / 服务时间 = 等待时间 / 服务时间 + 1

由响应比分析可知,该算法介于FCFS和SJF之间,但是每次需要计算每个作业的响应比,增加系统开销。

⑶ 一文读懂Linux任务间调度原理和整个执行过程

在前文中,我们分析了内核中进程和线程的统一结构体task_struct,并分析进程、线程的创建和派生的过程。在本文中,我们会对任务间调度进行详细剖析,了解其原理和整个执行过程。由此,进程、线程部分的大体框架就算是介绍完了。本节主要分为三个部分:Linux内核中常见的调度策略,调度的基本结构体以及调度发生的整个流程。下面将详细展开说明。

Linux 作为一个多任务操作系统,将每个 CPU 的时间划分为很短的时间片,再通过调度器轮流分配给各个任务使用,因此造成多任务同时运行的错觉。为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间中断,并使用全局变量 Jiffies 记录了开机以来的节拍数。每发生一次时间中断,Jiffies 的值就加 1。节拍率 HZ 是内核的可配选项,可以设置为 100、250、1000 等。不同的系统可能设置不同的数值,可以通过查询 /boot/config 内核选项来查看它的配置值。

Linux的调度策略主要分为实时任务和普通任务。实时任务需求尽快返回结果,而普通任务则没有较高的要求。在前文中我们提到了task_struct中调度策略相应的变量为policy,调度优先级有prio, static_prio, normal_prio, rt_priority几个。优先级其实就是一个数值,对于实时进程来说,优先级的范围是 0 99;对于普通进程,优先级的范围是 100 139。数值越小,优先级越高。

实时调度策略主要包括以下几种

普通调度策略主要包括以下几种:

首先,我们需要一个结构体去执行调度策略,即sched_class。该类有几种实现方式

普通任务调度实体源码如下,这里面包含了 vruntime 和权重 load_weight,以及对于运行时间的统计。

在调度时,多个任务调度实体会首先区分是实时任务还是普通任务,然后通过以时间为顺序的红黑树结构组合起来,vruntime 最小的在树的左侧,vruntime最多的在树的右侧。以CFS策略为例,则会选择红黑树最左边的叶子节点作为下一个将获得 CPU 的任务。而这颗红黑树,我们称之为运行时队列(run queue),即struct rq。

其中包含结构体cfs_rq,其定义如下,主要是CFS调度相关的结构体,主要有权值相关变量、vruntime相关变量以及红黑树指针,其中结构体rb_root_cached即为红黑树的节点

对结构体dl_rq有类似的定义,运行队列由红黑树结构体构成,并按照deadline策略进行管理

对于实施队列相应的rt_rq则有所不同,并没有用红黑树实现。

下面再看看调度类sched_class,该类以函数指针的形式定义了诸多队列操作,如

调度类分为下面几种:

队列操作中函数指针指向不同策略队列的实际执行函数函数,在linux/kernel/sched/目录下,fair.c、idle.c、rt.c等文件对不同类型的策略实现了不同的函数,如fair.c中定义了

以选择下一个任务为例,CFS对应的是pick_next_task_fair,而rt_rq对应的则是pick_next_task_rt,等等。

由此,我们来总结一下:

有了上述的基本策略和基本调度结构体,我们可以形成大致的骨架,下面就是需要核心的调度流程将其拼凑成一个整体,实现调度系统。调度分为两种,主动调度和抢占式调度。

说到调用,逃不过核心函数schele()。其中sched_submit_work()函数完成当前任务的收尾工作,以避免出现如死锁或者IO中断等情况。之后首先禁止抢占式调度的发生,然后调用__schele()函数完成调度,之后重新打开抢占式调度,如果需要重新调度则会一直重复该过程,否则结束函数。

而__schele()函数则是实际的核心调度函数,该函数主要操作包括选取下一进程和进行上下文切换,而上下文切换又包括用户态空间切换和内核态的切换。具体的解释可以参照英文源码注释以及中文对各个步骤的注释。

其中核心函数是获取下一个任务的pick_next_task()以及上下文切换的context_switch(),下面详细展开剖析。首先看看pick_next_task(),该函数会根据调度策略分类,调用该类对应的调度函数选择下一个任务实体。根据前文分析我们知道,最终是在不同的红黑树上选择最左节点作为下一个任务实体并返回。

下面来看看上下文切换。上下文切换主要干两件事情,一是切换任务空间,也即虚拟内存;二是切换寄存器和 CPU 上下文。关于任务空间的切换放在内存部分的文章中详细介绍,这里先按下不表,通过任务空间切换实际完成了用户态的上下文切换工作。下面我们重点看一下内核态切换,即寄存器和CPU上下文的切换。

switch_to()就是寄存器和栈的切换,它调用到了 __switch_to_asm。这是一段汇编代码,主要用于栈的切换, 其中32位使用esp作为栈顶指针,64位使用rsp,其他部分代码一致。通过该段汇编代码我们完成了栈顶指针的切换,并调用__switch_to完成最终TSS的切换。注意switch_to中其实是有三个变量,分别是prev, next, last,而实际在使用时,我们会对last也赋值为prev。这里的设计意图需要结合一个例子来说明。假设有ABC三个任务,从A调度到B,B到C,最后C回到A,我们假设仅保存prev和next,则流程如下

最终调用__switch_to()函数。该函数中涉及到一个结构体TSS(Task State Segment),该结构体存放了所有的寄存器。另外还有一个特殊的寄存器TR(Task Register)会指向TSS,我们通过更改TR的值,会触发硬件保存CPU所有寄存器在当前TSS,并从新的TSS读取寄存器的值加载入CPU,从而完成一次硬中断带来的上下文切换工作。系统初始化的时候,会调用 cpu_init()给每一个 CPU 关联一个 TSS,然后将 TR 指向这个 TSS,然后在操作系统的运行过程中,TR 就不切换了,永远指向这个 TSS。当修改TR的值得时候,则为任务调度。

更多Linux内核视频教程文本资料免费领取后台私信【 内核大礼包 】自行获取。

在完成了switch_to()的内核态切换后,还有一个重要的函数finish_task_switch()负责善后清理工作。在前面介绍switch_to三个参数的时候我们已经说明了使用last的重要性。而这里为何让prev和last均赋值为prev,是因为prev在后面没有需要用到,所以节省了一个指针空间来存储last。

至此,我们完成了内核态的切换工作,也完成了整个主动调度的过程。

抢占式调度通常发生在两种情况下。一种是某任务执行时间过长,另一种是当某任务被唤醒的时候。首先看看任务执行时间过长的情况。

该情况需要衡量一个任务的执行时间长短,执行时间过长则发起抢占。在计算机里面有一个时钟,会过一段时间触发一次时钟中断,通知操作系统时间又过去一个时钟周期,通过这种方式可以查看是否是需要抢占的时间点。

时钟中断处理函数会调用scheler_tick()。该函数首先取出当前CPU,并由此获取对应的运行队列rq和当前任务curr。接着调用该任务的调度类sched_class对应的task_tick()函数进行时间事件处理。

以普通任务队列为例,对应的调度类为fair_sched_class,对应的时钟处理函数为task_tick_fair(),该函数会获取当前的调度实体和运行队列,并调用entity_tick()函数更新时间。

在entity_tick()中,首先会调用update_curr()更新当前任务的vruntime,然后调用check_preempt_tick()检测现在是否可以发起抢占。

check_preempt_tick() 先是调用 sched_slice() 函数计算出一个调度周期中该任务运行的实际时间 ideal_runtime。sum_exec_runtime 指任务总共执行的实际时间,prev_sum_exec_runtime 指上次该进程被调度时已经占用的实际时间,所以 sum_exec_runtime - prev_sum_exec_runtime 就是这次调度占用实际时间。如果这个时间大于 ideal_runtime,则应该被抢占了。除了这个条件之外,还会通过 __pick_first_entity 取出红黑树中最小的进程。如果当前进程的 vruntime 大于红黑树中最小的进程的 vruntime,且差值大于 ideal_runtime,也应该被抢占了。

如果确认需要被抢占,则会调用resched_curr()函数,该函数会调用set_tsk_need_resched()标记该任务为_TIF_NEED_RESCHED,即该任务应该被抢占。

某些任务会因为中断而唤醒,如当 I/O 到来的时候,I/O进程往往会被唤醒。在这种时候,如果被唤醒的任务优先级高于 CPU 上的当前任务,就会触发抢占。try_to_wake_up() 调用 ttwu_queue() 将这个唤醒的任务添加到队列当中。ttwu_queue() 再调用 ttwu_do_activate() 激活这个任务。ttwu_do_activate() 调用 ttwu_do_wakeup()。这里面调用了 check_preempt_curr() 检查是否应该发生抢占。如果应该发生抢占,也不是直接踢走当前进程,而是将当前进程标记为应该被抢占。

由前面的分析,我们知道了不论是是当前任务执行时间过长还是新任务唤醒,我们均会对现在的任务标记位_TIF_NEED_RESCUED,下面分析实际抢占的发生。真正的抢占还需要一个特定的时机让正在运行中的进程有机会调用一下 __schele()函数,发起真正的调度。

实际上会调用__schele()函数共有以下几个时机

从系统调用返回用户态:以64位为例,系统调用的链路为do_syscall_64->syscall_return_slowpath->prepare_exit_to_usermode->exit_to_usermode_loop。在exit_to_usermode_loop中,会检测是否为_TIF_NEED_RESCHED,如果是则调用__schele()

内核态启动:内核态的执行中,被抢占的时机一般发生在 preempt_enable() 中。在内核态的执行中,有的操作是不能被中断的,所以在进行这些操作之前,总是先调用 preempt_disable() 关闭抢占,当再次打开的时候,就是一次内核态代码被抢占的机会。preempt_enable() 会调用 preempt_count_dec_and_test(),判断 preempt_count 和 TIF_NEED_RESCHED 是否可以被抢占。如果可以,就调用 preempt_schele->preempt_schele_common->__schele 进行调度。

   本文分析了任务调度的策略、结构体以及整个调度流程,其中关于内存上下文切换的部分尚未详细叙述,留待内存部分展开剖析。

1、调度相关结构体及函数实现

2、schele核心函数

⑷ 时间片轮转调度算法的基本原理

在早期的时间片轮转法中,系统将所有的就绪进程按先来先服务的原则,排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片.时间片的大小从几ms到几百ms.当执行的时间片用完时,由一个计时器发出时钟中断请求,调度程序便据此信号来停止该进程的执行,并将它送往就绪队列的末尾;然后,再把处理机分配给就绪队列中新的队首进程,同时也让它执行一个时间片.这样就可以保证就绪队列中的所有进程,在一给定的时间内,均能获得一时间片的处理机执行时间.

⑸ 什么是调度算法

调度算法

通常将作业或进程归入各种就绪或阻塞队列。有的算法适用于作业调度,有的算法适用于进程调度,有的两者都适应。

1.先来先服务(FCFS, First Come First Serve)

先来先服务(FCFS, First Come First Serve)是最简单的调度算法,按先后顺序进行调度。

1. FCFS算法

按照作业提交或进程变为就绪状态的先后次序,分派CPU;

当前作业或进程占用CPU,直到执行完或阻塞,才出让CPU(非抢占方式)。

在作业或进程唤醒后(如I/O完成),并不立即恢复执行,通常等到当前作业或进程出让CPU。最简单的算法。

2. FCFS的特点

比较有利于长作业,而不利于短作业。

有利于CPU繁忙的作业,而不利于I/O繁忙的作业。

2. 轮转法(Round Robin)

轮转法(Round Robin)是让每个进程在就绪队列中的等待时间与享受服务的时间成正比例。

1. 轮转法

Ø 将系统中所有的就绪进程按照FCFS原则,排成一个队列。

Ø 每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。

Ø 在一个时间片结束时,发生时钟中断。

Ø 调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前的队首进程。

Ø 进程可以未使用完一个时间片,就出让CPU(如阻塞)。

Ø

2. 时间片长度的确定

Ø 时间片长度变化的影响

² 过长->退化为FCFS算法,进程在一个时间片内都执行完,响应时间长。

² 过短->用户的一次请求需要多个时间片才能处理完,上下文切换次数增加,响应时间长。

Ø 对响应时间的要求:T(响应时间)=N(进程数目)*q(时间片)

Ø 就绪进程的数目:数目越多,时间片越小

Ø 系统的处理能力:应当使用户输入通常在一个时间片内能处理完,否则使响应时间,平均周转时间和平均带权周转时间延长。

3. 多级反馈队列算法(Round Robin with Multiple Feedback)

多级反馈队列算法时间片轮转算法和优先级算法的综合和发展。

优点:

² 为提高系统吞吐量和缩短平均周转时间而照顾短进程。

² 为获得较好的I/O设备利用率和缩短响应时间而照顾I/O型进程。

² 不必估计进程的执行时间,动态调节。

1. 多级反馈队列算法

² 设置多个就绪队列,分别赋予不同的优先级,如逐级降低,队列1的优先级最高。每个队列执行时间片的长度也不同,规定优先级越低则时间片越长,如逐级加倍。

² 新进程进入内存后,先投入队列1的末尾,按FCFS算法调度;若按队列1一个时间片未能执行完,则降低投入到队列2的末尾,同样按FCFS算法调度;如此下去,降低到最后的队列,则按“时间片轮转”算法调度直到完成。

² 仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。

²

2. 几点说明

² I/O型进程:让其进入最高优先级队列,以及时响应I/O交互。通常执行一个小时间片,要求可处理完一次I/O请求的数据,然后转入到阻塞队列。

² 计算型进程:每次都执行完时间片,进入更低级队列。最终采用最大时间片来执行,减少调度次数。

² I/O次数不多,而主要是CPU处理的进程。在I/O完成后,放回优先I/O请求时离开的队列,以免每次都回到最高优先级队列后再逐次下降。

² 为适应一个进程在不同时间段的运行特点,I/O完成时,提高优先级;时间片用完时,降低优先级。

⑹ 求《调度:原理、算法和系统》pdf,要中文版的,谢谢

求《调度:原理、算法和系统》pdf,要中文版的,谢谢

书名=调度:原理、算法和系统 第2版

作者=(美)Michael Pinedo着;张智海译

页码=455

ISBN=7-302-15310-8

出版社=北京:清华大学出版社 , 2007.08

附件已经上传

我需要32位xp系统的 AE要中文版的谢谢

我可以给您一份希望可以帮助您,饥巧

点击下载adobe after effects 2015绿色版

AECC2015绿色版安装教程

1、鼠标双击右键解压软件压缩包,然后得到AECC2015绿色版.exe软件,然后弹出AECC2015绿色版向导,点击接受按钮开始安装

2、安装软件位置放置c磁盘,并开始软件安装进度,点击安装按钮,等待软件安装

3、请耐心等待,待安装进度满格即可完成安装

4、之后即可弹出AECC2015绿色版软件界面,软件无需破解即可免费使用,有需要的朋友快跟我一起体验一下吧

求Blessing - World Edition歌词 要中文版的 谢谢

《blessing世界版》中文歌词
法国 祝福你的生日
中国 每天都为你祝福
日本 前进直到最后的一秒吧
巴西 揭下了却还是无缘无故地增加的标签,还有不断评下等级的无理价值
意大利 就说不要用那样的数值去推量一个人啊,用手覆盖起不断交错的语言
美国 哦。。烂稿键。是起床的时间了
韩国 在灯火熄灭之前
美国 哦。。。是起床的时间了
韩国 照亮眼前吧
菲律宾 来吧试着凝视着里
日本 正映照出最棒的同伴对吧
瑞典 那就是生命的证明
合 祝福你的生日,每天都为你祝福
智利 即使明天世界将会灭亡
合 祝福你的生日,每天都为你祝福
中国 直到最后的一秒我也会抬头向前看
合 可喜可贺,从现在到未来
合 可喜可贺,所有最好的祝福给你
波兰 很难从没有中产生有这事,无法看到碰触到最重要的事物这事
德国 察觉到不幸和幸福这事,每天亦是生日和死敬缓忌这事
中国 哦。。。快行动起来
俄罗斯 拨开泥沼吧
中国 哦。。。快行动起来
俄罗斯 让莲花绽放吧
意大利 来吧在这里试着叠起双手
韩国 正在彼此传达温暖对吧
巴西 那即是生命的证明
合 祝福你的生日,每天都为你祝福
瑞典 即使只是漂亮话也没关系
合 祝福你的生日,每天都为你祝福
法国 感谢你让我诞生于这世上
合 可喜可贺,从现在到未来
合 可喜可贺,所有最好的祝福给你
美国 来靠过来看一看吧
巴西 如果是摇滚的话就会是如此
智利 像这样,像这样,耶
波兰 如果是无伴奏合唱的话就会是如此
法国 像这样,像这样,耶
瑞典 是游戏的话就会是如此
韩国 像这样,像这样,耶
意大利 是舞曲的话就会是如此
中国 哒哒哒哒哒
波兰 好好的吃饭
巴西 好好的睡觉
瑞典 好好的玩儿
韩国 好好的学习
美国 好好的聊天
智利 好好的吵架
合 过着普通平凡的每日
法国 即使无法哭泣
意大利 即使无法欢笑
中国 即便无法歌唱
俄罗斯 即使无法爱人
菲律宾 即使一无所有
日本 即使不被人爱
德国 但我依然想要活下去
合 祝福你的生日,每天都为你祝福
俄罗斯 即使明天将会灭亡
合 祝福你的生日,每天都为你祝福
德国 前进直到最后一秒吧
法国 如果你还活着
俄罗斯 或许她能回心转意呢
法国 如果你还活着
菲律宾 或许能中到大奖呢
法国 如果你还活着
瑞典 或许能从头开始呢
智利 若是为了挣扎求存的话
韩国 白白放弃
巴西 泼冷水
美国 连蒙带骗
菲律宾 偷懒
意大利 被迷得神魂颠倒
俄罗斯 然后下周
法国 或是下个月
中国 来年也
波兰 甚至下世
德国 也一起献上祝福吧
合 祝福你的生日,每天都为你祝福
菲律宾 即使只是漂亮话也没关系
合 祝福你的生日,每天都为你祝福
日本 感谢聚集于此的奇迹
合 可喜可贺,从现在到未来
合 可喜可贺,所有最好的祝福给你
合 可喜可贺,从现在到未来
合 可喜可贺,所有最好的祝福给你
合 可喜可贺
另附,外文歌词
Blessings for your birthday
Blessings for your everyday
最后の一秒まで前を向け(Face forward until the very last second)

Howl (BR-Portuguese): Muitos rótulos vai receber e me *** o se tentar mudar
O valor que vāo dar a vocē ocupará esse lugar
(With tags that multiply even if torn off, and the unreasonable worth from the rank attached to you)
MastaH (Italian): Nascondi tutto ciò che sai in te, anche quello che non pensi mai
Quelle parole un tempo feci mie, e cercai di non lasciarle più
(You shouldn’t make assumptions about people with such values. I make those fluttering words with my hands.)

Tune (English): Oh…It’s time to get up
Enae (Korean): 둥불을 꺼버리기 전에 너
(Before you trun off the light)
Tune (English): Oh…It’s time to get up
Enae (Korean): 발밑을 한 번 비춰봐
(brighten your step)

Ehmz (tagalog): Kung susubukan mo lang na pagmasdang mabuti
(Hey, try and take a good look over here)
鸟子 (Japanese): 最高の味方が映ってるでしょ?
(your greatest ally is reflected back at you, right?)
Un3h (Swedish): Det är det som visar att livet finns där
(That’s the proof of life)

全员:Blessings for your birthday
Blessings for your everyday
Kiro (Spanish): Aunque el mundo se pueda acabar, disfrútalo
(Even if the world is in ruins tomorrow)
全员:Blessings for your birthday
Blessings for your everyday
茶理理 (Chinese): 直到最后的一秒我也会抬头向前看
(Face forward until the very last second)

Enae (Korean) Sumashu (French) Paperblossom (German) Kiro (Spanish) 茶理理 (Chinese) Ehmz (tagalog) : Hip hip HOORAY
From now on to the future
Howl (BR-Portuguese) MastaH (Italian) 莲 (Russian) 鸟子 (Japanese) Un3h (Swedish) Tune (English)cheeseman: (Polish):Hip hip HOORAY
All the best blessings for you

cheeseman: (Polish): Kiedy ręce puste masz, niełao jest, żrobic z tego coś
Nie zobaczysz i nie dotkniesz rzeczy, co najważniejsze są
(It’s not easy to make something from nothing. The important things are the ones you can’t see or touch)
Paperblossom (German): Wir sind unglücklich und merken nicht dass wir unser Glück nicht seh’n
Drum lebe jeden Tag als wäre er dein Geburtstag und dein Tod
(Unhappiness is when you can grasp that you are happy. Live everyday as if it’s your birthday and your last day)

茶理理 (Chinese): 噢~快行动起来
(Oh…Stand up and take action)
莲 (Russian): Через тернии путъ к звездам отыши
(Push your way through the mud)
茶理理 (Chinese): 噢~快行动起来
(Oh…Stand up and take action)
莲 (Russian): Птица счастъя ждет тебя!
(and the lotus flowers will bloom!)

MastaH (Italian): Adesso prova a metter la tua mano sopra la mia
(Hey, try to place your hand on of mine)
Enae (Korean): 따뜻한 온기가 전해져오고 있죠
(you can feel the warmth, right?)
Howl (BR-Portuguese): E é a prova que nào está só
(That’s the proof of life.)

全员:Blessings for your birthday
Blessings for your everyday
Un3h (Swedish): Även om det är svårt så spelar det ingen roll
(Even if it’s a challenge, it doesn’t matter)
全员:Blessings for your birthday
Blessings for your everyday
Sumashu (French): Laisse moi te remercier pour être né dans ce monde
(Thank you for being born into this world)

Howl (BR-Portuguese) Sumashu (French) MastaH (Italian) 茶理理 (Chinese) Un3h (Swedish)Paperblossom (German): Hip hip HOORAY
From now on to the future
Tune (English) Enae (Korean) Kiro (Spanish) Ehmz (tagalog)莲 (Russian) 鸟子 (Japanese) cheeseman: (Polish): Hip hip HOORAY
All the best blessings for you

Tune (English):Come now, hurry hurry, step right this way.
Howl (BR-Portuguese): o rock nós can taremos (If you stay in a rock style it’s like this)
Kiro (Spanish): Así, así, yeah!(Like this, like this, yeah!)
cheeseman: (Polish): W acapella atylu zaśpiewasz tak (If you say it in an acapella style it’s like this)
Sumashu (French): Comme ça, me ça, yeah!(Like this, like this, yeah!)
Un3h (Swedish): Eller så här, precis som en rappare (If you say it in a rap style it’s like this)
Enae (Korean【English】): Like this, like this, yeah!
MastaH (Italian): Se lo dirai ballando, diventerà (If you say it in a dance style it’s like this)
茶理理 (Chinese【English】): Da da da da da

cheeseman: (Polish):Tak jak trzeba jedz (Eat well)
Howl (BR-Portuguese): E rma bem (Sleep well)
Un3h (Swedish): Ha en massa kul (Play well)
Enae (Korean): 잘 배우고 (Learn well)
Tune (English): Speak proper and well
Kiro (Spanish): Resiste bien (Fight well)
莲 (Russian) cheeseman: (Polish) Howl (BR-Portuguese) Un3h (Swedish) Enae (Korean) Tune (English)Kiro (Spanish) : Living quite a normal everyday

Sumashu (French): Même quand tu ne peux pleurer (Even if you can’t cry)
MastaH (Italian): Non riesci a ridere (Even if you can’t laugh)
茶理理 (Chinese): 即便无法歌唱 (Even if you can’t sing)
莲 (Russian): Хоть твоя жизнь пуиста (Even if you’ve got nothing)
Ehmz (tagalog): Kahit ’di magmahal (Even if you can’t love)
鸟子 (Japanese): 爱されなくても (Even if you aren’t loved)
Paperblossom (German): Nein, ich gebe niemals auf!(Even then, I want you to live)

全员:Blessings for your birthday
Blessings for your everyday
莲 (Russian): Даже если завтрашний пля мира деиь ненаступит(Even if the world is in ruins tomorrow)
全员:Blessings for your birthday
Blessings for your everyday
Paperblossom (German): Ich geb nie auf und bleib stark, bis zum letzten Moment!(Face forward until the very last second)

Sumashu (French): Si tu es vivant (If you are alive)
莲 (Russian): Вернется важный человек (That person might turn around)
Sumashu (French): Si tu es vivant (If you are alive)
Ehmz (tagalog): Sa lotto malay mo ika’’y m *** o (You might win the lottery)
Sumashu (French): Si tu es vivant (If you are alive)
Un3h (Swedish): Så att kan få börja om igen (It might begin again)
Kiro (Spanish): Si tu quieres puedes cambiar (If it’s for the sake of living on, go ahead and

Enae (Korean): 붕에 앚고 (Waste)
Howl (BR-Portuguese): E Atrapalhe (Interrupt)
Tune (English): Confuse and mystify
Ehmz (tagalog): Sige, maglimayon (Disturb)
MastaH (Italian): Vai ed innamorati (Obsess)
莲 (Russian): Ичерз пару дней (And next week)
Sumashu (French): Et le mois prochain (next month)
茶理理 (Chinese): 来年也 (next year)
cheeseman: (Polish): Życiu też (next life)
Paperblossom (German): Komm wir feiern jeden Tag (Let’s celebrate together)

全员:Blessings for your birthday
Blessings for your everyday
Ehmz (tagalog): Kung pagsubok lamang ’to ay’di na mahalaga
(Even if it’s a challenge, it doesn’t matter)
全员:Blessings for your birthday
Blessings for your everyday
鸟子 (Japanese): ここに集えた奇迹にありがとう (Thank you for the miracle you managed to gather here)

Howl (BR-Portuguese) 鸟子 (Japanese) Un3h (Swedish) Tune (English) cheeseman: (Polish) Enae (Korean): Hip hip HOORAY
From now on to the future
Sumashu (French) Paperblossom (German) Kiro (Spanish) 茶理理 (Chinese) Ehmz (tagalog) MastaH (Italian) 莲 (Russian): Hip hip HOORAY
All the best blessings for you

全员:Hip hip HOORAY
From now on to the future
Hip hip HOORAY
All the best blessings for you
Hip hip HOORAY~
请务必收下啊TAT
希望能解决您的问题。

求点经典DJ 要中文版的!谢谢了 !

以下是好听的英文的DJ舞曲,希望你喜欢
这些歌曲很多都很适合非主流空间用的哦!
①强烈推荐DJ歌手
一Eddy Wata
I Love My People(2008最新单曲)
La Bomba(大爆炸,蹦巴拉)
In Your Mind
Jam
What A Boy
二Fabrizio E Marco
Fly Away
Everyday
If I Could
Call It Love
You Are
Tell Me Why
Way You Do
Without
三Groove Coverage
The End
7years And 50 Days
I Need You
Poison
Little June Covergirl
Million tears
On The Radio
Holy Virgin
Because I Love You
Only Love
四Cascada
Miracle
A Never Ending Dream
Big Bad Love
Truly Madly Deeply
Everytime We Touch
One More Night
How Do You Do
Love Again
Because The Night
What Hurts The Most
Ready For Love
Kids in america
Last Christmas
Bad Boy
Cant S The Rain
五Sarina Paris
Look At Us
Just About Enough
So I Wait
The Single Life
Love In Return
Romeo's Dead
You
True Love
六Scooter
Im lonely
Nessaja
The Question Is What Is The Question
One(Always Hardcore)
Scooter - Maria (I like It Loud)
Move Your Ass
Faster Harder Scooter
How Much Is The Fish
Jigga Jigga!
七Basshunter
Dota
Boten Anna
All I Ever Wanted(Dota英文版)
Now You're Gone(Boten Anna英文版)
Please Don't Go
Life Should Be Easy
Camilla
Tetris
八Colonia
Ozimas Mi Dah
Tako Sexy
Za Tvoje Snene Oci
Files
Najbolje Od Svega
九Activ
Motive Doar Cu Tine
Visez
Superstar
Without U
Reasons
Under My Skin
十Candee Jay
If I Were You
Back For me
Lose This Feeling
十一Velvet - Fix Me
Mi Amore
Rock Down To
十二Deep Spirit
Lonely
No Cover Song
十三Nana
Lonely
Dreams
十四Prezioso
Let's Talk About A Man
Shaman King
十五Gabry Ponte
Geordie
Time To Rock
②DJ舞曲单曲
Gummibaer - Ich Bin Dein
Italian Rockaz - La Donna
Rollergirl - Geisha Dreams
Kick - Fest Hos Mig
Reggae - Chiki,Chiki
Red Impact Ft Ildiko - We love Dancing
Rise And Fall - 意大利极品DJ
Baracuda - I leave the world today
Dj Snoop And Jozee - Class People-M2O
3rei Sud Est Clipe Dance Mix
Hiaba Vartam - Stormy Feat Sheela
Mariko
Pokito Me Me Ma Me Mo
Gunther & The Sunshine Girls - Like Fire Tonight
Fantasy Project Crazy Baby
Believe(DanceStylers Club Short)
Jespere - Marc Lavoine
Heaven - DJ Sammy
Akira - I Dream
I *** ail - One More Night
Kate Ryan - Ella Elle L'a
Oops JAime Pas Langlais
Moonlight shadow
冰河时代Stronger Madman
It's ok
Everybody People
Daddy DJ - Daddy DJ
Deep In My Mind
Mi Ka Wa Li
Superhero
Aneela Feat Arash - Chori Chori
Dance Is My Love - Red DJ
Millennium - Day After Day
Waves - Dj Satomi
Give Me More
Millennium Day After Day
Baracuda - Ass Up
E-Type - True Believer
Holly Dolly - Dolly Song
Fabrizio Faniello - I’m In Love (The Whistle Hit)
Shaft - Mambo Italiano
Balla Da Li - Boom Boxx
Clon - Funky Tonight
Dj Bobo Ole Ole
Looking 4 A Good Time - Hotel Saint Geor
Do It All Night
Darren Hayes - 嗨水晶糖果
Arash - Tike Tike Kardi
La La Love
Sky加快版
This Is My DJ加快版
③舞曲组合
1.Banaroo
I'll fly away
Space Cowboy
Ba Yonga Wamba
Be my satellite
Uh Mamma
Dubi Dam Dam
Sing and Move
Call Me Beep Me
2.Befour
How Do You Do
Happy Holiday
Magic Melody
Ive Your Dream
Come Fly With Me
Time To Dance
We Stand United
3.Yoomiii
Rhythm of Love
A kiss Is All I Miss
Show me love
Just A Love Song
4.A-Teens
Floorfiller
Fire Fly
Upside Down
5.ATC
I'm In Heaven
Around The World
So Magical
Set Me Free
Heart Beats Like a Drum
New York City
Why Oh Why
6.O-Zone
Despre Tine
Sarbatoarea Noptilor De Vara
Ra Tu nu
De Ce Plang Chitarele
Fiesta De La Noche
7.Young Divas
Happenin'All Over Again
This Time I Know It's For Real
8.Toy-Box
The Sailor Song
Best Friend
Cowboy Joe
Superstar
Sayonara
Prince Of Arabia
9.Chipz
1001 Arabian Nights
Waikiki Beach
Cowboy
Carniva
One Two Three
10.Aqua
Barbie Girl
Doctor Jones
My Oh My
Lollipop
Roses Are Red
Around The World
Halloween
11.Vengaboys
Sha La La
Uncle John From ,Jamaica
We Like To Party
版主要是觉得满意的话别忘了打分哟
※*▂_ˊ焮ル版权所有,打击盗版,复制必究※

哪有《分布式系统原理与范型》中文版的pdf

:vdisk.weibo./s/BR7tbihEo_ojo
:vdisk.weibo./s/agRb9L8bt5kZK
两本,你看看你要的是哪本?

曼昆经济学原理pdf中文版第五版的pdf 求发到 谢谢啦


求sai下载,要中文版的,不要病毒,谢谢。

请用电脑下载附件,手机端看不到附件的

解压后双击sai.exe就能使用

whereisip求助:哪有whereisip的中文版?只要中文版的,只要中文版的

这个工具暂时还没用被汉化,如果我学会汉化的话,马上给你来一个

求一个安卓系统,音乐合并的软件要中文版的,谢谢!

这种音乐合并的软件,应该还是有不少的
我以前在应用宝里面下载过一个这个样子的软件
想不起来名字了,你自己去里面搜索就可以了
手机打开应用宝软件——搜索框输入音乐合并软件
找到合适的下载就可以了,除了这个应用宝里面按还可以下载其他的资源的
高清壁纸之类的,还望采纳哦

⑺ 求《调度:原理、算法和系统》pdf,要中文版的,谢谢

书名=调度:原理、算法和系统 第2版

作者=(悉悉首美)Michael Pinedo着;张智海译

页码=455

ISBN=7-302-15310-8

出版陆野社=北京:清华大学出版社 , 2007.08

附件已睁数经上传


⑻ 哪里有《调度:原理,算法和系统》在线阅读,或者谁有给我发下吧,非常感谢。

http://wapwenku..com/view/0e047e08763231126edb11cf.html?ssid=0&from=844b&uid=&pu=sz@1330_640,usm@0,ta@big__5.0_1_&bd_page_type=1&tj=wenkuala_2_0_10

阅读全文

与调度原理算法和系统相关的资料

热点内容
dvd光盘存储汉子算法 浏览:758
苹果邮件无法连接服务器地址 浏览:963
phpffmpeg转码 浏览:672
长沙好玩的解压项目 浏览:145
专属学情分析报告是什么app 浏览:564
php工程部署 浏览:833
android全屏透明 浏览:737
阿里云服务器已开通怎么办 浏览:803
光遇为什么登录时服务器已满 浏览:302
PDF分析 浏览:486
h3c光纤全工半全工设置命令 浏览:143
公司法pdf下载 浏览:383
linuxmarkdown 浏览:350
华为手机怎么多选文件夹 浏览:683
如何取消命令方块指令 浏览:350
风翼app为什么进不去了 浏览:779
im4java压缩图片 浏览:362
数据查询网站源码 浏览:151
伊克塞尔文档怎么进行加密 浏览:893
app转账是什么 浏览:163