[OS] 프로세스의 생성과 종료

2020. 4. 19. 16:47Programming/CS

 

프로세스 생성과 종료

프로세스 생성

  • 프로세스는 프로세스에 의해 만들어진다.

    컴퓨터에서 실제 프로세스 생성과정을 보자.

    1. BOOTING : OS가 RAM 에 resident
    2. OS가 가장 먼저 첫 process를 만든다. (ex. Linux: init)
    3. init 프로세스가 여러개의 프로세스들을 만든다.
    4. 그 만들어진 프로세스들은 또 자식프로세스들을 생성...

    이렇게 process Tree 를 만들고, parent process, child process, sibling process(부모같음)의 개념을 똑같이 사용한다.

  • PID(Process Identifier) : 프로세스의 각 id가 존재한다. 절대 중복되지 않음! (PPID(부모의 PID)개념도 존재)

  • 프로세스 생성(system call)

    • fork(): 부모 프로세스 복사하여 새로운 프로세스 만듬.
      • 추가 작업 없이 자원을 상속할 수 있다. 따로 초기화 작업을 또 거칠 필요 없이, 그대로 '복사'해서 쓰기만 하면 된다
    • exec() : 실행파일(만들어진 프로세스)을 메모리로 가져오기
      • PID, CID, PPID를 그대로 복사하고, 코드영역/데이터 영역만 변경하므로 garbage collection관리에도 용이하다 (상위 프로세스, 자식프로세스가 다 끝났는지 트래킹 등 하나하나 찾아다닐 필요 없음)
      • 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출. 이미 만들어진 프로세스의 구조를 재활용하는 것!
      • 코드영역 - 새로운 코드, 데이터 영역 - 새로운 변수로 채워짐, 스택 영역 - PPID, PID, CID, 메모리 관련사항은 변하지 않고 PC, reg등의 값이 리셋됨. 마치 프로세스를 처음 시작하는 것 처럼 정리된다!
      • 사실 이 exec() 호출은 자식프로세스와의 동기화를 위한 wait()코드와 같이 사용된다. 자식을 exec()으로 호출하고, 부모를 wait()하게 하고, 자식이 끝나면 부모가 다시 실행되는 형식.
      • 이 명령어를 통해 프로세스간의 switching, context switching이 이루어진다.
    • exit() : 해당 프로세스가 가졌던 모든 자원은 OS에게 반환
      • 자식 프로세스가 정상 종료하지 않았을 경우 부모 프로세스에게 종료를 알려주지 못하므로 garbage collection이 제대로 이루어지지않는다. 그렇게 컴퓨터에 쌓인 쓰레기 파일들이 메모리에 늘어나다보면, 느려지는 것이다. 그래서 재부팅 시에 이 모든 garbage 를 정리한다.
      • 그래서 최대한 정상 종료하는것이 중요한데, 그것이 바로 exit(), return ;이다.
      • 그리고 특히나 객체지향 프로그래밍 언어에서 모든 객체의 최상위에는 Object라는 클래스가 있는데, 모~든 객체는 Object 객체의 자식이 된다. (자바스크립트의 Object 를 생각하면 이해가 쉽다 )

 

조금 더, 프로세스의 동적할당/정적할당에 대해 짚고 넘어가자.

프로세스는 코드영역, 데이터 영역, 힙 영역, 스택 영역으로 구성되어있다.

프로세스의 상세 구조. 이미지 출처: https://t1.daumcdn.net/cfile/tistory/992954485BB45A2E19

 

 

  • 정적할당 영역 : 컴파일시 크기 결정.
    • 코드 영역 : 실제 컴파일 될 코드
    • 데이터 영역 : 작성된 코드에 있는 variable, const ... 등
  • 동적할당 영역 : 런타임 시 크기 결정
    • 힙 영역 : malloc()등의 메모리 할당
    • 스택 영역 : 함수간의 call function(return + value 전달), scope(local Variable, global variable,,)을 구현하고 관리하는데 사용한다. 사실상 스택은 Thread가 작동하는 동안 추가/삭제되는 동적 할당 영역이다.

 

다음 포스팅에서는 본격적으로 쓰레드, 프로세스 동기화에 관해 공부한다.