[리눅스, 단부를 작성하는 과정을 구조 및 프로세스의 프로세스 절차로

이 문서의 내용

공정 1. 구조

프로세스의 프로세스로 2 프로그램

3. 생성 방법

프로세스의 끝에서 4

 

배경 :

1. 프로세스는 컴퓨터 프로그램 실행의 실체는

2. 공정은 용기의 스레드

진짜 실행중인 인스턴스 3. 프로그램 자체가 설명의 명령, 데이터 및 조직 형태이며, 프로세스는 프로그램입니다

4. 다수의 프로세스가 동일한 프로그램과 관련 될 수 있지만, 각 처리는 동기 또는 비동기 방식으로 독립적 인 동작에 근거

프로세스 구조 .Linux

리눅스 프로세스 구조는 세 부분으로 구성 코드 세그먼트, 데이터 세그먼트 및 스택 세그먼트

니펫 : 프로그램 코드를 저장하는 동일한 프로그램을 실행하는 여러 프로세스들이 같은 코드 세그먼트를 사용하는 경우

데이터 세그먼트 : 프로그램 글로벌 변수, 상수, 정적 변수

스택 세그먼트 : 함수 파라미터, 프로세스 제어 블록 PCB 내에 정의 된 로컬 변수 (프로세스의 하단 코어 스택)

추신:

1.PCB은 PCB 공정의 존재에 의해 인식 프로세스의 고유 식별 시스템에 존재한다

제작 과정 프로그램의 실행을 포함하여 스케줄링 및 PCB의 관리, PCB의 과정을 통해 2 시스템은 프로세스를 종료 등 처리 우선 순위를 변경할

PID 프로세스 식별 3. 처리 한 관계이며, 다수 - 대 - 파일 간의 관계!

 

II. 프로그램 프로세스 절차에

세대 리눅스 프로그램은 네 단계로 나누어 져 있습니다 : 사전 컴파일이 컴파일이, 조립, 링크를

PS : G ++ 컴파일러 프로그램이 여러 오브젝트 파일이 있거나 프로그램이 라이브러리 함수를 사용하는 경우, 컴파일러는 또한 원자바오 대상의 모든 연결해야 할 대상 파일에 세 단계로, 컴파일러, 어셈블러 소스 파일을 미리 컴파일 최대, 그리고 마지막으로 실행 프로그램을 형성

 

공정 단계에 프로그램 :

1) 커널 프로그램 코드 및 데이터를 프로그램 메모리 공간을 할당하는 메모리로 읽어

2) 커널 프로세스 할당 프로세스 식별자 PID 및 기타 리소스

3) PID 저장된 상태 정보에 대응하는 커널 프로세스 실행의 실행 큐에 프로세스는 프로그램 스케줄 스케줄러의 실행 후에 오퍼레이팅 시스템 프로세스로 전환시킬 수있다

III. 생성 과정

배경 :

운영 체제에 의해 생성, 부모 프로세스 만든이 : 두 가지 방법으로 프로세스를 만들기 1

시스템이 시작되면 운영 체제가 일부 프로세스를 생성합니다 2. 그들이 관리 및 작업에 시스템 자원의 할당을 부담, 이러한 프로세스는 종종 시스템 프로세스라고

3. 시스템은 프로세스 트리 구조를 형성하기 위해 자식 프로세스를 생성하는 과정을 수 있습니다

전체 리눅스 시스템의 4. 모든 프로세스는, 트리 구조입니다

시스템에 의해 만들어진 프로세스 0에 부가 5. 다른 프로세스 생성 부모 프로세스이다

 

함수 포크를 만드는 과정에서 :

 

된 pid_t 포크 (공극)

부모 프로세스의 경우 1. 포크 함수는 자식 프로세스의 PID를 반환

자식 프로세스 2., 포크 함수는 0을 반환

3. 오류를 생성하는 경우, 포크 함수가 반환 -1

