[프로그래밍] 싱글스레드 vs 멀티스레드

WONNY_LOG·2023년 7월 4일

STUDY

목록 보기
4/6

스레드란?

프로세스가 할당받은 자원을 이용하는 실행의 단위

  • 하나의 프로세스 내에서 동시에 진행되는 작업 갈래, 흐름의 단위
  • 프로세스 내부에 있는 CPU의 작업 단위


공장3에 각각 스레드1
공장1에 각각 스레드2

싱글 스레드

프로세스 내에서 하나의 메인스레드만으로 작업을 처리한다

장점

컨텍스트 스위칭 작업 없음
컨텍스트 스위칭 작업 비용이 발생하지 않는다

동기화 필요 없음
오직 하나의 스레드가 혼자 자원을 사용하기 때문에 다른 스레드에 의해 값이 바뀔 일 이없음

단순 CPU만 사용하는 작업일때 추천
모든 작업을 하나의 스레드에서만 진행하고 컨텍스트 스위칭 작업이 일어나지 않기 때문에, 작업전환(context switching)시간이 적게 소요된다

쉬운 난이도와 적은 메모리 사용
프로그래밍 난이도가 쉽고, CPU, 메모리를 적게 사용한다 (코스트가 적게 든다)

단점

여러개의 CPU사용 불가
프로세서를 최대한 활용하기 위해선 여러개의 프로그램 인스턴스를 실행시키거나 외부에서 여러 개의 프로그램 인스턴스를 실행시키는 방법을 사용해야 한다.
이러한 방법의 문제는 다수의 프로그램 인스턴스가 어떻게 상태를 공유할 것인가의 문제

순차적인 작업 수행
연산량이 많은 작업을 해야하는 경우, 앞선 작업이 완료되어야 다른 작업을 수행할 수 있다
ex) 싱글스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 다운로드하는 동안 유저는 아무 액션도 취하지 못한다

낮은응답성
에러발생 시 처리를 하지 못하고 멈추는 경우가 생긴다

싱글스레드기반의 언어

자바스크립트

node.js
자바스크립트는 싱글스레드 환경
자바스크립트에서 비동기는 어떻게?
자바라면 기존 흐름을 이어가던 스레드가 작업을 하다 비동기 작업을 만나면 새로운 스레드가 기존 스레드와 동시에 작업한다.

node.js는 싱글스레드를 효율적으로 사용할 수있는 이벤트 루프 방식을 선택함

멀티 스레드

두개 이상의 스레드를 갖는 프로세스 (프로그램을 둘 이상 실행 시킴)


A스레드에서 다음 B스레드로 이동이 컨텍스트 스위칭을 통해 일어난다 > 스위칭이 일어나면서 부분적으로 조금씩 각각의 스레드에 대한 작업을 끝냄

장점

응답성
프로그램의 스레드 중 하나가 중단되거나 긴 작업을 수행하더라도 프로그램 수행이 계속 되어 사용자 응답성이 증가한다
ex) 멀티스레드가 적용된 웹 브라우저 프로그램에서 하나의 스레드가 이미지 파일을 다운로드하는 동안, 다른스레드에서 검색 혹은 영상 플레이 가능

경제성
프로세스 내 자원들과 메모리를 공유하기 때문에 메모리 공간과 자원소모가 줄어든다.
스레드 간 통신이 필요한 경우에도 쉽게 데이터를 주고 받을 수 있고, 프로세스의 컨텍스트 스위칭과 달리 스레드간 컨텍스트 스위칭은 캐시 메모리를 비울필요가 없기 때문에 더 빠르다.

멀티프로세서의 활용
다중CPU(프로세서) 구조에서는 각각의 스레드가 다른 프로세서에서 병렬로 수행될 수 있으므로 병렬성이 증가한다

단점

