Quando criamos um programa qualquer, precisamos ter diversas variáveis que serão utilizadas durante a execução do programa e que terão alguma função de controle, mensagem, acumulador ou o que for necessário. Por exemplo, no código em C abaixo, temos uma variável x, do tipo inteiro, que é usada para controlar um loop.
#include<stdio.h>
main(){
int x;
for(x=0;x<10;x++){
printf(" %d ",x);
}
}
O sistema operacional é um programa como outro qualquer, que executa um conjunto de tarefas específico; foi escrito em alguma linguagem de programação; foi compilado e é executado; e como qualquer outro programa, possui variáveis e estruturas de controle internas. Uma destas estruturas de controle é o descritor de processos – que é uma estrutura de dados (struct) para armazenar dados dos processos enquanto o SO estiver executando.
Os dados do processo que o descritor de processo armazena, variam conforme o sistema operacional – a grosso modo poderíamos citar:
No trecho de código abaixo, podemos verificar a criação de uma estrutura de controle de processos que poderia ser utilizada em um sistema operacional fictício. No caso, podemos ver a criação de uma struct chamada desc_proc, que possui diversos campos, cada um com uma função específica no controle dos processos.
Dentro da função main temos a inicialização de uma tabela de descritores – identificada como tab_desc, que definirá a quantidade máxima de processos que o sistema irá manipular simultaneamente. Também são inicializados as “filas” de descritores livres – identificada por desc_livre e fila de espera da CPU – identificada por espera_cpu. A lista de processos criados vais sendo armazenada na variável tab_desc, que vai “consumindo” espaços de desc_livre.
struc desc_proc{
char estado_atual;
int prioridade;
unsigned int inicio_memoria;
unsigned int tamanho_memoria;
struct arquivos_abertos[20];
unsigned int tempo_cpu;
unsigned int proc_pc;
unsigned int proc_sp;
unsigned int proc_acc;
unsigned int proc_rx
struct desc_proc *proximo;
};
int main(int argc, char *argv){
struct desc_proc tab_desc[MAX_DESC_PROC];
struct desc_proc *desc_livre;
struct desc_proc *espera_cpu;
for(i=0; i<MAX_DESC_PROC-1; ++i){
tab_desc[i].proximo = &tab_desc[i+1];}
tab_desc[i].proximo = NULL;
desc_livre = &tab_desc[0];
exit(0);
}
Esta estrutura de dados tem como função gerenciar e controlar toda a existência de um processo criado dentro de um determinado sistema operacional. Em outras palavras, é a variável que “guarda” todo contexto do processo enquanto este existir. A estrutura é muito importante porque é através desta que o sistema operacional pode ter o controle sobre a existência dos processos e principalmente viabilizar a multiprogramação.