운영체제

스레드와 동시성

스레드(Thread)

  • CPU 활용의 기본 단위
  • 프로세스 내에서 프로그램 명령을 실행하는 기본단위
  • 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성
  • 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, open files 등의 운영체제 자원 공유

단일 스레드(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
본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.

profile
Devops, AWS에 관심있어요.

0개의 댓글