Skip to content

Instantly share code, notes, and snippets.

@carlos-menezes
Last active November 24, 2021 11:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save carlos-menezes/be9e138ff87a72094e03ef75a816ff11 to your computer and use it in GitHub Desktop.
Save carlos-menezes/be9e138ff87a72094e03ef75a816ff11 to your computer and use it in GitHub Desktop.

2. O sistema operativo é um dos principais componentes de qualquer sistema informática e oferece vários serviços, entre os quais:

  • Gestão de recursos: o SO é responsável pela gestão de um conjunto de recursos lógicos que simplificam a utilização dos recursos físicos base;
  • Execução de programas: concede um ambiente para a execução dos programas;
  • Operações I/O: comunicação entre o utilizador do SO e os drivers dos dispositivos;
  • Proteção: isolamento dos espaços de endereçamento de cada processo.

3. Uma tarefa é um fluxo de execução que se executa no âmbito de um processo já existente, executando funções do programa associado ao processo. Por partilhar o espaço de endereçamento com o processo ao qual está associado, partilha de dados é mais rápida e a comutação é mais rápida (quando comparada à comutação entre processos).

As threads são especialmente úteis em ambientes onde se pretende uma elevado throughput na realização de tarefas. Um exemplo prático da sua utilização verifica-se nos servidores web, onde um processo servidor, ao receber um pedido, despoleta uma nova thread para tratar do pedido efetuado.


4.

a. Algoritmo de Bakery p/ 2 processos.

b.

p1() {
	while (1) {
		regiao-nao-critica();
		n1 = 1;
		n1 = n2+1;
		while(n2 && n1 > n2) {
			regiao-critica();
			n1 = 0;
		}
	}
}

p2() {
	while (1) {
		regiao-nao-critica();
		n2 = 1;
		n2 = n1+1;
		while(n1 && n2 >= n1) {
			regiao-critica();
			n2 = 0;
		}
	}
}

p2 acederá primeiro à secção crítica verificar-se-á a condição de entrada no while (n1 = 1 e n2 >= 1, logo TRUE).

c. As soluções algorítmicas têm diversas desvantagens:

  • Apenas contemplam espera ativa;
  • Os algoritmos são desenhados para uma situação onde existem apenas 2 processos:
    • O algoritmo de Lamport, desenhado para contemplar a coordenadação de acesso a uma região crítica por N (arbitrário) rocessos, é complexo;

6.

a. Os items produzidos na linha 7 poderão não ser colocados em buf se dois processos executarem essa instrução em simultâneo.

b. Vários processos podem "consumir" o mesmo item se executarem a linha 5 em simultâneo.

c.

int buf[N];
int prodptr=0, consptr=0;
pthread_mutex_t prod_m, cons_m;
sem_t semCons = 0, semProd = 6;

produtor() {
	int item = produz();
	sem_wait(&semProd);
	pthread_mutex_lock(&prod_m);
	buf[prodptr] = item;
	prodptr = (prodptr+1) % N;
	pthread_mutex_unlock(&prod_m);
	sem_post(&semCons);
}

consumidor() {
	int item;
	sem_wait(&semCons);
	pthread_mutex_lock(&cons_m);
	item = buf[consptr];
	consptr = (consptr+1) % N;
	pthread_mutex_unlock(&cons_m);
	sem_post(&semProd);
	consome(item);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment