quinta-feira, 20 de setembro de 2012

Entendendo Processos do Unix com Programas em C – Parte 1


Este Post é em homenagem ao trabalho do meu colega de turma Joelson da Cunha Lucena,

Motivação
Estou estudando Sistemas Operacionais com base Unix e tenho feito alguns testes em C para comprovar os estudos. Creio que possa ser útil a publicação desses programinhas criados para compartilhar o conhecimento.
Processos em Sistemas Unix
Um processo é um programa em execução.
Vários conceitos permeiam o mundo dos processos, tais como a estrutura de um processo na memória, os possíveis estados de um processo, o bloco de controle de processo (PCB), como o sistema operacional trata os processos durante suas trocas de contexto, filas de escalonamento de processos, os escalonadores propriamente ditos, etc. (Talvez entremos mais a fundo em cada um desses conceitos mais pra frente)
Como o foco é ser prático, vamos a um exemplo de como podemos gerar um processo em Unix.
Mãos na Massa
Estando em algum sistema com base Unix (Linux, Mac OS, BSD, Hurd, etc), vamos criar um arquivo chamado loop.c no qual conterá nosso código de programa na linguagem C. O local de trabalho fica a seu critério, mas no exemplo vou usar o home do meu usuário.
Dentro do arquivo, criaremos o seguinte código na linguagem C:
#include
#include
int main() {
    while(1);
}
O programa começa com a declaração dos includes, que são as bibliotecas que  nos fornecem as funções usadas no nosso código. O ‘int main()’ é a declaração do método principal a ser executado naquele determinado arquivo/programa. Repare que seu conteúdo é apenas ‘while(1)’, o que provocará um loop infinito dentro do programa. Fizemos isso para que você possa ver o processo sendo executado no sistema operacional, então se tivéssemos colocado qualquer programação finda, não seria possível acompanharmos o importante passo que o exercício propõe, que é vermos o processo que criamos em execução.
Como os arquivos .c não podem ser executados diretamente, devemos compilar o arquivo para criarmos um executável. Para tal, posicionado no terminal na pasta onde consta o arquivo loop.c criado, digite o seguinte comando:
gcc -o loop loop.c
onde:
  • gcc -o – é o programa a ser chamado para que o sistema compile o arquivo
  • loop – é o nome do arquivo que será criado
  • loop.c – é o nome do nosso arquivo origem de código fonte.
Tendo criado o nosso arquivo executável, para chamá-lo, podemos digitar no terminal:
./loop&
onde:
  • ./ – é o indicador de que chamamos determinado arquivo à execução
  • loop – é o nome do arquivo executável que geramos e queremos executar
  • & – Serve para que o sistema rode esse programa em background. Se não tivéssemos especificado esse caracter, o terminal nos bloquearia naquela sessão até que finalizássemos o processo abruptamente.
Para vermos o nosso processo em execução, podemos digitar no terminal o comando: top
Ele te retornará uma lista de processos em execução, tal como isto:
 2160 joelson   20   0  4148  352  272 R  100  0.0   2:00.47 loop                                                                                                       
 1149 root      20   0  161m  24m  11m S    1  0.4   1:36.36 Xorg                                                                                                       
 1890 joelson   20   0 1107m 273m  36m S    1  4.7   4:26.13 firefox                                                                                                     1934 joelson   20   0  373m  37m  20m S    1  0.6   0:30.50 plugin-containe    
Repare que o nosso processo loop é logo o primeiro da minha fila!
Como o nosso processo é de loop infinito, ele nunca deixará de executar a não ser que o interrompemos.
Ainda na tela de visualização dos processos em execução, para que você finalize o processo loop, digite k
Ele aguardará uma entrada com o identificador do processo a ser finalizado. No meu caso, é 2160, então é o que eu digitarei e darei enter.
Após, ele pede um sinal de finalização. Digite 9 e dê enter novamente. Pronto, finalizamos o processo!
Para sair da visualização da lista de processos, digite: ctrl + c
Conclusão
Entender como funcionam os sistemas operacionais é muito interessante, mas vermos na prática seu funcionamento é muito melhor. Vimos como criamos e, de maneira limitada, que podemos manipular nossos processos e seus estados. Nos estudos que ainda serão postados, vamos nos aprofundando nas especificidades dos processos. Espero que seja de proveito de todos.

Nenhum comentário:

Postar um comentário