기능 분석 : 포크 기능은 새로운 공정 및 PID 식별자 프로세스 커널에서 사용할 프로세스의 새로운 할당을 생성하고 데이터 및 부모 프로세스의 스택 세그먼트를 포함하는 아이의 부모 프로세스 커널 복사 공간 그리고 부모 프로세스 공유 코드 세그먼트, 이번에는 자녀와 부모 프로세스 정확히 같은!

질문 : 왜 다른 프로세스 (부모 프로세스의 자식 프로세스)에 대한 포크 함수가 리턴 그것의 값이 다를 것이다?

때문에 반환 값이 동일하지 않습니다 그래서 두 프로세스가, 부모와 자식 프로세스를 구별하기 위해, 포크 함수가 반환 그래서 두 번 돌아 기다리고, 포크 기능에 머물렀던 있도록 복제 프로세스의 스택 세그먼트의 복제,

 
포크 기능 예 :

 

코드를 복사
사용법 #include <iostream> 
#INCLUDE <pthread.h를> 
#INCLUDE <STDIO.H> 
#INCLUDE <stdlib.h> 
#INCLUDE < 문자열 .H> 
사용법 #include <unistd.h> 
#INCLUDE <errno.h> 
#INCLUDE < semaphore.h>
 사용하여  네임 스페이스 표준을;

int 형 ) (주
{
    된 pid_t는 PID;
    PID = 포크 ();
    만약 PID (< 0 )
    {
        COUT << " 포크 오류 " << ENDL;
        출구 ( - 1 ); // 비정상 종료 
    }
     다른  경우 (PID == 0 )
    {
        COUT << " 아들 공정 아들 " << GETPID () << " 부모 : " << getppid () << ENDL;
    }
    그밖에
    {
        COUT << " 부모 프로세스 부모 : " << GETPID () << " 아들 " << PID << ENDL;
        슬립 ( 2 );
    }
    반환  0 ;
}
코드를 복사

QQ는 20190716141340 스크린 샷

분석 : 현재 프로세스의 PID를 얻을 GETPID, 부모 프로세스의 현재 프로세스를 PID를 얻을 수 getppid, 위의 코드는 다른 포크 반환 값을 확인합니다

 

의 부모와 자식 프로세스가 공유 된 데이터와 스택 세그먼트 만 코드 세그먼트를 공유 확인하자

코드를 복사
사용법 #include <iostream> 
#INCLUDE <pthread.h를> 
#INCLUDE <STDIO.H> 
#INCLUDE <stdlib.h> 
#INCLUDE < 문자열 .H> 
사용법 #include <unistd.h> 
#INCLUDE <errno.h> 
#INCLUDE < semaphore.h>
 사용하여  네임 스페이스 표준을;

INT 데이터 X = 1 ;

int 형 ) (주
{
  된 pid_t는 PID;
  INT stack_x = 1 ;
  INT * 힙 = ( INT *) 의 malloc ( sizeof 연산자 ( INT ));
  * 힙 = 3 ;

  PID = 포크 ();

  만약 PID (< 0 )
  {
    COUT << " 포크 오류 " << ENDL;
    출구 ( - 1 );
  } 다른  경우 (PID == 0 )
  {
    데이터 X ++ ;
    stack_x ++ ;
    ( * 힙) ++ ;
    COUT << " 아들 데이터 X = " << 데이터 X << " , stack_x = " << stack_x << " 힙 = " << * 힙 << ENDL;
    출구 ( 0 );
  } 다른
  {
    슬립 ( 2 );
    COUT << " 부모 데이터 X = " << 데이터 X << " , stack_x = " << stack_x << " 힙 = " << * 힙 << ENDL;
  }
  반환  0 ;
}
코드를 복사

QQ는 20190716143450 스크린 샷

분석 : 우리는 발견 데이터 세그먼트, 스택, 두 프로세스가 동일하지 않은 부모를 증명하고 아이가 데이터 세그먼트와 스택 세그먼트를 공유하지 않는 데이터의 힙! , 서브 프로세스 데이터 세그먼트와 스택 세그먼트 내용 변경, 그리고 부모 프로세스에서 공유 코드 조각 목적으로 부모와 자식의 데이터에 영향을주지 않습니다 것은 저장 공간을 절약하는 것입니다

부모 프로세스 자식 프로세스의 복사본의 자원의 대부분, 작은 부분 만은 프로세스의 PID, 상위 프로세스 ID로 이러한 것들 때문에, 다른

 

정보 "기록 중 복사"개념 설명 :

이제 자식 프로세스 데이터 부모 프로세스의 스택 세그먼트를 생성 할 때 리눅스 커널이 종종 즉시 포크 기능의 실현에 복제되지 않지만, 자식 프로세스가이 데이터의 내용을 수정하는 경우 복사 작업이 발생, 커널은 자식 프로세스를 줄 것이다 할당 프로세스 공간, 부모 프로세스의 내용을 복사 한 다음 다시 계속 자신의 일부를 달성하기 위해이 사본은 작업 과정의 일부를 완료하는 것이 더 합리적이다! , 높은 효율

 

프로세스의 마지막 네 :

리눅스는 일반적으로 프로세스가 종료 및 비정상 프로세스 종료로 구분됩니다

방법 1) 일반 아웃 : 주요 기능 반환 0, 통화 종료 기능, 함수는 _exit를 호출

