프로세스의 연산

꿀떡냠·2024년 5월 15일
post-thumbnail

프로세스는 어떻게 생성되고 복사 되는 걸까?

프로세스의 구조

  • 코드 영역
    • 프로그램 본문이 기술된 곳으로 텍스트 영역이라고도 한다.
  • 데이터 영역
    • 코드가 실행되면서 사용하는 변수(variable)나 파일 등의 각종 데이터를 모아놓은 곳이다.
    • 데이터는 변하는 값이기 때문에 기본적으로 읽기와 쓰기가 가능하다.
    • 상수는 읽기 전용이다.
  • 스택 영역
    • 부수적으로 필요한 데이터를 모아놓은곳
    • 프로세스 내에서 함수를 호출하면 함수를 수행하고 원래 프로그램으로 되돌아올 위치를 이 영역에 저장한다.
    • 운영 체제가 사용자 프로세스를 작동하기 위해 유지하는 영역으로 사용자에게 보이지 않는다.

프로세스의 생성과 복사

사용자가 프로그램을 실행하면, 운영체제는 프로그램을 메모리로 가져와 코드 영역에 넣고 프로세스 제어 블록을 생성한다. 그리고 메모리에 데이터 영역과 스택영역을 확보한 후 프로세스를 실행한다.

fork() 시스템 호출의 개념

  • fork() 시스템 호출은 실행 중인 프로세스로 부터 새로운 프로세스를 복사하는 함수
  • 실행 중인 프로세스와 똑같은 프로세스가 하나 더 만들어 진다.
  • 기존 프로세스는 부모가 되고 새로 생긴 프로세스는 자식 프로세스가 되어, 두 프로세스는 부모-자식 관계로 연결된다.

fork() 시스템 호출의 동작 과정

  • 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어진다.
  • 프로세스 제어 블록 내용중 일부가 변경된다.
    • 프로세스 구분자(PID) : 각 프로세스의 구분자이므로 다른 PID를 갖게 된다.
    • 부모 프로세스와 자식 프로세스가 차지하는 메모리 위치가 다르므로 메모리 관련 정보가 변경된다.
    • 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)가 바뀐다.

fork() 시스템 호출의 장점

  • 프로세스의 생성 속도가 빠르다 : 하드디스크에서 프로그램을 가져오지 않않고 기존 메모리에서 복사하기 때문에 속도가 빠르다.
  • 추가 작업 없이 자원을 상속할 수 있다.
  • 시스템 관리를 효율적으로 할 수 있다. : 자식 프로세스 종료시 부모 프로세스가 자식이 사용하던 자원을 정리한다.

프로세스의 전환

  • 새로운 프로세스로 전환할때는 exec() 시스템 호출을 사용한다.
  • 프로세스의 구조를 재활용하기 위한 목적으로 exec() 시스템 호출을 사용한다.
  • 이미 만들어진 프로세스 제어블록, 메모리 영역, 부모-자식 관계를 그대로 사용할 수 있어 편리하다.

exec() 시스템 호출의 개념

  • fork() : 새로운 프로세스를 복사하는 시스템 호출
  • exec() : 프로세스는 그대로 둔 채 내용만 바꾸는 시스템 호출, 현재의 프로세스가 완전히 다른 프로세스로 전환

exec() 시스템 호출의 동작 과정

  • exec() 시스템 호출을 하면 코드 영역에 있는 기존 내용이 지워지고 새로운 코드로 바뀐다.
  • 데이터 영역이 새로운 변수로 채워지고, 스택 영역이 리셋 된다.
  • 프로세스 제어 블록
    - 재사용 : 프로세스 구분자, 부모 프로세스 구분자, 자식 프로세스 구분자, 메모리 관련 사항
    • 변경 : 프로그램 카운터 레지스터 값 등 각종 레지스터와 파일정보 리셋

프로세스 계층 구조의 장점

동시에 여러 작업을 처리하고 종료된 프로세스의 자원을 회수하는데 데 용이하다.

고아 프로세스와 좀비 프로세스

  • 고아 프로세스 : 자식 프로세스가 종료되기 전에 부모 프로세스가 먼제 종료되는 경우를 말한다.
    - 좀비 프로세스 : 자식 프로세스가 종료되었는데 부모 프로세스가 자원회수를 하지 않는 경우를 말한다.
  • 고아 프로세스와 좀비 프로세스가 많아지면 결국 자원이 낭비 되기 때문에 효율적인 운영에 방해된다. 따라서 운영체제는 주기적으로 반환되지 못한 자원을 회수해야한다.
profile
백엔드 개발자로 살아남기

0개의 댓글