Sistemas Operacionais 4 Threads Texto base captulo 4
Sistemas Operacionais 4. Threads Texto base: capítulo 4 Operating Systems: Internals and Design Principles W. Stallings
Processos e threads l Vimos o conceito de processo englobando duas características básicas: n IC - UFF propriedade de recursos: a um processo é alocado um espaço de endereçamento virtual para manter a sua imagem; de tempos em tempos o processo pode ter mais memória, além do controle de arquivos, dispositivos de E/S, . . .
Processos e threads (2) n IC - UFF unidade de despacho: um processo é uma linha de execução, intercalada com outras linhas de outros processos; cada uma delas tem um estado de execução e uma prioridade; é a entidade que é escalonada e despachada pelo SO
Processos e threads (3) l Estas duas características podem ser tratadas de forma independente pelo SO: n n IC - UFF thread ou processo peso leve (lightweight process): é a unidade de despacho processo ou tarefa: é a unidade de alocação de recursos
Assim, . . . l Em um ambiente multithreaded, um processo: n n n IC - UFF é a unidade de alocação e proteção de recursos tem um espaço de endereçamento virtual que mantém a imagem do processo tem acesso controlado a outros processos, arquivos e outros recursos
e. . . l Em um processo podem existir uma ou mais threads com n n n IC - UFF um estado de execução (pronta, . . . ) seu contexto salvo quando não estiver executando sua pilha de execução acesso a variáveis locais próprias acesso compartilhado com outras threads deste processo aos recursos do processo
Modelos de processos Thread única PCB Espaço de ender. do usuário Multithreaded Pilha do usuário Pilha do núcleo PCB Espaço de ender. do usuário IC - UFF Thread TCB TCB Pilha do usuário Pilha do núcleo
Benefícios de threads É mais rápido criar uma thread que um processo l É mais rápido terminar uma thread que um processo l É mais rápido chavear entre threads de um mesmo processo l Threads podem se comunicar sem invocar o núcleo já que compartilham memória e arquivos l IC - UFF
Contudo, Suspender um processo implica em suspender todas as threads deste processo já que compartilham o mesmo espaço de endereçamento l O término de um processo implica no término de todas as threads desse processo l IC - UFF
Exemplos de aplicação Trabalho em primeiro e segundo planos: E/S e cálculo em planilhas l Processamento assíncrono: salvamento periódico em editores de texto l Aumento de velocidade de execução: paralelismo l Organização: facilidade de projeto e implementação l IC - UFF
Estados de uma thread Estados fundamentais: executando, pronta e bloqueada l Faz sentido o estado “suspensa”? l O que acontece com as threads de um processo quando uma delas bloqueia? l IC - UFF
Exemplo: RPC tempo pedido RPC processo 1 serv thread A (processo 1) pedido RPC serv thread B pedido RPC serv executando bloqueado(a) IC - UFF
Em que nível implementar? l Nível do usuário n n IC - UFF gerenciamento das threads é feito pela aplicação o núcleo desconhece a existência de threads chaveamento entre threads não requer privilégio de modo núcleo; isso elimina o gasto de dois chaveamentos de modo escalonamento é feito pela aplicação
e mais. . . n l implementadas através de bibliotecas: executam em qualquer SO Porém: n n IC - UFF chamada ao sistema bloqueia todas as threads de um processo não aproveita os benefícios do multiprocessamento (estão em algum processo!)
Ainda o nível l Nível do núcleo n n IC - UFF gerenciamento das threads é feito pelo núcleo mantém a informação de contexto para processo e threads escalonamento e chaveamento das threads é feito pelo núcleo bloqueio de uma thread não bloqueia as outras
e ainda. . . n n l threads podem aproveitar a capacidade de multiprocessamento usuário enxerga uma API para threads do núcleo Porém: n IC - UFF a transferência de controle entre threads de um mesmo processo requer chaveamento para modo núcleo
Combinando modos. . . biblioteca de threads espaço do usuário espaço do núcleo thread nível usuário thread nível núcleo P IC - UFF Processo P P
Comparando implementações IC - UFF
Exemplo de uso #include <stdio. h> #include <pthread. h> void thr_func(int *id); /* codigo threads 1 e 3 */ void thr_yield(int *id); /* codigo thread 2 */ int main(){ pthread_t thr 1, thr 2, thr 3; /* declara as threads */ int n. Thr. ID 1, n. Thr. ID 2, n. Thr. ID 3; n. Thr. ID 1 = 1; n. Thr. ID 2 = 2; n. Thr. ID 3 = 3; /* cria threads: id, inic, funcao, param funcao */ pthread_create(&thr 1, NULL, (void* )thr_func, &n. Thr. ID 1); pthread_create(&thr 2, NULL, (void* )thr_yield, &n. Thr. ID 2); pthread_create(&thr 3, NULL, (void* )thr_func, &n. Thr. ID 3); IC - UFF /* espera fim das threads: id, status de saida */ pthread_join(thr 3, NULL); pthread_join(thr 2, NULL); pthread_join(thr 1, NULL); }
Exemplo de uso (2) /* codigo das threads 1 e 3 */ void thr_func(int *id){ printf("Eu sou a thread %dn", *id); } /* codigo da thread 2 */ void thr_yield(int *id){ sched_yield(); printf("Eu sou a thread %dn", *id); } /* compilacao: gcc -o threads -lthread -lposix 4 threads. c */ IC - UFF
Leitura suplementar Operating Systems Concepts, A. Silberschatz e P. B. Galvin, Addison. Wesley l Modern Operating Systems, A. S. Tanenbaum, Prentice Hall l IC - UFF
Threads: nível usuário biblioteca de threads espaço do usuário espaço do núcleo P thread nível usuário IC - UFF P Processo
Threads: nível núcleo espaço do usuário espaço do núcleo thread nível usuário thread nível núcleo P IC - UFF Processo P
- Slides: 23