• Nenhum resultado encontrado

Processos ao nível do SO

N/A
N/A
Protected

Academic year: 2021

Share "Processos ao nível do SO"

Copied!
142
0
0

Texto

(1)

Processos ao nível do SO

José C. Cunha, DI-FCT/UNL

Concorrência em sistemas de operação

Periféricos operando simultaneamente

Multiprogramação

(2)

10/1/2009 FSO 2

SO monolíticos

Programas e periféricos pedem serviços ao SO

Todas as acções do SO com interrupções desligadas

(3)

10/1/2009 FSO 3

SO: abordagem tradicional

OS Hardware User Mode Kernel Mode Application Programs Application Programs

(4)

10/1/2009 FSO 4 Application Programs Application Programs System Services Hardware User Mode Kernel Mode

SO monolítico

Ex: MS-DOS

(5)

10/1/2009 FSO 5

SO monolíticos

Programas e periféricos pedem serviços ao SO

Todas as acções do SO com interrupções desligadas

SO fica mais simples, mas…

Processos e periféricos ficam a aguardar muito tempo

SO grandes ficam muito complexos

Difíceis de estender com novos serviços

(6)

10/1/2009 FSO 6

SO organizado em camadas

Cada camada acede uma interface de mais baixo nível

Application Programs

System Services

User Mode Kernel Mode

Memory & I/O Device Mgmt

Hardware

Process Schedule

Application Programs

(7)

10/1/2009 FSO 7

Tendência para SO mais flexíveis

User Mode Kernel Mode Hardware Microkernel Servers Application Programs Application Programs

(8)

10/1/2009 FSO 8

SO baseados em processos

Nem todas as acções do SO exigem as interrupções desligadas

(9)

10/1/2009 FSO 9

SO baseados em processos

Nem todas as acções do SO exigem as interrupções desligadas

(10)

10/1/2009 FSO 10

SO baseados em processos

Nem todas as acções do SO exigem as interrupções desligadas

Maior descentralização das acções do SOProcessos:

-- entidades assíncronas interrompíveis

-- partilham o CPU e passam por estados:

(11)

10/1/2009 FSO 11

SO baseados em processos

Nem todas as acções do SO exigem as interrupções desligadas

Maior descentralização das acções do SOProcessos:

-- entidades assíncronas interrompíveis -- partilham o CPU e passam por estados

Pronto, Executando, Bloqueado

(12)

10/1/2009 FSO 12

SO baseados em processos

Nem todas as acções do SO exigem as interrupções desligadas

Maior descentralização das acções do SOProcessos:

-- entidades assíncronas interrompíveis -- partilham o CPU e passam por estados

executando, bloqueado, pronto

Processo para acções de „device driver‟

(13)

10/1/2009 FSO 13

Noção de processo associada a cada device

driver

para cada periférico

Responsável pela sua operação física

Pela detecção do fim de operações e erros Pelo tratamento de interrupções

(14)

10/1/2009 FSO 14

Vantagens:

-- maior clareza nos módulos do SO

-- estruturas de dados descentralizadas e sob controlo de processos dedicados

-- maior eficiência no atendimento dos

pedidos dos programas e dos periféricos na gestão da concorrência

(15)

10/1/2009 FSO 15

O Núcleo do SO

(16)

10/1/2009 FSO 16

O Núcleo do SO

Distribui o tempo de CPU pelos processosAtende interrupções e assinala-as aos

respectivos processos responsáveis, sob a forma de sinais

(17)

10/1/2009 FSO 17

O Núcleo do SO

Distribui o tempo de CPU pelos processosAtende interrupções e assinala-as aos

respectivos processos responsáveis, sob a forma de sinais

Oferece funções para:

(18)

10/1/2009 FSO 18

O Núcleo do SO

Distribui o tempo de CPU pelos processosAtende interrupções e assinala-as aos

respectivos processos responsáveis, sob a forma de sinais

Oferece funções para:

Processos fazerem pedidos ao SO

Processos comunicarem entre si e

(19)

10/1/2009 FSO 19

