동시성 프로그래밍 공부를 하다가.. 개념 정립이 안 되어 있다고 느껴서 관련 자료를 찾아보며 공부해 보았다.
프로그램 - 프로세스 - 멀티프로세스/멀티스레드 이런 처리 과정을 잘 알고 있으면 코드를 이해하고,작성하는데 도움이 될 것 같다.
* 코어와 스레드 *
CPU 코어 (Centeral Processing Unit) - 중앙 처리 장치
싱글코어의 경우.. 일하는 사람이 1명이라고 생각하면 됨.
CPU는 한 번에 1가지 일만 처리 가능함.
예전에는 한명으로도 충분했는데(여러가지 작업이 있다고 해도 하나씩 계속 처리하면서 다음 작업으로 넘어감)
시간이 지나며 연산량이 더 많아지자.. CPU의 클럭을 높이는 방식으로 이를 대처함
*무어의 법칙 - 18개월마다 컴퓨팅 성능은 2배씩 빨라질 것이다.
하지만 발열문제를 잡지 못해서 싱글코어의 해가 저물었음
-> 멀티코어의 시대 시작
다만 멀티코어도 처음에는 문제가 많았음.
우선 업무를 분배하는 거 자체가 어렵기도 하고(사람이 한 명 더 생겼다고 일이 2배로 빨라지지는 않는 것처럼 ㅎ)
코드 자체가 싱글스레드에서 가장 잘 동작하도록 작성되어 있는 게 대부분이기도 하고..
이런저런 문제로 싱글코어 일 때 보다 멀티코어일 때 더 느린 경우도 있었음.
하지만 싱글코어의 경우 발열문제라는 한계에 봉착했기 때문에
멀티코어에서 코어간의 통신에 대한 연구들이 이루어짐
스레드는?
하드웨어적 스레드와 소프트웨어적 스레드는 다름
2002년에 인텔에서 Hyper-Threading Technology를 발표
하나의 코어를 2개의 스레드로 용도를 나눠서 마치 물리적인 코어가 2개인 것처럼 작동하게
코어 내부를 스레드로 나눠서 작업을 병행하는 방식
(몸은 하나 손은 2개 느낌)
소프트웨어에서 스레드는.. time division multiplexing 즉 시분할 다중화를 통해
다수의 스레드 인스턴스가 동시에 각자의 일을 하는 것처럼 보이는것
*프로세스와 스레드*
실행단위: cpu core에서 실행하는 하나의 단위로 프로세스와 스레드를 포괄하는 개념
프로세스: (부연 설명이 없다면) 하나의 스레드만 가지고 있는 단일 스레드 프로세스
동시성: 한 순간에 여러가지 일이 아니라, '짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것'
1.프로그램과 프로세스
피자집에 가서 피자를 달라고 했는데 피자 레시피가 적힌 종이만 준다면..?
여기서 레시피가 우리가 열심히 짜는 코드, 즉 프로그램이다.
프로그램은 실행시키 전에는 그저 코드가 적혀있는 파일에 불과함.
-> 레시피(프로그램)에 적힌대로 피자를 만들면(실행하면) -> 프로세스가 됨.
하드디스크의 프로그램이 실행되면 프로세스가 필요로 하는 재료들(코드,데이터,힙,스택)이 메모리에 올라감.
코드 - 실행 명령을 포함하는 코드들
데이터 - Static 변수, Global 변수
힙 - 동적 메모리 영역
스택 - 지역변수, 매개변수, 반환 값 등 일시적인 데이터
또한 해당 프로세스에 대한 정보를 담고 있는 PCB(Process Control Block) 블럭이 함께 생성됨
Pointer - 프로세스상태 중에 준비상태나 대기상태의 큐를 구현하기 위해
Process State - 현재 프로세스의 상태를 담고 있음
Process Number(PID) - 고유번호를 담음
Program Counter - 다음 명령어를 가리킴
이외에 Registers, Memory limits, List of open files ...도 있음
예시 상황을 들어보자
유튜브로 노래를 듣고, xcode를 키고, 슬랙을 키고, 카톡을 키고 크롬을 켜 둔 상태
(여러 프로세스를 동시에 사용)
하지만 원래 한 프로세스가 실행되기 위해서는 cpu를 점유하고 있으면 다른 프로세스는 실행상태에 있을 수 없음
다수의 프로세스를 동시에 실행하기 위해 여러개의 프로세스를 시분할로(짧은 텀을 반복하며) 전환해서 실행시킴
각각 PCB블럭이 실행, 준비 상태를 왔다갔다 하며 cpu에 적재 되었다 내려갔다 함
이를 Context Switching이라고 함
-> 복잡하기 때문에 경량화된 프로세스 버전인 스레드가 등장함
부모 프로세스 밑에 여러 스레드가 있다면, 각 스레드는 코드, 데이터, 힙 영역을 공통자원으로 사용함
각 스레드는 스택 부분만을 따로 가지고 있음 (모든 데이터를 다 빼고 넣고 할 필요가 없음)
*멀티 프로세스와 멀티 스레드*
-> '''처리 방식의 일종임 (한 앱에 대한 처리 방식)'''
한 어플리케이션이 여러가지 일을 처리하는 상황이다.
여러 사용자가 로그인을 요청하는 상황에서.. 한 프로세스는 하나의 요청만 해결할 수 있어서
부모 프로세스를 포크해서 자식 프로세스를 만듦. 이 때 자식 프로세스는 부모와 별개의 메모리 영역 확보
스레드는 '한프로세스 내에서 구분지어진 실행 단위'
한 어플리케이션에 대한 작업의 단위가 나누어질 때가 많다.
이 때 각각의 스레드가 작업들을 담당하는것
멀티프로세스
- 각 프로세스는 독립적
- IPC를 사용한 통신
- 자원 소모적, 개별 메모리 차지
- Context Switching 비용 큼
- 동기화 작업 필요 없음
멀티스레드
- 스레드끼리 긴밀하게 연결되어 있음
- 공유자원(코드,데이터,힙)으로 통신 비용 절감
- 공유자원 덕분에 메모리가 효율적
- Context Switching 비용 적음
- 공유자원 관리 필요
멀티스레드의 장점이 많아 보이는데..?
인터넷 쓰다가 작동중지 화면을 봤을 것이다.
여러 탭을 띄워놓고 일하다가 하나 멈추면.. 갑자기 인터넷 창 전체가 꺼짐
-> 멀티스레드를 이용했기 때문
스레드가 긴밀하게 연결되어 있기 때문에 하나의 스레드에 문제가 생기면 전체 프로세스에 영향이 감
크롬은 멀티프로세스를 이용함
-> 멀티 탭간 연관 덜 받음
멀티코어
- 동시성(Concurrency)
- 병렬 처리(Parallelism)
싱글코어를 가진 CPU가 실행 단위를 처리 할 때는
동시에 여러가지를 진행하기 위해 빠른 텀으로 전환해가며 실행함 -> 이것이 동시성의 개념
여러 실행단위를 번갈아 실행하면서 동시에 일어나는 것처럼 보이게 하는 것
"짧은 순간에 cpu의 시간을 분할해서 동시에 하는 것처럼 보이게 하는 것"
멀티코어는?
물리적으로 여러 코어를 사용해서 다수의 실행단위를 '한 순간에 처리할 수 있음'
요약
1. 프로세스는 프로그램(코드)가 실행 된 것이다.
2. 스레드는 '한 프로세스 내에서 나뉘어진' 하나 이상의 실행 단위이다.
3. 한 어플리케이션에 대한 작업을 동시에 하기 위해서는 2가지 처리 방식(멀티 프로세스/멀티 스레드)가 있다.
4. 동시에 실행이 되는 것처럼 보이기 위해서
실행단위는 시분할로 cpu를 점유하여(실행,준비) context switching을 한다.
5. 멀티 프로세스는 '독립적인 메모리'를 가지고 있지만, 멀티 스레드는 '자원을 공유'한다.
6. 멀티코어는 하드웨어 측면에서 실행 단위를 병렬적으로 처리할 수 있도록 여러 프로세서가 있는 것.
//참고 자료
//https://youtu.be/iks_Xb9DtTM
//https://youtu.be/_dhLLWJNhwY
//https://youtu.be/1grtWKqTn50
'Computer Science' 카테고리의 다른 글
JSON Parsing (0) | 2023.04.16 |
---|---|
디자인 패턴 (MVC, MVP, MVVM) (0) | 2023.03.27 |
C? C++? C#??? 기계어, 어셈블리어, 고급언어와 함께 (0) | 2023.03.19 |
메모리? Memory (0) | 2023.03.13 |