[Linux] estruturar o processo, criar, final, e procedimentos para a utilização do processo de

Neste artigo:

1. Estrutura do processo

2. programa em um processo de processo

3. O processo de criação

4. No final do processo

 

Antecedentes:

1. O processo é a entidade no programa de computador em execução

2. O processo é a rosca do recipiente

A instância verdadeira corrida 3. O programa em si é única instrução, dados e formas organizacionais de descrição, o processo é o programa

4. Vários processos podem ser associados com o mesmo programa, mas cada processo baseia-se na operação independente maneira síncrona ou assíncrona

Uma estrutura processo .Linux

estrutura processo Linux consiste em três partes: um segmento de código, segmento de dados e segmento de pilha

Trecho : armazenar código de programa se vários processos em execução o mesmo programa que eles usam o mesmo segmento de código

segmentos de dados : variáveis globais do programa, constantes, variáveis estáticas

segmento Pilha : parâmetros da função, as variáveis locais definidas no PCB bloco de controlo de processo (pilha de núcleo na parte inferior do processo)

ps:

1.pcb é que existe num sistema de identificação único processo percebida pela presença de processo PCB

2. Sistema através do processo de agendamento e gerenciamento de PCB, PCB, incluindo o processo de criação, a implementação do programa, sair do processo e alterar a prioridade do processo etc.

3. Processo com identificador de processo PID é 1-1 relacionamento, e a relação entre um arquivo de muitos-para-!

 

II. Programa para um procedimento do processo

programa de geração de Linux é dividido em quatro fases: pré-compilação, compilação, montagem, ligação

ps: compilador G ++ pré-compilado, o compilador, arquivos de origem assembler em três etapas para o arquivo de destino, se o programa tiver vários arquivos objeto ou programas usam as funções de biblioteca, o compilador também terá de ligar todos o alvo wen -se e, finalmente, formar um programa executável

 

Programa em etapas do processo:

1) O código do programa kernel e os dados são lidos para a memória, alocar espaço de memória para o programa

2) Identificador do processo de alocação de processo kernel do PID e outros recursos

3) e o processo do kernel correspondente informações de estado PID armazenado, o processo para a fila de execução para a execução, o programa pode ser convertido para o processo do sistema operacional após a execução das programações do programador

III. Processos de Criação

Antecedentes:

1. Criar um processo de duas maneiras: criado pelo sistema operacional, criado pelo processo pai

2. Quando o sistema é iniciado, o sistema operacional irá criar algum processo, eles suportar a gestão e atribuição de recursos do sistema para as tarefas, esses processos muitas vezes chamado de processo do sistema

3. O sistema permite um processo para criar um processo filho para formar uma estrutura de árvore processo

4. Todos os processos de todo o sistema Linux é uma estrutura de árvore,

5. Além 0 processo é criado pelo sistema, outros processos são, pela sua processo pai criado

 

No processo de criação de um garfo função:

 

fork pid_t (void)

1. Para o processo pai, forquilha função retorna o PID processo filho

2. Para um processo filho, forquilha função retorna 0

3. Se você criar um erro, forquilha função retorna -1

Análise de função: função fork cria um novo processo e uma nova alocação de processo disponível a partir do kernel para processo identificador PID, em seguida, o processo pai cópia espaço kernel para a criança, incluindo dados e segmentos de pilha do processo pai, e os segmentos de código share processo pai, desta vez a criança eo processo pai exatamente o mesmo!

Pergunta: Por que para diferentes processos (o processo pai, o processo filho), função fork retorna o valor que vai ser diferente?

Uma vez que a replicação do segmento de pilha no processo de replicação, de modo que os dois processos de ter ficado na função de garfo, esperando para retornar, de modo que a função forquilha retornos duas vezes, a fim de diferenciar entre os processos pai e filho, de modo que o valor de retorno não é a mesma

 
função forquilha Exemplo:

 

Copie o código
#include <iostream> 
#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include < string de .h> 
#include <unistd.h> 
#include <errno.h> 
#include < semaphore.h>
 usando  namespace std; 

int main () 
{ 
    pid_t pid; 
    pid = forquilha ();
    se (pid < 0 ) 
    { 
        cout << " erro fork " << endl;// saída anormal 
    }
     else  se (pid == 0 ) 
    { 
        cout << " processo filho, filho: " << getpid () << "parent: " << getppid () << endl; 
    } Else 
    { 
        cout << " processo pai, pai: " << getpid () << " filho: " << pid << endl; 
        sono ( 2 ); 
    } Retornar 0 ; 
}
    
     
Copie o código

QQ imagem de tela 20190716141340

Análise: getpid obter o pid do processo atual, getppid para obter pid o processo atual do processo pai, o código acima para verificar o valor garfo retorno diferente

 

Vamos verificar um pai e filho processos compartilham o segmento de código só, sem dados compartilhados e segmentos de pilha