Cada processo, seus canais de I/O

hardware Prog A device drivers Prog B Prog C processo em execução

(20)

10/1/2009 FSO 20

Processo

Programa

Programa é estático

(21)

10/1/2009 FSO 21

Processo

Programa

Programa é estático

código e dados

Processo é uma instância de execução

código e dados (estes vão variando)

estado: pilha, registadores (PC, SP, …)

canais de I/O

(22)

10/1/2009 FSO 22

Processo

Programa

Programa é estático

código e dados

Processo é uma instância de execução

código e dados (estes vão variando)

estado: pilha, registadores (PC, SP, …)

canais de I/O

atributos e outros recursos…

O mesmo programa pode ser

executado em diferentes processos:

(23)

10/1/2009 FSO 23

Controlo de Processos

Ambiente de execução dos programas:

instruções da máquina hardware

chamadas a funções de biblioteca

chamadas ao sistema de operação

Suporte duma máquina virtual dedicada a cada processo:

Processador Virtual

Memória Virtual

(24)

10/1/2009 FSO 24

Máquina virtual de um processo

O SO gere e projecta na máquina real

Mem. Virtual  mapa de memória

CPU virtual  CPU real / time-sharing

I/O virtual  canais de I/O  periféricos

Mem. virtual

CPU virtual

(25)

10/1/2009 FSO 25

Um Processo no SO

(26)

10/1/2009 FSO 26

Um Processo no SO

Ambiente de execução de um programa: -- Programa executável

(27)

10/1/2009 FSO 27

Um Processo no SO

Ambiente de execução de um programa: -- Programa executável

(28)

10/1/2009 FSO 28

Um Processo no SO

Ambiente de execução de um programa: -- Programa executável

-- Zonas de dados e pilha

-- Zona para salvaguarda de estado do CPU (PC, SP, outros registadores)

(29)

10/1/2009 FSO 29

Um Processo no SO

Ambiente de execução de um programa: -- Programa executável

-- Zonas de dados e pilha

-- Zona para salvaguarda de estado do CPU (PC, SP, outros registadores)

-- Informação sobre canais abertos para

(30)

10/1/2009 FSO 30

Um Processo no SO

Ambiente de execução de um programa: -- Programa executável

-- Zonas de dados e pilha

-- Zona para salvaguarda de estado do CPU (PC, SP, outros registadores)

-- Informação sobre canais abertos para

ficheiros e outra informação de controlo Guardada em Descritores internos do SO

(31)

10/1/2009 FSO 31

Processo e sua memória

código do programa dados pilha núcl eo do SO descrição de um processo mapa de memória (tabela de páginas)

(32)

10/1/2009 FSO 32

Estados lógicos de um processo

pronto bloqueado executando criação terminação escalonado fim do time-slice I/O fim do I/O núcl eo do SO descrição de um processo estado do CPU

(33)

10/1/2009 FSO 33

Processo em memória

código do programa dados pilha núcl eo do SO descrição de um processo mapa de memória estado do CPU descritores de canais etc

(34)

10/1/2009 FSO 34

Ambiente de um processo Unix

Mapa de memória do processoInicialização -> main()

(35)
(36)

10/1/2009 FSO 37

Início de execução de um processo

Activar um programa C:

uma função de inicialização (no “start address” especificado pelo compilador) é activada:

(37)

10/1/2009 FSO 38

Início de execução de um processo

Activar um programa C:

uma função de inicialização (no “start address” especificado pelo compilador) é activada:

p.e. _start no C Run Time (crt)

obtém argumentos e vars. ambiente para o

(38)

10/1/2009 FSO 39

Início de execução de um processo

Activar um programa C:

uma função de inicialização (no “start address” especificado pelo compilador) é activada:

p.e. _start no C Run Time (crt)

obtém argumentos e vars. ambiente para o

mapa do processo, iniciando a pilha

e lança a função main():

(39)
(40)

10/1/2009 FSO 41

Terminação de um processo

Normal:

(41)

10/1/2009 FSO 42

Terminação de um processo

Normal:

-- retorno de main()

(42)

