Instituto Superior de Engenharia do Porto

Departamento de Engenharia Informática

Sistemas Operativos II

Ficha de Avaliação Continua – Módulo IV

 

19 de Dezembro de 2005         

 

 

 

 

 

         

 

 

 

1 – Crie 6 threads em que cada uma das threads deverá imprimir uma posição de um vector de strings. A posição a imprimir deverá ser passada como parâmetro à thread. A thread principal deve esperar que todas as outras threads terminem.

Sugestão: um vector de strings poderá ser definido da seguinte forma: char s [6][20];

 

 

2- Altere o escalonamento do Nachos para que siga o seguinte comportamento:

 

Quando é pedido ao scheduler para obter a próxima thread a executar, esta deve ser obtida aleatoriamente da lista de treads aptas a executar.

 

Para a resolução assuma que já existe o método “int ContaElementos”  na class List (que conta o número de elementos da lista), o método “void *RemoveItemN(int n)” (que remove e devolve o elemento N de uma lista) e a função que obtém  um número aleatório entre 1 e N é a função “int sorte(int N)”.

 

 

 

 

#include <stdlib.h>

 

int sorte(int n)

{  int j;

   srand(getpid());

   j=1+(int) ((double)n*rand()/(RAND_MAX+1.0));

  return (j);

 

}

 

int List::ContaElementos()

{

    ListElement *element = first;

    Int n=0;

 

    if (IsEmpty())

            return 0;

   

    while (element)

      {

            n++;

            element=element->next;

      }

 

     return (n);

}

 

void * List::RemoveItemN(int n)

{

    ListElement *element = first;

      ListElement *prev_element = NULL;

    int x=1;

    if (IsEmpty() || (ContaElementos()<n))

            return NULL;

 

    while (element)

      {

        if (x==n) break;

        prev_element=element;

        element=element->next;

        x++;

      }

 

  if (element==NULL)

    return NULL;

 

  if (prev_element!=NULL)

    prev_element->next=element->next;

     

      if (first==element)

            first=element->next;

      if (last==element)

            last=prev_element;

 

      item=element->item;

 

    delete element;

    return item;

}