linux时间片
1. linux 判断进程时间片耗尽
假如这段代码就放在调度程序中,就应该是每次先把某个进程时间片减1,再判断,确定是休眠还是继续
不是放在调度里面,它没有理由去处理这个数字
处理task_struct的应该是内核程序..我看的内核代码不多,只能猜...
2. linux 每一个时间片是哪个进程占用的
方法/步骤
首先,我们在测试项目中新建一个用户控件,然后把GridControl拖到用户控件中,设置控件的Dock属性为Fill(可根据需要自行设置)。GridControl的显示效果如下图所示:
由上图可以看到,我们拖进去的控件上面显示的有一段说明性的英文文字,如果不想显示这些文字,那我们就点击RunDesigner进入属性编辑器窗体,修改OptionView下的showGroupPanel属性为False,这样,上面的提示性文字就消失了;
设置属性控制GridControl中列头的过滤器:我们只需要点击runDesign,设置OptionsCustomization下的AllowFilter属性为False,即可禁用过滤器,设为True时,可启用过滤器;
如何控制GridControl右键单击可弹出右键菜单:如果不需要右键菜单,我们可以在OptionMenu下设置其EnableColumnMenu属性为false,如若需要右键菜单,则把属性设为True即可;
在查询数据为空时,显示自定义的字符提示:当我们的查询书库为空时,我们可以在列表中设置字符提示信息,而不是弹出一个窗体提示信息,这样我们需要在gridview1_CustomDrawEmptyForwground()事件下写以下方法即可;
6
显示行号:使用GridControl时,我们一般在第一行显示序号便于记录数,在如果需要在第一行显示行号,那么我们可以在gridView1_CustomDrawRowIndicator(object sender, e)下写如下代码,即可实现显示行号的功能;
7
显示水平滚动条:当我们显示的列数很多时,可能用到水平滚动条,在GridControl中,显示滚动条的控制只需要设置this.gridView.OptionsView.ColumnAutoWidth = false;
3. Linux内核初始化 sp设置
Linux内核初始化sp设置方法是sp只要指向远大于512偏移处都可以。linux在初始的时候会调用fork系统调用来创建第一个进程,他被成为零号进程,创建后会一直存在并且零号进程是所有进程的父进程。
Linux内核初始化的设置方法
首先看任务的结构体,前面是进程的状态时间片,优先级信号打开文件等等,重要的是最后TSS结构体,TSS段存放的是进程的一些寄存器的状态标识,当CPU运行某个进程时,需要将这个进程的TSS段放入CPU中。
TSS实际就是CPU在运行时产生的一些结果会放到这些寄存器中,当再次调用这个进程时再把TSS段放进CPU中,需要将linux的信息从硬盘中移到内存里,之后进行内存向量等的初始化,在内核初始化的过程中,会手动创建0号进程。
4. 在linux中如何根据nice值设置任务时间片
Linux内核的三种调度方法:
1、SCHED_OTHER 分时调度策略。
2、SCHED_FIFO实时调度策略,先到先服务。
3、SCHED_RR实时调度策略,时间片轮转。
实时进程将得到优先调用,实时进程根据实时优先级决定调度权值,分时进程则通过nice和counter值决定权值,nice越小,counter越大,被调度的概率越大,也就是曾经使用了cpu最少的进程将会得到优先调度。
所有任务都采用linux分时调度策略时即nice时,采用以下方式设置任务时间片。
1,创建任务指定采用分时调度策略,并指定优先级nice值(-20~19)。
2,将根据每个任务的nice值确定在cpu上的执行时间(counter)。
3,如果没有等待资源,则将该任务加入到就绪队列中。
4, 调度程序遍历就绪队列中的任务,通过对每个任务动态优先级的计算(counter+20-nice)结果,选择计算结果最大的一个去运行,当这 个时间片用完后(counter减至0)或者主动放弃cpu时,该任务将被放在就绪队列末尾(时间片用完)或等待队列(因等待资源而放弃cpu)中。
5,此时调度程序重复上面计算过程,转到第4步。
6,当调度程序发现所有就绪任务计算所得的权值都为不大于0时,重复第2步。
5. linux 什么时候调用schele
Linux在众多进程中是怎么进行调度的,这个牵涉到Linux进程调度时机的概念,由Linux内核中Schele()的函数来决定是否要进行进程的切换,如果要切换的话,切换到哪个进程等等。
Linux进程调度时机主要有:
1、进程状态转换的时刻:进程终止、进程睡眠;
2、当前进程的时间片用完时(current->counter=0);
3、设备驱动程序
4、进程从中断、异常及系统调用返回到用户态时;
时机1,进程要调用sleep()或exit()等函数进行状态转换,这些函数会主动调用调度程序进行进程调度;
时机2,由于进程的时间片是由时钟中断来更新的,因此,这种情况和时机4是一样的。
时机3,当设备驱动程序执行长而重复的任务时,直接调用调度程序。在每次反复循环中,驱动程序都检查need_resched的值,如果必要,则调用调度程序schele()主动放弃CPU。
时机4,如前所述,不管是从中断、异常还是系统调用返回,最终都调用ret_from_sys_call(),由这个函数进行调度标志的检测,如果必要,则调用调用调度程序。那么,为什么从系统调用返回时要调用调度程序呢?这当然是从效率考虑。从系统调用返回意味着要离开内核态而返回到用户态,而状态的转换要花费一定的时间,因此,在返回到用户态前,系统把在内核态该处理的事全部做完。
对于直接执行调度程序的时机,我们不讨论,因为后面我们将会描述调度程序的工作过程。前面我们讨论了时钟中断,知道了时钟中断的重要作用,下面我们就简单看一下每个时钟中断发生时内核要做的工作,首先对这个最频繁的调度时机有一个大体了解,然后再详细讨论调度程序的具体工作过程。
每个时钟中断(timer interrupt)发生时,由三个函数协同工作,共同完成进程的选择和切换,它们是:schele()、do_timer()及ret_form_sys_call()。我们先来解释一下这三个函数:
schele():进程调度函数,由它来完成进程的选择(调度);
do_timer():暂且称之为时钟函数,该函数在时钟中断服务程序中被调用,是时钟中断服务程序的主要组成部分,该函数被调用的频率就是时钟中断的频率即每秒钟100次(简称100赫兹或100Hz);
ret_from_sys_call():系统调用返回函数。当一个系统调用或中断完成时,该函数被调用,用于处理一些收尾工作,例如信号处理、核心任务等等。
这三个函数是如何协调工作的呢?
前面我们看到,时钟中断是一个中断服务程序,它的主要组成部分就是时钟函数do_timer(),由这个函数完成系统时间的更新、进程时间片的更新等工作,更新后的进程时间片counter作为调度的主要依据。
在时钟中断返回时,要调用函数ret_from_sys_call(),前面我们已经讨论过这个函数,在这个函数中有如下几行:
cmpl $0, _need_resched
jne reschele
……
restore_all:
RESTORE_ALL
reschele:
call SYMBOL_NAME(schele)
jmp ret_from_sys_call
这几行的意思很明显:检测 need_resched 标志,如果此标志为非0,那么就转到reschele处调用调度程序schele()进行进程的选择。调度程序schele()会根据具体的标准在运行队列中选择下一个应该运行的进程。当从调度程序返回时,如果发现又有调度标志被设置,则又调用调度程序,直到调度标志为0,这时,从调度程序返回时由RESTORE_ALL恢复被选定进程的环境,返回到被选定进程的用户空间,使之得到运行。
以上就是时钟中断这个最频繁的调度时机。讨论这个的主要目的使读者对时机4有个大致的了解。
另外,TIF_NEED_RESCHED的设置时机 :
设置这个标志的函数主要有两个: resched_task(),set_tsk_need_resched().主要是resched_task,而resched_task的调用者 check_preempt_curr更是通过:try_to_wake_up/wake_up_new_task/pull_task /__migrate_task 这些被广泛使用的函数, 从而分布在内核中大量的检查点有机会抢占进程.
最后要说明的是,系统调用返回函数ret_from_sys_call()是从系统调用、异常及中断返回函数通常要调用的函数,但并不是非得调用,对于那些要经常被响应的和要被尽快处理的中断请求信号,为了减少系统开销,处理完成后并不调用 ret_from_sys_call()(因为很显然的,从这些中断处理程序返回到的用户空间肯定是那个被中断的进程,无需重新选择),并且,它们作的工作要尽可能少,因为响应的频率太高了。
Linux进程调度和其他的UNIX进程调度不同,尤其是在“nice level”优先级的处理上,与优先权调度(priority高的进程最先运行)不同,Linux用的是时间片轮转调度(Round Robing),但同时又保证了高优先级的进程运行的既快、时间又长(both sooner and longer)。而标准的UNIX调度程序都用到了多级进程队列。大多数的实现都用到了二级优先队列:一个标准队列和一个实时(“real time”)队列。一般情况下,如果实时队列中的进程未被阻塞,它们都要在标准队列中的进程之前被执行,并且,每个队列中,“nice level”高的进程先被执行。
总体上,Linux 调度序程在交互性方面表现很出色,当然了,这是以牺牲一部分“吞吐量”为代价的。
6. 当前linux内核的进程调度,时间片究竟是多长时间
linux内核是通过硬件中断来执行相应的中断处理程序,linux内核是利用中断程序实现了对task任务链表的分析处理,这自然也包括重新分配cpu时间片
linux系统上,中断系统是很核心的东西,她很大程度上能影响整个内核,因为任何时刻都有可能发生中断信号,无论cpu在干什么都一定会处理的(除非中断还没初始化完成或者还在屏蔽中断)
7. linux中什么是时间片
时间片,简单来说就是CPU分配给各个程序的时间,使各个程序从表面上看是同时进行的,而不会造成CPU资源浪费。
时间片轮转调度中唯一有趣的一点是时间片的长度。从一个进程切换到另一个进程是需要一定时间的--保存和装入寄存器值及内存映像,更新各种表格和队列 等。
假如进程切换(process switch) - 有时称为上下文切换(context switch),需要5毫秒,再假设时间片设为20毫秒,则在做完20毫秒有用的工作之后,CPU将花费5毫秒来进行进程切换。CPU时间的20%被浪费 在了管理开销上。
8. linux线程时间片多长
Linux内核切换线程时间在微秒级别,几十微秒。
1. 查看需要更新的内核命令:
1
2
apt-cache search linux
#该命令将会显示所有可以获取的内核
2. 安装内核,假设要安装的内核为2.6.39-0,则使用下面的命令
1
2
sudo apt-get install linux-headers-2.6.39-0-generic linux-image-2.6.39-0-generic
#安装后,reboot即可,重启后,既是以新内核启动。
9. linux可以修改进程时间片的长短吗
明确回答,no
不可能改某个进程的时间片长度,系统调度的时间片是既定的。具体在代码的什么地方,还没研究过,但是Linux的实现原理是这样的
想要一个进程获得更多的运行时间只有提高它的优先级。