방법 2) 비정상 아웃 : 중단 함수 호출이 처리는 신호를 수신하고,이 신호는 종료 프로세스를 일으키는

가까운 파일 기술자에 사용되는 프로세스의 잠금 장치가 메모리 리소스를 점유 해제 : 물론, 상관없이 어떤 방법으로, 동일한 시스템은 결국 코드의 구현 될 것입니다

종료 함수가있는 동안 우리는 시스템 제어 시스템의 구현 후, 호출 함수에 반환 제어 후, 그 사이를 구별 할 필요가

 

우리가 지금 _exit 종료 기능을 살펴 보자 :

가까운 바닥에 _exit 함수는 종료 _exit 함수는 _exit 기능보다 더 많은 아무것도하지 않는 기능을 종료 래퍼 함수입니까?

_exit 함수는 아니지만 종료 기능은 잘못된 시간 사용 _exit 기능 할 수 없습니다 보증 데이터 무결성에서, [읽기 / 기록 캐시 IO 동작이 될 것입니다!

즉, 종료 기능은 프로세스의 종료 전에 케이스를 엽니 다 철저하게 파일을 확인됩니다 파일 버퍼의 내용은 다시 파일에 기록됩니다!

 

왜 _exit 함수 데이터가 일어날 것 불완전 전화한다? 우리는 기본 리눅스에 대한 세부 사항으로 이동

리눅스 표준 라이브러리 함수 메모리에 각 오픈 파일에 대응하는 버퍼를 갖는 것을 특징으로 공지 [IO 완충액 동작이 존재하고, 계속해서 파일이 여러 조각을 읽을 때마다 판독 이 직접 메모리로부터 다음 판독에서 판독 될 수 있도록 데이터를 축적하는 (가 그러한 충족 특정 조건으로서, 상기 메모리 버퍼에 기록 될 때마다 기록 파일 속도,이를 개선하기 위해 버퍼링 한 후 특정 문자 수), 다음 쓰기 - 일단 파일이 기술은 크게 파일의 속도를 증가 버퍼의 내용이 읽기 및 쓰기,하지만 또한 일부 데이터로, 프로그래밍 구덩이에 조금 추가, 이론적으로 작성해야 파일에 있지만, 사실은 특정 조건, 그것은 메모리 버퍼에 저장된 지식 _exit 함수를 직접 과정의 끝 경우 데이터 무결성을 보장 할 수 있도록, 버퍼 데이터가 손실 될 수있다 충족되지 않기 때문에 오히려 함수 _exit보다, 종료 기능을 사용하십시오

주소 재 인쇄 : https://www.cnblogs.com/yinbiao/p/11202089.html

게시 40 개 원래 기사 · 원 찬양 57 ·은 25 만 + 조회수

추천

출처blog.csdn.net/With__Sunshine/article/details/105341222