동기나 비동기에 대해서는 많이 접해봤는데 이번에 블로킹과 논블로킹 개념을 조사하라는 과제를 통해 해당 개념을 처음 접하게 되었다. 그래서 이해한 내용을 토대로 블로그에도 다시한번 정리해보려고 한다.
1. 블로킹, 논블로킹
- 블로킹 : 자신의 작업을 하다가 다른 작업 주체가 하는 작업이 시작되면 끝까지 기다렸다가 다시 자신의 작업을 시작한다. 즉, 결과가 올때까지 작업을 중단하고 대기한다.
=> 설계가 간단하지만 경우에 따라 효율이 떨어짐 - 논블로킹 : 다른 주체의 작업과 상관없이 자신의 작업을 계속한다.
=> 설계가 복잡하지만 경우에 따라 효율이나 반응속도가 더 뛰어남
언뜻 보면 다른 작업을 기다렸다가 작업을 하는지 여부에 따라 개념이 나뉘는 동기/비동기와 비슷해보인다. 내가 이해한 두 개념의 차이는 다음과 같다.
- 동기/비동기 : 다른 작업과 작업의 시작, 종료시간을 맞추는지 여부
- 블로킹/논블로킹 : 다른 작업의 주체가 작업하는 동안 기다리는지 여부
※ 블로킹/논블로킹과 동기/비동기 두 개념의 경우 실제로는 서로 크게 관련이 없는 별개의 개념이나, 차이점을 비교하면 더 자세히 이해할 수 있다.
2. 스레드
프로세스 내에서 프로그램 명령을 실행하는 흐름의 단위이다. CPU 이용의 기본 단위라고도 본다.
스레드는 같은 프로세스에 속한 다른 스레드와 코드, 데이터 섹션, 열린 파일이나 신호 같은 운영체제 자원들을 공유한다.
또한 스레드 ID, 프로그램 카운터, 레지스터 집합, 스택으로 구성된다.
일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이를 각각 싱글 스레드, 멀티 스레드라고 한다.
하나의 스레드로 두 작업을 처리하는 싱글스레드의 경우 한 작업을 마친 후 다른 작업을 시작하지만, 두 개의 스레드로 작업하는 멀티스레드의 경우 짧은 시간 동안 2개의 스레드가 번갈아 가면서 작업을 수행해서 동시에 두 작업이 처리되는 것과 같이 느끼게 한다. 하지만 스레드 간의 작업전환(문맥교환; context switching) 시간이 걸리기 때문에 오히려 두개의 스레드로 작업한 시간이 싱글스레드로 작업한 시간보다 더 걸릴 수도 있다. 작업 전환 시에는 현재 진행중인 작업의 상태와 정보 등을 저장하고 읽어오는 시간이 소요된다.
CPU 이외의 자원을 사용하는 작업의 경우 싱글스레드보다 멀티스레드 프로세스가 더 효율적이다.
(ex) 단순 CPU만 사용하는 계산작업
3. 싱글 스레드, 멀티 스레드
- 싱글 스레드: 한 프로세스에서 한 스레드 실행. 하나의 레지스터와 스택으로 표현.
(장점)
- 멀티스레드가 공용 자원을 사용하기 위해 하는 자원 접근 동기화 작업이 따로 필요하지 않음.
- 여러개의 프로세스가 하나의 프로세서를 공유할 때 발생하는 문맥 교환 작업을 요구하지 않아 비용이 덜 듦.
(단점)
- 여러 개의 CPU를 활용하지 못함(멀티스레드의 문제이기도 함)
- 멀티 스레드: 프로그램을 다수의 실행 단위로 나누어 실행.
프로세스 내에서 자원을 공유하며 자원 생성과 관리의 중복을 최소화.
서버가 많은 요청을 효율적으로 수행할 수 있는 환경 제공.
각각의 스레드가 고유의 레지스터와 스택으로 표현.
(장점)
- 기존프로세스에서 스레드를 생성하므로 새로운 프로세스를 생성하는 것보다 빠르다.
- 프로세스 자원과 상태를 공유해 효율적으로 운영 가능
- 프로세스 문맥교환보다 스레드 문맥교환이 더 빠름
(단점)
- 하나의 스레드만 실행중일 경우 실행시간 오히려 지연될 가능성
- 운영체제의 지원 필요
- 스레드 스케줄링 고려 필요
'블록체인 기반 핀테크 및 응용 SW 개발 > Javascript' 카테고리의 다른 글
과제를 통한 async, await 연습(+호이스팅, callback, promise 맛보기) (2) | 2021.01.22 |
---|---|
[JavaScript] setTimeout()의 형식과 익명함수, arrow 함수 공부 (1) | 2021.01.11 |