0. 프로그램(Program)이란?
- 프로세스(실행 중인 프로그램)의 생성 및 실행 규칙들로 엮어진 파일
- 컴퓨터가 무엇을 하도록, 구체적으로 알려주는 명령문(명령어)들의 집합
- 대부분의 프로그램은 저장장치에 바이너리 형식의 파일로 저장되어 있다가 사용자가 실행시키면 메모리에 적재되어 실행된다.
1. 프로세스(Process)란?
- 컴퓨터에서 연속적으로 실행되고 있는 프로그램
- 스케줄링의 대상이 되는 작업(Task)이라는 용어와 거의 같은 의미로 쓰인다.
- 프로세스 내부에는 최소 하나의 스레드를 가지고 있는데, 실제로 스레드 단위로 스케줄링을 한다.
- 저장장치(HDD, SSD)에 있는 프로그램을 실행하면, 실행을 위해 메모리 할당이 이루어지고, 할당된 메모리 공간으로 바이너리 코드가 올라가게 된다. 이 순간부터 프로세스라 불린다.
- 여러 개의 프로세서를 사용하는 것을 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다.
- 프로세스는 독립적인 특성을 가지고 있다.
1-1. 프로세스의 메모리 구조(프로세스 하나당 하나씩 존재한다)
- Code 영역 : 프로그램을 실행시키는 실행 파일 내의 명령어들이 올라감
- Data 영역 : 전역(Global) 변수, 정적(static) 변수의 할당, 프로그램이 끝날 때까지 메모리에 남아있는 변수
- Heap 영역 : 동적할당을 위한 메모리 영역
- Stack 영역 : 지역변수, 함수 호출시 전달되는 인자(파라미터)를 위한 메모리 영역
1-2. 프로세스의 상태
커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다.
| 상태 | 설명 |
| 생성(New / Create) | 프로세스가 막 생성된 상태 |
| 준비(Ready) | 프로세스가 CPU를 사용하고 있지는 않지만 언제든지 사용할 수 있는 상태로, CPU가 할당되기를 기다리고 있는 상태 |
| 실행(Running) | 프로세스가 CPU를 차지하여 명령어들이 실행되고 있는 상태. 일반적으로 준비 상태의 프로세스 중 우선순위가 높은 프로세스가 CPU를 할당받는다. |
| 대기(Waiting / Block) | 보류(block)라고 부르기도 한다. 프로세스가 입출력 완료, 시그널 수신, 특정 자원이나 이벤트 등 어떤 사건을 기다리고 있는 상태를 말한다. |
| 종료(Exit / Terminated) | 프로세스의 실행을 완료한 상태 |
| Suspended Waiting | 프로세스가 대기 상태에서 기억 장치를 잃은 상태 |
| Suspended Ready | 프로세스가 기억장치를 제외한 다른 모든 필요한 자원들을 보유한 상태 |
1-3. 프로세스의 상태전이
하나의 프로그램이 실행되면 그 프로그램에 대응되는 프로세스가 생성되어 준비 리스트의 끝에 들어간다. 준비 리스트 상의 다른 프로세스들이 CPU를 할당받아 준비 리스트를 떠나면, 그 프로세스는 점차 준비 리스트의 앞으로 나가게 되고 언젠가 CPU를 사용할 수 있게 된다.
| 동작 | 설명 |
| 생성→준비 | 생성 상태의 프로세스가 OS로부터 승인을 받아, 준비 상태의 프로세스가 모여 있는 자료구조인 준비 큐(ready queue)에 추가됨 |
| 준비→실행 (Dispatch) |
우선순위가 높은 프로세스 선정하여 명령어 실행. 준비 리스트의 맨 앞에 있던 프로세스가 CPU를 점유하게 되는 것, 즉 준비 상태에서 실행 상태로 바뀌는 것을 디스패치라고 한다. |
| 실행→준비 (Timer runout) |
운영체제는 프로세스가 프로세서를 계속 독점해서 사용하지 못하게 하기 위해 클럭 인터럽트(Clock interrupt)를 두어서 프로세스가 일정 시간 동안만(시분할 시스템의 time slice) 프로세서를 점유할 수 있게 한다. (Preemption, 독점 방지) |
| 실행→대기 (Block) |
실행 상태의 프로세스가 허가된 시간을 다 쓰기 전에 입출력 동작, 자원 등을 필요로 하는 경우 프로세스는 CPU를 스스로 반납하고 대기 상태로 넘어 간다. |
| 대기→ 준비 (Wake up) |
입출력 작업 종료 등 기다리던 사건이 일어났을 때 대기 상태에서 준비 상태로 넘어가는 과정 |
| 실행→종료 | 실행 중인 프로세스가 정상적으로 끝나서 종료 상태로 변경됨 |
| Swap-out (Suspend) |
준비(대기) 상태에서 기억 장치를 반납하고 지연 준비(지연 대기) 상태로 전이 |
| Swap-in(Resume) | 지연 준비(지연 대기) 상태에서 기억 장치를 할당받아 준비(대기) 상태로 전이 |
2. 스레드(Thread)란?
스레드(thread)란 프로세스(process) 내에서 프로세스의 자원을 이용하여 실행되는 여러 흐름의 단위로
실제로 작업을 수행하는 주체
- 스레드는 프로세스 내부의 작업의 흐름, 단위.
- 스레드는 운영체제의 스케줄러에 의해 독립적으로 관리될 수 있는 프로그래밍된 명령어의 가장 작은 시퀀스이다.
- 스레드는 한 프로세스(process)내부에는 적어도 하나의 스레드가 존재한다.
- 스레드가 여러개 존재하는 것을 멀티스레드(mulitread)라고 한다.
- 멀티스레드(multitread)에서 각 스레드끼리는 프로세스의 일정 메모리 영역을 공유한다.
- 스레드마다 stack을 생성한다.
- 일정 메모리 영역을 공유하기 때문에 동일한 프로세스 내부의 스레드 간 문맥교환(context switching)할 때가, 프로세스끼리 문맥교환(context switching)을 할 때보다 빠르며, 상대적으로 스위칭해야 할 메모리 영역이 적기 때문이다.
* 문맥교환(context switching) : 하나의 프로세스나 스레드가 cpu를 사용하고 있는 상태에서 다른 프로세스나 스레드가 cpu를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 과정
2-1. 스레드의 목적
- 프로그램의 응답성 향상 : 스레드를 사용하면 하나의 프로세스 내에서 여러 작업을 동시에 처리할 수 있기 때문에, 다른 스레드에서 실행 중인 작업이 끝나기를 기다리지 않고, 동시에 여러 작업을 처리하여 프로그램의 응답성을 향상할 수 있다.
- 자원 공유 : 스레드를 사용하면 같은 프로세스 내에서 메모리 공간을 공유할 수 있다. 이를 통해 데이터를 공유하고, 프로세스 간의 통신을 더욱 효율적으로 할 수 있다.
- 비용 감소 : 스레드를 사용하면 새로운 프로세스를 생성하는 것보다 적은 비용으로 여러 작업을 처리할 수 있다.
- 병렬 처리 : 스레드를 사용하면 하나의 작업을 여러 개의 스레드로 나누어 병렬적으로 처리할 수 있다. 이를 통해 작업을 더욱 빠르게 처리할 수 있다.
2-2. 멀티스레드
- 하나의 응용프로그램을 여러 개의 스레드로 구성하고 각 스레드로 하여금 하나의 작업을 처리하도록 하는 것.
- 윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고, 멀티 스레딩을 기본으로 하고 있다. 웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
2-3. 멀티스레드의 장점 / 단점
[장점]
- 높은 성능 : 여러 개의 스레드가 병렬적으로 작업을 처리하므로, 작업 처리 속도가 빠르고, 시스템 전체의 성능이 향상한다.
- 높은 자원 활용도 : 멀티 스레드는 하나의 프로세스에서 여러 개의 스레드가 작동하므로, 프로세스가 가진 자원들을 스레드들이 공유하여 더 효율적으로 사용할 수 있다. 또한 문맥교환을 할 때 공유하고 있는 메모리만큼 메모리 자원을 아낄 수 있다.
- 높은 응답성 : 멀티 스레드는 각각의 스레드가 별도의 작업을 처리하므로, 어떤 스레드에서 오류가 발생하더라도 다른 스레드는 정상적으로 작동하여 시스템이 멈추지 않고 계속해서 작업을 처리할 수 있다.
[단점]
- 동기화 문제 : 멀티 스레드에서는 여러 개의 스레드가 공유 자원을 사용하기 때문에, 동기화 문제가 발생할 수 있다.
한 스레드가 공유 자원을 사용하는 동안 다른 스레드가 해당 자원을 사용하게 되면 데이터의 일관성이 깨질 수 있다. - 교착상태 : 멀티 스레드에서는 여러 개의 스레드가 서로 대기하면서 무한정 기다릴 수 있는 상황이 발생할 수 있다.
- 디버깅의 어려움 : 멀티 스레드에서는 여러 개의 스레드가 동시에 실행되기 때문에, 디버깅이 어려울 수 있다.
스레드 간의 의존성이 복잡하게 얽혀 있을 경우 디버깅이 더욱 어려워진다.
'프로그래밍 > 용어' 카테고리의 다른 글
| [용어/개념] 루틴(Routine), 코루틴(Coroutine) (0) | 2025.01.02 |
|---|---|
| [용어/개념] 스케줄링(Scheduling) (0) | 2025.01.02 |
| [용어/개념] 동기(Synchronous), 비동기(Asynchronous), 블로킹(Blocking), 논블로킹(Non-Blocking) (0) | 2024.12.26 |
| [용어/개념] 동시성(Concurrency), 병렬성(Parallelism) (0) | 2024.12.24 |