본문 바로가기
컴퓨터 기초/운영체제 이론

[실습과 그림으로 배우는 리눅스 구조] 3.프로세스 관리

by 인생여희 2020. 6. 6.

프로세스 생성 목적

리눅스에서는 두가지 목적으로 프로세스를 생성한다.

 

목적1. 같은 프로그램의 처리를 여러 개의 프로세스가 나눠서 처리한다. 예를 들어, 웹서버처럼 리퀘스트가 여러개 들어왔을 때 동시에 처리해야 하는 경우.

 

목적2. 전혀 다른 프로그램을 생성한다. 예) bash로 부터 각종 프로그램을 새로 생성하는 경우.

 

fork() 함수

같은 프로그램의 처리를 여러개의 프로세스가 나눠서 처리한다는 목적1에는 fork 함수만을 사용한다. fork 함수를 실행하면 실행한 프로세스와 함께 새로운 프로세스가 1개 생성된다. 

 

-순서

1.자식 프로세스용 메모리 영역을 작성하고, 거기에 부모 프로세스의 메모리를 복사한다.

2.fork()함수의 리턴값이 각기 다른 것을 이용하여 부모 프로세스와 자식 프로세스가 서로 다른 코드를 실행하도록 분기한다.

 

[코드]

[컴파일]

gcc -o fork fork.c

 

[실행]

./fork

 

[결과]

fork 함수를 리턴할때 부모 프로세스는 자식 프로세스의 프로세스 id, 자식 프로세스는 0을 리턴한다.

 

execve()함수

전혀 다른 프로그램을 생성할 때에는 execve() 함수를 사용한다. 커널이 각각의 프로세스를 실행하기 까지 흐름은 아래와 같다.

  1. 실행 파일을 읽은 다음 프로세스의 메모리 맵에 필요한 정보를 읽어 들인다.

  2. 현재 프로세스의 메모리를 새로운 프로세스의 데이터로 덮어 쓴다.

  3. 새로운 프로세스의 첫 번째 명령부터 실행한다.

즉, 전혀 다른 프로그램을 생성하는 경우, 프로세스의 수가 증가하는 것이 아니라, 기존의 프로세스를 별도의 프로세스로 변경하는 방식으로 수행된다.

 

구체적으로 보면 일단 실행 파일을 읽고 프로세스의 메모리 맵에 필요한 정보를 읽어들인다. 실행 파일은 프로세스의 실팽 중에 사용하는 코드와 데이터 외에도 아래와 같은 정보가 필요하다.

-코드를 포함한 데이터 영역의 파일상 오프셋, 사이즈, 메모리맵 시작주소.

-코드 외의 변수 등에서의 데이터 영역에 대한 같은 정보(오프셋, 사이즈, 메모리 맵 시작주소)

-최초로 실행할 명령의 메모리 주소

 

코드 영역과 데이터 영역의 ‘메모리 맵 시작 주소’가 필요한 이유는 cpu에서 실행되는 기계언어 명령은 고급언어로 쓰인 소스코드와는 다르게 특정 메모리 주소를 지정할 필요가 있기 때문이다.

 

c = a + b 코드를 기계언어로 바꾸면 다음과 같이 메모리 주소를 직접 조작하는 명령으로 변환(컴파일) 된다.

그후 엔트리 포인트에서부터 프로그램을 실행한다.