스레드
스레드란?
: 프로세스의 실행 가능한 가장 작은 단위. 프로세스의 특정한 수행 경로이자 프로세스 내에서 실행되는 여러 흐름의 단위이다.
멀티스레딩
: 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법
- 한 스레드가 중단(blocked)되어도 다른 스레드는 실행(running)상태일 수 있어서 빠른처리가 가능합니다.
- 동시성에도 큰 장점이 있습니다.
- 하지만 한스레드에 문제가 생기면 다른 스레드에도 영향을 끼쳐 프로세스에 영향을 줄 수 있습니다.
#동시성이란?
: 서로 독립적인 작업들을 작은 단위로 나누고 동시에 실행되는 것처럼 보여주는 것
공유 자원
: 여러 스레드가 동시에 접근할 수 있는 데이터 또는 리소스
예를 들어, 한 프로그램에서 여러 스레드가 동시에 파일을 읽거나 쓰는 경우를 생각해보세요. 이 파일은 공유 자원이 될 수 있습니다. 여러 스레드가 파일을 동시에 수정하려고 하면, 데이터 손실이나 불일치가 발생할 수 있습니다. 이러한 경우에는 적절한 동기화 메커니즘이나 잠금(locking)을 사용하여 공유 자원에 안전하게 접근해야 합니다.
임계 영역
: 여러 스레드가 동시에 접근할 때 데이터 손상이나 불일치를 일으킬 수 있는 코드 부분
한 예시로는 은행 계좌에서 잔액을 수정하는 프로그램을 생각해볼 수 있습니다. 잔액을 수정하는 코드 부분이 임계 영역이 될 것입니다. 다수의 스레드가 동시에 잔액을 수정하려고 할 때, 잘못된 잔액이 계산될 수 있습니다. 이를 방지하기 위해 임계 영역에는 적절한 동기화 메커니즘이나 잠금(lock)을 사용하여 한 번에 하나의 스레드만 접근하도록 해야 합니다.
#상호 배제
: 한 프로세스가 임계 영역에 들어갔을 때 다른 프로세스는 들어갈 수 없다.
#한정 대기
: 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안 된다.
#융통성
: 한 프로세스가 다른 프로세스의 일을 방해해서는 안 된다.
뮤텍스
: 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금 해제하는 객체
세마포어
: 간단한 정수 값과 두 가지 함수 wait 및 signal로 공유 자원에 대한 접근을 처리
모니터
: 모니터는 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원을 숨기고 해당 접근에 대해 인터페이스만 제공
교착상태
: 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
#원인
- 상호 배제 : 한 프로세스가 자원을 독점해서 다른 프로세스들이 접근 불가능
- 점유 대기 : 특정 프로세스가 점유한 자원을 다른 프로세스가 요청하는 상태
- 비선점 : 다른 프로세스의 자원을 강제적으로 못 가져옴
- 환형 대기 : 프로세스들이 서로가 서로의 자원을 요구하는 상황
#해결 방법
- 자원 할당 시 애초에 조건이 성립되지 않도록 설계
- 프로세스당 요청할 자원들의 최대치를 통해 자원 할당 가능 여부를 파악하는 '은행원 알고리즘' 사용
- 교착 상태 발생 시 사이클을 확인하고 관련된 프로세스를 한 개씩 삭제
은행원 알고리즘
: 총 자원의 양과 현재 할당한 자원의 양을 기준으로 안정 또는 불안정 상태로 나누고 안정 상태로 가도록 자원을 할당하는 알고리즘
예상질문
- 스레드(Thread)와 프로세스(Process)의 차이는 무엇인가요?
: 스레드는 프로세스 내에서 실행되는 작업 단위이며, 여러 스레드는 같은 프로세스 내에서 공유된 자원을 사용할 수 있지만, 프로세스는 독립적인 실행 단위입니다.
- 동기화(Synchronization)와 관련하여 스레드 간의 통신 방법에 대해 설명해주세요.
: 스레드 간의 통신에는 공유 메모리, 메시지 전달 등의 방법이 사용됩니다.
- 어떤 것이 스레드의 생명주기를 구성하고 있습니까?
: 스레드의 생명주기는 생성, 준비, 실행, 대기, 종료 단계로 구성됩니다.
정리
스레드는 프로세스 내에서 독립적으로 실행될 수 있는 작업 단위로, 프로그램의 동시성을 구현하는 핵심 요소입니다. 여러 스레드는 같은 프로세스의 자원을 공유하며, 각각의 스레드는 독립적인 실행 경로를 가지고 있어서 병렬로 실행될 수 있습니다. 스레드는 동시성 문제를 해결하기 위해 적절한 동기화 메커니즘을 사용하여 공유 자원에 안전하게 접근해야 합니다.