Anúncios

Processos e threads

Nos anos 80 era comum o fato de uma aplicação conter um único processo que executasse um único fluxo de execução. Aplicativos mais complexos, que continham concorrência entre atividades internas, exigiam uma mudança neste comportamento e foram base para uma revolução no modo como os sistemas operacionais funcionavam.

Nesta época percebeu-se que era preciso aprimorar o funcionamento dos processos para que eles fossem associados a múltiplas atividades concorrentes.

Hoje os processos consistem de um ambiente de execução que gerencia diferentes recursos. Dentre estes recursos encontramos as threads, que correspondem a uma abstração do sistema operacional para uma atividade a ser executada.

Processo

Os processos são containers de recursos utilizados para execução da instância de um programa. Os processos contém um ambiente de execução que fornece proteção contra as threads que estão fora dele, para que assim os recursos nele contidos sejam inacessíveis às threads existentes em outros processos*.

O ambiente de execução de um processo envolve o controle de diferentes recursos, tais como:

– Programa executável: um processo sempre está vinculado a um programa. Um programa corresponde a uma sequência estática de instruções.

– Threads: um processo precisa de ao menos uma thread para execução de suas atividades.

– Espaço de endereçamento virtual: o espaço de endereçamento virtual de um processo é uma unidade de gerenciamento de memória virtual. Esta unidade consiste de uma ou mais regiões de endereços de memória virtual. Como estas regiões não estão em sequência, é possível que sejam separadas por áreas não acessíveis de memória virtual utilizadas por outros processos. Uma região corresponde a uma área contínua de memória que é acessível às threads do processo que a possui.

– Access Token: contexto de segurança do processo. O Access Token contém a identificação de segurança e as credenciais de um processo.

– Process ID: identificador único de um processo.

– Handles: lista de recursos do sistema operacional consumidos pelo processo, tais como: semáforos, portas de comunicação, arquivos, etc.

* Este comportamento é variante entre processos dado os seus recursos compartilhados. Os processos podem fugir à regra e compartilhar recursos (tais como memória) entre processos existentes no mesmo computador.

Thread

Threads podem ser criadas e destruídas dinamicamente. Seu principal objetivo é maximizar o poder de execução concorrente entre operações, isto é, fortalecer o poder de execução de tarefas simultâneas.

Dentro de um processo a thread corresponde a uma entidade coordenada pelo Windows para execução de uma atividade. Toda thread compartilha do mesmo espaço de endereçamento virtual de seu processo. Isto significa que toda thread em um processo possui todos os direitos de escrita e leitura do espaço de endereçamento virtual de seu respectivo processo. Threads não podem acidentalmente referenciar o espaço de endereçamento virtual de outro processo, entretanto, um processo pode tornar disponível parte de seus endereços privados como uma seção compartilhada de memória. De forma adicional, um processo tem o direito de abrir para outro processo o uso de funções compartilhadas de memória.

As threads, assim como os processos, também possuem um identificador global, este identificador é chamado de “Thread ID”.

Todos os recursos do ambiente de execução de um processo podem ser acessados utilizando o Microsoft .NET Framework. A seguir é apresentado um bloco de código C# que faz acesso a estes recursos.

using System.Diagnostics;

class Program {
    static void Main(string[] args) {

        Process targetProcess = Process.GetCurrentProcess();

        // Unique identifier for the process
        int processId = targetProcess.Id;

        // Path to program
        string programPath = targetProcess.Modules[0].FileName;

        // Gets the amount of the virtual memory allocated for the associated process
        long virtualMemory = targetProcess.VirtualMemorySize64;

        // Gets the amount of physical memory allocated for the associated process.
        long physicalMemory = targetProcess.WorkingSet64;

        // Gets the amount of private memory allocated for the associated process.
        long privateMemory = targetProcess.PrivateMemorySize64;

        // Number of handles opened by the process
        int handles = targetProcess.HandleCount;

        // Return all threads in process
        ProcessThreadCollection threads = targetProcess.Threads;

        foreach (ProcessThread iThread in threads) {

            int threadId = iThread.Id;
        }
    }
}

Referência

Windows Internals – Part 1. 6ª Edição – Microsoft Press – Russinovich, M.; Solomon, D. e Ionescu, A.

Sistemas distribuídos – Conceitos e projeto. 4ª Edição – Bookman – Coulouris, G., Dollimore J. e Kindberg T.

Anúncios

One Response to Processos e threads

  1. Jordan Pedro says:

    Excelente

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: