본문 바로가기
Computer Science/운영체제

[OS] 프로세스와 컨텍스트 스위칭이란? (프로세스 상태와 관리, 프로세스 구조와 구성, 컨텍스트 스위칭 오버헤드)

by 그적 2024. 1. 9.

목차

  • 프로세스란?
  • 프로세스 상태와 관리
  • 프로세스 구조 : 프로세스가 접근할 수 있는 메모리 구조
  • 프로세스 구성 : PCB (Process Control Block)
  • 컨텍스트 스위칭이란?
  • 컨텍스트 스위칭 과정
  • 컨텍스트 스위칭과 오버헤드

 


1. 프로세스란?

프로그램은 단순히 디스크에 저장되어 있는, 기계어로 작성된 실행할 수 있는 파일을 의미한다. 컴퓨터는 프로그램을 실행하기 위해 CPU에게서 메모리를 할당받아 프로그램을 메모리에 적재시켜 실행하는데, 이를 프로세스라고 한다. 따라서 프로세스를 실행 중인 프로그램, 혹은 메모리에 올라간 프로그램으로 칭하기도 한다.

 

  • 프로그램 : 디스크(보조 기억장치)에 저장되어 있는 passive한 개체
  • 프로세스 : 메모리(주 기억장치)에 적재되어 있는 active한 개체

 


2. 프로세스 상태

컴퓨터는 프로세스를 처리할 때 아래의 프로세스 생명 주기에 따라 프로그램을 처리한다.

 

  • 생성(New) : 프로세스가 생성된 상태이며, 실행을 위한 메모리와 자원을 할당받지 못했다.
  • 준비(Ready) : 프로세스가 실행을 기다리는 상태이며, 필요한 자원을 모두 할당받아 실행을 위한 준비는 완료되었다.
  • 하지만 CPU를 할당받지 못해 스케줄링 대기열(Ready Queue)에서 CPU가 할당되기를 기다리고 있다.
  • 실행(Running) : 프로세스를 구성하는 명령어를 실행하는 상태이며, CPU가 작업을 처리한다.
  • 대기(Blocked, Waiting) : 특정 이벤트가 발생하여 프로세스가 잠시 멈춘 상태이며, 이 상태에서는 CPU를 사용하지 않는다. 프로세스 작업 시간이 초과되거나 특정 자원을 이용하기 위해 대기해야 하는 상황 등에서 대기할 수 있다.
  • 소멸(Exit, Terminated) : 프로세스가 실행을 마치고 종료된 상태이며, 할당된 메모리와 자원이 반환한다.

 


3. 프로세스 관리 (Sculduler)

1) New -> Ready

 : 디스크에 존재하는 프로그램을 Job이라고 부른다. 메인 메모리에 올라가기 전, 운영체제는 이러한 실행해야 하는 수많은 프로그램들을 Job Queue에 저장하고 Job Scheduler를 통해 관리했으나, 현대의 시분할 컴퓨터는 Job Scheduler + Job Queue를 사용하지 않고 바로 메모리에 적재된다.

 

2) Ready -> Running

 : CPU 점유를 기다리는 Ready Queue에 존재하는 프로세스 중 Running 상태로 만들 프로세스를 결정한다. CPU는 효율을 위해 짧은 주기로 여러 프로세스를 교체하며 실행한다. 따라서 이것을 CPU Scheduler 혹은 Short-term Scheduler라고도 부른다.

 


4. 프로세스가 접근할 수 있는 메모리 구조

프로세스는 메모리에 적재되어 실행 중인 프로그램이라고 말했다. (실제로는 페이지, 세그먼트 단위로 쪼개져 적재되는데, 논리적인 의미로 가상메모리라고 칭함.) CPU는 메모리에 올라간 명령어와 데이터를 읽으면서 실행되는데, 아래 사진과 같이 Code, Data, Heap, Stack 영역으로 구성된다.

 

1) 코드 영역 (Code, Text)

 : 프로그램 코드가 올라가있는 영역으로, 컴퓨터가 이해할 수 있는 기계어로 컴파일되어 저장된다. 일반적으로 읽기 전용으로 설정되고, 코드 영역의 경우에는 같은 프로그램에 여러 프로세스가 실행될 수 있기 때문에 프로세스 간의 메모리 공유가 가능하다.

 

2) 데이터 영역 (Data)

 : 프로그램이 실행되는 동안에 항상 접근이 가능한 전역 변수와 정적 변수(static)가 저장되며, 프로그램 종료 시 제거된다.

 ** BSS 영역 : 초기화되지 않은, 0 혹은 null 포인터로 지정된 정적 변수 및 전역 변수를 위한 공간이다.

 

