본문 바로가기

iOS/학습정리

CS) 프로세스와 스레드

프로세스와 스레드

프로세스란?

실행중인 프로그램

프로세스는 실행중인 프로그램으로 메인 메모리에 존재한다. 실행중이지 않은 프로그램의 경우 저장장치에 있으며 프로세스는 언제든 CPU가 실행시킬 수 있는 상태에 있는 것이다.

시스템 콜을 통해 자원을 요구하는 주체이기도 하다. 시분할 시스템의 경우 여러 개의 프로세스를 동시에 수행하는데 이를 멀티 프로세싱 혹은 멀티 태스킹이라 한다.

  • 멀티 프로세싱은 멀티 프로세서와 혼동될 수 있어 보통 멀티 태스킹을 더 많이 쓴다.
  • 하나의 프로그램이 수행 중 여러 개의 프로세스를 만드는 경우도 있다.

프로세스는 사용자 프로세스시스템 프로세스로 나뉠 수 있는데, 자원 경쟁 측면에서는 동일하다.

  • 사용자 프로세스: 응용 프로그램이 실행되는 것
  • 시스템 프로세스: 운영체제가 필요에 의해 생성

프로세스의 문맥

프로세스는 상태 변화가 있는 동적인 개체이다. 시분할에 따른 멀티태스킹 환경에서 프로세스는 실행이 중단되거나 속개되는 상태가 반복된다. 프로세스의 실행 중단 시 보존되고, 속개 시 다시 원상 복구되어야 하는 프로세스의 모든 실행 정보문맥(Context)이라 한다.

프로세스 문맥 구성

  • 사용자 수준 문맥 (user-level context)
    • 텍스트(text) 영역: 프로그램 코드 부분
    • 자료(data) 영역: 프로그램 전역변수 부분
    • 스택(stack) 영역: 프로그램 실행시간 스택 부분

사용자 수준 문맥은 커널 영역이 아닌 user space에 있으며, 메인 메모리의 현재 상태를 의미한다. 프로그램 코드는 binary code로 저장되며 스택 영역은 함수를 호출할 때 스택에 쌓이고(push), 지우는(pop) call-stack을 말한다.

  • 커널 수준 문맥 (Kernel-level context)
    • CPU 내의 특수 레지스터의 내용
      • 프로그램 카운터(PC)
      • 스택 포인터(SP)
      • CPU 상태 레지스터(PSR: Program Status Register)
    • CPU 내의 각종 범용 레지스터(일반 계산용)
    • 프로세스 현재의 각종 자원 사용 정보
      • file open, network port 등
    • 커널의 프로세스 관리 정보
      • 여러 프로세스들이 부모/자식 형태로 존재하는데 이를 트리 형태로 관리
      • 프로세스 트리를 관리하기 위한 링크(포인터)

문맥 교환

CPU를 다른 프로세스로 넘기는 작업

실행이 정지되는 프로세스의 문맥은 보존되고, 새로 실행되는 프로세스의 문맥이 활성화된다.

사용자 수준 문맥은 원래 메모리에 있었으므로 메모리에 남아있으나, CPU 레지스터의 내용들은 추후의 복구를 위해 저장(save)되고 스케줄링된 새로운 프로세스의 문맥이 적재(restore)된다.

문맥 교환이 발생하는 시점은 다음과 같다.

  • 비자발적 문맥 교환
    • 시분할 기반의 스케줄링(타임 슬라이스 소진)
    • 인터럽트로 인한 CPU 선점
  • 자발적 문맥 교환
    • 입출력 요청
    • 다른 프로세스가 보낼 시그널에 대한 대기요청

프로세스의 상태

  • 생성(new): 프로세스 생성 중인 상태
  • 준비(ready): CPU 배정을 기다리는 상태
  • 실행(running): 프로세스의 명령이 CPU에 의해 실행되고 있는 상태
  • 대기(blocked): 프로세스가 어떤 이벤트가 발생하기를 기다리고 있는 상태
    • 기다리는 이벤트가 발생하기 전까지는 CPU를 받을 수 없다.
  • 종료(terminated): 프로세스 실행이 종료된 상태

스레드

전통적 프로세스

heavy weight process

프로세스 간의 공유변수를 갖기 어렵다. 이를 위해서는 운영체제가 제공하는 특수 구조체나 공유파일을 사용해야 한다. 예로 pipe, shared mem, signal, socket 등이 있다.

fork()에 의한 협동 프로세스 사용시 데이터 영역과 스택 영역 모두를 복사하여 생성하므로 시간적 오버헤드와 메모리 낭비가 초래된다.

스레드

lignt weight process

코드와 데이터는 공유하고 스택만 따로 갖는 형태이다.

전통적 프로세스는 하나의 스레드로 구성되어 있다고 볼 수 있다. 하나의 프로세스는 여러 개의 스레드로 구성 가능하며, 전역 변수를 스레드간 통신 수단으로 활용 가능하다. 프로세스 생성보다 스레드 생성이 빠르고 자원 점유가 적다.