컴퓨터구조와 운영체제

18. 프로세스 개요

waterclean101 2023. 11. 21. 09:31

프로세스 개요

프로세스 개요

  • 프로그램은 실행되기 전까지는 보조 기억 장치에 있는 데이터 덩어리일 뿐이지만 이 보조 기억 장치에 저장된 프로그램을 메모리에 적재하고 실행하는 순간에 그 프로그램은 프로세스가 된다.
  • 이런 과정을 ‘프로세스를 생성한다.’고 표현.
  • 프로세스의 종류: 크게 두 가지. 포그라운드 프로세스와 백그라운드 프로세스
  • 포그라운드 프로세스 (foreground process): 사용자가 볼 수 있는 공간에서 실행되는 프로세스로 메모장, 워드 프로세서 등
  • 백그라운드 프로세스 (background process): 사용자가 볼 수 없던 공간에서 실행되는 프로세스로 사용자와 직접 상호작용이 가능한 백그라운드 프로세스와 사용자와 상호작용하지 않고 그저 정해진 일만 수행하는 프로세스로 나뉜다(데몬(daemon) 혹은 서비스(service)).

 

프로세스 제어 블록

모든 프로세스는 실행되기 위해서 CPU를 필요로 한다. 하지만 CPU의 자원은 한정되어 있다. 따라서 프로세스들은 돌아가면서 자신에게 할당된 시간만큼만 CPU를 이용하고 자기 차례가 끝났다면 다음 프로세스한테 CPU의 차례를 양보하게 된다.

  • 타이머 인터럽트: 타이머 인터럽트는 시간 끝났다는 것을 알려주는 특별한 인터럽트로 클럭 신호를 발생시키는 장치에 의해서 주기적으로 발생하는 하드웨어 인터럽트의 한 종류다.

프로세스 제어블록(PCB; Process Control Block)

  • 운영 체제는 빠르게 번갈아가며 수행되는 프로세스들을 관리를 해줘야 하고, 이를 위해 사용하는 자료 구조를 **프로세스 제어블록(PCB)**이라고 한다.
  • 프로세스 관련 정보를 관련 정보를 저장하는 자료 구조다. 상품에 달린 태그와 같은 정보로 프로세스 생성 시 커널 영역에 생성되고 종료될 때 폐기된다.
  • PCB에 담긴 정보들은 정보들은 프로세스의 생성, 실행, 중지 및 종료 시 효율적으로 관리되기 위해 필요하다.

 

PCB에 담기는 대표적인 정보(커널 영역에 담기는 정보)

  • 프로세스 ID(PID): 특정 프로세스를 식별하기 위해 부여하는 고유한 번호로 운영 체제는 이 번호를 사용하여 프로세스를 구별하고 관리한다.
  • 레지스터 값: 프로세스의 현재 상태를 나타내는 레지스터의 값이다. 프로그램 카운터, 스택 포인터 등이 포함되며, 프로세스가 중단될 때 현재 상태를 저장하고 재개될 때 이를 복원하는 데 사용된다.
  • 프로세스 상태: 프로세스의 현재 상태를 나타내며 프로세스가 CPU를 기다리는 상태, 실행 중인 상태, 입출력 작업을 위해 대기하는 상태 등 여러 가지가 있다.
  • CPU 스케줄링 정보: 프로세스가 언제 그리고 어떤 순서로 CPU를 할당받을지에 대한 정보로, 이 정보는 프로세스 스케줄링 알고리즘에 의해 사용된다.
  • 메모리 정보: 프로세스가 메모리의 어느 부분을 사용하고 있는지에 대한 정보다. 이는 주소 공간, 페이지 테이블 정보 등을 포함할 수 있다.
  • 사용한 파일과 입출력장치 정보: 프로세스에 할당된 입출력 장치와 사용 중인 파일에 대한 정보다. 이는 프로세스가 작업 중인 파일과 입출력 장치를 관리하는 데 사용된다.

 

문맥 교환 (context switch)

