[리눅스 시스템 원리와 실제] 13장 개념/연습문제

2021. 12. 2. 20:55·Major/Linux
728x90

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. 프로세스 종료 상태를 알린다.

 

 

 

728x90
저작자표시 비영리 (새창열림)

'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
'Major/Linux' 카테고리의 다른 글
  • [리눅스 시스템 원리와 실제] 6장 개념/연습문제
  • [리눅스 시스템 원리와 실제] 5장 개념/연습문제
  • [리눅스 시스템 원리와 실제] 4장 개념/연습문제
  • [리눅스 시스템 원리와 실제] 3장 개념/연습문제
BeNI
BeNI
코딩하는 블로그
  • BeNI
    코딩못하는컴공
    BeNI
  • 전체
    오늘
    어제
    • Menu (253)
      • My profile (1)
      • 회고 | 후기 (8)
      • Frontend (65)
        • Article (11)
        • Study (35)
        • 프로그래머스 FE 데브코스 (19)
      • Backend (0)
      • Algorithm (58)
        • Solution (46)
        • Study (12)
      • Major (111)
        • C&C++ (23)
        • Java (20)
        • Data Structure (14)
        • Computer Network (12)
        • Database (15)
        • Linux (6)
        • Architecture (3)
        • Lisp (15)
        • OS (1)
        • Security (2)
      • etc (2)
  • 링크

    • 깃허브
    • 방명록
  • 인기 글

  • 최근 댓글

  • 최근 글

  • 태그

    react
    lisp
    백준
    C++
    데브코스
    리팩토링
    프로그래머스
    자료구조
    파일처리
    Algorithm
  • hELLO· Designed By정상우.v4.10.2
BeNI
[리눅스 시스템 원리와 실제] 13장 개념/연습문제
상단으로

티스토리툴바