10/1/2009 FSO 43

Terminação de um processo

Normal:

-- retorno de main()

-- chamada exit(): acções de „fecho‟, …

-- chamada _exit(): retorno imediato ao SO )

(43)

10/1/2009 FSO 44

Terminação de um processo

Normal:

-- retorno de main()

-- chamada exit(): acções de „fecho‟, …

-- chamada _exit(): retorno imediato ao SO -- podem devolver o „exit status‟ do processoAnormal:

(44)

10/1/2009 FSO 45

Terminação de um processo

Normal:

-- retorno de main()

-- chamada exit(): acções de „fecho‟, …

-- chamada _exit(): retorno imediato ao SO -- podem devolver o „exit status‟ do processoAnormal:

(45)

10/1/2009 FSO 46

Terminação de um processo

Normal:

-- retorno de main()

-- chamada exit(): acções de „fecho‟, …

-- chamada _exit(): retorno imediato ao SO -- podem devolver o „exit status‟ do processoAnormal:

-- chamada de abort()

(46)

10/1/2009 FSO 47

Chamadas a biblioteca e

chamadas ao sistema

As chamadas ao sistema têm funções

correspondentes na biblioteca standard C

Muitas funções de biblioteca não chamam o sistema: operam em MODO UTILIZADOR!

As chamadas ao sistema operam em MODO

SUPERVISOR!Exemplo:

(47)
(48)

10/1/2009 FSO 49

Níveis de software

hardware Núcleo do SO bibliotecas API do SO programa

Visão de uma aplicação

Modo utilizador (executa num processo)

Modo supervisor

Chamada ao sistema

(49)

10/1/2009 FSO 50

Chamada ao sistema _exit

hardware rot-int… do_exit exit(…) _exit(…) int SYSCALL libc API do SO Programa C

Núcleo (kernel) No caso do linux/x86: EXIT_SCALL=1 SYSCALL=0x80 Código possível _exit: … mov eax,EXIT_SCALL

(50)

10/1/2009 FSO 51

Chamada ao sistema _exit

hardware rot-int… do_exit exit(…) _exit(…) int SYSCALL libc API do SO Programa C

Núcleo (kernel) No caso do linux/x86: EXIT_SCALL=1 SYSCALL=0x80

Código possível

_exit: …

mov eax,EXIT_SCALL mov ebx, [ebp+4]

void _exit(int status);

(51)

10/1/2009 FSO 52

Chamada ao sistema _exit

hardware rot-int… do_exit exit(…) _exit(…) int SYSCALL libc API do SO Programa C

Núcleo (kernel) No caso do linux/x86: EXIT_SCALL=1 SYSCALL=0x80

Código possível

_exit: …

mov eax,EXIT_SCALL mov ebx, [ebp+4]

int SYSCALL

(52)

10/1/2009 FSO 53

Chamadas ao sistema (I/O)

hardware

rot-int…

do_write

printf(…) write(…)

Exemplo de saída de dados

int SYSCALL

device drivers

libc

API do SO

Programa C

Núcleo (kernel) Buffer com os dados a escrever

(53)

10/1/2009 FSO 54

Principais características do UNIX

(54)

10/1/2009 FSO 55

Principais características do UNIX

Suporta múltiplos processosSuporta múltiplos utilizadores

(55)

10/1/2009 FSO 56

Principais características do UNIX

Suporta múltiplos processosSuporta múltiplos utilizadoresEscalonamento com time-slice

(56)

10/1/2009 FSO 57

Principais características do UNIX

Suporta múltiplos processosSuporta múltiplos utilizadoresEscalonamento com time-slice

Organiza o espaço nos discos num sistema de ficheiros hierárquico

(57)

10/1/2009 FSO 58

Principais características do UNIX

Suporta múltiplos processosSuporta múltiplos utilizadoresEscalonamento com time-slice

Organiza o espaço nos discos num sistema de ficheiros hierárquico

Possui mecanismos de permissões associados a processos e a ficheiros

(58)

10/1/2009 FSO 59

Classes de chamadas ao SO

