Scheduling in Kernel 2.2

Christoph Pleger (pleger@magma.cs.uni-dortmund.de)
Fri, 3 Sep 1999 10:47:51 +0200 (MET DST)


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/