동기/비동기, 블로킹/논블로킹에 대해 공부하다가 문득 프로세스, 스레드, 코어에 대해 궁금증이 생겨서 알아보았습니다. 대학생때 OS수업에서 배웠는데 벌써 까먹은...
그럼 각 용어에 대한 설명부터 해보고 본격적인 설명에 들어가겠습니다.
1. CPU 코어
코어는 CPU 내에서 실제적인 연산과 명령 처리를 담당하는 부분입니다. 한 개의 CPU에 여러 개의 코어가 있을 경우, 각 코어는 독립적으로 명령을 실행할 수 있습니다. 듀얼코어, 쿼드코어 등 우리에게 친숙한 단어입니다.
2. CPU 쓰레드
한 코어 내에서 두 개 이상의 명령 스트림(스레드)을 동시에 처리할 수 있는 능력을 말하며 이를 하이퍼쓰레딩 기술이라고 부르기도 합니다. 하이퍼스레딩은 하나의 물리적 코어가 두 개의 논리적 스레드로 작동할 수 있게 합니다. 역할은 OS의 쓰레드의 역할과 비슷합니다. 다만 CPU 쓰레드는 CPU자원을 효율적으로 사용하기 위한 방법입니다.
3. 프로세스
프로그램이 독립적인 메모리와 CPU 자원을 할당받아 실행중인 상태를 말합니다. 이때 메모리는 크게 4개로 나눌 수 있습니다.
- stack - 지역변수나 호출되는 함수
- heap - 생성자, 인스턴스와 같은 동적 데이터
- data - 전역변수, static 변수, 상수 등
- code - 기계어로 변역된 코드
각각의 프로세스가 독립적이라면 서로 메모리를 공유할 방법은 전혀 없나요?
당연히 있습니다. inter-process communication(IPC), local inter-process commnunication(LPC), 별도 공유 메모리 방식이 있지만 지원 부담이 크다는 문제가 있습니다.
4. 쓰레드 (소프트웨어)
하나의 프로세스 내에서 여러개의 스레드가 사용되는것을 의미합니다. 이 방식은 heap, data, code 공유를 통해서 CPU 자원과 메모리 사용의 효율성을 높힙니다.(stack은 따로 할당하여 독립성을 보장합니다) 자세한 설명은 조금만 미뤄두겠습니다.
그렇다면 이제부터 시간 순서대로 각각이 어떻게 "멀티"로 변화해왔고 왜 그렇게 바뀌었는지 알아보겠습니다.
5. 멀티 프로그래밍 (단일 코어, 단일 프로세스 시절)
핵심 문제: CPU의 쉬는시간
가장 처음은 멀티 프로그래밍입니다. 프로세스가 CPU를 독점하면서 다른 작업은 대기해야 했습니다. 이러한 방식은 비효율적이었고, 하드웨어 자원의 낭비가 심했습니다. 멀티프로그래밍은 여러 프로그램을 메모리에 동시에 유지하여 언제든 다른 작업이 수행될 수 있도록 하였습니다.
6. 멀티 프로세싱 (프로세스 아님)
핵심 문제: 더 복잡한 연산
하지만 여전히 너무 느렸고 더 빠른, 더 많은 작업이 수행되는걸 원했습니다. 이 문제를 해결하기 위해 물리적인 CPU를 늘리는 방법이 고안되었습니다. 사람으로 치면 직원 수를 더 뽑은 격입니다.
7. 멀티 태스킹, 멀티 프로세스
핵심 문제: 응답속도, 동시성
멀티 프로그래밍은 자원 활용을 개선했지만, 사용자의 작업 처리에 있어 빠른 응답 시간과 동시성을 제공하는 데는 한계가 있었습니다. 타임 슬라이싱 기법을 사용하여, 각 작업에 공평하게 CPU 시간을 할당하고, 빠른 컨텍스트 스위칭을 통해 사용자에게 동시에 작업이 수행되는 듯한 환경을 제공하였습니다.
물리적으로 코어는 1개 인데 어떻게 2개의 작업이 동시에 일어날 수 있는거지?
우리는 여기서 "동시"라는 것을 다시 생각해보아야 합니다. 우리가 보는 영상이 사실은 사진을 아주 작은 시간단위로 이어붙인것이지만 우리는 그것을 움직인다라고 인식합니다. 사진인걸 알면서도 크게 인지할 수 없기 때문에 암묵적으로 영상으로 바꾸어 말합니다. 여기서도 이런 원리를 활용합니다.. 하나의 주체이지만 인지하지 못할정도로 빠르게 2개의 작업을 번갈아 시행하면 마치 2개의 작업을 하는 것처럼 보입니다. 비록 우리가 알고있는 "동시"가 아니지만 우리가 인지하기엔 충분히 "동시"입니다. 이런 원리로 프로세스를 번갈아 실행하는 것을 context switching이라고 부릅니다.
8. 멀티 스레드
핵심 문제 - 큰 프로세스의 컨텍스트 스위칭 비용
멀티 프로세스가 동시성을 개선해주었지만 효율적인 자원 사용과 빠른 응답 시간을 요구하는 다중 프로그램 환경이 일반화되면서, 운영 체제가 여러 작업을 동시에 관리할 수 있는 능력이 필요했습니다. 이 때문에 시간과 비용을 좀 더 줄일 수 있는 방법이 필요했는데 프로세스 내부에 서로 자원을 공유하면서 작업을 수행하는 스레드를 만들어 프로세스의 context switching의 횟수와 비용을 줄이는 방법이 고안되었습니다.
9. 멀티 코어
핵심 문제 - 단일코어 CPU의 한계
CPU의 클록 속도 증가에 따른 열 문제와 성능의 물리적 한계에 직면하여, 여러 개의 코어를 하나의 CPU 칩에 통합하는 멀티코어 프로세서가 등장했습니다. 이는 병렬 처리 능력을 향상시키고 더 많은 작업을 동시에 처리할 수 있게 만들었습니다.
10. CPU 멀티 스레드
핵심 문제 - 코어의 효율적인 사용
명령어 파이프라이닝과 동시 멀티스레딩을 활용하여, 한 시점에 여러 명령어를 처리할 수 있습니다. 예를 들어, 하나의 스레드가 데이터를 메모리에서 읽는 동안 다른 스레드가 연산을 수행할 수 있습니다.
# Reference
https://www.youtube.com/watch?v=XNGfl3sfErc&ab_channel=널널한개발자TVhttps://www.youtube.com/watch?v=H01FkDtllwc&ab_channel=널널한개발자TVhttps://velog.io/@wonhee010/동기vs비동기-feat.-blocking-vs-non-blockinghttps://inpa.tistory.com/entry/👩💻-동기비동기-블로킹논블로킹-개념-정리
https://inpa.tistory.com/entry/👩💻-프로세스-⚔️-쓰레드-차이
chatgpt
'개발중 생기는 WHY' 카테고리의 다른 글
웹과 앱을 하나의 백엔드 API로 운영할 수 없을까? (0) | 2023.04.28 |
---|---|
Question Queue (0) | 2022.12.24 |
뛰어난 개발자가 되기위한 덕목 (0) | 2022.11.24 |
Spring을 왜 공부해야 하는가 (0) | 2022.11.22 |