Anderson L. S. Moreira
[email protected] http://dase.ifpe.edu.br/~alsm
Curso de Análise e Desenvolvimento
de Sistemas de Informação
Recife - PE
Créditos
Professor: Anderson L. S. Moreira Disciplina: Sistemas Operacionais
Home-page:
http://dase.ifpe.edu.br/~alsm
Aula 4 mostra os conceitos iniciais de processos e
comunicação entre processos. Iremos ver noções de pai e
filho entre processos e criação nos ambientes Windows e
Linux.
Agenda
Introdução
Estrutura do processo Estados do processo
Mudanças de estado do processo Criação e eliminação de processos
Processos independentes, subprocessos e threads
Processos foreground e background
Processos do sistema operacional Processos CPU-bound e I/O-bound
Introdução – Multiprogramação (revisão)
Execução, em paralelo, de múltiplos programas na mesma
máquina;
Cada instância de um programa em execução denomina-se
um processo;
Considerando um grau de tempo fino, o paralelismo não é
real;
Pseudoparalelismo
ou
pseudoconcorrência
– implementação
de sistemas multiprogramados sobre um computador com
um único processador
Introdução
Um programa é:
Uma seqüência finita de instruções;
Uma entidade passiva (que não se altera com o passar do tempo); Armazenado em disco.
Um processo é:
Uma abstração que representa um programa em execução;
Uma entidade dinâmica: seu estado se altera conforme for executando; Armazenado na memória.
Processos vs. Programas
Programa
= Arquivo executável (sem atividade);
Um
processo
é um objeto do sistema operacional que suporta
a execução dos programas;
Um
processo
pode, durante a sua vida, executar diversos
programas;
Um
programa
ou partes de um programa podem ser
compartilhados por diversos processos (ex.: biblioteca
Estrutura do Processo
Estrutura do processo Programa Contexto de Software Contexto de Hardware Espaço de EndereçamentoEstrutura do Processo
Espaço de endereçamento (virtual):
Conjunto de posições de memória acessíveis; Código, dados, e pilha;
Dimensão variável.
Contexto de software:
As instruções do processador executáveis em modo usuário; As funções do sistema operacional;
Contexto de hardware (estado interno):
Valor dos registradores do processador;
Toda a informação necessária para retomar a execução do processo; Memorizado quando o processo é retirado de execução
Contexto de Hardware
Mudança de
contexto
Carrega registradores do Processo B Carrega registradores do Processo A Sistema Operacional Salva registradores do Processo A executando executando executando Salva registradores do Processo B Processo A Processo BModelo: Objeto “Processo”
Propriedades
Identificador;
Programa;
Espaço de Endereçamento;
Prioridade;
Processo pai;
Canais de Entrada / Saída, Arquivos;
Quotas de utilização de recursos;
Contexto de Segurança;
Operações – Funções do sistema que atuam sobre os
processos
Criar
Eliminar
Processos para o SO
Imagem de um programa: Segmento de código.
Conjunto de recursos de HW alocados pelo SO:
Registradores (PC, Stack Pointer…); Espaço de endereçamento (memória); Espaço no disco (arquivos de E/S). Unidade de escalonamento:
Estado;
Algoritmos de escalonamento para otimizar o uso do HW;
Hierarquia entre processos
Processos Independentes, Subprocessos e
Threads
Estrutura de processos e subprocessos
Processo A
Processo C Processo B
Processo E Processo D
Processos Independentes, Subprocessos e
Threads
Processo multithread Contexto de hardware Contexto de hardware Contexto de hardware Espaço de endereçamento C o n te x to d e so ft w a re Thread 3 Thread 2 Thread 1Espaço de Endereçamento
Estrutura de um processo Programa Contexto de Software prioridade de execução registrador PC data/ hora de criação tempo de processador registrador SP quotas privilégios endereços de memória principal alocados registrador de status owner (UID) PID nome registradores gerais Contexto de Hardware Espaço de EndereçamentoBloco de Controle do Processo
A estrutura de dados que representa o processo no SO é chamada “Process Control Block” (PCB)
Contém as informações necessárias:
Registradores, memória, disco (arquivos); Prioridade;
Estado;
Histórico (contabilidade);
Ponteiro para um outro PCB (lista encadeada); O SO deve manter listas de processos
Listas encadeadas;
A estrutura PCB é usada para tal;
Bloco de Controle do Processo
PCB . . . . .. . . ponteiros Estado do processo Registradores Nome do processo Prioridade do processo Limites de memória Lista de arquivos abertosEstados do Processo
Lista de PCBs . .. .. .. . . .. .. .. . . .. .. .. . . .. .. .. . . .. .. .. . Lista de processos em estado de pronto PCB# 5 PCB# 9 PCB# 1 PCB# 2 PCB# 4 Lista de processos em estado de esperaExemplo prático
No site da disciplina no “Material Aula” baixe o simulador SOsim e execute;
http://siep.ifpe.edu.br/anderson/arquivos/sosim_v20.zip Procure identificar o PCB, e propriedades dos processos;
Ciclo de vida dos processos
Processos nascem:
No momento de sua criação (via chamada de sistema – Fork, spawn…). Processos vivem:
Executam na CPU, liberam a CPU (E/S). Executam:
Programas dos usuários;
Programas do sistema (daemons); Processos morrem:
Ou porque terminaram sua execução Ou porque um outro processo os matou: Erro, acesso não-autorizado, falha.
Estados do Processo
Os processos podem ter os seguintes estados: Criado; Execução (running); Pronto (ready); Bloqueado (wait); Encerrado ou Término; Suspenso.*
Mudanças de Estado
Mudanças de estado do processo
Estado de Execução
Estado de Bloqueio Estado de Pronto
a
c
d b
Estado de Suspenso
Dois problemas principais para gerar os recursos: A CPU é muito mais rápida do que a memória; A memória é de tamanho finito.
Precisa-se, então, poupar a memória. Por isso:
Processos bloqueados que estão na memória podem ser transferidos para o disco (swap) até sua E/S ser acabada.
Processos prontos podem também ser descarregados para o disco. Chega-se a mais dois estados:
Bloqueado, suspenso.
Exercício
Desenhar o novo diagrama de estados
incluindo os estados
pronto, suspenso
e
Mudanças de Estado
Mudanças de estado do processo (2)
residente não residente Estado de Execução Estado de Bloqueio Estado de Bloqueio Estado de Pronto Estado de Pronto
Criação e Eliminação
Mudanças de estado do processo (3)
Estado de Execução Estado de Término
Criação de um processo
IdProcesso = CriarProc (Código, Prioridade,... )
Quando a criação tem sucesso o sistema atribui um identificador interno (PID) ao processo que é retornado na função Na criação de um processo tem de ficar definido qual é o
programa que o processo vai executar. Normalmente é especificado um arquivo contendo um programa executável. A função tem frequentemente diversos parâmetros: a prioridade, canais de entrada/saída, ...
Eliminação de processos
Eliminação do processo quando o seu programa termina,
libertando todos os recursos e estruturas de dados retidas
pelo processo
Sair ([Estado])
Eliminação de outro processo
Finalizar Processo Filho
Em inúmeras situações o processo pai pode querer
bloquear-se esperando a finalização de um processo filho
Processos Foreground e Background
Processos foreground e background
(a) Processo Foreground
(b) Processo Background saída saída arquivo de saída terminal terminal entrada entrada arquivo de entrada
Processo Foreground e Background
Pipe entrada do Processo A saída do Processo B saída do Processo A entrada do Processo B Processo A Processo BPropriedades especiais dos Processos do
Sistema
Auditoria e segurança Serviços de rede
Contabilização do uso de recursos Contabilização de erros
Gerência de impressão Gerência de jobs batch Temporização
Comunicação de eventos
Modelo de Segurança
Um processo em execução tem de estar associado a um
Usuário (entidade que pode ser responsabilizada pelos seus
atos);
Os utilizadores são representados no sistema por um código
que os identifica (User IDentifier – UID);
Para facilitar o compartilhamento o usuário pode pertencer a
um grupo ou grupos de usuários (identificador por um GID).
Controle dos Direitos de Acesso
Autorização - operação que valida os direitos do usuário sobre um recurso antes deste poder executar uma operação sobre ele;
A autorização baseia-se conceitualmente numa Matriz de Direitos de Acesso;
Para um dado objeto a coluna da matriz define a Lista de Direitos de Acesso (ACL);
Para um dado usuário a linha respectiva define todos os seus direitos normalmente designados por Capacidade.
Objeto
Processos CPU e IO Bound
Processos CPU Bound x IO Bound
(a) CPU-bound
tempo tempo
E/ S E/ S
UCP UCP
THREADS
Tarefas
Mecanismo simples para criar fluxos de execução independentes, compartilhando um mesmo contexto (ou de software ou de
Tarefas vs. Processos
Porque não usar processos?
Processos obrigam ao isolamento (espaços de endereçamentos disjuntos) dificuldade em compartilhar dados (mas não
impossível… exemplos?)
Tarefas: Exemplos de Utilização
Servidor (ex.:, web)
Aplicação cliente de correio eletrônico
Modelos Multitarefa no Modelo Computacional
Operações sobre as Tarefas
IdTarefa = CriarTarefa(procedimento);
EliminarTarefa (IdTarefa); EsperaTarefa (IdTarefa)
Bloqueia a tarefa esperando ser finalizada de outra tarefa ou da tarefa referenciada no parâmetro Idtarefa
Interface POSIX
err = pthread_create (&tid, attr, function, arg)
pthread_exit(void *value_ptr)
int pthread_join(pthread_t thread, void **value_ptr) suspende a tarefa chamada até “pthread_t thread“ terminar;
continua a execução caso “pthread_t thread“ já tenha sido terminada Ponteiro para o identificador da tarefa Utilizado para definir atributos da tarefa como a prioridade Função para executar Parâmetros para a função
Programação num ambiente
multitarefa
As tarefas compartilham o mesmo espaço de
endereçamento e portanto têm acesso às mesmas
variáveis globais.
A modificação e teste das variáveis globais tem de
ser efetuada com cuidados especiais para evitar
erros de sincronização.
Alternativas de Implementação
Tarefas-kernel (real)
Pseudotarefas (Tarefas-usuário)
As tarefas implementadas numa system call no
espaço de endereçamento do usuário;
Idéia proveniente das linguagens de programação;
Núcleo apenas “vê” um processo;
Processo guarda lista de tarefas, e seu respectivo
contexto
Pseudotarefas (Tarefas-usuário)
A comutação entre tarefas explícita função
thread-yield
Pode ser contornado usando interrupções (“preempção”)
Problema: e se uma tarefa faz chamada de bloqueio?
Tarefas-Kernel (ou Tarefas Reais)
Implementadas no núcleo do SO
Mais comuns
Lista de tarefas e respectivo contexto são mantidos
pelo núcleo
Comparação Tarefas Usuário e Kernel
Quero que respondam indicando qual é a melhor
opção.
Capacidade de utilização em diferentes SOs?
Velocidade de criação e comutação? (vs. processos?)
Tirar partido de execução paralela em multiprocessadores?
Aproveitamento da CPU quando uma tarefa bloqueia (ex: ler
do disco)?
LINUX - PROCESSOS
(Sob o ponto de vista do usuário)
Processos em Linux
Identificação de um processo
Um inteiro designado por PID;
Alguns identificadores estão pré atribuídos: processo 0 é o
swapper
(gerenciador de memória) e o processo 1 init é o
de inicialização do sistema;
Os processos relacionam-se de forma hierárquica
O processo herda todo o ambiente do processo pai;
O processo sabe quem é o processo de que descende
designado por processo pai;
Quando o processo pai termina os subprocessos
continuam a executar, são adotados pelo processo de
inicialização (pid = 1).
Os processos têm prioridades variáveis
Processos em Linux
Espaço de endereçamento em modo usuário
Organiza-se em três zonas que no Unix original se denominavam por segmentos:
• texto - código do programa
• dados - espaço de dados do programa • pilha (stack)
Espaço de endereçamento em modo kernel
No interior do núcleo existe uma zona de dados para cada processo que contem o seu contexto;
Processos em Linux
Cada processo também tem associado um contexto de software acessível em modo usuário e que contém diversas variáveis úteis para os programas utilitários ou para as aplicações.
Exemplo:
HOME=/usr/pjpf SHELL=/bin/csh USER=pjpf
PATH=/usr/pjpf/bin/:/usr/local/bin:/bin
Este contexto é herdado do processo pai e pode ser modificado livremente porque reside no espaço do usuário.
Nos programas 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 no Linux
id = fork()
A função não tem parâmetros,em particular o arquivo que irá executar. A imagem do novo processo é uma cópia da do criador.
O contexto de hardware pai é copiado para o filho
A função retorna o PID do processo;
Este parâmetro assume valores diferentes de acordo com o processo em que se efetua o retorno:
• ao processo pai é devolvido o “pid” do filho • ao processo filho é devolvido 0
• -1 em caso de erro
Retorno de uma função com valores diferentes não existente na programação sequencial;
Finalização do Processo
Termina o processo, liberta todos os recursos
retidos pelo processo, ex.: os arquivos abertos;
Assinala ao processo pai seu término.
Finalização do Processo
No Linux existe uma função para o processo pai sincronizar
com o término de um processo filho;
Bloqueia o processo pai até que um dos filhos termine
Exemplo de Sincronização entre o
Processo Pai e o Processo Filho
Execução de um Programa
A função fork apenas permite lançar processo com o mesmo código problemas?
A função exec permite substituir a imagem do processo onde é invocada pela contida num arquivo executável;
Não há retorno numa chamada com sucesso.
Parâmetros: valores que são passados para os parâmetros de entrada na função main do código que irá executar.
Execução de um Programa
int execl(char* arquivo, char* arg0, char* argl,…, argn,0) int execv(char* arquivo, char* argv [])
Caminho de acesso ao arquivo executável
Argumentos para o novo programa. Podem ser passado como ponteiros individuais ou como um array de
ponteiros.
Estes parâmetros são passados para a função main do novo programa e acessíveis através do argv
Exemplo 1
#include <stdio.h> #include <unistd.h> int main() {
execl("/bin/ls","ls","test_exec.c",NULL); printf ("Eu ainda nao estou morto\n"); exit(0);
}
• O comando ls é executado, mas o printf não. Isto mostra que o processo não retorna após a execução do execl.
Exemplo 2
#include <stdio.h> #include <unistd.h> int main() { if ( fork()==0 ) execl( "/bin/ls","ls","test_exec.c",NULL); else {sleep(2) ; /* espera o fim de ls para executar o printf() */
printf ("Eu sou o pai e finalmente posso continuar\n“); } exit(0);
}
• Neste caso, o filho morre após a execução do ls, e o pai continuará a viver, executando então o printf.
Shell
O shell constitui um bom exemplo da utilização de fork e exec
Autenticação
Um processo tem associados dois identificadores que são
atribuídos quando o usuário efetua o login (se autentica)
perante o sistema:
o número de usuário UID - user identification
o número de grupo GID - group identification
Os UID e GID são obtidos do arquivo /etc/passwd no
momento do login
O UID e o GID são herdados pelos processos filhos
superuser é um UID especial – zero. Normalmente está
associado ao utilizador root (privilegiado).
Proteção no Acesso de Recursos
A proteção dos recursos em Linux é uma versão simplificada
do modelo de Listas de Controle de Acesso (ACL);
Para um recurso (arquivo, socket, etc.) a proteção é definida
em três categorias:
Dono (owner): usuário que normalmente criou o recurso;
Grupo (group): conjunto de usuários com afinidades de
trabalho que justificam direitos semelhantes;
Outros usuários (world).
SetUID
Mecanismo de Set UID (SUID) – permite alterar
dinamicamente o usuário;
Duas variantes: bit de setuid, ou função sistema
setuid.
Exercício: Procure exemplos de mudança de usuários por
SetUID. Será sorteado um para explicar.
Bit SetUID
No arquivo executável pode existir uma indicação especial
que na execução do exec chame a alteração do uid;
O processo assume a identidade do dono do arquivo durante
a execução do programa.
Exemplo: comando passwd
Funções Sistema de identificação
Real UID e GID – UID e GID originais do processo
Effective UID e GID – usado para verificar permissões de acesso e que pode ter sido modificado pelo setuid
getpid() - devolve a identificação do processo getuid(), getgid()
devolvem a identificação real do usuário geteuid(), getegid()
devolvem a identificação efetiva do usuário setuid(uid), setgid(gid)
altera a identificação efetiva do usuário para uid e gid, só pode ser invocada por processos com privilégio de superusuário
WINDOWS - PROCESSOS
Sob o ponto de vista do usuário
Processos –Windows
Um processo é um detentor de recursos usados pelas tarefas; Os fluxos de execução são as threads;
Processa uma ou mais threads.
Contexto de hardware Contexto de hardware Contexto de hardware Espaço de endereçamento C o n te x to d e so ft w a re Thread 3 Thread 2 Thread 1
Processos
Um processo em Windows é constituído por: Um espaço de endereçamento;
Um programa executável; Pelo menos uma tarefa;
Uma lista de referências (handles - manipuladores) para vários objetos (quaisquer recursos do sistema);
Um contexto de segurança;
Threads no Windows
Tarefas reais.
Componentes fundamentais:
Os registos do CPU que representam o estado do
processador
Duas pilhas (
stacks), uma para execução em modo
kernel
e outra para execução em modo usuário;
Uma zona de memória privada (
thread-localstorage - TLS)
para uso pelos subsistemas e DLLs
Fibers
Pseudotarefas geridas no espaço de endereçamento do
usuário.
Uma thread pode ter múltiplas fibers;
Fibers não são vistas pelo núcleo;
As fibers são criadas e comutadas explicitamente com
systems call (chamadas);
Jobs
Grupo de processos
Permite gerenciamento uniforme (e.x., terminar em
conjunto)
Um processo só pode ser associado a um job e em principio
todos os seus descendentes pertencem ao mesmo job
Segurança
O contexto de segurança de um processo ou de uma thread é um objeto designado Access Token;
Um Access Token regista os usuários, grupos, máquinas, e domínios que estão associados ao processo.
Sempre que é acessado um objeto no sistema o executive valida o token contra uma ACL
Acesso concedido se não existir nenhuma recusa, e existir pelo menos uma permissão num dos utilizadores, grupos, etc.
Criação de processos Win32
BOOL CreateProcess(LPCTSTR ApplicationName, LPTSTR CommandLine, LPSECURITY_ATTRIBUTES ProcessAttributes, LPSECURITY_ATTRIBUTES ThreadAttributes, BOOL InheritHandles, DWORD CreationFlags, LPVOID Environment, LPCTSTR CurrentDirectory, LPSTARTUPINFO StartupInfo, LPPROCESS_INFORMATION ProcessInformation); Nome do programa executável. Se for NULL o Command Line tem de ter o nome do executável Linha de comando para o programa que quer criar Atributos de segurança do processo e da tarefa Indica se o novo processo herda os tokens do processo pai Várias flags entre elas a que permite definir classes de prioridades Ambiente de execução do processo criado Estrutura retornada pelo núcleo com a informação de controle
Criação de processos Win32
Diferenças vs. fork+exec:
No Windows não se cria automaticamente uma relação
pai-filho. Embora o processo pai fique com um handle
para o filho.
Um processo tem associado uma thread (main thread).
Na criação do processo pode definir a classe de prioridade
a que as threads do processo ficam associadas.
Eliminação de Processos
Existem três formas para terminar um processo
Chamada a função ExitProcess que autotermina o processo
Chamada a função TerminateProcess que permite a um
processo com um determinado privilégio terminar outro
processo
Criação Thread
HANDLE CreateThread (LPSECURITY_ATTRIBUTES ThreadAttr, DWORD stakSz, LPTHREAD_START_ROUTINE StrtAddr, LPVOID Parm, DWORD CreatFlgs, LPDWORD ThreadId); Handle para a thread ou NULL se falhou Atributos de segurança Tamanho da pilha Endereço da função inicial Um parâmetro pode ser passado a thread
Esperar pelo termino de Subprocesso
WaitForSingleObject(handle, timeout)
Função genérica de espera sobre um objeto
(entidade do sistema operacional)
EVENTOS
Rotinas Assíncronas para Tratamento de acontecimentos
assíncronos e exceções
Eventos
Uso de sinais [ctrl-C] Processo interrupção sinal Sistema OperacionalRotinas Assíncronas
Certos acontecimentos devem ser tratados pelas
aplicações, embora não seja possível prever a sua
ocorrência
Ex: Ctrl-C
Ex: Ação desencadeada por um timeout
Como tratá-los na programação sequencial?
Poderia lançar uma tarefa por acontecimento.
Desvantagem?
Alternativa: Rotinas assíncronas associadas aos
acontecimentos (eventos)
Sinais
Sinais, interrupções e exceções
Hardware Sistema Operacional Interrupções Exceções Sinais Processo Processo
Sinais
Acontecimentos Assíncronos no Linux
Signal
Causa
SIGALRM
O relógio expirou
SIGFPE
Divisão por zero
SIGINT
O usuário apertou a tecla para interromper o
processo (normalmente o CRTL+C)
SIGQUIT
O utilizador quer terminar o processo e provocar
um core dump
SIGKILL
Signal para terminar o processo. Não pode ser
tratado
SIGPIPE
O processo escreveu para um pipe que não tem
receptores
SIGSEGV
Acesso a uma posição de memória inválida
SIGTERM
O usuário pretende terminar ordenadamente o
processo
SIGUSR1
Definido pelo usuário
SIGUSR1
Definido pelo usuário
Exceção Interação com o terminal Desencadea do por interrupção de HW Explicitamente desencadeado por outro processo
D
ef
ini
dos em
s
ig
n
a
l.h
Tratamento de sinais
Possibilidades:
Terminar o processo.
Ignorar sinal.
Alguns sinais como o SIGKILL não podem ser ignorados.
Porquê?
Executar rotina de tratamento (
handler
)
Associarmos rotinas de tratamento a sinal pela função do
sistema
signal
Cada sinal tem um tratamento por omissão, que pode ser
terminar ou ignorar
Chamada Sistema “Signal”
void (*signal (int sig, void (*func)(int))) (int);
A função retorna um ponteiro para função anteriormente associada ao sinal Identificador do sinal para o qual se pretende definir um handler Ponteiro para a Função ou macro especifico: •SIG_DFL – ação por omissão •SIG_IGN – ignorar o sinal Parâmetro para a função de tratamento
Exemplo
#include <stdio.h> #include <signal.h> apanhaCTRLC () {
char ch;
printf ("Quer de fato finalizar a execucao?\n"); ch = getchar();
if (ch == 's') exit(0);
else {
printf ("Entao vamos continuar\n"); signal (SIGINT, apanhaCTRLC); }
}
void main () {
signal (SIGINT, apanhaCTRLC);
printf("Associou uma rotina ao signal SIGINT\n"); for (;;){
printf(". "); sleep (1/2); }