본문 바로가기
생각

<도둑맞은 집중력> 읽다가 멀티 스레드 공부 하게 된 이야기 : multiThread & concurrency 1

by 6161990 2024. 10. 6.

무려 칠만원어치.. 붕어빵이 몇개야

 

얼마 전 <도둑맞은 집중력> 을 읽어보았다. 흥미로웠던 부분은 '인간의 뇌는 멀티태스킹을 할 수 없다'는 주장이다. 인간의 뇌는 기본적으로 한 번에 하나의 작업에만 집중할 수 있도록 설계되어 있다. 그런데 우리가 여러 작업을 번갈아가며 수행하다 보면, '컨텍스트 스위칭'이 자주 발생한다. 이로 인해 두뇌의 효율이 떨어지고, 점점 더 둔해지는 것처럼 느껴진다.

 

뇌에서 발생하는 이 컨텍스트 스위칭을 '인지적 전환'이라고 부르는데, 이 과정에는 상당한 비용이 따른다. 그 이유는 전두엽의 용량. 멀티태스킹을 할 때, 한정된 전두엽의 자원이 여러 작업에 분산되면서 각 작업에 필요한 집중력이 점차 감소하기 때문이다. 나는 멀티 테스킹이 안되는 인간이라고 생각했는데 사실은 그게 자연스러운 일이라는 것에 심심한 위로를 받았다.

인간은 충분히 멀티 테스킹하지 않아보인다. 여기서 내 궁금증이 발발했다. 그럼 "우리의 애플리케이션은 충분히 멀티 테스킹한가? 어떻게 가능하게 만들지?" 였다. 

멀티 테스킹을 공부하게 된 이유다. 멀티 프로세스, 멀티 스레드 등 multi 때문에 발생하는 현상과 골치아픔에 대해서 내가 어떻게 컨트롤할 수 있는지에 대해서도 공부해보기로했다. 

먼저, multi 들의 개념과 그 개념과 관련된 용어들을 나는 다음과 같이 이해했다. 

멀티 코어와 멀티 테스킹
동시에 여러 개의 작업을 가능하게 하는 것이라는 공통점이 있다. 멀티 코어멀티 테스킹을 가르는 기준은 전자는 하드웨어적인 개념으로 하나의 CPU에 여러 개의 코어가 있는 것이고, 후자는 소프트웨어적인 개념으로 여러 프로세스가 동시에 실행되는 것을 말한다. 그래서 멀티 테스킹은 대중적으로 많이 통용되는 언어인데 반해 멀티 코어는 그렇지 않다. 하드웨어니까 그렇다고 생각한다. 

또 다른 차이점은 동시 작업 수행 여부이다. 멀티 코어는 여러 개의 코어(처리 유닛)를 가지고 있기 때문에, 각 코어가 동시에 병렬 처리(Parallel Processing)로 작업을 수행한다.
근데 멀티 테스킹은 하나의 CPU 가 여러 작업을 동시에 수행하는 것처럼 보이지만 사실은 시간 공유 기법을 통해 차례로 수행된다. 그 시간이 너무 빨라서 체감을 못하는 것 뿐이다. 여기서 차례 차례 수행된다는 것의 다른 말은 context switching, 시간 공유 기법을 통해 수행된다는 것의 다른 말은 시분할처리.

이 멀티 테스킹 개념을 가지고 있는 것이 바로 프로세스와 스레드이다. 

프로세스와 스레드
내 맥북 OS 안에는 유튜브 앱이 있는데, 앱을 실행시키지않으면 그건 그냥 프로그램이다. 앱을 직접 실행시키면 동작되는 것이 프로세스(Process) 다. 비유하면 .class 는 프로그램(program), instance는 프로세스(process)인거다. 동작하는 유튜브 애플리케이션 안에서 작업을 수행하는 하나하나는 스레드(thread)다. 스레드는 프로세스의 작업 단위이고 단일/멀티 스레드가 개념적으로 존재한다. 

스레드(들)는 프로세스의 자원을 공유하고 스레드 고유의 자원인 stack 을 할당받는다. 프로세스는 스레드가 실행될 수 있는 환경만 제공하는거고 그 안에서 스레드가 직접 이리 뛰고 저리 뛰며 일을 수행한다. 그래서 스레드에게 일을 시키는 것은 프로세스가 아니고 CPU다. 

CPU 와 스레드
CPU 는 스레드 단위로 작업을 실행한다. 프로세스 내에 있는 스레드를 움직이게 하는 게 CPU. CPU 가 여러 스레드를 처리할 때, context switching이 발생한다. 


지금까지 개념을 오늘 나의 하루로 대입해서 상상해보았다. 

 

10월 4일 일기 
날씨 이상함 

뿌링클 시켰는데 뿌링소스가 안왔다.
....
블로그에 뿌링소스 없이 뿌링클 먹은 기분을 기록해놓고 싶었다.
맥북으로 블로그 포스팅 하면서 유튜브를 봤다.






Mac OS 체제 안에서 블로그 애플리케이션으로 PROCESS1 이 실행되었을 것이다. 그리고 블로그 쓰기, 자동 저장과 같은 작업이 각각의 스레드에서 처리되었을 것이다. 유튜브도 시청했으니까 PROCESS2 도 실행되었을 것이다. 그리고 좋아요, 댓글 작성, vod 송출이 각 스레드에서 처리되었을 것이다. 여기서 PROCESS1PROCESS2 가 멀티 코어에서 동작하는지 싱글 코어에서 동작하는지 어떻게 알 수 있을까. 




해당 운영 체제의 하드웨어다. Apple M1 Pro 모델은 8코어다. 8개의 멀티 코어가 동작하는 CPU 에서 PROCESS1PROCESS2 가 동시에 병렬적으로 동작했을 것이다. OS 와 CPU 는 무슨 관계일까


OS 와 CPU
OS 는 CPU 가 어떤 작업(프로세스나 스레드)을 언제 실행할지 결정한다. 이 과정을 process scheduling 이라고한다. CPU 는 운영체제가 지시한 순서에 따라 각 프로세스를 실행하며, 컨텍스트 스위칭을 통해 여러 작업을 번갈아 가며 처리한다. CPU 는 다른 프로세스의 요청을 처리할 때 인터럽트를 발생시킨다. OS 는 이 인터럽트를 관리하여 CPU 가 다른 작업으로 원할히 넘어갈 수 있도록 돕는다. CPU 의 메모리 또한 OS 가 관리한다. OS 는 CPU를 돕는다. 


multi 한 환경들에 대해서 용어를 정리해보았다. 근데 컨텍스트 스위칭을 빼먹었다. 다음에는 여기에 대해서 좀 더 자세히 공부해봐야겠다. 
당분간 이 multi 한 것들이 애플리케이션 개발에 어떤 영향 가하는지 공부해보려고 한다. 축약하면, 멀티 스레드와 컨커런시..



참고글 
https://89douner.tistory.com/153
https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-multi-programming-tasking-processing
https://geekeno.wordpress.com/2010/09/24/%EB%A9%80%ED%8B%B0%EC%BD%94%EC%96%B4multi-core%EC%99%80-%EB%A7%A4%EB%8B%88%EC%BD%94%EC%96%B4many-core/
https://hongchangsub.com/cpu-scheduling-thread-multiple-processor-scheduling/