스레드 개념이 헷갈려 정리하고자 하였으나, 프로세스와 스레드 두 가지 개념 자체가 혼동되어 정리하기로 하였다.
프로세스(Process)
1. 프로세스의 정의
- 운영체제로부터 자원을 할당받은 [작업]의 단위
- 프로그램(실행 파일)이 실행되어 -> 파일이 컴퓨터 메모리에 올라가게 되는 상태(동적인 상태)의 프로그램
- 즉, 프로그램 -> 프로세스로 이어지는 단계이다.
그렇다면, 프로그램은?
2. 프로그램이란,
- '프로그램'이란. 파일이 저장 장치에 저장되어 있지만, 메모리에 올라가 있지 않은 정적인 상태
- 즉, 아직 실행되지 않은 파일(코드 덩어리)
Ex) Window *.exe 파일, Mac OS의 *.dmg 파일 등
여기서,
1) 메모리에 올라가 있지 않은: 운영체제(OS)가 프로그램에게 독립적인 메모리 공간을 할당해주지 않은 상태
- 여기서, 모든 프로그램은 운영체제가, 실행되기 위한 메모리 공간을 할당해주어야 실행 가능하다.
2) 정적인 상태: 움직이지 않는, 아직 실행되지 않고 가만히 있는 상태
3. 프로세스 단계
- 프로그램 -> 프로세스로 이어지는 단계에서, 운영체제는 프로그램을 메모리의 적당한 위치로 가져오고, 동시에 프로세스 제어 블록(PCB, Process Control Block)을 만든다.
-> 프로세스 = 프로그램 + 프로세스 제어 블록
이라고 할 수 있으며, 이때 PCB는 프로세스를 처리하는데 필요한 다양한 정보가 포함된 운영체제 커널의 자료구조이다.
(1) 프로세스 제어 블록(PCB)
- 특정 프로세스를 처리하는데 필요한 정보가 포함된 운영체제 커널의 자료구조로
- 운영체제가 프로세스 스케줄링을 위해 프로세스에 관한 모든 정보를 가지고 있는 데이터베이스라고 할 수 있다.
- 각 프로세스 생성마다 고유의 PCB가 생성되고 -> 프로세스 완료 시 PCB는 제거된다.
- 프로세스는 CPU를 점유해 작업을 처리하다가, 상태가 전이되는 경우 -> 진행 작업 내용을 정리하고 CPU를 반환해야 한다.
-> 이때, 프로세스는 진행하던 작업을 PCB에 저장하여 -> 다시 CPU를 점유하여 작업 수행 시 PCB로부터 저장된 정보를 CPU로 넘겨온다.
프로세스 제어 블록에 저장되어 있는 정보로는,
PCB 구성 정보 | 설명 |
프로세스 식별자(Process ID) | |
프로세스 상태(Process State) | 생성(Create) - 준비(Ready) - 실행(Running) - 대기(Waiting) - 완료(Terminated) 상태 존재 |
프로그램 계수기(Program Counter) | 해당 프로세스가 다음에 실행할 명령어의 주소 |
CPU 레지스터 및 일반 레지스터 | |
CPU 스케줄링 정보 | 우선 순위, 최종 실행 시각, CPU 점유 시간 등 |
메모리 관리 정보 | 해당 프로세스 주소 공간 |
프로세스 계정 정보 | 페이지 테이블, 스케줄링 큐 포인터, 소유자, 부모 등 |
입출력 상태 정보 | 프로세스에 할당된 입출력 장치 목록, 열린 파일 목록 |
포인터 | 부모 프로세스에 대한 포인터, 자식 프로세스에 대한 포인터, 프로세스가 위치한 메모리 주소에 대한 포인터, 할당된 자원에 대한 포인터 정보 등 |
(2) 프로세스 단계
- 프로세스는 아래와 같은 단계로 정의되며,
각 단계는
단계 | 설명 |
생성(new, create) | 프로세스가 메모리에 올라와 실행 준비를 완료한 상태 |
준비(ready) | 생성된 프로세스가 CPU를 얻을 때까지 기다리는 상태 |
수행(running) | 준비 상태에 있는 프로세스 중 하나가 CPU를 얻어 -> 실제 작업 수행하는 상태 |
대기(waiting) | 실행 상태에 있는 프로세스가 입출력 요청 시 -> 입출력이 완료될 때까지 기다리는 상태 |
종료(exit) | 프로세스 종료 상태 |
(3) 프로세스의 구조
- 프로세스는 '코드 영역, 데이터 영역, 스택 영역, 힙 영역' 으로 구성
구조 영역 | 설명 |
코드(Code) | 코드 자체를 구성하는 메모리 영역(프로그램 명령) |
데이터(Data) | 전역 변수, 정적(static) 변수, 배열 할당 공간(초기화 된 데이터) |
스택(Stack) | 지역 변수, 매개 변수, 리턴 값 저장 공간(임시 메모리 영역) |
힙(Heap) | 동적 할당시 사용되는 공간(new(), mallock() 등) |
스레드(Thread)
1. 스레드의 정의
- 프로세스가 할당받은 자원을 이용하는 [실행 흐름]의 단위
-> 스레드는 프로세스 안에 '포함'되어 있다.
- CPU 입장에서의 작업 단위 cf) 프로세스: 운영체제 입장에서의 작업 단위
2. 스레드 필요성
- 프로그램 실행 시작부터 끝까지 프로세스 하나만을 사용해서 진행될 때의 복잡성을 해결하기 위해
- '한 프로그램을 처리하기 위한 프로세스를 여러 개 만드는 방법'은, '운영체제가 안정성을 위해, 프로세스마다 자신에게 할당된 메모리 내의 정보에만 접근'할 수 있어 이 메모리를 벗어나는 정보에 접근하려면 오류가 발생해
- 프로세스 보다 더 작은 실행 단위 개념 등장
3. 스레드의 메모리 공유
- 스레드는 프로세스 내에서 Stack만 각각 따로 할당 받고 & Code, Data, Heap 영역은 공유
-> 한 프로세서 내의 주소 공간이나 자원 대부분을 공유
+ ) Code, Data, Heap 자원은 공유하지만, Stack은 공유하지 않는 것은,
- Stack의 후입선출(LIFO, Last In First Out) 특성과 연관이 있는데,
- Stack 영역은 Stack이 쌓일 때 위에서부터 프로세스가 섞인 상태로 나오기 때문에 원활한 실행 흐름을 위해 Stack은 독립적으로 존재한다.
4. 스레드 생성
- 하나의 프로세스 생성 -> 하나의 스레드 생성(메인 스레드)
- 스레드를 추가로 생성하지 않는 한, 모든 프로그램 코드는 메인 스레드에서 실행
- 하나의 프로세스는 여러 개의 스레드를 가질 수 있음(멀티 스레드)
5. 멀티 프로세스 Vs 멀티 스레드
멀티프로세스 | 멀티스레드 | |
의미 | 하나의 컴퓨터에 여러 CPU -> 하나 이상의 프로세스 동시(병렬) 처리 | 하나의 프로세스 -> 여러 스레드 생성(각 스레드가 하나의 작업 처리) |
장점 | 구조 독립 -> 안정성 높음 | - 프로그램 응답 시간 단축 - 시스템 처리율 향상 - 메모리 공간, 시스템 자원 효율성 증가 - Data, Heap 영역을 이용해 데이터 주고받음 -> 스레드 간 통신 간단 |
단점 | - 독립된 메모리 영역 -> 작업량 증가 시 오버헤드 발생 가능(Context Switching) - 프로세스 간 통신(IPC) 복잡 |
- 하나의 스레드에 문제 발생 시 전체 프로세스에 영향 - 서로 다른 스레드가 Stack 제외 메로리 공간 공유 -> 동기화 문제 발생 가능 |
6. 스레드 제어 블록(TCB, Thread Control Block)
- 스레드의 메타 데이터를 저장하는 블록
- 스레드 별로 존재하는 자료 구조
+ ) PCB와 TCB
- 같은 프로세스 내에서 스레드 간 Context Switching -> TCB(Context Switching 의 기본 단위)
- 다른 프로세스의 스레드로 Context Switching -> PCB & TCB
7. 자바 스레드(Java Thread)
- 일반 스레드와 거의 동일
- JVM이 운영체제의 역할
- Java Thread는 JVM에 의해 스케줄되는 실행 단위 코드 블럭 -> JVM 내에 메모리를 공유하여 사용
- main() 메소드 수행 -> 하나의 스레드 실행
'CS' 카테고리의 다른 글
[Network] HTTP 란 ? (0) | 2022.07.09 |
---|---|
[Network] TCP 와 UDP 의 차이 ? (0) | 2022.07.09 |
[Network] TCP/IP 란 ? (0) | 2022.07.09 |
[DB] 데이터베이스 인덱스(Index) (0) | 2022.07.09 |
[Network] OSI 7계층(feat.TCP/IP Updated) (0) | 2022.06.21 |