basicamente um programa em execução Um programa é apenas o código. Um programa pode executar vários processos Associado a cada processo está seu espaço de endereçamento Gustavo Pantuza Threads
o programa executável e os recursos do programa. Recursos como: registradores (contador de progra e ponteiro para a pilha); lista de arquivos abertos; alarmes abertos (eventos e signals do SO); processos relacionados; Gustavo Pantuza Threads
unidade de processamento de um processo, um fluxo de controle. Cada processo tem um espaço de endereçamento e, no mínimo, uma thread. Um processo tem duas partes: Ativa: fluxo de controle e execução (Thread) Passiva: espaço de endereçamento Threads de um mesmo processo compartilham do mesmo espaço de endereçamento. Gustavo Pantuza Threads
Linux escalona Tarefas (tasks) As tarefas são threads ou processos single-threaded Um processo é um conjunto de threads compartilhando o mesmo espaço de endereçamento O escalonador de tarefas do Linux não diferencia threads de processos Gustavo Pantuza Threads
<stdio.h> 2 #include <stdlib.h> 3 #include <unistd.h> /* fork */ 4 #define CHILD 0 5 int main(int argc, char* argv[]) 6 { 7 int num = 0; 8 /*Fork return the Child process id (PID) to Parent process. 9 * The child process pid variable must be 0 */ 10 int pid = fork(); 11 fprintf(stdout,"Both process run this line where number is: %d\n", num); 12 if(pid == CHILD){ /* Child Process */ 13 num = 1; 14 fprintf(stdout, "I am the CHILD and the number now is %d\n", num); 15 }else if(pid > 0){ /* Parent Process */ 16 num = 2; 17 fprintf(stdout, "I am the PARENT and the number now is %d\n", num); 18 } 19 printf("Who am I? the number for me is %d\n", num); return EXIT_SUCCESS; 20 } Figura: Very simple fork() example Gustavo Pantuza Threads
para criação de processos (fork()) 1 clone(SIGCHLD, 0); System call para criação de threads (pthread) 1 clone(CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND, 0); Gustavo Pantuza Threads
lib pthread.h A função pthread_create() cria uma thread dentro do processo. A função passada como parâmetro é o bloco a ser executado pela thread A função pthread_join() aguarda até que a thread finalize sua execução Gustavo Pantuza Threads
ponto de parada na execução do programa Qualquer process/thread é obrigado a parar na barreira Nenhum dos processos ou threads pode continuar até que todos os outros também tenham alcançados a barreira Gustavo Pantuza Threads
resultado da computação em dois processos que compartilham um mesmo recurso depende de quem executa primeiro Ex: Duas threads tentanto alterar a mesma variável. As partes de um programa que acessam esses recursos compartilhados são chamadas de regiões críticas. Gustavo Pantuza Threads
que programas executem de maneira segura suas regiões críticas é necessário utilizar o princípio de Exclusão Mútua. Ela é uma forma de impedir que outros processos/threads façam uso de algum recurso compartilhado quando um processo o estiver usando. Ex: Só uma thread usa a variável por vez O mutex é uma implementação da Exclusão Mútua Gustavo Pantuza Threads
Mútua Um Mutex gera Espera Ocupada A Espera Ocupada é quando um processo verifica uma condição repetidamente até que ela seja verdadeira Ela ocupa o processador junto com os demais processos. Ineficiente Semáforos colocam o processo pra dormir (wait state) O processo é acordado quando o semáforo é incrementado Gustavo Pantuza Threads
rede Imagine uma arquitetura cliente/servidor utilizando sockets O servidor pode criar threads para lidar com as requisições recebidas Gustavo Pantuza Threads