2012-04-23 20 views
5

He escrito el programa de prueba para probar SCHED_FIFO. Me enteré de que SCHED_FIFO no puede ser reemplazado por SCHED_OTHER hilos. Pero no pude explicar los resultados obtenidos cuando el mismo programa se ejecuta varias veces.El subproceso SCHED_FIFO se reemplaza por el subproceso SCHED_OTHER en Linux

/* Includes */ 
#include <unistd.h>  /* Symbolic Constants */ 
#include <sys/types.h> /* Primitive System Data Types */ 
#include <errno.h>  /* Errors */ 
#include <stdio.h>  /* Input/Output */ 
#include <stdlib.h>  /* General Utilities */ 
#include <pthread.h> /* POSIX Threads */ 
#include <string.h>  /* String handling */ 
#include <sched.h> 
/* prototype for thread routine */ 
void print_message_function (void *ptr); 
void print_message_function1 (void *ptr); 

/* struct to hold data to be passed to a thread 
this shows how multiple data items can be passed to a thread */ 
typedef struct str_thdata 
{ 
int thread_no; 
int thread_value; 
char message[100]; 
    } thdata; 

int main() 
    { 
pthread_t thread1, thread2; /* thread variables */ 
thdata data1, data2;   /* structs to be passed to threads */ 

/* initialize data to pass to thread 1 */ 
data1.thread_no = 1; 
data1.thread_value = 0; 
strcpy(data1.message, "Hello!"); 

/* initialize data to pass to thread 2 */ 
data2.thread_no = 2; 
data2.thread_value = 10000; 
strcpy(data2.message, "Hi!"); 

/* create threads 1 and 2 */  
pthread_create (&thread1, NULL, (void *) &print_message_function, (void *) &data1); 
pthread_create (&thread2, NULL, (void *) &print_message_function1, (void *) &data2); 

/* Main block now waits for both threads to terminate, before it exits 
    If main block exits, both threads exit, even if the threads have not 
    finished their work */ 
pthread_join(thread1, NULL); 
pthread_join(thread2, NULL); 

/* exit */ 
exit(0); 
} /* main() */ 

/** 
* print_message_function is used as the start routine for the threads used 
* it accepts a void pointer 
**/ 
void print_message_function (void *ptr) 
{ 

thdata *data;    
data = (thdata *) ptr; /* type cast to a pointer to thdata */ 

struct sched_param param; 
//int priority=10; 
/* sched_priority will be the priority of the thread */ 
//param.sched_priority = priority; 
/* only supported policy, others will result in ENOTSUP */ 

int policy = SCHED_OTHER; 
/* scheduling parameters of target thread */ 
pthread_setschedparam(pthread_self(), policy, &param); 
printf("Thread %d says sched policy %d \n", data->thread_no, SCHED_OTHER); 
pthread_getschedparam(pthread_self(),&policy,&param); 

printf("Thread %d says %s %d \n", data->thread_no, data->message,policy); 

int i=0; 
/* do the work */ 
printf("Thread %d says %s %d \n", data->thread_no, data->message,(int)pthread_self()); 
for(i=0;i<100;i++) 

printf("Thread %d says %d \n", data->thread_no,data->thread_value++); 
pthread_exit(0); /* exit */ 
} /* print_message_function (void *ptr) */ 



void print_message_function1 (void *ptr) 
{ 

thdata *data;    
data = (thdata *) ptr; /* type cast to a pointer to thdata */ 

struct sched_param param; 
int priority=10; 
/* sched_priority will be the priority of the thread */ 
param.sched_priority = priority; 
/* only supported policy, others will result in ENOTSUP */

int policy = SCHED_FIFO; 
/* scheduling parameters of target thread */ 
pthread_setschedparam(pthread_self(), policy, &param); 
printf("Thread %d says sched policy %d \n", data->thread_no, SCHED_FIFO); 

pthread_getschedparam(pthread_self(),&policy,&param); 

printf("Thread %d says %s %d \n", data->thread_no, data->message,policy); 

int i=0; 
/* do the work */ 
printf("Thread %d says %s %d \n", data->thread_no, data->message,(int)pthread_self()); 
for(i=0;i<100;i++) 

printf("Thread %d says %d \n", data->thread_no,data->thread_value++); 
pthread_exit(0); /* exit */ 
} /* print_message_function (void *ptr) */ 

He conseguido resultados inesperados en múltiples ejecuciones donde he visto SCHED_FIFO sea invalidada por SCHED_OTHER hilo, es decir, como por programa, hilo 2 es en FIFO modo, mientras que el hilo 1 es SCHED_OTHER modo. He visto varias veces donde thread1 es reemplazado por thread1.

¿Alguien me puede ayudar a encontrar el problema?

+0

Salida de 'sysctl -a | grep _rt'? – ninjalj

+0

@martinjames kernel.sched_rt_period_us = 1000000 kernel.sched_rt_runtime_us = 950000 – GoT

+0

estoy usando Ubuntu 11.10 con g ++ 4.6.1 – GoT

Respuesta

6

es probable que tenga estos valores de sysctl en efecto, que son los valores por defecto:

kernel.sched_rt_period_us = 1000000 
kernel.sched_rt_runtime_us = 950000 

Esto significa que las discusiones en tiempo real se les permite acaparar sólo el 95% de cada período de 1 segundo.

Véase también: Can't provoke Priority Inversion in C++

+0

sí, estos son mis predeterminado values.But, i trató de poner -1 a kernel.sched_rt_runtime_us desactivar en tiempo real. Esto tampoco funcionó – GoT

+4

¿Cuántos núcleos tienes? ¿Cómo se asegura de que los hilos no se puedan ejecutar simplemente en diferentes núcleos? También tenga en cuenta que debe establecer la prioridad. POSIX define un par de funciones 'sched_get_priority_max' y' sched_get_priority_min' que toman una política como argumento y le dan el rango de prioridades válidas para esa política. – Kaz

+1

Desactivé el uso de todos los núcleos, excepto uno que usa comando sudo sh -c "echo 0>/sys/devices/system/cpu/cpu3/online" ... Las cosas están bien.THANKS :-) – GoT

4

también cada vez que el hilo se bloquea en Io, tal vez de las declaraciones printf, otro hilo se puede programar.

Cuestiones relacionadas