본문 바로가기
CS/OS

프로세스와 스레드

by yongckim 2022. 8. 31.
728x90
반응형

옛날의 컴퓨팅 환경

초기의 컴퓨터들은 한번에 하나의 작업만을 수행할 수 있는 상태였습니다. 기본적으로 CPU는 한번의 하나의 작업만 수행할 수 있기 때문입니다.

예를들어, 우리가 프로그램을 하나 다운 받으려고 하면 그 동안 아무 작업을 할 수 없는 상태가 되는 것입니다.

이런 상황을 해결하기 위해 프로세스라는 개념이 탄생하게 되었습니다.

프로그램과 프로세스란?

그렇다면 프로그램과 프로세스는 무엇이고 둘의 차이는 무엇일까요?

  • 프로그램
  • 프로그램은 명령어 리스트를 내용으로 가진 디스크에 저장된 파일(실행파일)을 의미합니다. 쉽게 말해서, .exe, .deb 과 같은 실행파일들이 프로그램입니다.
  • 프로세스
  • 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 의미합니다. 쉽게 말해서, 현재 실행중인 프로그램을 의미합니다.

즉, 프로세스는 실행중인 프로그램을 의미합니다.

프로그램 카운터란?
CPU 레지스터 중 하나로서, 다음에 실행될 명령어의 주소를 가지고 있습니다. 실행될 명령어의 주소를 가지고 있기 때문에 명령어 포인터라고도 합니다.

프로세스 메모리 구조

프로세스는 앞서 설명했듯이, 실행중인 프로그램을 의미합니다.

프로세스의 실행상태는 프로그램 카운터의 값과 레지스터의 내용으로 나타냅니다.

프로세스의 메모리 배치는 일반적으로 여러 섹션으로 구분되며 다음과 같습니다.

위의 그림에서 각 영역이 의미하는 바는 다음과 같습니다.

  • 텍스트 섹션 : 실행하는 코드
  • 데이터 섹션 : 전역 변수, static 변수
  • 힙 섹션 : 프로그램 실행 중에 동적으로 할당되는 메모리 (ex : new)
  • 스택 섹션 : 함수를 호출할 때 임시 저장되는 데이터의 저장장소 (ex : 함수 매개변수, 지역 변수, 반환 주소, 반환 값)

스택과 힙

텍스트 및 데이터 섹션의 크기는 고정되기 때문에 프로그램을 실행하는 동안에는 크기가 변하지 않습니다.

하지만 스택 및 힙 섹션은 프로그램 실행 중에 동적으로 줄어들거나 커질 수 있습니다.

스택의 경우 함수가 호출될 때마다 함수 매개변수, 지역 변수 및 반환 주소를 포함하는 활성화 레코드가 스택에 저장됩니다.

함수가 종료되어 원래 위치로 돌아왔을 경우 활성화 레코드가 스택영역에서 제거됩니다.

힙의 경우도 메모리가 동적으로 할당됨에 따라 힙이 커지고 할당한 메모리가 반환된 경우 축소됩니다.

운영채제는 스택과 힙 섹션이 서로의 방향으로 커지더라도 영역이 겹치지 않도록 관리해야 합니다.

활성화 레코드란?
Context Switching(컨텍스트 스위칭)이 일어나기 전에 함수 상태를 기록하고 복원하기 위한 것으로, 해당 함수의 값, 값 파라미터, 지역 변수, 반환 주소의 정보가 기록됩니다.

프로세스의 상태

프로세스는 실행되면서 상태가 계속해서 변화됩니다.

프로세스의 상태는 다음과 같이 분류됩니다.

  • new(생성) : OS에 프로세스의 PCB가 생성이 되면서 프로세스가 메인 메모리에 적재되어 실행준비를 마친 상태입니다.
  • Ready(준비) : 프로세스가 CPU를 얻을 때까지 자신의 차례를 기다리고 있는 상태입니다. Ready Queue에 들어와 있는 상태라고도 이야기 합니다.
  • Running(실행) : Ready Queue에 있던 프로세스가 자신의 차례를 부여받아 실제로 수행되는 상태입니다.
  • Waiting(대기) : 프로세스가 실행(Running) 상태에서 어떤 이벤트가 발생했을 경우(입출력 대기, 신호 수신) 프로세스를 대기상태로 만듭니다.
  • Terminated(종료) : 프로세스가 작업을 모두 마치고 PCB를 제거하고 메인 메모리에서 빠져나간 상태입니다.

프로세스 제어블록 (PCB)

각 프로세스는 운영체제에서 프로세스 제어 블록(process control block, PCB)에 의해 표현됩니다.

프로세스 제어블록은 프로세스 생성시에 만들어지며, 해당 프로세스에 연관된 여러 정보를 가지고 있으며, 다음과 같은 것 들을 포함합니다.

  • 프로세스 상태 : 생성, 준비, 실행, 대기, 종료와 같은 상태를 나타냅니다.
  • 프로그램 카운터 : 해당 프로세스가 다음에 실행할 명령어의 주소를 가리킵니다.
  • CPU 레지스터들 : CPU 레지스터는 컴퓨터의 구조에 따라 다양한 수와 유형을 가집니다. 레지스터에는 누산기(accumulator), 인덱스 레지스터, 스택 레지스터, 범용 레지스터들과 상태 코드 정보가 포함됩니다. 프로그램 카운터와 함께 이 상태 정보는, 나중에 프로세스가 다시 스케줄 될 때 계속 올바르게 실행되도록 하기 위해서 인터럽트 발생 시 저장되어야 합니다.
  • CPU-스케줄링 정보 : 프로세스 우선순위, 스케줄 큐에 대한 포인터와 다른 스케줄 매개변수를 포함합니다.
  • 메모리 관리 정보 : 운영체제에 의해 사용되는 메모리 시스템에 따라 기준(base) 레지스터와 한계(limit) 레지스터의 값, 운영체제가 사용하는 메모리 시스템에 따라 페이지 테이블 또는 세그먼트 테이블 등과 같은 정보를 포함합니다.
  • 회계(accounting) 정보 : CPU 사용 시간과 경과된 실시간, 시간 제한, 계정 번호, 잡 또는 프로세스 번호 등을 포함합니다.
  • 입출력 상태 정보 : 해당 프로세스에 할당된 입출력 장치들과 열린 파일의 목록 등을 포함합니다.