(59)

10/1/2009 FSO 60

Classes de chamadas ao SO

Acesso a ficheiros e directoriasPedir e libertar memória

(60)

10/1/2009 FSO 61

Classes de chamadas ao SO

Acesso a ficheiros e directoriasPedir e libertar memória

(61)

10/1/2009 FSO 62

Classes de chamadas ao SO

Acesso a ficheiros e directoriasPedir e libertar memória

Pedir a execução de novos programasControlar a execução de programas

(62)

10/1/2009 FSO 63

Classes de chamadas ao SO

Acesso a ficheiros e directoriasPedir e libertar memória

Pedir a execução de novos programasControlar a execução de programas

Comunicação e sincronização de processos concorrentes

(63)

10/1/2009 FSO 64

Classes de chamadas ao SO

Acesso a ficheiros e directoriasPedir e libertar memória

Pedir a execução de novos programasControlar a execução de programas

Comunicação e sincronização de processos concorrentes

(64)

10/1/2009 FSO 65

O arranque do SO

Um pequeno programa para bootstrap

Responsável pelo carregamento para

memória e execução do núcleo do SO

(65)

10/1/2009 FSO 66

O arranque do SO

Um pequeno programa para bootstrap

Responsável pelo carregamento para

memória e execução do núcleo do SO

Depende de cada computador

Depois das inicializações o SO cria o primeiro processo (init)

(66)

10/1/2009 FSO 67

O arranque do SO

Um pequeno programa para bootstrap

Responsável pelo carregamento para

memória e execução do núcleo do SO

Depende de cada computador

Depois das inicializações o SO cria o primeiro processo (init)

O processo init dá início a uma cascata de criação de processos

(67)

10/1/2009 FSO 68

(68)

10/1/2009 FSO 69

Árvore de processos (exemplo)

Init

Spooler de impressão

Atendimento de logins por rede Login terminal 1

Shell para utilizador A

Comando 'ls' (exemplo de um sessão….)

(69)

10/1/2009 FSO 70

Utilizadores e permissões

Utilizadores: identificação, direitos ou permissões

O que pode ler, escrever, executar, que tempo de CPU, espaço em memória,

espaço em disco, etc…

Cada utilizador tem de identificar-se perante o SO: login

Cada processo recebe os direitos do utilizador que o criou

(70)

10/1/2009 FSO 71

Atributos de um processo

(71)

10/1/2009 FSO 72

Atributos de um processo

Identificador (process identifier)

Imagem do programa em memória

(72)

10/1/2009 FSO 73

Atributos de um processo

Identificador (process identifier)

Imagem do programa em memória

Código, dados e pilha (tabela de páginas)

Estado do CPU (quando não executa)

(73)

10/1/2009 FSO 74

Atributos de um processo

Identificador (process identifier)

Imagem do programa em memória

Código, dados e pilha (tabela de páginas)

Estado do CPU (quando não executa)

Conteúdo dos registos (PC, SP, …)

Estado do I/O

Canais de I/O (ficheiros abertos e buffers com os dados em trânsito)

(74)

10/1/2009 FSO 75

Atributos de um processo

Identificador (process identifier)

Imagem do programa em memória

Código, dados e pilha (tabela de páginas)

Estado do CPU (quando não executa)

Conteúdo dos registos (PC, SP, …)

Estado do I/O

Canais de I/O (ficheiros abertos e buffers com os dados em trânsito)

Identificador do utilizador e seus

(75)

10/1/2009 FSO 76

Mais atributos

Na realidade o processo tem um dono:

identificador do utilizador (uid) e grupo (gid)

as permissões estão associadas aos

(76)

10/1/2009 FSO 77

Mais atributos

Na realidade o processo tem um dono:

identificador do utilizador (uid) e grupo (gid)

as permissões estão associadas aos

recursos

(77)

10/1/2009 FSO 78

Mais atributos

Na realidade o processo tem um dono:

identificador do utilizador (uid) e grupo (gid)

as permissões estão associadas aos

recursos

Directoria corrente

"Atributos" extra: variáveis de ambiente

