cout << "PThread " << i << ": Impossible to create." << endl;
}
}
void RoundRobin::AguardaFinalizacaoPthread(){
for (int i=1; i <= NUM_PTHREADS; i++)
pthread_join(myPthreads, NULL);
pthread_attr_destroy(&myAttr);
pthread_mutex_destroy(&myMutex);
}
Eu gostaria de configurar algumas PThreads e quando a primeira alcançar o time-slice (quantum), a segunda toma a CPU e a primeira vá para o fim da fila.
Sei que isso é exatamente o escalonamento Round-Robin.
Pergunta
Juliano Rossi
Olá para todos!
Eu estou tentando alterar o time-slice (quantum) do escalonamento Round-Robin por meio dos padrões POSIX.
Até o momento consegui achar isto:
- sched_rr_get_interval(0, &timeTrigger);
Onde:
- 0 é o processo corrente;
- &timeTrigger é uma referência a um timespec configurado com 2 segundos.
Aqui vai o código:
#include "RoundRobin.h"
#include <pthread.h>
#include <sched.h>
#include <cstdlib>
#include <iostream>
#include <sys/time.h>
#include <unistd.h>
#define NUM_PTHREADS 2
#define MICRO_PER_SECOND 1000000
struct timeval now, start, stop;
struct timespec timeTrigger, timeCondition;
pthread_t myPthreads[NUM_PTHREADS];
pthread_mutex_t myMutex = PTHREAD_MUTEX_INITIALIZER;
pthread_attr_t myAttr;
using namespace std;
void *Work (void *ptr){
int i = (int) ptr;
pthread_mutex_lock(&myMutex);
cout << "\nPrinting PThread" << i << endl;
for(int j=1;j <= 6; j++){
cout << j << " ";
sleep(1);
}
pthread_mutex_unlock(&myMutex);
return NULL;
}
RoundRobin::RoundRobin() {
// TODO Auto-generated constructor stub
}
RoundRobin::~RoundRobin() {
// TODO Auto-generated destructor stub
}
void RoundRobin::CriaPThreads(){
int resultOfCreatePthread=0;
gettimeofday(&now, NULL);
timeTrigger.tv_sec = now.tv_sec + 2;
pthread_cond_init(&myCond, NULL);
pthread_attr_init(&myAttr);
pthread_attr_setschedpolicy(&myAttr, SCHED_RR);
pthread_attr_setinheritsched(&myAttr, PTHREAD_EXPLICIT_SCHED);
sched_rr_get_interval(getpid(), &timeTrigger);
for (int i=1; i <= NUM_PTHREADS; i++){
resultOfCreatePthread = pthread_create(&myPthreads, &myAttr,
Work, (void *)i);
if (resultOfCreatePthread != 0)
cout << "PThread " << i << ": Impossible to create." << endl;
}
}
void RoundRobin::AguardaFinalizacaoPthread(){
for (int i=1; i <= NUM_PTHREADS; i++)
pthread_join(myPthreads, NULL);
pthread_attr_destroy(&myAttr);
pthread_mutex_destroy(&myMutex);
}
Eu gostaria de configurar algumas PThreads e quando a primeira alcançar o time-slice (quantum), a segunda toma a CPU e a primeira vá para o fim da fila.
Sei que isso é exatamente o escalonamento Round-Robin.
Mas eu preciso fazer isso utilizando POSIX.
Obrigado desde já!
Link para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.