Como o getpid funciona?

6

A chamada do sistema getpid retorna o ID do processo de chamada. Como o kernel descobre qual processo está invocando a chamada do sistema?

    
por saurav1405 30.08.2015 / 19:33

3 respostas

10

O kernel faz o agendamento de tarefas e fornece chamadas do sistema.

Quando um processo está rodando, o kernel programa seu tempo de execução - especialmente ele atribui um PID a ele - essa informação é armazenada dentro do espaço de endereço do kernel, em estruturas de dados (por exemplo, dentro de uma estrutura de tarefa).

Assim, quando um processo chama a chamada de sistema getpid() , o kernel tem apenas de procurar na estrutura da tarefa do processo de chamada (ou seja, atualmente em execução).

    
por 30.08.2015 / 21:35
7

Quando uma chamada de sistema é executada, há uma troca de privilégios, ou seja, o código executado tem permissão para executar mais instruções e acessar dados proibidos para o código da terra do usuário.

No entanto, não há nenhuma mudança no contexto do processo, portanto, o código do kernel ainda está sendo executado no contexto do processo de chamada. Isso significa que o kernel não precisa procurar qual processo está chamando, ele já sabe disso. O código de chamada do sistema getpid simplesmente recupera o ID do processo de um ponteiro para uma estrutura interna que contém suas próprias informações específicas de processo / thread. Essa estrutura depende da implementação do sistema operacional.

Por exemplo, com o Illumos (OpenSolaris), a estrutura é chamada proc: link

    
por 31.08.2015 / 00:58
4

Em um único sistema de CPU, existe uma variável global que aponta para a estrutura proc do processo em execução ou para o segmento atual. A estrutura proc contém o id do processo.

Em um sistema com várias CPUs, há um ponteiro semelhante para cada CPU ou o contexto da MMU é usado para configurar uma variável global para o syscall.

int64_t 
getpid(void) 
{ 
        rval_t  r; 
        proc_t  *p; 

        p = ttoproc(curthread); 
        r.r_val1 = p->p_pid; 

Neste exemplo, curthread é a variável global usada.

    
por 31.08.2015 / 00:39