💻 프로세스
프로세스? 스레드?
- 실행 중인 프로그램을 뜻한다. 디스크에 실행 파일 형태로 존재하던 프로그램이 메모리에 올라가 실행되면 비로소 프로세스가 된다.
- 프로세스 내부에 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-
내부 동작 그림 블로그
출처: 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]
어떤 경우?
출처