[THREAD]스레드
스레드
명령어가 CPU 를 통해서 수행되는 객체의 단위
프로세스 내에는 반드시 1개 이상의 스레드가 존재
레드는 같은 프로세스에 있는 자원과 상태를 공유
같은 프로세스 내의 스레드는 같은 주소 공간에 존재, 동일한 데이터에 접근 가능. 또한 하나의 스레드가 수정한 메모리는 같은 메모리를 참조하는 스레드에 영향. 하나의 스레드에서 오픈한 파일을 다른 스레드가 사용 가능, 프로세스가 종료되면 그 프로세스에 속해있던 스레드도 함께 종료.
스레드 필요성
프로세서 내에서 여러 요청들을 동시에 처리해야 할 때
하나의 프로서스 안에서 동시에 여러 루틴을 사용해야 할 때 여러 스레드가 독립적으로 수행한다.
스레드 구성요소
- 가상 CPU - 인터프리터, 컴파일러에 의해 내부적으로 처리되는 가상 코드입니다.
- 수행 코드 - Thread Class에 구현되어 있는 run() Method 코드
-
처리 데이터 - Thread에서 처리하는 데이터
-
인터프리터(Interpreter)
- 전체 파일 스캔, 한번에 번역
- 초기 스캔시간이 길지만, 한번 실행 파일이 만들어지면 빠름
- 기계어 번역과정에서 더 많은 메모리 사용
- 전체 코드를 스캔하는 과정에서 모든 오류를 한꺼번에 출력, 실행 전 오류를 알 수 있음
- 대표적인 언어로 C, C++, JAVA 등
- 컴파일러(Compiler)
- 한 번에 한 문장씩 번역
- 실행 시간이 느림
- 오브젝트 코드 생성과정 없어, 메모리 효율이 좋음
- 프로그램을 실행시키고 나서 오류를 발견 시 바로 실행 중지. 실행 후 오류를 알 수 있음
- 대표적인 언어로 Python, Ruby, Javascript 등
스레드 특징
- 프로세스 내에서 실행되는 흐름의 단위. 하나의 스레드는 시작해서 종료할 때까지 한번에 하나씩 명령들을 수행
- 각 스레드마다 call stack이 존재(call stack: 실행 중인 서브루틴을 저장하는 자료 구조), 나머지 Code, Data, Heap 영역은 스레드 끼리 공유. 반면 프로세스는 다른 프로세스의 메모리에 직접 접근 불가
- 스레드는 다른 스레드와 독립적으로 동작. 따라서, 두 개 이상의 스레드 동작 시, 두 개 이상의 스레드의 실행 및 종료순서는 예측불가
싱글 스레드 & 멀티 스레드
싱글스레드
- 프로세스가 단일 스레드로 동작하는 방식
- 레지스터, 스택으로 표현
- e.g. 자바스크립트
장점
- 자원 접근에 대한 동기화 불필요. 여러 개의 스레드라면 공용 자원에 대한 접근을 제어 필요. 즉, 모든 스레드가 일정 자원에 동시에 접근하거나, 똑같은 작업을 실행하려는 경우, 에러가 발생하거나 원하는 값이 나오지 않음. 따라서, 스레드들이 동시에 같은 자원에 접근하지 못하도록 제어 필요
- 문맥 교환(context switch) 작업 불필요. 문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업, 많은 비용 발생 프로그래밍 난이도가 쉽고, CPU 메모리를 적게 사용.
단점
- 여러 개의 CPU를 활용 불가. 멀티 코어 머신에서 CPU 사용을 최적화 불가. 최적화를 위해선 Cluster 모듈을 이용하여 여러 프로세스를 사용 가능. 하지만 프로세스의 자원 공유는 어렵기 때문에 Redis(데이터베이스, 캐시, 메시지 브로커 및 대기열로 사용하는 빠른 오픈 소스 인 메모리 데이터 스토어) 같은 부가 인프라 필요.
- 연산량이 많은 작업 시, 완료되어야 다른 작업을 수행 가능.
- 에러 처리를 못하는 경우 멈춤. 멀티 스레드 모델은 에러 발생 시 새로운 스레드를 생성하여 극복
멀티스레드
하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행
멀티 프로세스(multi process)는 여러 개의 CPU를 사용하여 여러 프로세스를 동시에 수행
시스템 자원의 활용 극대화, 처리량 증대로 단일 프로세스 시스템 효율성 증가
멀티스레드 장점
- 작업을 분리해서 수행하므로 실시간으로 사용자에게 응답 가능
- 한 프로세스를 여러 프로세서에서 수행, 효율적
멀티스레드 문제점
- 주의 깊은 설계, 까다로운 디버깅
- 단일 프로세스 시스템에서 효가 기대 불가, 다른 프로세스에서 스레드 제어 불가
- 자원 공유 문제가 발생, 하나의 스레드에 문제가 전체 프로세스에 영향
- 문맥 교환 작업을 요구. 문맥 교환이란 다른 태스크(프로세스, 스레드)가 시작할 수 있도록 이미 실행 중인 태스크(프로세스, 스레드)를 멈추는 것
- 데드락(Deadlock, 교착 상태), 뮤텍스(Mutex), 세마포어(Semaphore)
동시성과 병렬성의 차이
동시에 돌릴 수 있는 스레드 수는 컴퓨터 코어 개수로 제한. 운영체제(또는 가상 머신)는 각 스레드를 시간에 따라 분할하여, 여러 스레드가 일정 시간마다 돌아가면서 실행함 - 시분할
- Concurrency(동시성, 병행성) - 여러 개의 스레드가 시분할 방식으로 동시에 수행되는 것처럼 착각하게 함
- Parallelism(병렬성) - 멀티 코어 환경에서 여러 개의 스레드가 실제로 동시에 수행됨
댓글남기기