[OS] 프로세스의 연산

YongHo·2024년 4월 18일

저번에 저장장치에 있던 프로그램이 메모리에 적재되어 실행된 상태를 프로세스라 하였는데 그럼 그 자세한 내용을 이해해보려고 한다.

1. 프로세스의 구조

프로세스는 코드 영역, 데이터 영역, 스택 영역으로 구성되어 있다. 일단 쉽게 이해할 수 있도록 스파게티 요리 과정에 비유하여 살펴보겠다.

프로세스요리설명
코드 영역요리책스파게티를 만들기 위해선 레시피를 봐야한다.
레시피에 나와 있듯이 코드영역에는 프로세스의 본문이 기술되어 있음
데이터 영역재료요리를 완성하려면 재료가 있어햐 한다. 요리 재료는 프로세스의 데이터 영역에 해당된다.
스택 영역조리 도구조리하는 데 필요한 칼, 도마, 냄비 등의 도구는 스택 영역에 해당한다.
데이터 영역은 일반 데이터 영역과 힙 영역으로 나뉘는데 이건 나중에 다시 설명해보겠다!

예를 들어 워드프로세서 ㅍ로그램을 실행하면 이 프로그램은 코드 영역에 탑재되고, 편집 중인 문서는 데이터 영역에 편집된다. 또한 워드 작동을 위해 사용하는 각종 부가 데이터는 스택 영역에서 관리하게 된다.

코드 영역

  • 코드 영역은 프로그램의 본문이 기술된 곳으로 텍스트 영역이라고도 한다. 프로그래머가 작성한 프로그램은 코드 영역에 탑재되며 탑재된 코드는 읽기 전용으로 처리된다.

데이터 영역

  • 데이터 영역은 코드가 실행되면서 사용하는 변수나 파일 등의 각종 데이터를 모아놓은 곳이다. 물론 상수로 선언된 변수는 읽기 전용으로 코드 영역에 해당한다.

스택 영역

  • 스택 영역은 운영체제가 프로세스를 실행하기 위해 부수적으로 필요한 데이터를 모아놓은 곳이다. 스택 영역은 운영체제가 사용자의 프로세스를 작동하기 위해 유지하는 영역이므로 사용자에게는 보이지 않는다.



2. 프로세스 생성과 복사

프로세스는 프로그램을 실행할 때 새로 생성되는데, 이때 운영체제는 메모리로 가져와서 코드 영역에 넣고 PCB를 생성한다. 이렇게 되면 시간과 효율이 떨어지게 된다.
그래서 프로세스를 복사할 수가 있는데 fork()라는 함수에 대해 알아보겠다.

-fork()

실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수로 커널에서 제공한다.
예로 구글 크롬에서 웹 페이지를 보다가 ctrl + N키를 누르게 되면 크롬이 하나 더 실행되는데 이는 현재의 크롬 프로세스에서 복사를 한 것이다.
이처럼 기존 프로세스는 부모 프로세스가 되고 새로 생긴 프로세스는 자식 프로세스가 되어 부모-자식 관계로 연결되게 된다.

fork() 호출 후 PCB를 포함한 대부분이 자식 프로세스에 복사되어 똑같은 프로세스가 만들어지는데, 메모리 주소 프로세스 구분자(PID), 부모 프로세스 구분자(PPID), 자식 프로세스 구분자(CPID)가 바뀌게 된다.

fork() 시스템 호출의 장점

  • 프로세스 생성 속도가 빠르다
  • 추가 작업 없이 자원을 상속할 수 있다
  • 시스템 관리를 효율적으로 할 수 있다



3. 프로세스의 전환

복사를 할 수 있는 fork()함수가 있다면 복사된 함수를 새롭게 바꾸는 exec() 함수가 있다.
exec() 시스템 호출은 기존 프로세스를 새로운 프로세스로 전환하는 함수이다.
exec() 시스템 호출을 사용하는 목적은 프로세스의 구조를 재활용하기 위함이다.

exec()는 기존 프로세스 구조는 그대로 둔 채 내용만 바꾸어 새로 실행하는 것이므로, PCB영역은 그대로 냅두고 메모리 영역만 새롭게 바뀌게 된다.

4. 프로세스의 계층 구조

유닉스의 예를 통해 프로세스의 계층 구조에 대해 알아보겠다.

유닉스에서 커널이 처음 메모리에 올라와 부팅되면 커널 관련 프로세스를 여러 개 만드는데, 그 중 init 프로세스는 전체 프로세스의 출발점이 된다. init 프로세스를 사용하여 다음 나머지 프로세스를 init 프로세스의 자식 프로세스로 만들어 사용한다. 이때 사용되는 것이 fork()와 exec() 시스템 호출이다.

프로세스 계층 구조의 장점

  • 여러 작업의 동시 처리가 가능하다
    - 예를 들어 3명이 동시에 컴퓨터 접속해서 처리해야 하는데, login 프로세스는 1명만이 처리할 수 있다 치자. 이때 fork()를 사용하여 여러 개의 프로세스를 만들어주면 동시에 처리할 수가 있다.
  • 자원 회수가 용이하다
    - 계층 구조로 만들면 프로세스 간의 책임 관계가 분명해져 시스템 관리가 수월하다. 프로세스가 작업을 마쳐서 사용하던 자원을 회수 할 때 부모 프로세스가 회수하면 되기 때문에 간편하다.

0개의 댓글