13 Chapter 프로세스 원리
1. 프로세스 이미지
1) 개념 : 텍스트(코드), 데이터, 힙, 스택 영역으로 구성된다.
ⓐ 텍스트(코드) : 프로세스가 실행하는 실행 코드를 저장하는 영역
ⓑ 데이터 : 프로그램 내에 선언된 전역 변수 및 정적 변수 등을 위한 영역
ⓒ 힙 : 동적메모리 할당을 위한 영역
ⓓ 스택 : 함수 호출을 구현하기 위한 실행시간 스택을 위한 영역
+ U-영역 : 프로세스의 내부 정보
$ size [실행파일]
실행파일의 각 영역의 크기를 알려준다.
2. 프로세스 ID
1) 쉘의 명령어 처리 과정
① 프롬프트를 내고 명령어를 입력받는다.
② 자식 프로세스를 생성한다
③ 자식 프로세스에게 명령어를 실행시킨다.
2) 프로세스 ID
int getpid();
프로세스의 id를 반환한다.
int getppid();
부모 프로세스의 id를 반환한다.
3. 프로세스 생성
1) 프로세스 생성: fork()
- 부모 프로세스를 복제하여 새로운 자식 프로세스를 생성
pid_t fork(void);
새로운 자식 프로세스를 생성한다.
자식 프로세스에게는 0을 반환, 부모프로세스에게는 자식프로세스의 id반환
- 두 개의 값을 반환하므로 pid=0일때 자식 프로세스를 위한 코드 부분을 만들 수 있다.
pid = fork();
if(pid == 0)
{ 자식 프로세스의 실행코드 }
else
{ 부모 프로세스의 실행코드 }
2) 프로세스 기다리기 : wait()
pid_t wait(int *status);
자식 프로세스 중의 하나가 종료될 때까지 기다린다.
자식 프로세스가 종료하면 종료코드가 *status에 저장된다.
종료된 자식 프로세스 id를 반환한다.
4. 프로그램 실행
1) 프로그램 실행의 원리
- fork() 후 자식프로세스는 부모 프로세스와 똑같은 코드 실행
- 다르게 하려면? exec() 시스템 호출 사용
2) exec() 시스템 호출
- 호출이 성공하면 리턴하지 않는다.
- 호출이 실패하면 -1을 리턴한다.
int execl(~) // 명령줄 인수를 하나씩나열, 마지막은 null
int execv(~) // 명령줄 인수를 argv[]형태로 만듬
int execlp(~) // 첫번째 인수가 경로명이 아닌 실행파일 이름
int execvp(~) // 첫번째 인수가 경로명이 아닌 실행파일 이름
3) 쉘의 명령어 처리 원리
- 보통 fork() 호출 후에 exec() 호출
- 새로 실행할 프로그램에 대한 정보를 arguments로 전달한다.
- exec() 호출이 성공하면 자식 프로세스는 새로운 프로그램을 실행하게 되고, 부모는 계속해서 다음 코드 실행
5. 프로그램 실행 과정
1) exec 시스템 호출
- c 시작 루틴에 명령줄 인수와 환경 변수를 전달하고 프로그램을 실행시킴
2) c 시작 루틴 : main함수를 호출하면서 명령줄 인수, 환경변수를 전달
- 실행이 끝나면 반환 값을 받아 exit 한다.
int main(int argc, char *argc[]);
argc : 명령줄 인수의 수
argc[] : 명령줄 인수 리스트를 나타내는 포인터 배열
6. 시스템 부팅
1) 시스템 부팅 과정
: 시스템 부팅은 fork/exec 시스템 호출을 통해 이루어진다.
swapper 만들고 fork/exec수행하여 init 생성함 fork/exec를 반복적으로 수행하며 getty 프로세스 생성
login -> shell 로 로그인된다.
2) 부팅 관련 프로세스
ⓐ swapper : 0번 프로세스, 커널 내부에서 최초로 만들어진 프로세스로 프로세스 스케줄링 담당
ⓑ init : 1번 프로세스, 시스템을 시작하고 초기화한다.
ⓒ 서비스 데몬 프로세스 : 부팅되는 컴퓨터에서 제공하는 서비스들을 위한 데몬 프로세스들이 생성
ⓓ getty : 가상 콘솔을 가능하게 해주는 프로세스
ⓔ login : /etc/passwd 파일을 참조하여 사용자의 로그인 id, pwd 검사한다
ⓕ shell 프로세스 : 시작파일을 실행한 후에 쉘 프롬프트를 내고 사용자로부터 명령어를 기다린다.
3) 프로세스 트리 출력
$ pstree
실행중인 프로세스들의 부모, 자식관계를 트리형태로 출력한다.
$ w
로그인한 사용자의 자세한 작업정보를 출력한다.
//연습문제
1. ② 지역변수는 스택영역에 저장된다
2. 텍스트, 데이터, 힙, 스택
3. 힙영역
4. pid, ppid, fork(), wait()
5. ②자식프로세스는 fork()시스템 호출 바로 다음 코드부터 실행함
6. ⑤ -1 반환
7.
8.
9. 7개
3갠줄알았는데 다 코드작성해서 컴파일 해보니까
한번 fork하면 1개 2번 fork하면 2개 2개 fork하면 4개가 생성됨 => 7개
10. 프로세스 종료 상태를 알린다.
'Major > Linux' 카테고리의 다른 글
[리눅스 시스템 원리와 실제] 6장 개념/연습문제 (1) | 2021.10.15 |
---|---|
[리눅스 시스템 원리와 실제] 5장 개념/연습문제 (4) | 2021.10.15 |
[리눅스 시스템 원리와 실제] 4장 개념/연습문제 (0) | 2021.10.14 |
[리눅스 시스템 원리와 실제] 3장 개념/연습문제 (0) | 2021.10.13 |
[리눅스 시스템 원리와 실제] 1장 개념/연습문제 (0) | 2021.10.09 |