(78)

10/1/2009 FSO 79

Variáveis do ambiente

Definem um ambiente "livre" (pode conter qualquer coisa na forma nome=valor)

exemplos:

HOME – home directory (directoria ´´base´´ do utilizador)

PATH – lista de directorias (caminhos) onde procurar ficheiros executáveis

LANG – língua preferida pelo utilizador

São definidas:

automaticamente no login (HOME, USER, …)

ou definidas num ficheiro de inicializações

(79)

10/1/2009 FSO 81

(80)

10/1/2009 FSO 82

Exemplo de uso de processos

A nível do Shell no Unix:

(81)

10/1/2009 FSO 83

Exemplo de uso de processos

A nível do Shell no Unix:

-- ler e interpretar comandos do terminal -- criar um processo por cada comando

(82)

10/1/2009 FSO 84

Exemplo de uso de processos

A nível do Shell no Unix:

-- ler e interpretar comandos do terminal -- criar um processo por cada comando

-- destruir o processo no fim da execução de cada comando

(83)

10/1/2009 FSO 85

(84)

10/1/2009 FSO 86

Executar um programa 

Processo

Pedir a criação de um processo:

(85)

10/1/2009 FSO 87

Executar um programa 

Processo

Pedir a criação de um processo:

o SO verifica todas as permissões e…

(86)

10/1/2009 FSO 88

Executar um programa 

Processo

Pedir a criação de um processo:

o SO verifica todas as permissões e…

cria as estruturas para gerir o processo

inicia todos os seus atributos

inicia o mapa de memória com o programa (p. ex. a partir de um ficheiro executável)

(87)

10/1/2009 FSO 89

Executar um programa 

Processo

Pedir a criação de um processo:

o SO verifica todas as permissões e…

cria as estruturas para gerir o processo

inicia todos os seus atributos

inicia o mapa de memória com o programa (p. ex. a partir de um ficheiro executável)

inicia o CPU, transferindo o controlo para o processo criado (PC, SP,…)

(88)

10/1/2009 FSO 90

Executar um programa 

Processo

Pedir a criação de um processo:

o SO verifica todas as permissões e…

cria as estruturas para gerir o processo

inicia todos os seus atributos

inicia o mapa de memória com o programa (p. ex. a partir de um ficheiro executável)

inicia o CPU, transferindo o controlo para o processo criado (PC, SP,…)

Queremos algo como:

