Sistemas Operativos - Faculdade de Engenharia da ...rma/SOPE/at/T04_05.pdf · • threads partilham...
Transcript of Sistemas Operativos - Faculdade de Engenharia da ...rma/SOPE/at/T04_05.pdf · • threads partilham...
Sistemas OperativosProcessos, threads e eventos
Rui Maranhão ([email protected])
Multi-tarefa
• execução, em paralelo, de programas no mesmo computador
• cada instância em execução denomina-se processo (conceito central num SO!)
• pseudo-paralelimo: execução de sistemas multiprograma num computador com um único processador
Processos vs. Programas
• programa é um ficheiro executável
• um processo é um objecto do sistema operativo que suporta a execução dos programas
• um processo pode executar vários programas
• um programa ou partes dele podem ser partilhados por diversos processos (*.dll)
Processo como máquina virtual
• um processo tem
• espaço de endereçamento
• repertório de instruções
• contexto de execução (estado interno)
Processos
• o contexto de execução de um processo (ou seja, o seu estado) compreende
• código
• dados
• estado do processador (registos)
• recursos (ficheiros, ...)
• tempo CPU consumido
Processo
• SO deverá ser capaz de
• criar, suspender, e reiniciar a execução de processos
• suportar comunicação entre processos
• o próprio SO tem muitos processos “do sistema”
Processos
• competem por recursos para executar as suas tarefas
• cabe ao sistema operativo fazer o escalonamento dos processos
Estados de um processo
• em execução
• foi-lhe atribuído CPU
• bloqueado
• o processo está logicamente impedido de prosseguir, porque lhe falta um recurso
• do ponto de visto do SO, transição voluntária
• pronto a executar, aguarda escalonamento
Primitivas de despacho
• bloqueia(evento)
• coloca processo na fila de processos parados à espera do evento
• invoca próximo processo
• liberta(evento) ou liberta(processo, evento)
• se processo não esta a espera de mais eventos, coloca-o na lista de espera
Primitivas de despacho
• proximo_processo()
• selecciona um dos processos existentes na lista de processos prontos a executar
• executa a comutação de contexto
• salvaguarda contexto volátil do processo corrente
• carrega contexto do processo escolhido
Principais decisões
• Qual o próximo processo?
• Quando começa a executar?
• Durante quanto tempo?
• ou seja: há desafectação forçada ou não?
Eliminação de processos
• eliminação do processo quando o programa termina, eliminando dados e recursos
• sair([estado]), estado = erro \/ !erro
• eliminação de outro processo
• eliminarProc(id)
• erro fatal (segmentation fault)
Terminação de processo filho
• em certos casos, o processo pai pode querer bloquear esperando a terminação do processo filho
• estado = esperaTerminacao(id)
Multiprogramação - Benefícios -
• maximiza o tempo de utilização do CPU
• utilização do CPU = 1 - pn
• n é o número de processos
• p fracção de tempo em espera por I/O
•
Processos em Unix
• identificação de um processo
• inteiro pid
• alguns pid’s estão pre-atribuídos
• 0 é o swapper (gestão de memória)
• 1 é o init (inicialização do sistema)
Processos em Unix
• os processos relacionam-se de forma hierárquica
• o processo herda o ambiente do pai
• o processo sabe o pid do pai
• se processo pai terminar, os subprocessos são adoptados pelo pid=1
Processos em Unix
• espaço de endereçamento (modo utilizador)
• três zonas (segmentos)
• .text, dados, e stack
• espaço de endereçamento (modo kernel)
• zona de dados e stack no kernel
Processos em Unix
• processos também tem associado um contexto de execução em modo utilizador contendo as variáveis de ambiente
• HOME, SHELL, PATH, ...
• herdado do processo pai
• em C é acessível através do parâmetro do main ou de uma variável externa
main (arc, arv, envp)extern char **environ
Criação de um Processo
• id = fork()
• retorna o pid do processo
• pai = pid do filho
• filho = 0
• -1 erro
• sem parâmetros ; imagem do filho é uma cópia do criador
Terminação
• termina o processo, e liberta todos os recursos detidos pelo processo
• assinala ao processo pai a terminação
• void exit(status)
• status permite passar ao pai o estado em que o processo terminou (<0 = erro)
Terminação
• em unix existe uma função para o processo pai se sincronizar com a terminação de um processo filho
• bloqueia o processo pai até que o filho termine
• int wait(int *status)
• status - estado de terminação do filho
• retorna o pid do processo terminado
Execução de um programa
• o fork apenas permite lançar processo com o mesmo código!
• a função exec permite substituir a imagem do processo onde é invocada
• não há retorno numa chamada com sucesso
• parâmetros: valores passados
• ficheiros matem-se abertos
Execução de um programa
• int execl(char *fich, arg0,...argn, 0)
• int execv(char *fich, *argv[])
• fich = caminho do ficheiro
• argv = argumentos
Autenticação
• um processo tem associado 2 ids atribuídos aquando do login (uid, gid)
• uid e gid são obtidos no ficheiro /etc/passwd
• uid e gid são herdados pelos filhos
• superuser é um uid especial (0, associado ao utilizador root)
Protecção
• protecção de recursos em unix é semelhante ao modelo listas de controlo de acesso
• protecção definida em três categorias
• dono (owner)
• grupo (group)
• restantes (world)
Set uid
• mecanismo de set uid (suid) permite alterar dinamicamente o utilizador
• duas variantes
• bit de setuid
• função de sistema setuid
Bit setuid
• ficheiro executável pode conter uma indicação especial para provocar a alteração do uid
• processo assume identidade do dono
• exemplo: passwd
• operação crítica para segurança!!
Threads vs. processos
• Porque não usar processos?
• processos obrigam ao isolamento
• espaços de endereçamento disjuntos
• dificuldade em partilhar
• Eficiência na criação e comutação
Threads: operações
• operações sobre as threads
• id = criarThread(procedimento)
• eliminarThread(id)
• esperarThread(id)
API POSIX
• err = pthread-create(&tid, attr, func, arg)
• tid = id da tarefa ; attr = atributos
• func = função a executar
• arg = parâmetros para a função
• pthread-exit(void *value_ptr)
• int pthread-join(pthread_t thread, void **value_ptr)
• se a tarefa alvo não terminou bloqueia-se
ThreadsPOSIX vs. Windows
Tarefas Criar Sincronizar com Terminacao Transferir controlo adormecer terminarPOSIX pthread create pthread join pthread yield sleep pthread exit
Windows CreateThread WaitForSingleObject SwitchToThread sleep ExitThread
Programação em ambiente multitarefa
• threads partilham o mesmo endereçamento
• acesso às mesmas variáveis globais
• modificação de variáveis globais deve ser feito com precaução
• para resolver estes problemas, sincronização é essencial (falado adiante)
threads utilizador
• as tarefas são implementadas numa biblioteca no espaço de endereçamento do utilizador
• ideia proveniente das LP
• núcleo apenas vê um processo
• processo guarda lista de tarefas
threads utilizador
• comutação entre tarefas é explicita
• thread-yield
• pode ser contornado usando interrupções
• problema: e se uma tarefa faz chamada bloqueante??
• Solução?
threads núcleo
• implementação no núcleo do SO
• mais comuns
• lista de tarefas é gerido pelo núcleo
threads núcleo vs. utilizador
• capacidade de utilização em diferentes SO?
• velocidade de criação e comutação?
• tirar partido da execução paralela em multiprocessadores?
• aproveitamento do CPU quando uma tarefa bloqueia?
Rotinas assíncronas
• certos acontecimentos devem ser tratados, embora não seja possível prever a sua ocorrência
• ctr-c, time-out, div-0
• como tratá-los na programação sequencial?
• uma thread por acontecimento?
• Alternativa: eventos!
Signals
• ... são acontecimentos assíncronos em unix
• definidos em signal.h
• man signal para mais info
Tratamento de signals
• omissão - termina o processo
• ignorado - alguns sinais não podem ser ignorados (ex., SIGKILL)
• associado a uma rotina de tratamento (handler)
• usando a função signal
Chamada de sistema: kill
• envia um signal ao processo pid
• nome da função bem escolhido?!
• kill(pid, sig)
Outras funções associadas aos signals
• unsigned alarm(unsigned int sec)
• depois de sec segundos SIGALARM é enviado para o processo
• pause()
• aguarda a chegada de um signal
• unsigned sleep(unsigned int sec)
• faz alarm e bloqueia-se a espera do signal