OS를 보다보면, 참 멀티라는 단어가 많이 나온다. 가지고 있는게 공룡책 영문뿐이라, 파파고 돌려도 빡셀 때도 있고, 그렇다고 Chat GPT한테 물어봐도, 꼬리를 무는 식으로 묻다보면,
"네, 맞습니다. 제가 이전에 설명한 내용 중 혼동이 있었습니다. 죄송합니다."
답변이 많이 나와서, 따로 구글링하여 정리해보려 한다.
베이스가 된 자료는 https://www.youtube.com/watch?v=QmtYKZC0lMU
한글로는 거기서 거기같은 의미지만, 큰 차이점이 존재한다. 둘 다 작업(프로세스 혹은 스레드)을 효율적으로 하기 위해 사용되는 방법이지만, 동시성은 여러 작업을 아주 짧은 시간으로 나누어 번갈아 작업하는 것이라면, 병렬성은 실제로 2개 이상의 작업을 같이 수행한다.
스레드와 프로세스의 개념에 대해 간단하게 요약하면 다음과 같다.
- 프로세스는 프로그램을 실행시켜 메모리에 적재된, 프로그램의 인스턴스를 말한다. 각각의 프로세스는 독립된 메모리 공간을 할당 받는다. 이러한 프로세스는 각각 독립적이며, 다른 프로세스의 메모리 공간에 접근할 수 없다.
- 스레드는 프로세스 내에서 실행되는 작업의 흐름의 단위이며, 모든 프로세스는 하나 이상의 스레드를 가지고 있다. 스레드는 프로세스 내에서 stack만 따로 할당 받으며, code, data, heap 영역은 공유한다.
한 번에 하나의 프로그램만 실행한다. 즉, 하나의 프로세스만이 CPU를 점유하며 다른 프로세스는 실행될 수 없고, 해당 프로세스가 끝나야 실행할 수 있다.
프로세스에서 I/O 작업을 해야한다면, 그동안은 CPU는 아무것도 하지 않는 상태가 되고, I/O 작업이 완료된 후 다시 프로세스를 실행시키게 된다.
이러한 방식은 CPU가 아무것도 안하는 시간이 있기 때문에, CPU 사용이 비효율적이다.
P1과 P2 프로세스가 메모리에 올라왔을 때, P1이 실행되다, I/O 요청이 들어오면, CPU는 P2를 실행시킨다. (Context Switching).
만약 P2에 IO 요청이 들어왔음에도, P1에서 IO 작업이 완료되지 않았다면, 그동안은 CPU는 아무 일도 하지 않는다.
이러한 방식도 단점이 있는데, 프로세스의 CPU 점유 시간이 길어진다면, 다른 프로세스는 계속 대기를 하게 된다.
멀티 프로그래밍 방식은 하나의 프로세스의 CPU 점유 시간이 길어지면, 그동안 다른 프로세스는 대기를 해야 한다는 단점이 존재한다.
프로세스가 CPU를 점유할 때, 짧은 시간 동안, CPU를 사용하여, 여러 프로세스를 동시에 사용한다.
즉, 멀티 태스킹은 멀티 프로그래밍과 유사하지만, 각 프로세스의 CPU 사용시간을 아주 짧은 시간으로 하여, 사용자가 보기에는 마치 여러개의 프로그램을 동시에 사용하는 것처럼 보이게 되는 것이다.
하지만, Context Switching은 하나의 프로세스가 동시에 여러 작업을 수행하지 못한다는 단점, Context Switching은 무거운 작업이라는 단점, 프로세스 사이의 데이터 공유가 어렵다는 단점이 존재한다.
앞서 말했듯이, 스레드는 프로세스의 실행 작업 단위로써, 하나의 프로세스 내에서 스레드는 스택을 제외한 다른 영역들을 공유하는 특징이 있다.
스레드들은 메모리 영역을 공유하기 때문에, Context Switching이 가벼우며, 데이터 공유가 용이해진다.
멀티 코어란 하나의 CPU에 여러 개의 코어가 탑재된 것을 말한다. 이 코어가 시스템의 모든 연산을 담당하여 처리한다.
출처: 멀티 프로세스
출처: https://lotuus.tistory.com/92
코어가 하나라면, 멀티 태스킹처럼 수행하기 때문에, 큰 차이를 보이지 않지만, 만약 코어가 둘 이상이라면, 아래 그림과 같이 2개의 코어가 각각의 스레드 작업을 담당하게 된다. 이러한 방식을 멀티 스레딩 이라고 한다. (병렬)
또한 쓰레드의 등장으로, 기존의 멀티 태스킹도, 여러 프로세스와 여러 스레드가 아주 짧게 쪼개져, cpu time을 가지고 작업이 처리된다.
멀티 프로세싱은 두 개 이상의 프로세서(대충 CPU)나 코어를 활용하는 시스템을 멀티 프로세싱이라고 한다.