프로세스란?
프로세스는 프로그램(코드 더미)을 실행 시켜 정적인 프로그램이 동적으로 변하여 프로그램이 돌아가고 있는 상태를 말한다. 즉, 컴퓨터에서 실행중인 프로그램을 의미한다.
스레드란?
과거에는 프로그램을 실행할 때 프로세스 하나만을 사용해서 이용했다. 하지만 기술이 발전됨에 따라 프로그램이 복잡해지고 다채로워지면서 프로세스 하나만을 사용해서 프로그램을 실행하기에는 한계가 있었다. 그렇다고 동일한 프로그램을 여러 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 된다. 스레드는 이러한 프로세스 특성의 한계를 극복하기 위해 탄생했다.
스레드란, 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위를 말한다. 예를 들어, 브라우저에서 파일을 다운 받으며, 온라인 쇼핑을 하면서 또 동시에 게임도 하는 것이다. 이러한 일련의 작업 흐름들을 스레드라고 하며 여러개가 있다면 이를 멀티(다중) 스레드 라고 부른다.
프로세스와 스레드의 메모리
프로세스의 자원 구조
먼저 프로세스의 자원 구조를 보자. 프로그램이 실행되면서 다음 4가지 메모리 영역으로 구성되어 할당 받게 된다.
1) 코드 영역 (Code / Text) : 프로그래머가 작성한 프로그램 함수들의 코드가 CPU가 해석할 수 있는 기계어 형태로 저장되어 있다.
2) 데이터 영역 (Data) : 코드가 실행되면서 사용하는 전역변수나 각종 데이터들이 모여있는 공간이다.
3) 스택 영역 (Stack) : 지역 변수와 같은 함수 호출시에 저장되는 자료들이 있는 공간이다. Stack은 함수 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸한다. 만일 스택의 영역을 초과하면 Stack Overflow 에러가 발생한다.
4) 힙 영역 (Heap) : 생성자, 인스턴스와 같은 동적으로 할당되는 데이터들을 위해 존재하는 공간이다. 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.
스레드의 자원 공유
스레드는 프로세스가 할당 받은 자원을 이용하는 실행의 단위로서, 스레드가 여러개 있으면 스레드끼리 프로세스의 자원을 공유하면서 프로세스 실행 흐름의 일부가 되기 때문에 동시 작업이 가능하다.
아래 그림과 같이 하나의 프로세스에 여러 스레드가 존재하고 이 스레드들은 프로세스의 4가지 영역중 Stack만 할당받아 복사하고 나머지는 공유하게 된다.
⭐ stack은 함수 호출 시 전달되는 인자, 되돌아갈 주소값, 함수 내에서 선언하는 변수 등을 저장하는 메모리 공간이기 때문에, 독립적인 스택을 가졌다는 것은 독립적인 함수 호출이 가능하다 라는 의미이다. 그리고 독립적인 함수 호출이 가능하다는 것은 독립적인 실행 흐름이 추가된다는 말이다.즉, stack을 가짐으로써 스레드는 독립적인 실행 흐름을 가질 수 있게 되는 것이다.
프로세스와 스레드의 생명 주기
프로세스 스케쥴링
프로세스 스케쥴링은 운영체제에서 CPU를 사용할 수 있는 프로세스를 선택하고, CPU를 할당하는 작업을 말한다. 프로세스 스케쥴링은 프로세스의 우선순위, 작업량 등을 고려하여 효율적으로 배치한다. 이와 같은 스케줄링은 멀티 태스킹 작업을 만들어내는 데에 있어 핵심적인 부분이다.
스케쥴링은 운영체제의 특징과 시스템 요구사항에 따라 다양한 알고리즘 방식으로 동작된다. 알고리즘 종류로는 대표적으로 FCFS(First-Come, First-Served), SJF(Shortest-Job-First), Priority, RR(Round Robin), Multilevel Queue 등이 있다.
프로세스 컨텍스트 스위칭
컨텍스트 스위칭(Context Switching, 문맥교환)은 CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 일련의 과정을 말한다. 동작 중인 프로세스가 대기 상태로 바뀌면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다. 이러한 컨텍스트 스위칭이 일어날 때 다음번 프로세스는 스케줄러가 결정하고 그 주체는 스케줄러이다.
PCB(Process Control Block)
프로세스 제어 블록(PCB)는 운영체제에서 프로세스를 관리하기 위해 해당 프로세스의 상태 정보를 담고 있다.
포인터 (Pointer) : 프로세스의 현재 위치를 저장하는 포인터 정보
프로세스 상태 (Process state) : 프로세스의 각 상태 - 생성(New), 준비(Ready), 실행(Running), 대기(Waiting), 종료(Terminated) 를 저장
프로세스 아이디 (Process ID, PID) : 프로세스 식별자를 지정하는 고유한 ID
프로그램 카운터 (Program counter) : 프로세스를 위해 실행될 다음 명령어의 주소를 포함하는 카운터를 저장
레지스터 (Register) : 누산기, 베이스, 레지스터 및 범용 레지스터를 포함하는 CPU 레지스터에 있는 정보
메모리 제한 (Memory Limits) : 운영 체제에서 사용하는 메모리 관리 시스템에 대한 정보
열린 파일 목록 (List of open file) : 프로세스를 위해 열린 파일 목록
스레드 스케쥴링
프로세스 스케줄링과 마찬가지로, 스레드 스케줄링은 운영체제에서 다중 스레드를 관리하며, CPU를 사용할 수 있는 스레드를 선택하고, CPU를 할당하는 작업을 말한다.
대표적으로는 Round Robin, Priority-based scheduling, Multi-level Queue scheduling 등이 있다.
다만 스레드 스케줄링은 프로세스 스케줄링과 다르게, 하나의 프로세스 내에서 다수의 스레드가 동작하는 형태이기 때문에, 스레드 간의 상호작용과 동기화 문제를 고려해야 한다는 차이점이 존재한다.
스레드 상태
스레드 상태 | 설명 |
NEW | 스레드가 생성되고 아직 호출되지 않은 상태 |
RUNNABLE | 스레드가 실행되기 위해 기다리는 상태 CPU를 할당받을 수 있는 상태이며, 언제든지 실행될 준비가 되어있다. |
BLOCKED | 스레드가 특정 이벤트(입출력 요청 등)가 발생하여 대기하는 상태 CPU를 할당받지 못하며, 이벤트가 발생하여 다시 RUNNABLE 상태로 전환될 때까지 대기한다. |
TERMINATED | 스레드가 실행을 완료하고 종료된 상태 더 이상 실행될 수 없으며, 메모리에서 제거된다. |
스레드 컨텍스트 스위칭
멀티 스레딩 환경에서 스레드 간의 실행을 전환하는 기술이다.
TCB(Thread Control Block)
PCB처럼, TCB는 각 스레드마다 운영체제에서 유지하는 스레드에 대한 정보를 담고 있는 자료구조이다. TCB는 PCB 내에 존재한다. 스레드의 상태 정보, 스레드 ID, 스레드 우선순위, 스케쥴링 정보 등 다양한 정보를 저장한다. TCB도 스레드가 생성될 때 운영 체제에 의해 생성되며, 스레드가 실행을 마치고 소멸될 때 함께 소멸된다.
참고
'CS 지식 > 운영체제' 카테고리의 다른 글
[운영체제] 캐시 (0) | 2024.11.10 |
---|---|
[운영체제] 운영체제 동기화 방법: 세마포어와 뮤텍스 (0) | 2024.09.21 |
[운영체제] 메모리 계층 구조 (0) | 2024.06.21 |
[운영체제] PCB(Process Control Block)란? (0) | 2024.05.17 |