느린 생산시간
컨텍스트 스위칭, 동기화 등의 이유 때문에 싱글 코어 멀티 스레딩은 스레드 생성 시간이 오히려 오버헤드로 작용해 단일 스레드보다 느리가

동시성 이슈
멀티스레드는 레지스터와 스택을 제외한 코드, 데이터, 파일 자원(데이터, 힙영역)을 공유하기 때문에 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다.
때문에 동기화 작업을 통해 작업 처리 순서를 컨트롤하고 동시에 같은 자원에 대한 접근을 막아야해야한다.
이로 인해 데드락 현상이 발생하여 성능이 저하 될 수 있다는점 주의 !

운영체제 지원
멀티스레딩을 위해서 운영체제의 지원이 필요하다

높은 난이도
프로그래밍의 난이도가 높다. 또한 스레드 수만큼 자원을 많이 활용한다

멀티스레드기반의 언어

C언어, Java, Python


멀티 스레드 vs 멀티 프로세스

  • 멀티프로세스는 각 프로세스가 독립된 메모리를 가지고 동작한다. 때문에 컴퓨터 내 자원을 많이 소모함
  • 멀티스레드는 하나의 프로세스 내에서 여러개의 스레드들이 각 각 움직여 내부의 메모리를 공유하한다. 때문에 프로그램이 가벼워짐 (비교적 컨텍스트 스위칭 비용이 저렴함)

프로세스 > 프로세서로 움직이고 > 프로세스 내에서의 움직임 단위가 스레드가 됨



데드락

시스템 자원에 대한 요구가 뒤엉킨 상태를 나타낸다

즉, 스레드가 여러개 있다보니 특정 스레드는 자신이 작업을 진행할 기회를 얻지 못해 죽어버림

데드락 예방

  • 자원의 상호 배제 조건 방지 : 한 번에 여러 프로세스가 공유 자원을 사용할 수 있게 한다. 그러나 추후 동기화 관련 문제가 발생할 수 있다.
  • 점유 대기 조건 방지 : 프로세스 실행에 필요한 모든 자원을 한꺼번에 요구하고 허용할 때까지 작업을 보류해서, 나중에 또다른 자원을 점유하기 위한 대기 조건을 성립하지 않도록 한다.
  • 비선점 조건 방지 : 이미 다른 프로세스에게 할당된 자원이 선점권이 없다고 가정할 때, 높은 우선순위의 프로세스가 해당 자원을 선점할 수 있도록 한다.
  • 순환 대기 조건 방지 : 자원을 순환 형태로 대기하지 않도록 일정한 한 쪽 방향으로만 자원을 요구할 수 있도록 한다.



자바스크립트는 싱글스레드언어인데 어떻게 비동기적 처리가 가능할까

  • 자바스크립트 자체는 싱글스레드가 맞다.
    하지만 자바스크립트 엔진은 독립적으로 실행되지 않고, 런타임 영역에서 구동되기 때문에 멀티 스레드라고 할 수 있다.
    → 자바스크립트 비동기 동작의 핵심 요소는 런타임이 가지고 있다.
    → 대표적인 자바스크립트 런타임 : Browser, Node.js
  • 자바스크립트 엔진은 콜 스택과 메모리 힙만 담당하고 나머지는 브라우저 영역에서 담당한다.
    → 이처럼 실제로 자바스크립트 엔진은 독립적으로 실행되지 않고, 런타임(웹 Browser or NodeJS같은) 멀티 스레드 환경에 임베디드되어 실행된다.

*임베디드: 기계나 기타제어가 필요한 시스템에 대해, 제어를 위한 특정 기능을 수행하는 컴퓨터 시스템으로 장치 내에 존재하는 전자시스템이다
*런타임: 어떤 프로그래밍 언어가 동작할 수 있는 프로그램
자바스크립트 동작원리









싱글스레드 vs 멀티스레드
싱글스레드 vs 멀티스레드
Node.js
데드락
멀티스레드

0개의 댓글