3) 힙 영역 (Heap)

 : 동적 할당된 변수들이 저장되며, 프로그래머가 malloc이나 new 키워드를 이용해 동적으로 메모리가 할당하고 해제한다. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당이 되기 때문에, FIFO (First In First Out) 형태를 띤다.

 

4) 스택 영역 (Stack)

 : 함수 호출과 관련된 지역 변수 및 매개 변수가 저장되며, 함수 종료 시 제거된다. 메모리의 높은 주소에서 낮은 주소의 방향으로 쌓이는 push 동작, 종료 시 낮은 주소 데이터부터 제거되는 pop 동작으로 FILO (First In Last Out) 형태를 띤다.

 


5. PCB (Process Context Block)

프로세스 상태가 변하면서 프로세스 정보를 관리하거나 사용 중인 CPU, 메모리 등의 각종 자원 등을 관리하기 위해 PCB(Process Control Block)을 이용한다. PCB는 프로세스마다 존재하며, 프로세스가 생성되면 컴퓨터는 PCB를 할당하고, 프로세스가 종료되면 PCB를 해제한다.

  • 프로세스 상태(Process State) : 프로세스 상태(New / Ready / Running / Waiting / Exit)
  • 프로세스 식별자(PID) : 프로세스 식별 번호
  • CPU 레지스터(CPU Register) : 프로세스 실행 중 사용되는 레지스터 값 (PC와 SP)
  • CPU 스케줄링 정보(CPU Scheduling Infomation) : 프로세스 우선순위, 점유 시간 등과 같은 스케줄링 정보
  • 메모리 관리 정보(Memory Management Information) : 사용 중인 메모리 주소 범위 등과 같은 메모리 정보
  • 입출력 상태(I/O state) : 프로세스가 현재 사용 중인 입출력 장치 정보

 


6. 컨텍스트 스위칭(Context Switching)이란?

CPU는 효율성을 위해 프로세스를 짧은 주기로 교체하면서 운영한다. 이때 현재 실행 중인 프로세스와 다음에 실행할 프로세스와의 교체를 컨텍스트 스위칭이라고 한다. 컨텍스트 스위칭이 이뤄지려면, 우선 현재 실행 중인 프로세스 정보를 저장해두어야 한다. 이때 PCB에 현재 프로세스 정보를 담아두고, 다른 프로세스의 PCB 정보를 현재 레지스터에 로드하여 다른 프로세스를 실행시킨다.

 

그럼 언제 컨텍스트 스위칭이 일어날까?

  • 멀티 태스킹 : 스케줄러에 의해 프로세스가 번갈아가면서 실행될 때
  • 인터럽트 : CPU에게 처리해야 할 일이 생겼을 때
    • I/O 입출력
    • CPU 사용 시간 만료
    • 자식 프로세스 생성
    • 인터럽트 처리 대기
  • 커널 모드 전환 : 커널 모드 전환은 Context Switching이 필수는 아니지만, 운영체제에 따라 발생할 수 있다.

 


5. 컨텍스트 스위칭이 일어나는 과정

위 그림과 같이 인터럽트 혹은 시스템콜이 발생하면, PCB에 프로세스 정보를 저장하기 위해 커널 모드로 전환한다. 그 후, 현재 프로세스 정보를 PCB에 저장하고, PCB에 저장된 다음 프로세스 정보를 로드한다. 캐시 및 메모리 등의 삭제 및 로드가 끝나면 다시 사용자 모드로 전환되어 컨텍스트 스위칭이 끝이 난다.

 


5. 컨텍스트 스위칭과 오버헤드

컨텍스트 스위칭 과정 중에는 CPU는 아무 작업도 하지 못한다. 즉, 컨텍스트 스위칭에 걸리는 시간은 일종의 오버헤드인 것이다. 보통 10ms ~ 20mx의 시간이 걸리며, OS가 복잡해질수록, PCB 정보가 많아질수록 더 오랜 시간이 걸린다.

 

(해결 방안)

  • 멀티 프로그래밍 수준 낮추기 : 컨텍스트 스위칭 발생 빈도 줄인다. (스케줄러 역할)
  • 스레드 이용 : 같은 프로세스는 text, data, heap 영역을 공유하기 때문에 더 적은 PCB 정보를 저장한다.
  • 스택 포인터 활용 : 실행 중인 프로세스의 주소로 돌아갈 수 있는 스택 포인터를 이용한다.

 

댓글