Programming Language/Python

[Python] GIL 관련 OS, 컴퓨터구조가 중요한 이유

깜태 2021. 2. 18. 11:55
728x90

안녕하세요 오늘은 그동안 프로그래밍을 하는 입장에서 하나둘씩 공부해보다가 제가 배운 걸 도움이 될까하여 씁니다.

평소에 단순하게 소규모의 코딩만 하다가 어느 순간 많은 데이터를 다루게 되면 속도 이슈가 나오게 되고, 

고민해서 검색해보면 멀티프로세싱, 멀티쓰레드 쓰면 속도가 향상된다는 이야기가 나옵니다.

 

멀티프로세스, 멀티쓰레드가 빠를까요?? 어떨 때 써야할까요??

 

이런 얘기를 하다보면 자연스럽게 운영체제, 컴퓨터구조에 관한 이야기로 빠지게 됩니다.

 

기본적으로 알아야 할 것은 프로세스와 쓰레드의 차이입니다.

용어 설명부터 들어가보면,

프로세스는 컴퓨터 입장에서 실행되어 돌아가는 프로그램입니다.

쓰레드는 무엇일까요? 쓰레드는 프로세스 내부에서 동작하는 실행하는 흐름의 단위입니다.

 

프로세스 내부엔 쓰레드가 존재하지만, 쓰레드는 프로세스를 가질 순 없습니다. (프로세스 ⊃ 쓰레드)

 

그리고 멀티쓰레드와 멀티프로세스의 가장 큰 차이는 자원 공유입니다.

왼쪽의 이미지에서 multi-threading은

1 프로세스를 두고 같은 자원을 쓰레드가 사용하고 있지만,

우측의 이미지에서 Multi-processing은 각각의 프로세스가 자원을 다르게 쓰는 것을 볼 수 있습니다.

 

그럼 Multi-threading과 Multi-processing은 언제 나눠서 쓰는걸까요??

 

Multi-Process와 Multi-Thread을 구분 이유들이야 여러 가지가 있겠지만, 제 생각은

 

- 프로세스 간 통신인지, 프로세스 내 통신 (프로세스 간 자원 공유)

- I/O에 대해서 병목현상이 있는 경우

- 컴퓨터의 자원 여유 상황

 

에 따라 다르다고 생각합니다.

잠깐, 컴퓨터 구조에 대한 설명을 해보겠습니다.

위의 이미지는 컴퓨터 입장에서 걸리는 시간을 보여줍니다.

 

Multi-Thread

 

만약 제가 파일을 읽어와서, print를 진행했다고 생각해봅시다.

적어도 disk 에서 읽는데 10ms 가 걸리는데 그 동안 해당 프로세스는 대기 상태가 됩니다.

CPU 기준으로는 4달이나 가만히 있어야 하는 매우 비효율적인 시간입니다

 

조금 더 확장해서 만약 제가 100만 개의 파일을 읽어서, 하나씩 합치는 작업을 가정해봅시다.

그럼 1번째 파일을 읽고, 합치고, 2번째 파일을 읽고, 합치고, ... 100만개 파일을 읽고 합치는 작업이 있기 까지

사람에겐 오래 걸리는 시간은 아니지만, CPU는 4달 X 100만번의 시간을 기다리고 있어야 합니다.

 

이런 상황에서 Thread를 이용한다면 어떨까요?

Thread를 이용하면 디스크가 읽는 동안에 합칠 순 있겠지만 합칠 데이터가 아직 오지 않아서 마찬가지로 기다려야 합니다.

 

다른 가정을 하나 해봅시다.
파일을 읽고 print만 하는게 아니라 CPU 시간으로도 오래 걸리는 작업이라고 가정하면,
파일 I/O를 기다리는 동안에 다른 작업이 가능합니다.

한 프로세스에서 I/O 시간동안 생기는 작업들을 thread를 이용하면 실행시간을 단축시킬 수 있게 됩니다.

 

Multi-Processing

위의 가정을 다시 불러와서 100만개의 파일을 1개씩 순차적으로 print를 진행한다고 생각해봅시다.

Thread를 이용해 속도는 개선되더라도, 일하는 사람이 한 명이라면 어쩔수 없는 제약이 있을 겁니다.

이 때, Multi-Processing을 이용하면 프로세스의 개수를 늘리게 되는데, 이는 일하는 사람의 수를 늘리는 작업이 됩니다.

100만 개의 작업을 10명이서 나눠서 한다면, 1명당 10만개의 작업이 되고 그만큼 시간도 단축됩니다.

 

이렇게 보면 Multi-Process는 요즘 PC같이 multi-core 환경에선 무조건 좋아보입니다. 

실제로 웬만하면 성능개선이 되지만, 만능일까요?

 

Multi-Processing vs Multi-Thread

만약 CPU 개수가 적으면, Multi-Processing을 하기 어려운 상황이라 제약이 생깁니다.

Multi-Processing으로 속도를 개선시킬 수 있어도, I/O 작업이 많다면 Multi-Processing이 만능은 아닐 겁니다.

코드를 보면 일부는 Thread로 전환해야 속도 개선시킬 수 있는 케이스가 있을 수 있습니다.

 

아는 바가 짧아서 I/O 의 상황에서만 Multi-Thread 를 적었지만 이외에도 더 있을 수도 있습니다.

보완할 내용이나 지적할 내용 있으면 댓글 달아주세요 :)

감사합니다.

 

 

[출처]

[1]:formulusblack.com/blog/compute-performance-distance-of-data-as-a-measure-of-latency/

[2]:https://m.blog.naver.com/alice_k106/221566619995

728x90