Unidade F - Gerenciamento do processador

Bloco descritor de processo

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.