문맥 교환(Context Switching)은 운영 체제에서 매우 중요한 개념으로, 멀티태스킹 환경에서 CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 과정이다. 이 과정은 운영 체제의 스케줄러에 의해 관리되며, 컴퓨터 시스템의 효율성과 반응 시간에 큰 영향을 미친다.

한 프로세스에서 다른 프로세스로 실행 순서가 넘어가면 기존에 실행되던 프로세스 A는 지금까지의 중간 정보를 백업한다. 프로그램 카운터 등 각종 레지스터 값, 메모리 정보, 열었던 파일, 사용한 입출력 장치 등 이러한 중간 정보를 **문맥 (context)**이라고 한다.

문맥(context)

  • 다음 차례가 왔을 때 실행을 재개하기 위한 정보
  • 실행 문맥을 백업해두면 언제든 해당 프로세스의 실행을 재개할 수 있다.
  • 뒤이어 실행할 프로세스의 문맥을 복구한다.
  • 기존의 실행 중인 프로세스 문맥을 백업하고 새로운 프로세스 실행을 위해 문맥을 복구하는 과정을 **문맥 교환 (context switch)**이라 한다.

 

프로세스의 메모리 영역(사용자 영역에 담기는 정보)

크게 코드 영역 (텍스트 영역), 데이터 영역, 힙 영역, 스택 영역으로 나눌 수 있다.

코드 영역 (=텍스트 영역)

  • 프로그램의 실행 코드를 저장한다. 이 영역에는 프로그램이 실행되는 동안 변경되지 않는 기계어 코드가 포함된다.
  • 데이터가 아닌 CPU가 실행할 명령어가 담기기에 쓰기가 금지된 영역 (read-only)으로 같은 프로그램을 실행하는 다른 프로세스들이 동일한 코드를 사용하기 때문에 종종 다른 프로세스와 공유된다.
  • 정적 할당 영역으로 영역의 크기가 고정되어 있다.

데이터 영역

  • 전역 변수, 정적 변수 등 프로그램의 수명 동안 지속되거나 프로그램이 실행되는 동안 값을 유지해야 하는 변수를 저장한다.
  • 이 영역의 크기 역시 프로그램이 컴파일될 때 결정되며, 프로그램 실행 동안 변경되지 않는다.

힙 영역

  • 프로그램을 만드는 사용자, 즉 프로그래머가 직접 할당할 수 있는 저장 공간으로 프로그램이 실행되는 동안 필요에 따라 메모리를 할당하고 해제하는 데 사용된다.
  • 힙 영역은 메모리가 동적으로 할당되고 해제되기 때문에 관리가 복잡할 수 있으며, 메모리 누수와 같은 문제가 발생할 수 있다. 힙 영역은 스택 영역과 반대 방향으로 성장한다.
  • 가비지 컬렉션
    • 프로그래밍에서 사용하지 않는 메모리를 자동으로 회수하는 프로세스.
    • 힙에 할당된 객체가 더 이상 필요하지 않게 되면 가비지로 간주된다. 이는 객체에 대한 모든 참조가 사라졌을 때 발생한다.
    • 가비지 컬렉터는 힙 영역을 주기적으로 검사하여 더 이상 사용되지 않는 객체를 찾아내고, 이들이 차지하고 있는 메모리를 해제한다.
    • 메모리 관리를 단순화하고 메모리 누수를 방지하는 데 도움이 된다.

스택 영역

  • 데이터가 일시적으로 저장되는 공간으로 함수 호출 시 전달되는 인자, 반환 주소, 지역 변수 등을 저장하는 데 사용된다. 스택은 함수 호출과 함께 생성되고, 함수가 반환되면 소멸한다.
  • 스택 영역은 자동으로 관리되며, LIFO(Last In First Out) 방식으로 데이터가 추가되고 제거된다. 스택 오버플로우는 이 영역의 크기를 초과할 때 발생하는 일반적인 문제다.
  • 동적 할당 영역 (크기 가변)으로 일반적으로 스택 영역은 높은 주소 -> 낮은 주소로 할당된다.