배성재님....ㅠㅠㅠ
오늘은 면접을 볼 때 나왔던 질문을 공부 할까 한다.
개인적으로도 궁금한 부분이었다.
스레드는 CPU의 이용의 기본 단위다.
프로세스 내에서 프로그램 명령을 실행하는 기본 단위이자 흐름, 개체라고 할 수 있다.
스레드는 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택 으로 구성된다.
스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 열린 파일이나 신호와 같은 운영체제 자원들을 공유한다.
프로세스에 하나의 제어 모델이 있으면 단일 스레드이며,
프로세스가 다수의 제어 스레드를 가진다면 다중 스레드 모델이다.
하나의 프로세스에서 하나의 스레드 실행
하나의 레지스터와 스택으로 표현
프로그램을 다수의 실행 단위로 나누어 실행
프로세스 내에서 자원을 공유하여 자원생성과 관리의 중복을 최소화
서버가 많은 요청을 효율적으로 수행할 수 있는 환경을 제공
각각의 스레드가 고유의 레지스터와 스택으로 표현됨
1) 자원 접근에 대한 동기화를 신경쓰지 않아도 된다.
여러 개의 스레드가 공유된 자원을 사용할 경우 각 스레드가 원하는 결과를 얻게 하려면 공용 자원에 대한 접근이 통제되어야 하며 이 작업은 프로그래머에게 많은 노력을 요구하고 비용을 발생시킨다.
=> 단일 스레드 모델에서는 이러한 작업이 필요하지 않다.
2) 문맥 교환(context switch) 작업을 요구하지 않는다.
문맥 교환은 여러 개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 작업으로 많은 비용을 필요로 한다.
1) 여러 개의 CPU를 활용하지 못한다.
프로세서를 최대한 활용하게 하려면 cluster 모듈을 사용하거나 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다. 이 때 고려해야할 문제가 있는데, 바로 다수의 프로그램 인스턴스가 어떻게 상태를 공유할 것인가에 대한 문제다.
(사실 이것은 멀티 스레드 환경의 서버 프로그램도 확장성을 확보하기 위해 풀어야 할 숙제이긴 하다.)
단순하고 빠른 메모리 기반 NoSQL 데이터 베이스인 Redist가 좋은 고려대상이다.
하지만 서버 프로그램 인스턴스 간 상태 공유를 최소화하거나 가능하면 없애는 방향으로 아키텍처를 설계하는 것이 가장 바람직한 방법이라고 한다.
1) 새로운 프로세스를 생성하는 것보다 기존 프로세스에서 스레드를 생성하는 것이 빠르다.
2) 프로세스의 자원과 상태를 공유하여 효율적으로 운영이 가능하다
3) 프로세스의 문맥교환보다 스레드의 문맥교환이 더 빠르다.
1) 하나의 스레드만 실행중일 때에는 실행시간이 되려 지연될 수 있다.
2) 멀티 스레딩을 위해 운영체제의 지원이 필요하다.
3) 스레드 스케쥴링을 신경써야 한다.
두 개의 작업을 하나의 쓰레드로 처리하는 경우와 두 개의 쓰레드로 처리하는 경우를 가정해보자.
하나의 쓰레드로 두 작업을 처리하는 경우는 한 작업을 마친 후에 다른 작업을 시작하지만, 두 개의 쓰레드로 작업 하는 경우에는 짧은 시간동안 2개의 쓰레드가 번갈아 가면서 작업을 수행해서 동시에 두 작업이 처리되는 것과 같이 느끼게 한다. 하지만 오히려 두 개의 쓰레드로 작업한 시간이 싱글쓰레드로 작업한 시간보다 더 걸릴 수 도 있는데 그 이유는 쓰레드간의 작업전환(context switching)에 시간이 걸리기 때문이다.
=>그래서 단순히 CPU만을 사용하는 계산작업이라면 오히려 멀티쓰레드보다 싱글쓰레드로 프로그래밍하는 것이 더 효율적이다.
=> CPU 이외의 자원을 사용하는 작업의 경우에는 싱글쓰레드 프로세스보다 멀쓰레드 프로세스가 더 효율적이다.
(참고 : 프로세스간 또는 쓰레드간의 전환을 컨텍스트 스위칭(context switching)이라고 한다.)
출처: https://server-engineer.tistory.com/273 [HelloWorld]
싱글 스레드 하면 노드가 가장 먼저 생각나기 때문에 찾아 보았다.
결론부터 말하자면
라고 한다
출처: 블로그 클릭!
잘 봤습니다 :)