단일 스레드(Single Thread)
프로세스 내 제어 스레드 1개. 1개의 레지스터, 1개의 스택
🔸 장점 : 자원을 다른 리소스와 공유하지 않아. context switch 불필요(장점이라고 말하기 애매함)
🔹 단점 : 다수개의 CPU 활용이 불가
멀티스레드(Multi Thread)
프소세스 내 제어 스레드 여러개. 프로그램을 다수의 실행 단위로 나누어 실행. 각각의 스레드가 고유의 레지스터와 스택으로 표현
🔸 장점 :
일부가 차단되거나 장시간 작업 수행시에도 계속해서 실행 가능.
프로세스의 자원과 상태를 공유 효율적인 운영(프로세스는 공유메모리, 메세지 전달 기법을 통해서만 자원을 공유할 수 있음 ➡️ 프로그래머는 이를 위해 어떤 코딩을 해야해. 하지만 스레드는 자동으로 자기가 속해있는 프로세스들의 자원과 메모리들을 공유함(별다른 작업이 필요없음)).
자신이 속한 프로세스의 자원을 공유하기 때문에 스레드를 만들고 context switch를 진행하는 것이 더 경제적.(프로세스를 생성하는게 스레드를 생성하는 것 보다 훨씬 오래 걸린다)
다수개의 코어에서 병렬로 프로세스 실행.
응답성이 좋다.
멀티스레딩 모델
✔️ 다대일 모델 :
다수의 유저 스레드가 하나의 커널 스레드에 매핑
한번에 하나의 스레드만 커널에 액세스 할수 있으므로 멀티 스레드는 멀티코어 시스템에서 병렬로 실행할 수 없음. ➡️ 비효율적인 모델
✔️ 일대일 모델 :
각각의 유저 스레드를 커널 스레드와 매핑
더 많은 병렬성, 그러나 사용자 수준 스레드 생성시에도 커널 스레드 생성이 필요하다는 단점
유저수준에서 끝낼일도 커널스레드가 필요하다는 단점
✔️ 다대다 모델 :
많은 유저 레벨 스레드를 더 작거나 같은 수의 스레드로 다중화
커널 스레드 수는 응용프로그램이나 특정 기계로부터 특정되어짐
개발자는 필요한 만큼 많은 유저 스레드 생성 가능
스레드가 봉쇄형 시스템 호출 발생시에도 커널은 다른 스레드 수행을 스케쥴 할 수 있음
✔️ 2단계 모델 : (다대다 + 일대일)
많은 유저 레벨 스레드를 더 작거나 같은 수의 스레드로 다중화
또한 한 유저 스레드가 하나의 커널 스레드에만 매핑되는것을 허용
스레드 풀
🔸 장점
🔹 단점
[실습💻 멀티스레드 구현 예시]
JAVA 코드
private ExecutorService executorService;
public void sampleFunc(final sampleVO samplevo) {
// 스레드 풀 생성
excutorService = Executors.newSingleTreadExecutor();
Runnable task = new Runnable(){
@Override
public void run(){
/*application code 생략*/
} };
Try{
// excute 이용해서 스레드 실행
executorService.execute(task);
} catch(Exception e){ }
// 스레드 사용 후 종료
executorService.shutdown();
}
Tomcat 서버의 server.xml
<Connector port="8009"
protocol="HTTP/1.1"
connectionTimeout="5000"
disableUploadTimeout="true"
...
maxSpareThreads="75"
maxThreads="500"
minSpareThreads="25"
/>
minSpareThreads : connector 생성할때 최초 스레드 생성할때 생성할 스레드 갯수
maxThreads : 최대 스레드 수. CPU 사용량이랑 관계가 있어.
https://bit.ly/3FVdhDa
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.