Copie o código
#include <iostream> 
#include <pthread.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include < string de .h> 
#include <unistd.h> 
#include <errno.h> 
#include < semaphore.h>
 usando  namespace std; 

int dados_x = 1 ; 

int main () 
{ 
  pid_t pid; 
  int stack_x = 1 ;
  int * montão = ( int *) malloc ( sizeof ( int ));
  * montão = 3; 

  pid = forquilha (); 

  se (pid < 0 ) 
  { 
    cout << " erro fork " << endl; 
    saída ( - 1 ); 
  } Else  se (pid == 0 ) 
  { 
    dados_x ++ ; 
    stack_x ++ ; 
    ( * Montão) ++ ; 
    cout << " filho, dados_x = " << dados_x << "stack_x = " << stack_x << " ,<< * pilha << endl; 
    saída ( 0 ); 
  } Else 
  { 
    sono ( 2 ); 
    cout << " pai, dados_x = " << dados_x << "stack_x = " << stack_x << "montão = " << * pilha << endl; 
  } 
  Retornar  0 ; 
}
Copie o código

QQ imagem de tela 20190716143450

Análise: Descobrimos que o segmento de dados, pilha, montão de dados que os dois processos não são o mesmo, para provar o pai ea criança não compartilham o segmento de dados e segmento de pilha! , O segmento de dados sub-processos e segmento de pilha alterações de conteúdo, e não afetará os dados no processo pai, o pai ea criança para fins código de compartilhar trechos é para economizar espaço de armazenamento

A maior parte dos recursos da cópia processo filho do processo pai, apenas uma pequena parte é diferente, como pid, ID do processo pai do processo e assim estas coisas

 

Sobre "copy-on-write" conceito Descrição:

Agora Linux kernel é muitas vezes não imediatamente replicadas na realização da função fork ao criar os dados do processo da criança e segmentos de pilha do processo pai, mas a operação de cópia irá ocorrer quando o processo filho para modificar o teor desses dados, o kernel dará o processo filho alocação de espaço de processo, o conteúdo do processo pai copiado, e depois continuar para trás, esta cópia a fim de alcançar alguns dos seus próprios para completar alguns do processo de trabalho é mais razoável! , Maior eficiência

 

Quatro do final do processo:

Linux é dividido no processo será encerrado normalmente e de saída do processo anormal

1) a normal do caminho: principal função de retorno 0, função de saída chamada, a função chama _exit

2) para fora anormal da maneira: chamada função de interrupção, o processo de receber um sinal e o sinal faz com que o processo para encerrar

Claro, não importa o caminho, o mesmo sistema acabará por ser a implementação de um código: o processo usado para fechar descritores de arquivos abertos, liberar seu bloqueio ocupada recursos de memória

Precisamos distinguir entre que, após o controle de retorno para a função de chamada, enquanto a saída é uma função, após a implementação de sistemas de controle para o sistema

 

Vamos agora olhar para funções _exit e saída:

função _exit mais perto do fundo, função de saída _exit é uma função wrapper, em seguida, sair da função de fazer nada mais do que a função _exit?

função de saída será [IO leitura / cache escrito] operação, enquanto a função _exit não é, no momento função uso _exit errado não pode garantir a integridade dos dados!

Em outras palavras, a função de saída abre o caso antes do final do processo será verificado o arquivo, o conteúdo do buffer de arquivo é escrito de volta para o arquivo!

 

Por que é chamar dados função _exit está incompleta vai acontecer? Nós entrar em detalhes sobre o Linux subjacente

Na função de biblioteca padrão Linux, existe uma operação conhecida [IO] tampão, caracterizado pelo facto de que corresponde a cada ficheiro aberto, na memória tem um tampão, ler continuamente a cada vez que um ficheiro é lido várias peças após os dados de modo que possa ser lido na próxima leitura diretamente da memória tampão para melhorar a velocidade, a mesma, cada arquivos de gravação quando só é escrito para o buffer de memória, como sejam cumpridas certas condições (para acumular um certo número de caracteres), então o conteúdo do buffer write-once arquivo, esta tecnologia tem aumentado significativamente a velocidade de arquivo ler e escrever, mas também adicionar um pouco para os poços de programação, tais como alguns dados, em teoria, deve escrever no arquivo, mas, na verdade, porque não forem cumpridas certas condições, é de conhecimento armazenado no buffer de memória, se a função _exit acabar diretamente do processo, os dados do buffer serão perdidos, assim que você quer para garantir a integridade dos dados , certifique-se de usar a função de saída, em vez de um _exit função

Endereço reimpressão: https://www.cnblogs.com/yinbiao/p/11202089.html

Publicado 40 artigos originais · ganhou elogios 57 · Exibições 250.000 +

Acho que você gosta

Origin blog.csdn.net/With__Sunshine/article/details/105341222
Recomendado
Clasificación