배경
- 병렬 연산을 하기 위해 알아보다가 파이썬 모듈인 ProcessPoolExecutor , ThreadPoolExecutor를 알게됨
- 처음에 의도한 병렬 연산은 ProcessPoolExecutor 였고, ThreadPoolExecutor은 i/o작업에 특화됐다는걸 알수있었다.
- 이런 용도의 차이를 만들어 내는 구조적 차이를 알고자 한다.
용어정리
- 프로그램
프로그램이 실행되면 프로세스 인스턴스가 생성된다. 인스턴스가 생성된다는 의미는 프로그램 실행에 필요한 내용이 컴퓨터 메모리(Ram)에 적재된다는 뜻이다.
- 프로세스: 메모리에 적재되고 CPU 자원을 할당받아 프로그램이 실행되고 있는 상태, 여러 크롬창중 하나를 닫으면 프로세스 하나가 닫힌다.
- 스레드의 탄생 : 프로세스 하나만을 사용하기 때문에 다운이 완료될때까지 하루종일 기다려야 했다. 그렇다고 동일한 프로그램을 여러 개의 프로세스로 만들게 되면, 그만큼 메모리를 차지하고 CPU에서 할당받는 자원이 중복되게 될 것이다. 스레드(Thread)는 이러한 프로세스 특성의 한계를 해결하기 위해 탄생 .
프로그램 | 프로세스 |
어떤 작업을 하기 위해 실행할 수 있는 파일 | 실행되어 작업중인 컴퓨터 프로그램 |
파일이 저장 장치에 있지만 메모리에 올라가지 않은상태 | 메모리에 적재되고 CPU 자원도 할당받아 프로그램이 실행중인 상태 |
쉽게 말해 그냥 코드 덩어리 | 그 코드 덩어리를 실행한 것 |
프로세스와 스레드의 구조
- Code 영역은 프로그램의 실행 코드가 저장되는 메모리 부분입니다. 이 영역에는 컴파일된 소스 코드의 기계어 명령이 저장되며, 프로세스 내의 모든 스레드가 이 코드를 공유하여 실행합니다. 각 스레드가 동일한 함수나 명령을 실행할 수 있는 이유는 이 코드 영역을 공유하기 때문입니다.
- Data 영역은 전역 변수와 정적 변수(static variables)를 저장합니다. 이 영역의 데이터는 프로그램의 시작부터 종료까지 유지되며, 프로세스 내의 모든 스레드가 이 데이터를 공유할 수 있습니다. 이는 스레드 간에 데이터를 공유하거나 통신하는 데 사용될 수 있는 중요한 메커니즘을 제공합니다.
- Heap 영역은 동적으로 할당된 데이터(예: 프로그램 실행 중에 malloc() 또는 new 연산자를 통해 생성된 데이터)를 저장하는 곳입니다. 힙 영역은 런타임에 크기가 결정되며, 스레드는 동적으로 생성된 객체를 공유하기 위해 이 영역을 사용합니다. 힙은 자유롭게 확장 또는 축소될 수 있으며, 여러 스레드가 액세스하므로 동기화 문제를 주의해야 합니다.
- Stack 영역은 각 스레드가 자신만의 스택을 가지고 있으며, 함수 호출 시 전달되는 매개변수, 반환 주소 및 지역 변수 등이 저장됩니다. 각 스레드의 스택은 독립적으로 운용되므로 스레드 간에 스택 데이터를 직접 공유하지 않습니다. 이는 스레드가 함수 내에서 생성한 변수들을 독립적으로 관리할 수 있게 하며, 스레드 실행의 독립성을 보장합니다.
- 요약하면 프로세서는 물리적 코어갯수, 스레드는 논리적 코어갯수.
- 그렇다면 위 사진처럼 16스레드로 컴퓨터의 수백개의 작업을 어떻게 실행할까?
-> CPU의 작업처리방식 때문이다.
스레드와 코어를 이용한 CPU의 작업처리 방식
- 병렬성 : 여러 처리 유닛이 동시에 다양한 계산 작업을 실행하는 것을 의미합니다. 이는 여러 CPU 코어를 사용하여 동시에 여러 작업을 처리할 수 있게 해줌.
- 동시성 : 단일 CPU에서 여러 프로세스 또는 스레드가 효율적으로 실행될 수 있도록 관리하는 기법으로, 여러 작업을 번갈아 가며 처리하여, 동시에 일어나는 것처럼 보이게 하는 방식.
- 차이점 : 병렬성과 동시성은 모두 시스템의 멀티태스킹을 개선하고자 하는 목적은 같지만, 접근 방식과 사용 케이스에 차이가 있습니다. 병렬성은 여러 작업을 동시에 완료하는 데 초점을 맞추며, 동시성은 작업 처리를 최적화하여 시스템의 부하를 관리하고 효율을 높입니다.
추가
- (동시처럼 보이는 가짜)동시성은 왜 필요할까?
클럭을 계속 올리면 동시 여러작업이 가능할텐데, CPU 발열 때문에 한계가 있다.
따라서 작은공간에 물리적으로 코어를 많이 늘리는데 집중하고, 논리적 코어인 스레드까지 영끌해서 쓰는것
- 멀티태스킹 : OS를 통해 CPU가 작업하는데 필요한 자원(시간)을 프로세스 또는 스레드간에 나누는 행위를 말한다. 이를 통해 여러 응용 프로그램을 동시에 열고 작업 할 수 있다는 장점이 있다. 음악을 들으면서, 웹서핑을 하고, 메신저의 메시지를 확인할 수 있는 이유는 모두 멀티태스킹 덕분. 사실 CPU는 한번에 한가지 명령어밖에 처리하지 못한다. 즉, 동시가 아닌 재빠르게 프로세스들을 번갈아가며 실행하고, 관리하는 것
자료 출처
아래 링크 : 아주 뛰어난 개발자가 더 잘정리했으니 들어가볼것!
'그때그때 CS 정리' 카테고리의 다른 글
OS에서 알아야 할 네트워크 설정 모음 (1) | 2024.07.05 |
---|---|
나만의 코드 규칙 정립 (0) | 2024.06.30 |
파이썬 병렬 스레드 연구 (0) | 2024.06.20 |
파이썬 병렬 실행 연구 (0) | 2024.06.20 |
비동기 프로그래밍(asyn,aiohttp, aiofiles,aiomysql)은 뭘까? (0) | 2024.06.19 |