[TIL] 프로세스와 스레드

Narastro·2021년 8월 2일
0

TIL

목록 보기
9/16
post-thumbnail

💻 프로세스

프로세스? 스레드?

  • 실행 중인 프로그램을 뜻한다. 디스크에 실행 파일 형태로 존재하던 프로그램이 메모리에 올라가 실행되면 비로소 프로세스가 된다.
  • 프로세스 내부에 CPU 수행단위가 여러 개 있는 경우를 말한다. 프로그램 카운터와 레지스터, 스택으로 구성되며, 코드,데이터, 힙을 공유한다. 스레드 이용시 응답성이 좋아지고 자원을 공유할 수 있고 프로세스 단위보다 생성과 문맥 교환시 오버헤드가 적으며 서로 다른 CPU에서 병렬적으로 일을 처리할 수 있다.

멀티 스레드 스케줄링 방식

멀티 스레드


  • 하나의 프로세스 내부에서 하나의 스레드는 하나의 코드 실행 흐름이기 때문에 여러 스레드(멀티 스레드)를 사용하면 동시 작업이 가능한 멀티 테스킹을 할 수 있다.

  • 이 때, 메모리에서 데이터를 가져오는 동안, 코어들이 잠시동안 동작을 멈추는데 이것을 Memory Stall 이라고 한다.

  • 멀티 스레드는 이처럼 하나의 코어가 메모리에 접근하는동안, 다른 코어를 실행시켜주는 방식이다.

  • 스레드들 간의 통신은 Code, Data, Heap 영역을 공유한다.

멀티 스레드 방식

우선순위 방식

우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링하는 것으로, 스레드 객체에 우선 순위 번호를 부여할 수 있기 때문에 개발자가 코드로 제어할 수 있다.

순환 할당(Round-Robin) 방식

시간 할당량(Time Slice)을 정해서 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행하는 방식이다.

출처: https://enfanthoon.tistory.com/56 [June Dev Blog]

멀티스레드 프로그래밍 스타일

  • Heterogeneous
    작업을 쪼개서 종류별로 다른 쓰레드에게 맡기는 스타일
  • Homogenous (event driven, data driven)
    작업을 쪼개서 쓰레드 구분없이 나누어 하는 스타일

출처: https://popcorntree.tistory.com/84?category=813524 [어떤 프로그래머]

운영체제 스레드 동작 방식

종류

  • User Thread
  • Kernel Thread

운영체제 스레드

User Thread는 User level의 Thread 라이브러리를 통해 관리되는 Thread를 말하며
Kernel Thread는 운영체제가 제공하고 직접 관리하는 Thread를 말한다.

스레드 모델

Multi-Thread에는 네 가지 모델이 있다.

1. Many-to-One model

  • 하나의 커널 스레드가 다수의 유저 스레드를 처리하는 구조
  • 유저 스레드 처리 중 시스템 콜에 의해 블록상태가 되면 전체 프로세스가 막히는 병목 현상이 일어남

2. One-to-One model

  • User Thread 한 개당 Kernel Thread를 대응시켜 작업을 진행하는 구조
  • kernel Thread의 과도한 생성의 문제

3. Many-to-Many model

  • 다수의 User Thread를 다수의 Kernel Thread가 처리하는 구조
  • Kernel Thread의 숫자는 User Thread의 숫자보다 같거나 작게 할당

4. Two-Level model

  • 최종적으로 보완된 모델
  • Many-to-Many model과 One-to-One model을 합친 구조
  • 중요한 작업은 One-to-One 구조를 통해 처리
  • 나머지는 Many-to-Many 구조를 통해 처리
  • 혹시나 있을 중요한 작업에서의 기다림 현상을 줄일 수 있다.

내 방식과의 차이

  • 스레드에 대한 별도 구현 없음...
  • 스레드풀 vs 단순 계산
    (스레드를 매번 만들지 않고 재사용한다)

프로세스에 대해선,

  • PCB vs 프로세스 내부 프로퍼티
    (운영체제, 커널의 자료구조이며 운영체제가 프로세스를 표현)
  • 준비큐) LinkedList vs 단순 배열/최소힙
  • 등등..

프로세스가 많아질 때 성능 향상 방법

  • 멀티 스레드든 분산처리든 멀티코어든 병렬처리를 한다. (멀티스레드가 우선)
    단, 너무 스레드가 많아지면 콘텍스트 스위치에 의한 오버헤드 때문에 비효율적이다.
  • 그래도 안되면 "컴퓨터를 재부팅한다." (프레세스를 죽여라...)

🧭 타이머

SetTimeout 내부 동작

"기본적으로 자바스크립트는 싱글 스레드를 통해 동작한다"
"setTimeout, setInterval, HTTP요청, 이벤트핸들러는 비동기 처리 방식으로 동작한다."
-자바스크립트 Deep Dive-

내부 동작 그림 블로그

  • setTimeout 은 항상 이전의 콜백의 실행 후로부터 지연시간을 갖게 된다.

  • setInterval 은 이전 콜백 실행 여부와 상관없이 항상 지연시간마다 실행하려고 시도한다.

출처: https://mygumi.tistory.com/316 [마이구미의 HelloWorld]

정확도 높은 타이머 구현 방법

  • setTimeout 제외하면 setInterval을 쓰자...(?) <-위의 이유로 정확함
  • sleep을 이용하면 어떻게 정확히하지? (block 후 함수 실행, 비동기 아님)

⚽ Semaphore, Mutex

'공유자원 관리’

Mutex


화장실을 이용하는 사람은 프로세스 혹은 쓰레드이며 화장실은 공유자원, 화장실 키는 공유자원에 접근하기 위해 필요한 어떤 오브젝트이다.

출처: https://worthpreading.tistory.com/90 [Worth spreading]

Semaphore


세마포어는 손님이 화장실을 좀 더 쉽게 이용할 수 있는 레스토랑이다. 세마포어를 이용하는 레스토랑의 화장실에는 여러 개의 칸이 있다. 그리고 화장실 입구에는 현재 화장실의 빈 칸 개수를 보여주는 전광판이 있다. 사람들은 나오면서 빈 칸의 개수를 1씩 더한다. 그리고 기다리던 사람은 이 숫자에서 다시 1을 뺀 다음 화장실로 돌진한다.

출처: https://worthpreading.tistory.com/90 [Worth spreading]

어떤 경우?

  • 데이터 무결성
  • 데드락 예방

출처

profile
Earn this, Earn it.

0개의 댓글