단일 스레드, 멀티 스레드

윤주헌's avatar
Sep 02, 2024
단일 스레드, 멀티 스레드
스크립트라고 적힌거는 다 기생언어다
브라우저는 html없으면 실행 안됨! js는 브라우저가 해석해주는데 즉 html이 없으면 해석 안해준다
 
스크립트라는 언어는 원래 브라우저가 있어야 움직이는데 V8엔진을 크롬에서 때서 node.js(자바 런타임환경같이)를 만들었다
 
쉽게 말하면 node.js는 java브라우저 해석기다
node.js는 스레드가 한개다
 
멀티스레드는 IO에 약하다 단일 스레드가 좋다
파이썬에 보면 플라스크(마이크로 웹 프레임 워크)가 있다
스프링이 너무 썩어서 (만드는게 느려서) 장고 이런 것 사용했었다.
자바는 파이썬 보다 안정적이고 리플랙션이라는 장점이 있다.
훨신 쌔련되고 짧다 매료됨…
 

단일스레드가 왜 좋은지 요즘 서버는 왜 멀티 스레드를 안 쓰는지

서버에 요청이 들어오면 request 생긴다(재 사용이지만) 또 요청하면 또 reqeuset생긴다
지금은 총 2개
2개가 같이 DB쪽으로 동시에 가야한다
동시에 이동하려면 CPU가 2개가 있어야 한다 하지만 CPU는 한개라 왔다 갔다 해야한다 1인 2역을 해야한다.
결국 시분할 해야한다(라운드로빈)
이게 스레드다
  • 스레드
💡
실이다
실이 하나가 있는데 (Main스레드) 모든 프로그램은 OS한테 스레드 1개를 빌린다
실 끝까지 타고 가면 끝난다 java에서는 이 실이 메인 스택이다
스레드에 런이 왜 있을까? 콜백되는거임 os야 스레드 한개 더 필요한데 ? run도 하나의 실의 길이다
만약 메인의 실이 끝났다 끝난건가? 아니다 메인 실에 연결된 다른 실도 끝나야 끝나는 거다
 
스레드 늘리면 단점 → 왔다 갔다 동시에 하는 것처럼 보여줘야 한다 즉 느려진다.
 
스레드가 프로그램 빠르게 할 수 도 있다.
그림 두 개에 넘나들면서 그리는데 첫 번째 그림 그리다 두 번째 그림으로 넘어가려면 context를 저장해야한다(즉 어디까지 완료했나 말하는 것) 두 번째 그리다가 다시 첫 번째 그림으로 돌아가야 하니까
 
컨택스트 스위칭이 생기면서 느려짐 왔다 갔다 하면서 하다가 DB앞에서 트랜잭션이 걸렸어
  1. T1 트랜잭션 걸리는 순간 T2는 못 들어감
  1. DBMS에 insert요청하면 하드로 저장해야지? → IO(인풋하는것) 즉 IO요청하고나서 3초걸린다 하자 T1은 3초 기다려야 한다. 3초 wait됨(멍때리는 시간) T2는 총 6초 기다림 6초 기다리는게 왜 낭비냐? 새로운 스레드 들어오면 request또 만들어짐 애도 db까지 가야함 T1다 됐는지 체크 하고 T2도 체크하고 다시 새로운 스레드 출발 왔다 갔다 하면서 무한정 한다 스레드 재워버릴 수도 있는데 이러면 응답을 못 받는다. 여기서 뭘 제거하면 빨라질까? 3초 wait하는거, rqeuset가고 있으면 → IO환경에 취약함 IO시간때문에 기다리는 시간이 걸린다. CPU에서만 놀면 기다리는 시간이 없음 IO는 다 MVC다 무슨 요청 들어오면 DB가야함 퍼포먼스 안 좋음 NIO → nonblockingIO라고 한다 IO때문에 블로킹되지 말라고 NIO서버는 이렇게 동작한다 외부에서 요청오면 서버에서 reqeust하나 만들고 CPU가 할 수 있는 모든 일들 다 하고 레파지토리에서 느려짐 IO에서 3초걸림 그니까 3초 걸리기 전에 메모장 만들어서 (첫번째 리퀘스트 IO중)적고 쌩까고 2번째 요청 기다림 , 또 새로운 reqesut객체 만들고 할거 다하고 또 적음(R2 IO중 ) 계속 기록함 → 잠깐 할 일이 없을 때가 있음 → 이제 메모장 가서 일들이 처리 됐는지 확인하고 된 것은 보내고 안 됐으면 놔두고 다시 또 일이 밀렸어 요청 처리 하다가 또 메모장 가서 다 해결됐나 확인하고 해결된 애 처리함
 

예시

  • 멀티 스레드
아이스커피 주세요 하면 바로 커피 만들러 가면 주문은 wait, 하나 만들고 주고 다시 주문 받고
  • 단일 스레드
일단 주문 다 받아서 메모장에 적어두고 손님은 자리에 가 있고 커피를 하나씩 만들고 만들면 주고 만들면 주고 한다.
 
이벤트 루프라고 한다 프로미스라고 한다(비동기 처리되는것 반드시 약속 처리한다)
 
  • 프로미스
💡
비동기 작업의 결과를 나중에 받을 수 있게 해주는 객체
왔다 갔다 안해서 빠름
 
  • 왜 단일 스레드를 사용하는 거에요?하면
💡
1. 서버는 IO를 무조건 한다 그래서 멍때리는 시간이 생긴다 멍 때리는 시간동안 스래드는 wait가 걸린다
  1. 하지만 비동기로 하면 wait도 안 걸리고 처리 계속 한다
 
나무그리고 DB에서 데이터 올때까지 기다리다가 오면 집 그린다
 
멀티 스레드
 
나무, DB데이터, 집 스레드 3개로 해봄
나무 조금 집 조금 다시 나무조금 집 조금 씩 그린다 느리다
 
좋은거는 단일 스레드 보다는 다 왜냐면 하나 딱 그리고 데이터 올 때까지 멈춰있는 것처럼 보여서
 
  • 비동기
💡
일의 순서가 없다 아주 효과적이다!
  • 동기
💡
일의 순서가 있다
 
Share article

code-sudal