프로세스와 스레드, 멀티스레드
업데이트:
프로세스
프로세스란 실행 중인 프로그램을 말한다. 보통 프로그램과 많이 비교가 되는데 프로그램은 실행 코드, 프로세스는 메모리에 올라가 있는(적재된) 작업 단위이다. 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원, 스레드로 구성된다.
▪️ 프로그램 : 실행할 수 있는 파일 또는 프로그램
▪️ 프로세스 : 메모리에 적재되고 프로그램이 실행되고 있는 상태
상태
생성 new | 프로세스가 생성된 상태 |
실행 running | 명령어들이 실행되는 상태 |
준비 ready | 프로세스가 CPU로부터 메모리 공간을 할당 받길 기다리는 상태 |
대기 waiting | 특정 이벤트가 발생하길 기다리는 상태 |
종료 terminated | 프로세스가 실행을 끝마친 상태 |
상태전이
디스패치 Dispatch | 준비 → 실행 | 우선순위가 높은 프로세스를 선정하여 명령어 실행 |
보류 Block | 실행 → 대기 | 프로세스가 입출력(I/O)이나 자원 등을 기다리기 위해 대기로 전환 |
깨움 Wake Up | 대기 → 준비 | 입출력이 완료되거나 자원이 할당되어 다시 실행 |
시간제한 Timer Runout | 실행 → 준비 | 프로세스가 정해진 시간만큼 CPU 자원을 사용하고 반납 |
메모리 구성
하나의 프로세스는 아래 네 가지의 메모리 영역을 할당받는다.
코드 영역 Code | 실행할 프로그램의 코드 및 매크로 상수가 기계어 형태로 저장되는 영역 |
데이터 영역 Data | 코드에서 선언한 전역 변수와 정적 변수가 저장되는 영역 |
스택 영역 Stack | 함수 안에서 선언된 지역 변수, 매개 변수, 리턴값 등이 저장되는 영역. 함수 호출 시 기록, 종료 시 제거 |
힙 영역 Heap | 관리 가능한 데이터 이외의 다른 형태의 데이터를 관리하기 위한 공간. 동적 메모리 할당 공간 |
스레드
스레드란 프로세스 내에서 실제로 작업을 수행하는 주체로 프로세스보다 작은 작업 실행 단위이다. 모든 프로세스에는 한 개 이상의 스레드가 존재하는데, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스라 한다.
💡 사용 목적? 여러 작업 단위로 구성된 프로그램에서 요청을 동시에 처리하기 위해 사용한다.
▪️ 프로세스 : 독립적 실행, 각각 별개의 메모리
▪️ 스레드 : 프로세스 내의 메모리 공유, 빠른 전환 속도
각 스레드는 독립적으로 Thread ID, 프로그램 카운터 (PC), 레지스터 집합, 스택을 소유하고, 같은 프로세스 내에 스레드들은 서로 코드, 데이터 등의 시스템 자원을 공유한다.
사용 이유
▪️ 메모리 절약
▪️ Context Switching에 비해 오버헤드 절감
▪️ 작업들 간의 통신 비용 절감
💡 Context Switching? 현재까지의 작업 상태나 다음 작업에 필요한 데이터들을 저장하고 읽어오는 작업, 여러 프로세스가 하나의 프로세서를 공유할 때 발생한다.
종류
스레드를 지원하는 주체에 따라 아래 두 가지로 나눌 수 있다.
사용자 레벨 스레드 User-Level Thread | 커널 레벨 스레드 Kernel-Level Thread |
---|---|
커널 영역의 상위에서 지원, 사용자 레벨의 라이브러리를 통한 구현 | 운영체제가 지원, 커널이 스레드 생성 및 스케줄링 관리 |
빠른 속도 | 사용자 스레드에 비해 느린 생성, 관리 |
하나의 스레드가 중단될 경우 나머지 스레드 모두 중단 | 스레드가 중단되더라도 다른 스레드를 중단 없이 계속 실행 |
멀티스레드
멀티스레드는 두 개 이상의 여러 개의 스레드를 이용하는 프로그램이다. 멀티스레드에서 각각의 스레드는 하나의 독립적인 프로세스처럼 작업을 수행한다.
▪️ 멀티 프로세스 : 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행하는 것
▪️ 멀티 태스킹 : CPU 1개에서 여러 프로세스를 동시에 수행하는 것
▪️ 멀티 스레드 : 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것
⚠️ 주의: 멀티스레딩이 언제나 좋은 성능을 보이는 것은 아니다. 싱글 스레드가 더 효율적일 수 있다.
모델
▪️ 다대일 Many-to-One
하나의 커널 스레드에 여러 유저 스레드를 연결하는 모델로, 주로 커널 스레드를 지원하지 않는 시스템에서 사용된다. 한 번에 한 유저 스레드만 커널에 접근할 수 있어 여러 개의 스레드가 동시에 시스템 호출을 사용할 수 없다는 단점이 있다.
▪️ 일대일 One-to-One
하나의 커널 스레드에 하나의 유저 스레드가 대응하는 모델로 다대일 방식의 단점을 해결할 수 있다. 커널 스레드의 생성은 오버헤드가 크기 때문에 성능 저하가 발생할 수 있다는 단점이 있다.
▪️ 다대다 Many-to-Many
여러 유저 스레드에 작거나 같은 수의 커널 스레드가 대응하는 모델로 다대일 방식과 일대일 방식의 문제점을 해결하기 위해 나왔다. 커널이 유저 스레드와 커널 스레드의 매핑을 적절하게 조절한다.
장점
👍 응답성 Responsiveness : 작업을 분리해서 수행하기 때문에 사용자에게 실시간으로 응답할 수 있다.
👍 경제성 Economy : 프로세스를 새로 생성하는 것보다 스레드를 새로 생성하는 것이 훨씬 비용이 적게 든다.
👍 자원 공유 Resource Sharing : 자신이 속한 프로세스 내의 다른 스레드들과 메모리나 자원을 공유하여 효율적으로 사용할 수 있다.
👍 확장성 Scalability : 한 프로세스를 여러 프로세서에서 수행할 수 있다.
💡 프로세서? 컴퓨터 내에서 프로그램을 수행하는 하드웨어 유닛으로 중앙처리장치(CPU)를 의미한다.
단점
👎 싱글 코어 멀티스레딩은 스레드 생성 시간이 단일스레드보다 느리다.
👎 공유하는 자원에 동시에 접근하는 경우 의도하지 않은 값을 읽어오거나 수정할 수 있다. (동기화 작업 필요)
👎 프로그래밍 난이도가 높고, 스레드 수만큼 자원을 많이 사용한다.
싱글스레드
하나의 프로세스에서 하나의 스레드로만 실행하며 하나의 레지스터와 스택으로 표현한다.
장점
👍 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
👍 Context Switching 작업을 요구하지 않는다.
👍 프로그래밍 난이도가 쉽고, 자원을 적게 사용한다.
단점
👎 여러 CPU를 활용하지 못한다.
👎 하나의 작업이 완료되어야 다른 작업을 수행할 수 있다.
댓글남기기