CriarProcesso( ficheiro,canais-iniciais,

(89)

10/1/2009 FSO 91

Criar processos

Exemplo MS-Windows (Win32):

BOOL CreateProcess( LPCSTR AppName,

LPTSTR CommLine, LPSECURITY_ATTRIBUTES ProcAttr, LPSECURITY_ATTRIBUTES ThAttr, BOOL InheritHandles, DWORD CreatFlags, LPVOID Environment, LPCSTR CurrDirectory, LPSTARTUPINFO StartupInf, LPPROCESS_INFORMATION ProcInfo )

(90)

10/1/2009 FSO 92

Criar processos

Exemplo MS-Windows (Win32):

BOOL CreateProcess( LPCSTR AppName,

LPTSTR CommLine, LPSECURITY_ATTRIBUTES ProcAttr, LPSECURITY_ATTRIBUTES ThAttr, BOOL InheritHandles, DWORD CreatFlags, LPVOID Environment, LPCSTR CurrDirectory, LPSTARTUPINFO StartupInf, LPPROCESS_INFORMATION ProcInfo )Abordagem UNIX:

int fork(void)

(91)

10/1/2009 FSO 93

Chamadas Unix para Processos

Fork: cria um duplicado exacto do processo original incluindo informação sobre canais abertos

(92)

10/1/2009 FSO 94

Chamadas Unix para Processos

Fork: cria um duplicado exacto do processo original incluindo informação sobre canais abertos

Exec: nova imagem executável para o

processo, a partir de um ficheiro executável -- um novo mapa de memória

(93)

10/1/2009 FSO 95

Chamadas Unix para Processos

Fork: cria um duplicado exacto do processo original incluindo informação sobre canais abertos

Exec: nova imagem executável para o

processo, a partir de um ficheiro executável -- um novo mapa de memória

Wait: permite a um processo aguardar pela terminação de um filho

(94)

10/1/2009 FSO 96

Chamadas Unix para Processos

Fork: cria um duplicado exacto do processo original incluindo informação sobre canais abertos

Exec: nova imagem executável para o

processo, a partir de um ficheiro executável -- um novo mapa de memória

Wait: permite a um processo aguardar pela terminação de um filho

(95)

10/1/2009 FSO 97

Chamadas Unix para Processos

Fork: cria um duplicado exacto do processo original incluindo informação sobre canais abertos

Exec: nova imagem executável para o

processo, a partir de um ficheiro executável -- um novo mapa de memória

Wait: permite a um processo aguardar pela terminação de um filho

Exit /_exit: termina o processo corrente

(96)

10/1/2009 FSO 98

(97)

10/1/2009 FSO 99

(98)

10/1/2009 FSO 100

Como é que o ´´clone´´ sabe que é um

(99)

10/1/2009 FSO 101

Como é que o ´´clone´´ sabe que é um

´´clone´´?

Como é que o ´´pai´´ sabe que é o processo original e não a cópia?

(100)

10/1/2009 FSO 102

Como é que o ´´clone´´ sabe que é um

´´clone´´?

Como é que o ´´pai´´ sabe que é o processo original e não a cópia?

Será necessário distinguir entre eles?

- em geral o pai é um supervisor ou gestor que coordena a criação de múltiplos

(101)

10/1/2009 FSO 103

Um novo processo: criar um ´´clone´´

(102)

10/1/2009 FSO 104

Um novo processo: criar um ´´clone´´

int fork(void)

cria um novo processo (filho) cópia exacta do original (pai)

incluindo programa, atributos e informação sobre canais abertos (o pid é diferente, claro!)

(103)

10/1/2009 FSO 105

Um novo processo: criar um ´´clone´´

int fork(void)

cria um novo processo (filho) cópia exacta do original (pai)

incluindo programa, atributos e informação sobre canais abertos (o pid é diferente, claro!)

(104)

10/1/2009 FSO 106

Um novo processo: criar um ´´clone´´

int fork(void)

cria um novo processo (filho) cópia exacta do original (pai)

incluindo programa, atributos e informação sobre canais abertos (o pid é diferente, claro!)

devolve o pid do filho ao pai (no retorno de fork)o filho, sendo uma cópia do pai, começa a

executar na instrução apontada pelo mesmo valor do PC do pai: instrução logo a seguir ao fork!

o SO devolve um resultado no retorno de fork,

(105)

10/1/2009 FSO 107

(106)
(107)

10/1/2009 FSO 109

pid = fork (); /* pid: resultado do fork*/

if (pid == 0)

-- código executado pelo filho

else if (pid > 0) /*pid = identifica o filho*/

-- código executado pelo pai

else /* pid < 0 */

(108)

10/1/2009 FSO 110

Exemplo:

pid = fork(); switch (pid) { case 0: printf("Filho: %d\n",getpid()); exit(0); case -1: perror("fork"); break; default:printf(“Criei %d\n", pid); }

(109)

10/1/2009 FSO 111

Exemplo (cont.)

Onde aparecem as mensagens?

Por que ordem? Quem executa primeiro?

Filho "herda" os canais de i/o!

descritores copiados,

logo apontam os mesmos canais

São dois processos concorrentes, o SO decide como os escalonar

podem executar em simultâneo, se existirem vários CPU!

Offset R Offset RW p1 p2 p3 Offset R Offset R p3 filho de p2 Tabela global de fich. abertos Offset R 1

(110)

10/1/2009 FSO 112

(111)
(112)
(113)

10/1/2009 FSO 115

sequência de passos no fork()

P1 (pid=343) fork() fork() 1 2 4 3 5 5 P2 (pid=682) Sistema de Operação 343 682

(114)

10/1/2009 FSO 116

Utilização do fork

Criar várias instâncias do mesmo programa

(115)

10/1/2009 FSO 117

Utilização do fork

Criar várias instâncias do mesmo programa

p. ex: lançar o login em vários terminais

Tirar partido da multiprogramação

p. ex: um programa inclui diversas acções

que podem ser executadas em concorrência

(116)

10/1/2009 FSO 118

Utilização do fork

Criar várias instâncias do mesmo programa

p. ex: lançar o login em vários terminais

Tirar partido da multiprogramação

p. ex: um programa inclui diversas acções

que podem ser executadas em concorrência

Combinar fork + exec para criar processos com novos programas

(antes do exec, o novo processo pode

(117)

10/1/2009 FSO 120

(118)

10/1/2009 FSO 121

Executar um programa: exec

Num processo existente:

Cria um novo mapa de memória para o processo (substitui o antigo mapa)

na prática, passa a executar um novo programa

O restantes atributos do processo mantêm-se:

atributos e canais de I/O (há excepções)

Exemplo:

(119)

10/1/2009 FSO 122

Mapa de memória virtual do processo

programa bibliotecas

dados não inicializados dados inicializados args. e var. ambiente

stack end. inferior end. superior obtido pelo SO do ficheiro executável iniciado pelo SO com base no pedido

de criação (bss) (text) (data) PC SP

(120)

10/1/2009 FSO 123

(121)

10/1/2009 FSO 124

(122)

10/1/2009 FSO 125

Chamadas de fork e exec

int fork(void); -- uma só função

exec: – uma família de funções que recorrem

a uma única chamada ao SO execve()

Só diferem no modo como especificam os argumentos e as variáveis de ambiente: execl: lista de argumentos

execv: vector de apontadores p/ argumentos

execp: variável PATH

(123)

10/1/2009 FSO 126

execve e Companhia

Funções de biblioteca:

execl(char *path, char *arg0, char *arg1,…)

execle(char *path, char *arg0, char *arg1,…,0,

char **envp)

execv(char *path, char **argv)

execlp(char *file, char *arg0, char *arg1,…)

execvp(char *file, char **argv)

as duas últimas usam as directorias indicadas em PATH (do ambiente corrente do processo) para procurar file

(124)

10/1/2009 FSO 127

execl: args como uma lista terminada por NULL

e um pathname para o executável

int execl (char *path,

char *arg1, ..., char *argn, (char *) 0);

execlp: só precisa do filename para o executável

int execlp (char *file,

char *arg1, ..., char *argn, (char *) 0);

(125)

10/1/2009 FSO 128

execv: um array de argumentos

e um pathname para o executável

int execv(char *path, char *argv[ ]);

execvp: só um filename para o executável

(126)

10/1/2009 FSO 129

main()

{ printf(´´executing ls\n´´);

execl(´´/bin/ls´´, ´´ls´´, ´´-l´´, (char `)0);

/*se retorna aqui: houve um erro*/ perror(´´execl failed to run ls´´): exit(1);

(127)

10/1/2009 FSO 130

main()

{ char *av[ ] = {´´ls´´, ´´- l´´, (char *)0);

ou av[0] = ´´ls´´ av[1] = ´´- l´´ av[2] = NULL

/* os argumentos num array de strings */

execv(´´/bin/ls´´, av);

/*se retorna aqui: houve um erro*/ perror(´´execv failed to run ls´´): exit(1);

(128)
(129)

10/1/2009 FSO 134

fork + exec*

pid = fork(); switch (pid) { case 0: execl("/bin/ls","ls","/bin",0); perror("ls"); exit(1); case -1: perror("fork"); break; default: printf("Criei o %d\n", pid); } p1 fork() printf(…) execl(…) p2 switch… switch… main(…) do "ls"

(130)

10/1/2009 FSO 135

sequência fork() + execve()

P1 (pid=343) fork() fork() 1 2 4 3 5 5 exec() P2 (pid=682) 8 6 7 9 10 execve() Sistema de Operação 343 682

(131)
(132)

10/1/2009 FSO 137

fork vs. execve

mantém os mesmos canais (mesmo processo!)

filho herda uma copia dos canais de i/O

o pid mantém-se (mesmo processo!)

pid filho diferente do do pai (processos diferentes!)

nunca retorna (só em caso de erro)

retorna pid do filho ao pai (filho recebe zero)

mapa de mem. substituído pelo novo programa

mapa mem. pai copiado para filho

(133)

10/1/2009 FSO 138

Wait e waipid

int wait(int *status);

Aguarda a terminação de um dos filhos

int waitpid(int pid, int *status, int options); Se pid == -1  waitpid é igual a wait

Se pid > 0  aguarda o filho indicado por pid Options: WNOHANG: (wait with no hang)

devolve 0 e retorna de imediato, se filho ainda não acabou

(134)

10/1/2009 FSO 139

Esperar pela terminação

int wait(int *status)

aguarda pela terminação de um dos filhos

status: código de terminação do processo: se terminou com _exit pode-se obter o exit status

fork()

wait(&status) execve(…)

main(…) _exit( 0 ) bl oq ue ad o WEXITSTATUS(status) == 0

(135)

10/1/2009 FSO 140

(136)

10/1/2009 FSO 141

wait: cenários possíveis

O pai e o filho: executados concorrentemente

em multiprogramação.

Cenários possíveis:

1. Pai chega primeiro à chamada de wait

fica bloqueado até o filho chamar _exit

2. Filho chama _exit antes do pai chamar wait

o filho fica ZOMBIE (defunct)

quando pai chamar wait, não bloqueia, e o resíduo do filho é eliminado.

3. Pai não chama wait e termina

(137)

10/1/2009 FSO 142

(138)

10/1/2009 FSO 143

(139)

10/1/2009 FSO 144

Exemplo com execl

pid = fork(); switch (pid) { case 0: chdir("/bin"); execl("/bin/ls","ls",0); printf(stderr,"erro no execl\n"); case -1: perror("fork"); break; default: printf("Criei o %d\n", pid); wait( &st ); if ( WIFEXIT(st) )

printf("exit status: %d\n", WEXITSTATUS(st) ); }

(140)

10/1/2009 FSO 145

Exemplo com execvp

pid = fork();

switch (pid) {

case 0:

{ char *av[3];

av[0]="ls"; av[1]="/bin"; av[2]=NULL; execvp( "ls", av ); perror( "exec ls" ); exit(1); } case -1: perror("fork"); break; default: wait( &st ); }

(141)

10/1/2009 FSO 146

(142)

10/1/2009 FSO 147

Um Shell simplificado

while (true) {

read_command(command, params); if (fork () > 0) -- cria

wait (&status); -- o pai espera

else -- o filho executa o comando

execv(command,params); }

cp file1 file2 na linha de comandos

Referências

Documentos relacionados

Na população estudada, distúrbios de vias aéreas e hábito de falar muito (fatores decorrentes de alterações relacionadas à saúde), presença de ruído ao telefone (fator

Para além deste componente mais prático, a formação académica do 6º ano do MIM incluiu ainda disciplinas de cariz teórico, nomeadamente, a Unidade Curricular de

Todas as outras estações registaram valores muito abaixo dos registados no Instituto Geofísico de Coimbra e de Paços de Ferreira e a totalidade dos registos

As questões acima foram a motivação para o desenvolvimento deste artigo, orientar o desenvol- vedor sobre o impacto que as cores podem causar no layout do aplicativo,

Os principais objectivos definidos foram a observação e realização dos procedimentos nas diferentes vertentes de atividade do cirurgião, aplicação correta da terminologia cirúrgica,

psicológicos, sociais e ambientais. Assim podemos observar que é de extrema importância a QV e a PS andarem juntas, pois não adianta ter uma meta de promoção de saúde se

Desta forma, é de grande importância a realização de testes verificando a segurança de extratos vegetais de plantas como Manjerona (Origanum majorana) e Romã

O fortalecimento da escola pública requer a criação de uma cultura de participação para todos os seus segmentos, e a melhoria das condições efetivas para