CPU 스케줄링

프로세스는 수명주기 동안 다양한 Ready Queue와 Waiting Queue로 옮겨집니다.

CPU 스케줄러의 역할은 Ready Queue에 있는 프로세스 중에서 선택된 하나의 프로세스에 CPU 코어를 할당하는 것입니다.

컨텍스트 스위칭(Context Switching)

CPU가 어떤 프로세스를 실행하고 있는 상태에서 인터럽트에 의해 다음 우선 순위를 가진 프로세스가 실행되어야 할 때 기존의 프로세스 정보들은 PCB에 저장하고 다음 프로세스의 정보를 PCB에서 가져와 교체하는 작업을 컨텍스트 스위칭이라고합니다.

컨텍스트 스위칭에서 PCB를 저장하고 복원하는 과정에서 오버헤드가 발생하며 이 과정 동안 아무런 동작을 할 수 없기 때문에 이는 순수한 오버헤드입니다.

멀티 프로그래밍

하나의 코어를 가진 CPU에서는 하나의 작업만 처리할 수 있습니다. 그런데 우리는 컴퓨터를 사용할 때 다양한 프로그램을 동시에 키고 사용하고 있습니다.

이게 가능한 이유는 위에서 설명한 컨텍스트 스위칭을 통해서 CPU에서 처리하는 작업들이 일정한 시간을 가지고 변경되어 동시에 처리하는 것처럼 보이게 할 수 있습니다.

이렇게 동시에 실행되는 것처럼 보이게 하는 것을 Concurrency (동시성)라고 합니다.

멀티 프로세스

멀티프로세스는 하나의 프로세스가 아니라 여러 개의 프로세스가 서로 협력적으로 일하는 것을 의미합니다.

멀티 프로세스는 각 프로세스마다 별도의 메모리 영역을 가지고 프로세스 간 통신 기법을 사용해야만 다른 프로세스간 통신이 가능합니다.

쓰레드란?

쓰레드란 프로세스내에서 실제로 작업을 수행하는 주체를 의미합니다.

모든 프로세스는 최소 한개 이상의 쓰레드가 존재하여 작업을 수행하게 됩니다.

또한, 두 개 이상의 쓰레드를 가지는 프로세스를 멀티쓰레드 프로세스라고 합니다.

멀티 쓰레드

멀티 쓰레드는 하나의 프로세스 내에서 둘 이상의 쓰레드가 동시에 작업을 수행하는 것을 의미합니다.

쓰레드는 프로세스의 text, data, heap 영역을 공통된 자원으로 사용하고 스택만 따로 할당받습니다.

멀티 프로세스의 장점

  • 적절하게 역할이 분산되었을 경우 한 프로세스에 문제가 생기더라도 시스템 전체에 문제가 생기지 않습니다.

멀티 프로세스의 단점

  • 컨텍스트 스위칭 과정에서 각각의 독립된 메모리 영역을 할당 받았기 때문에 프로세스 간 공유되는 메모리가 없어 PCB를 저장하고 복원하는 과정에서 많은 오버헤드가 발생합니다.
  • 프로세스 간에 통신을 위해서는 복잡한 통신 기법을 사용해야 합니다. (서로 독립된 메모리 공간을 사용하기 때문)

멀티 쓰레딩의 장점

  • 프로세스를 다중 스레드화 하면 프로그램이 어떤 긴 작업을 수행하더라도 계속해서 사용할 수 있습니다.
  • 멀티프로세스의 경우 공유 메모리와 메시지 전달 기법을 통해서만 자원을 공유할 수 있지만 쓰레드는 자동적으로 속해있는 프로세스의 자원과 메모리를 공유하기 때문에 쉽게 값을 공유할 수 있습니다.
  • 쓰레드는 속한 프로세스의 자원과 메모리를 공유하므로 컨텍스트 스위칭에 드는 비용이 적습니다.
  • 하나의 쓰레드만 존재할 경우 처리기(core)가 여러개더라도 하나의 처리기에서만 수행되지만 멀티 쓰레드에서는 각각의 쓰레드가 다른 처리기에서 병렬로 수행될 수 있습니다.

멀티 쓰레딩의 단점

  • 하나의 쓰레드에 문제가 발생하면 전체 프로세스가 영향을 받습니다.
  • 자원 공유를 하는 과정에서 동기화 문제가 발생할 수 있습니다.

멀티 프로세스VS 멀티 쓰레드

  프로세스 쓰레드
자원 공유 공유 자원 없음 text, data, heap 공유
통신 방법 IPC를 이용한 통신 데이터 영역과 힙영역이 공유되므로 바로 접근 가능
동기화 작업 필요 없음 공유 자원 관리 필요(race condition 위험)
비용 작음
반응형

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

경쟁상황 (Race Condition), 뮤텍스, 세마포어  (0) 2022.09.11
CPU 스케줄링  (0) 2022.09.07
IPC  (0) 2022.09.04
시스템 콜  (0) 2022.08.30
운영체제와 IO / Interrupt  (0) 2022.08.28