1. Process
- 프로세스란?
- 정의
- 메모리에 적재되어 실행되고 있는 프로그램의 인스턴스(붕어빵)
- 크롬은 프로그램 그 자체. 크롬의 객체? 페이지 등등 인스턴스라 할 수 있나…
- 운영체제로부터 시스템 자원(CPU시간, 실행하기 위해 필요한 독립된 메모리 영역)을 할당 받은 작업의 단위
멀티 프로세스?
-
정의
- 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
-
장점
- 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 그 자식 프로세스만 죽는 것 이상으로 다른 영향이 확산되지 않는다.
-
단점
-
문맥 교환(Context Switching)*에서의 오버헤드(리소스가 많이든다!)
-
Context Switching 과정에서 캐쉬 메모리 초기화 등 무거운 작업이 진행되고 많은 시간이 소모되는 등의 오버헤드가 발생하게 된다.
-
프로세스는 각 독립된 메모리 영역을 할당받았기 때문에 하나의 프로그램에 속하는 프로세스들 사이의 변수를 공유할 수 없다. 따라서 IPC라는 방법을 사용해야 하며, 이는 어렵고 복잡한 통신 방법이다.
2. Thread
-
정의
- 프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위
-
특징
- 스레드는 프로세스 내의 Code, Data, Heap 영역은 다른 스레드와 공유하고 Stack 영역을 따로 할당받는다.(중요)
- 프로세스와 해당 프로세스 내의 다른 스레드와 자원과 공간을 공유하면서 사용
멀티 쓰레드?
- 정의
- 하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것
- 장점
- 프로세스에 비해 메모리 공간과 시스템 자원 소모가 줄어들게 된다.(왜냐면 프로세스 안에 있는 애가 스레드니까, 프로세스를 많이 만들지 말고 이걸 만들어)
- 스레드 간 통신시, Data, Heap 메모리 영역(프로세스에서 공통하는 부분)을 이용해 데이터를 주고 받으므로 통신 방법이 간단하다.
- Context switching 시 PCB 및 캐시 메모리를 비울 필요가 없기 때문에 비용이 적고 더 빠르다.
- 단점
- 서로 다른 스레드가 Data, Heap 영역 등을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있다. (싱크가 안맞을 수 있다) 즉, 자원 공유 동기화 문제가 발생한다.
- 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받는다.(하나의 스레드는 그 프로세스의 데이터를 사용하므로.)
- Thread-safe
- 멀티스레드 환경에서 여러 스레드가 동시에 사용되어도 안전하다는 것을 말한다.
- 즉, 여러 스레드가 프로세스의 공유 자원(하나의 객체 및 변수)에 접근할 때, 공유 자원의 무결성을 보장하는(=자원 동기화가 잘 되지 않는 이슈 없이 의도한 대로 동작하는) 것을 말한다.
- 즉, 멀티 프로세스는 죽어도 프로그램은 돌아가지만 스레드가 죽으면 안돌아 갈 수 있다. 그래서 Thread safe 라는 걸 사용한다.
3. Asynchronous
1. 제어권과 동시성에 따른 분류
제어권 : 제어권은 자신(함수)의 코드를 실행할 권리 같은 것이다. 제어권을 가진 함수는 자신의 코드를 끝까지 실행한 후, 자신을 호출한 함수에게 돌려준다.
- 블로킹 vs 논블로킹 (제어권이 누구한테 있는가)
- 블로킹
- 함수 A가 함수 B를 호출한 뒤, 함수 B의 리턴값이 올 때까지 기다린 후 진행되는 것
- 즉, 제어권을 넘겨주는 것
- 논블로킹
- 함수 A가 함수 B를 호출한 뒤, 함수 B의 작업 완료 여부와 상관 없이 진행되는 것
- 즉, 제어권을 넘겨주지 않는 것
동시성 : 함수 A와 함수 B가 동시에 진행되는 것(처럼 보이는 것). 그러기 위해서는 특정 함수 A가 다른 함수 B의 결과값에 의존하는지가 중요하다.
- 동기 vs 비동기 (호출되는 함수의 작업 완료 여부를 신경쓰는가)
- 동기
- 함수 A와 함수 B를 호출할 때, 함수 A가 함수 B의 리턴값을 계속 확인하면서 신경 쓰는것
- 비동기
- 함수 A와 함수 B를 호출할 때, 함수 A가 함수 B의 작업 완료 여부는 신경 쓰지 않는 것
4. 요약
메모리에 적재되어 실행되고 있는 프로그램의 인스턴스
프로세스 내에서 프로세스의 자원을 이용하는 여러 실행 흐름의 단위
하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것
하나의 프로그램을 여러 개의 스레드로 구성하고 각 스레드가 하나의 작업을 처리하도록 하는 것
멀티 프로세스 vs 멀티 스레드, 언제 뭘 사용해야 하는가?
이 두 가지는 동시에 여러 작업을 수행한다는 점에서 같지만 적용해야 하는 시스템에 따라 적합/부적합이 구분된다.
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 Context Switching이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 가지고 있다.
반면, 멀티 프로세스 방식은 하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지하고 Context Switching에 많은 비용이 든다는 단점이 존재한다.
따라서 대상 시스템의 특징에 따라 오류가 나서 프로세스가 죽었을 때 크리티컬한 이슈가 발생하는지, Context Switching이 발생 빈도가 빈번한지 등을 따져 잘 선택해야 한다.
- 비동기가 왜 필요한가?
- 내가 구글에서 자동완성 사용할 때, A하나 치고 다음 P 칠 때까지 자동완성 기다려? 아니지? 그말은 내가 apple~~~등 쓰고 있을 때 구글은 비동기로 자동완성을 해주고 있는거야. 오케?
- 동기와 비동기 시각자료
- https://cotak.tistory.com/136