Articles of 调度程序

Linux CFS计划代码在哪里?

我有完整的Linux版本3.13的源代码。 我试图findCFS调度程序的源代码,根据stream行的书籍应该驻留在/kernel/sched.c中的基本调度程序代码和/kernel/sched_fair.c专门为CFS代码。 我只是在我的3.13 linux代码里面的这两个文件做了一个代码全局search,结果没有任何结果。 我还单独search了/linux-3.13/kernel文件夹和/linux-3.13/kernel/sched文件夹。 仍然没有运气。 我想让别人知道CFS在新的linux内核代码域(linux-3.13。*)中的位置。 请原谅,如果我在这里失去了一些东西。 我是一个初学linux内核的人。

解开Linux内核调度程序

我正在研究Linux内核,并试图弄清楚循环调度algorithm是如何工作的。 在kernel\sched_rt.c文件中,有一个名为task_tick_rt的方法定义如下: static void task_tick_rt(struct rq *rq, struct task_struct *p, int queued) { update_curr_rt(rq); watchdog(rq, p); /* * RR tasks need a special form of timeslice management. * FIFO tasks have no timeslices. */ if (p->policy != SCHED_RR) return; if (–p->rt.time_slice) return; p->rt.time_slice = DEF_TIMESLICE; /* * Requeue to the end of queue if we […]

Linux内核:schedule()运行的过程是什么?

在进程X中调用诸如fork类的系统调用时,内核被称为在进程上下文中执行。 所以, fork可以说是在X进程中运行的吧? 但是,如果schedule()在同一个进程中被调用(而不是一个sys调用),你会说它是作为X的一部分运行吗? 或者它在交换过程中运行? 还是听起来荒谬,考虑到内核的单一性质?

了解renice

我试图用renice 19 (Linux 3.11)给一个CPU绑定的应用程序调度最低的优先级。 但是,它似乎没有按预期工作,或者我有一个理解问题。 让我来描述两种我已经尝试过的方法。 我期望在两个方面我都会得到同样的结果,但是我没有。 考虑应用程序loop是一个繁忙的循环: int main() { for(;;) ; return 0; } int main() { for(;;) ; return 0; } int main() { for(;;) ; return 0; } 。 实验1 开了一个terminal 运行./loop & CPU一样多(例如,我有4个CPU)。 跑了一个loop实例,并将其重新命名为19 结果如预期。 非reniced loop实例几乎100%CPU,每个实例有约1%。 实验2 开了两个terminal terminal1:运行./loop & CPU一样多。 2号航站楼:再次运行一个loop并将其重新设置为19 结果并不如预期。 在terminal2启动的loop实例有100%(虽然有19),而terminal1的loop实例共享其余的资源。 题 为什么实验2的行为不如实验1?

是nice()用来改变线程优先级还是进程优先级?

nice的手册页上写着:nice()增加了调用过程的nice值,那么我们可以用它来改变pthread_create创build的线程的nice值吗? 编辑:看来,我们可以设置每个线程的好价值。 我写了一个应用程序,为不同的线程设置不同的好值,并观察到“较好”的线程已经被调度为较低优先级。 检查输出,我发现string“高优先级…………….”输出更频繁。 void * thread_function1(void *arg) { pid_t tid = syscall(SYS_gettid); int ret = setpriority(PRIO_PROCESS, tid, -10); printf("tid of high priority thread %d , %d\n",tid ,getpriority(PRIO_PROCESS,tid)); while(1){ printf("high priority …………….\n"); } } void * thread_function(void *arg) { pid_t tid = syscall(SYS_gettid); int ret = setpriority(PRIO_PROCESS, tid, 10); printf("tid of low priority thread %d […]

什么使内核/操作系统实时?

我正在阅读这篇文章,但我的问题是在一个通用的层面上,我正在思考如下几行: 一个内核可以被称为实时只是因为它有一个实时调度程序? 换句话说,如果我有一个Linux内核,并且如果我将默认的调度程序从O(1)或CFS更改为real time scheduler ,它会变成一个RTOS吗? 它是否需要硬件的任何支持? 通常我看到embedded式设备有一个RTOS(例如VxWorks,QNX),这些是否有特殊的规定/ hw来支持它们? 我知道RTOS进程的运行时间是确定性的,但是可以使用longjump / setjump在确定的时间内获得输出。 我真的很感激一些意见,如果我错了什么,请纠正我。

如何在指定的date/时间运行bat文件?

我有一个蝙蝠文件,我想在特定的一天/每个季度运行一年。 我是新来的命令行,我知道如何通过任务调度器来运行它,这非常简单。 比方说,对于每个季度,第一个月和第二个月,我的蝙蝠文件应该在其他几个星期运行。 一个季度的第三个月,它应该每周运行一次。 可能的时间是凌晨6:00,我该怎么办? 请告诉我。 谢谢。

运行一个JAVA程序作为一个计划任务

我试图在Windows 7机器上每天运行一次简单的JAVA程序。 我的代码在NetBeans中运行良好。 如果我做一个干净的build设,这表明了这一点: C:\Program Files\Java\jdk1.7.0/bin/java -jar "C:\Users\User1\Documents\NetBeansProjects\Facebook\dist\Facebook.jar" 这当然不能在DOS提示符下工作,因为程序和文件之间的空间,所以我这样做: C:\Program Files\Java\jdk1.7.0/bin/java -jar "C:\Users\User1\Documents\NetBeansProjects\Facebook\dist\Facebook.jar" -jar "C:\Users\User1\Documents\NetBeansProjects\Facebook\dist\Facebook.jar" 这从DOS提示符下工作。 我现在在Windows Scheduler中创build一个任务来运行: C:\Program Files\Java\jdk1.7.0/bin/java 有参数: -jar "C:\Users\User1\Documents\NetBeansProjects\Facebook\dist\Facebook.jar" 当我运行它时,我所看到的只是一个DOS框闪烁一秒钟。 我预计代码需要大约30秒才能运行。 代码应该将数据保存到数据库,并且不会发生更新。 该代码也使用java.util.logging所以我应该看到日志条目,我不知道。 我强烈怀疑我没有正确运行JAVA命令,或者在通过计划程序运行时出现错误的类path问题,而这些问题在DOS提示符下运行时并不存在。 帮助将不胜感激。 如果你以前看过这个,可以对它进行分类。 如果你能告诉我如何从Scheduler得到一个有意义的错误跟踪,那也是非常有用的。 谢谢!

在win 7任务计划程序中按顺序运行batch file

我有两个batch file作为“行动”在一个单一的任务。 第一个使用微软安全要领扫描病毒。 第二个让电脑进入睡眠状态。 问题是,当任务运行时,似乎两个batch file同时运行,也就是说,我可以看到病毒扫描的开始,但是电脑几乎立即进入睡眠,所以扫描真的永远没有机会开始。 我了解batch file将按顺序在任务调度程序中运行。 我错了吗? 如何让睡眠batch file等待扫描batch file完成? 这里有两个简单的batch file… batch file一个 “C:\ Program Files \ Microsoft Security Essentials \ MpCmdRun.exe”-scan -scantype 1 batch file二 powercfg -hclosures rundll32.exe powrprof.dll,SetSuspendState 0,1,0 powercfg -h打开

内核vs系统中的Windows进程

我在内核和用户模式中有几个与Windows进程有关的问题。 如果我有一个Hello World应用程序和一个展示新系统调用foo()的hello world驱动程序,我很好奇当我处于内核模式时我能做什么,不能做什么。 对于初学者来说,当我编写新的Hello World应用程序时,我得到一个新的进程,这意味着我有自己的用户模式VM空间(让简单的32位窗口)。 所以我有2GB的空间,我“拥有”,我可以戳,直到我的心中的内容。 但是,我受到我的过程的约束。 我不能(不要让共享内存进入这个)触摸任何人的内存。 如果,我写这个hello world驱动程序,并从我的用户应用程序调用它,我(驱动程序代码)现在处于内核模式。 首先澄清/问题:我仍然在与用户模式应用程序相同的过程中,是正确的? 仍然有相同的PID? 内存问题:内存是作为虚拟机呈现给我的进程,即使我有1GB内存,我仍然可以访问4GB的内存(2GB用户/ 2GB的内核 – 不关心服务器上的交换机或细节,只是一个一般假设)。 作为一个用户进程,我不能偷看任何内核模式的内存地址,但是我可以做任何我想要的用户空间,对吗? 如果我打电话到我的hello world驱动程序,从驱动程序代码,我仍然有相同的usermode内存视图? 但是现在我也可以访问内核模式下的任何内存? 这是内核模式内存共享(不像用户模式,这是我自己的进程副本)? 也就是说,编写驱动程序更像是为单个进程(即OS)编写线程化应用程序(排除在外)? 下一个问题。 作为一个驱动程序,我可以改变我正在运行的过程。 说,我知道另一个应用程序(例如,一个用户模式的Web服务器),并加载该进程的虚拟机,改变它的指令指针,堆栈,甚至加载到过程中不同的代码,然后切换回我自己的应用程序? (我不想在这里做任何恶毒的事情,我只是好奇它是什么意思是在内核模式)? 另外,一旦在内核模式下,我可以防止操作系统抢占我吗? 我认为(在Windows中)你可以设置你的IRQL级别来做到这一点,但是我并不完全理解这一点,即使在阅读Solomons书(Inside Windows …)之后。 我会问另一个与IRQL / DPC直接相关的问题,但现在我想知道内核驱动程序是否有权将IRQL设置为High并接pipe系统。 更多来,但这些问题的答案将有所帮助。