Messages in this thread | | | Date | Fri, 3 Sep 1999 10:47:51 +0200 (MET DST) | From | Christoph Pleger <> | Subject | Scheduling in Kernel 2.2 |
| |
Hello,
What has happened with the scheduling under Kernel 2.2?
I had compiled the following program under Kernel 2.0. The program - as intended - switched the context between two processes:
#include <sys/types.h> #include <sys/wait.h> #include <signal.h> #include <unistd.h> #include <sched.h> #include <stdio.h>
#define DPRINTF(str) { printf(str); fflush(stdout); } #define LOOPS 10
struct sched_param schedparam; pid_t Children[2] = {0,0}; int min,max;
void server(void) { schedparam.sched_priority = max - 5; sched_setscheduler(0,SCHED_FIFO,&schedparam); sched_yield();
while (1) { DPRINTF("server\n"); sched_yield(); } } void client(void) { int i;
schedparam.sched_priority = max - 5; sched_setscheduler(0,SCHED_FIFO,&schedparam); sched_yield();
for (i = 0;i < LOOPS;i++) { DPRINTF("client\n"); sched_yield(); }
kill(Children[0],SIGKILL);} void main(void) { min = sched_get_priority_min(SCHED_FIFO); max = sched_get_priority_max(SCHED_FIFO);
schedparam.sched_priority = max; sched_setscheduler(0,SCHED_FIFO,&schedparam);
if ((Children[0] = fork()) != 0) { if ((Children[1] = fork()) == 0) { client(); _exit(0); } }
else { server(); _exit(0); }
waitpid(Children[0],NULL,0); waitpid(Children[1],NULL,0); }
After switching to Kernel 2.2 the program was recompiled. When I let it run now, the server-process stays in its endless-loop and the client-process does not print anything. What can be the reason for that? Was the scheduling changed in the kernel?
Then I tested the following:
void main(void) { min = sched_get_priority_min(SCHED_FIFO); max = sched_get_priority_max(SCHED_FIFO);
schedparam.sched_priority = max; sched_setscheduler(0,SCHED_FIFO,&schedparam);
if ((Children[0] = fork()) != 0) { if ((Children[1] = fork()) == 0) { switch (sched_getscheduler(0)) { case SCHED_OTHER: printf("client: SCHED_OTHER, "); break; case SCHED_FIFO: printf("client: SCHED_FIFO, "); break; case SCHED_RR: printf("client: SCHED_RR, "); break; default: break; }
sched_getparam(0,&schedparam); printf("%d\n",schedparam.sched_priority);
// client(); // _exit(0); } }
else { switch (sched_getscheduler(0)) { case SCHED_OTHER: printf("server: SCHED_OTHER, "); break; case SCHED_FIFO: printf("server: SCHED_FIFO, "); break; case SCHED_RR: printf("server: SCHED_RR, "); break; default: break; }
sched_getparam(0,&schedparam); printf("%d\n",schedparam.sched_priority); // server(); // _exit(0); }
waitpid(Children[0],NULL,0); waitpid(Children[1],NULL,0); }
This program gave the following output:
client: SCHED_FIFO, 99 server: SCHED_FIFO, 99
How is it possible that - in spite of SCHED_FIFO and equal priority - the client makes its output before the server, though the server was created before the client?
In Kernel 2.0 the server was started before the client.
Christoph
- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/
| |