이번 게시글에서는 멀티~ 와 관련된 용어들을 정리해보고자 한다.
내용이 잘못되었거나 제가 잘못 이해하고 있는 내용들은 언제든지 댓글로 달아주시길 바랍니다.
멀티스레드를 설명하기 전, "프로세스"를 먼저 알아야한다.
프로세스는 프로그램 즉, 코드 덩어리가 주기억장치인 메모리에 올라간 상태를 의미하며 1개의 CPU에는 1개의 프로세스만 동작할 수 있다.
👉 여기서 "동시성(Concurrency)"이라는 개념이 나오는데, 여러개의 프로세스를 잘게 쪼개서 동시에 처리되는 것 처럼 보이는 것이 바로 동시성이다.
그러면 이제 쓰레드에 관해 알아보자.
쓰레드는 프로세스와 달리 각자 자원을 보유하며 프로세스내에서 실행되는 흐름의 단위/CPU 스케줄링의 기본 단위라고 할 수 있다.
즉, 멀티스레드는 1개의 프로세스에 N개의 쓰레드를 이용한 것을 의미한다.
동시성과 달리 context switching이 발생하지 않고 자원을 효율적으로 관리할 수 있으며 각자 자원을 보유하고 있기 때문에 쓰레드 간 통신이 간단하다.
쓰레드의 단점은 자원을 공유하기 때문에 동기화문제가 발생할 수 있으며 병목현상, 데드락(교착상태) 디버깅이 어렵다는 단점이 있다.
복잡한 멀티쓰레드의 경우 단일 쓰레드보다 실행시간이 늦다.
또한 하나의 쓰레드에 문제가 생기면 전체 프로세스에 영향을 준다.
방금 전에 프로세서는 1개의 CPU에 1개의 프로세서만 담을 수 있다고 했다.
그렇다면 프로세서가 여러개라는 뜻은 무엇일까?
바로 CPU가 여러개라는 뜻이다. 즉 물리적으로 구현이 되어있는 것을 뜻한다.
이 개념에서 바로 "병렬성(Parallelism)"이 나온다.
독립된 구조를 이용하므로 안정성이 높고 다른 작업에 영향을 끼치지 않는다.
작업량이 많을수록 context swiching이 자주 일어나며 성능저하 발생 가능성이 높다.
"자원"차원의 관점이다.
무슨말이냐면, 1개의 CPU에 1개의 프로세서를 올릴 수 있다고 했다.
그러면 (예전 컴퓨터에서는 실제로 있었던 일이긴 한데) 프로그램을 하나 실행한다고 치면 키보드 입력부터 시작해서 마우스 움직임 다른 프로그램으로 이동 등 아무것도 할 수 없는 상태가 되어버린다.
동시성이라는 개념이 다시 나오는데, 작업들을 잘게 쪼개서 다른 작업들을 가능하도록 만드는 것을 의미한다.
"시간"차원의 관점이다.
다수의 작업들을 운영체제 스케줄링에 맞춰 작업하는 것을 의미한다.