본문 바로가기
CS/OS

[OS] 프로세스

by 진꿈청 2024. 7. 8.

과거의 컴퓨터는 한 번에 하나의 프로그램만 실행이 가능했지만, 현대의 컴퓨터는 메모리에 여러 프로그램들을 올리고 load하고 concurrently하게 실행이 가능하다.

3.1 Process Concept

Process

  • 프로세스는 실행 중인 프로그램
  • 프로세스의 현재 활동 상태 (status of the current activity)는 program counter의 값과 레지스터의 값에 따라 나타낼 수 있다.
  • Memory layout은 여러 섹션으로 나눌 수 있으며 일반적인 섹션은 다음과 같다.
    • Text section : executable code가 저장된 영역
    • Data section : 전역 변수들이 저장된 영역
    • Heap section : 프로그램의 런타임 동안에 동적으로 할당될 수 있는 영역
    • Stack section : 함수 호출 시 반환 주소, 파라미터 또는 지역 변수와 같은 일시적인 데이터를 저장하는 영역
  • Text section과 Data section은 고정된 크기를 가지지만, Heap과 Stack은 런타임 동안에 크기가 동적으로 커지거나 줄어들 수 있다.

 

 

 

또한 그림과 같이 스택과 힙은 서로 마주보는 방향으로 확장될 수 있으며, 스택은 주소가 낮은 쪽으로, 힙은 주소가 높은 쪽으로 확장된다.

Process State

프로세스가 실행 중일 때는 상태가 변화하며, 상태의 종류는 다음과 같다.

  • New : 새로 생성된 프로세스의 상태
  • Running : 명령어가 실행되고 있는 상태
  • Waiting : 프로세스가 I/O, signal 등의 이벤트를 기다리고 있는 상태
  • Ready : 프로세스가 프로세서(CPU)에 할당되기를 기다리는 상태
  • Terminated : 프로세스가 끝난 상태

Diagram of process state

프로세서의 코어가 1개라고 가정하면, 오직 하나의 프로세스만이 running 상태일 수 있다.

Process Control Block (PCB)

각각의 프로세스들은 운영체제에서 process control block(PCB) 이라는 프로세스 정보 묶음으로 관리된다.

PCB의 정보들은 아래와 같은 종류가 있다.

  • Process state : 프로세스의 상태 (new, ready, running, etc..)
  • Program counter : 다음 명령어의 주소
  • CPU registers : 해당 상태에서의 레지스터 값 (인터럽트 발생 시에 저장됨)
  • CPU-scheduling info
  • Memory-management info : page table, segment table 등의 정보
  • Accounting info
  • I/O status info : I/O 장치들의 정보, open된 파일의 리스트

 

Threads

 

스레드는 프로세스 내에서 실행 흐름의 단위이다.

단일 스레드 환경에서는 한 번에 하나의 태스크만 처리할 수 있다.

멀티 코어 환경에서 멀티 스레드를 사용하면 여러 스레드가 병렬로 태스크를 처리할 수 있다.

3.2 Process Scheduling

하나의 코어 당 하나의 프로세스만이 실행될 수 있으므로 (코어 개수) < (프로세스 개수) 라면, 초과된 프로세스들은 free한 코어에 할당될 때까지 대기해야 한다.

 

Scheduling Queues

  • ready queue : 코어에 할당되기를 기다리는 프로세스가 저장된 큐
  • wait queue : I/O와 같은 이벤트 발생을 기다리는 프로세스가 저장된 큐
  • CPU 스케줄러 : ready queue에 있는 프로세스를 선택해 코어에 할당해주는 역할

 

Context Switch

 

인터럽트가 발생했을 때 시스템은 현재 코어에서 실행 중인 프로세스의 context를 저장할 수 있다.

 

이 때, context는 PCB로 나타낼 수 있으며, state save로 코어의 현재 상태를 저장하고 state restore로 복구하여 다시 작업을 진행할 수 있다.

 

Context switch

  • 현재 프로세스의 상태를 저장하고 다른 프로세스의 상태를 복구하여 코어에 다른 프로세스를 할당하는 작업
  • Context switch 발생 시
    1. 커널이 현재 프로세스의 정보를 PCB에 저장
    2. 저장된 다른 프로세스의 context를 load

 

 

create

termination

 

Zombie process

 

프로세스가 종료되고 리소스가 모두 회수되었지만, 프로세스 테이블에 아직 남아있는 상태. 즉, 종료되었지만 아직 삭제되지 않은 프로세스.

 

보통 프로세스는 exit() 시스템 콜을 통해 운영체제에게 자신의 삭제를 요청하며 종료되고, 리소스들은 회수된다.

이 때, 프로세스의 종료 상태(exit status)가 저장되는 프로세스 테이블에는 아직 해당 프로세스가 남아있는 상태이고 wait() 시스템 콜을 호출할 때까지 남아있게 된다.

 

정리하면 좀비 프로세스는 프로세스 자체는 종료되었지만 아직 부모가 wait() 시스템 콜을 하지 않아 프로세스 테이블에 남아있는 프로세스.

모든 프로세스는 종료하면 좀비 프로세스가 되지만 짧은 시간 동안에만 머무른다.

 

 

좀비 프로세스의 위험성?

  • 좀비 프로세스는 이미 리소스를 반납한 상태이므로 리소스 낭비를 일으키진 않는다.
  • 다만 리눅스 운영체제의 PID는 기본적으로 0~32768의 범위를 가지므로 좀비 프로세스가 빠르게 쌓인다면 PID를 차지하게 되어 문제를 발생시킬 수 있다.

 

Orphans

 

부모 프로세스가 wait() 시스템 콜을 사용하지 않고 종료할 경우, 자식 프로세스들이 orphans가 된다.

UNIX 시스템은 orphan 프로세스들의 부모 프로세스를 init 으로 변경시킨다.

 

그리고 init은 주기적으로 wait() 를 호출하여 orphan들의 exit status를 받고 process table에서 제거한다.

 

3.4 Interprocess Communication

 

프로세스들의 협력은 프로세스들이 서로 영향을 주고받는 것을 의미한다.

프로세스들이 서로 협력하는 이유는 다음과 같다.

  • Information sharing : 여러 프로세스들의 동일한 정보를 필요로 할 때.
  • Computation speedup : 태스크 수행 속도를 빠르게. (ex. 분산 병렬 처리)
  • Modularity : 기능들을 여러 프로세스, 스레드로 나누어 생성.

 

프로세스들은 서로 통신하기 위해서 IPC(Interprocess Communication) 매커니즘을 사용하여 데이터를 교환한다.

 

IPC에는 shared memory 방식과 message passing 방식이 있으며 각각의 특징은 다음과 같다.

  • Shared memory
    • 프로세스들이 공유할 수 있는 memory region을 생성
    • Shared region에 데이터를 R/W하여 데이터를 공유
    • Shared memroy region을 만들 때만 시스템 콜을 사용하기 때문에 kernel intervention이 적으므로 속도가 빠름
  • Message passing
    • 프로세스끼리 메시지를 주고받으며 데이터를 교환
    • 적은 양의 데이터를 교환하기 좋음 (conflict를 피할 필요가 없으므로)
    • 구현이 간단
    • 시스템 콜을 이용하여 구현하므로 kernel intervention이 잦아 오버헤드가 큼 (속도가 느림)

 

'CS > OS' 카테고리의 다른 글

[OS] CPU 스케줄링  (0) 2024.07.16
[OS] 스레드&동시성  (2) 2024.07.14
[OS] 운영체제 기초  (0) 2024.07.08