일단 프로세스와 스레드의 차이를 보자면,
프로세스는 운영체제로부터 자원을 할당받는 작업의 단위이고 스레드는 프로세스가 할당받은 자원을 이용하는 실행의 단위이다.
응답성 (Responsiveness)
싱글 스레드 프로그램에선 수행 중이던 스레드가 입출력(I/O)로 인해 block 된다면 프로세스 전체가 block될 것이다. 멀티 스레드 프로그램에선 하나의 스레드의 실행 시간이 길거나 입출력 요청으로 인해 block 되더라도 다른 스레드들은 계속 실행되는 것을 허용한다. 그래서 사용자 입장에선 그 프로그램이 interactive하다고 볼 수 있다.
자원 공유 (Resource sharing)
프로세스 내 스레드간에 메모리 및 다른 자원들을 공유한다.
경제성 (Economy)
만약 각각의 작업을 위해 fork() 시스템 콜을 사용하는 등 여러개의 프로세스를 생성한다면, 프로세스 생성 및 컨텍스트 스위칭으로 인해 오버헤드가 발생한다. 이에 비해 멀티 스레딩 방식은 비용이 적게 소모되어 훨씬 경제적이다.
확장성 (Scalability)
멀티 프로세서 시스템에서 병렬성이 증가한다. 즉, 여러개의 스레드가 각각 다른 프로세서에서 동시에 실행이 가능하다. (하나의 프로세스라 컨텍스트 스위칭될 일이 없기 때문에 CPU가 여러개일 때 병렬적으로 사용될 수 있음)
시스템 자원소모 감소 (자원의 효율성 증대)
프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어 자원을 효율적으로 관리할 수 있다.
시스템 처리율 향상 (처리비용 감소)
스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
또한, 스레드 사이 작업량이 작아 컨텍스트 스위칭이 빠르다. (캐시 메모리를 비울 필요가 없다.)
간단한 통신 방법으로 프로그램 응답시간 단축
스레드는 프로세스 내 스택영역을 제외한 메모리 영역을 공유하기 때문에 통신 비용이 적다.
힙 영역을 공유하므로 데이터를 주고 받을 수 있다.
컨텍스트 스위칭
- CPU는 한번에 하나의 프로세스만 실행 가능하다.
- CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 데 이 과정을 컨텍스트 스위칭이라고 한다.
- 구체적으로, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다.
오버헤드
어떤 처리를 하기 위해 들어가는 간접적인 처리 시간, 메모리 등을 말한다.
ex) A라는 처리를 단순하게 실행하면 10초 걸리는데, 안전성을 고려하고 부가적인 B라는 처리를 추가한 결과 처리시간이 15초 걸렸다면, 오버헤드는 5초가 된다. 또한, 이 처리 B를 개선해 B’라는 처리를 한 결과, 처리시간이 12초가 되었다면 이 경우 오버헤드가 3초 단축되었다고 말한다.
fork를 통해 부모프로세스를 복사하여 자식 프로세스를 다수개로 늘려 여러 프로그램들을 병렬로 처리하며, 멀티 스레딩은 하나의 프로세스 안에서 병렬 처리를 한다.
멀티 스레드는 멀티 프로세스보다 적은 메모리 공간을 차지하고 컨텍스트 스위칭이 빠른 장점이 있지만, 동기화 문제와 하나의 스레드 장애로 전체 스레드가 종료될 위험을 가지고 있다.
멀티 프로세스는 하나의 프로세스가 죽더라도 다른 프로세스에 영향을 주지 않아 안정성이 높지만, 멀티 스레드보다 많은 메모리공간과 CPU 시간을 차지하는 단점이 있다.
즉, 멀티 프로세스 구조에선 여러 개의 자식 프로세스 중 하나에 문제가 발생하면 자식 프로세스 하나만 죽고 다른 곳에 영향을 끼치지 않는다. 하지만 멀티 스레드 구조에선 자식 스레드중 하나에 문제가 생긴 경우엔 전체 프로세스가 영향을 받게 된다. (ex. thread I/O)
두 방법은 동시에 여러 작업을 수행하는 점에서 동일하지만, 각각의 장단점이 있으므로 적용하는 시스템에 따라 적합한 동작 방식을 선택하고 적용해야 한다.
초기의 컴퓨터는 하나의 프로그램이 메모리에 올라가면 하나의 프로그램만 CPU가 처리를 진행할 수 있었다. 이 과정에서 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해, 입출력이 완료될 때까지 프로세서는 유휴(idle) 상태가 된다. 따라서 이는 프로세서의 자원 낭비로 이루어진다.
그래서 프로세서를 효율적으로 사용할 수 있도록 하는 멀티 프로그래밍이라는 처리방식이 나온 것이다.
프로세서가 입출력 작업의 종료를 대기할 동안 하나의 프로세서에서 다른 프로그램을 수행할 수 있도록 하는 것이 멀티 프로그래밍이다.
따라서, 특정 프로세서가 프로세스 A를 처리할 때, 다른 프로세스 B, C등을 처리하게 만드는 것을 말한다.
Task란 운영체제에서 처리하는 작업의 단위 또는 정해진 일을 수행하기 위한 명령어 집합을 뜻하는데(프로세스보다 확장된 개념), 멀티 태스킹은 task를 OS의 스케줄링에 의해 task를 번갈아가며 수행하는 것을 의미한다. 여러개의 task를 자주 번갈아가며 수행하다보니 사용자는 동시에 여러 task가 수행되고 있다고 느끼게 된다.
멀티 태스킹은 시분할 시스템에서 사용되며, 사용자에게 다수의 작업이 동시에 처리되는 것처럼 느껴지게 할 수 있다.
시분할 시스템(Time Sharing System)
여러 명의 사용자가 사용하는 시스템에서 컴퓨터가 사용자들의 프로그램을 번갈아가며 처리해줌으로써 각 사용자에게 독립된 컴퓨터를 사용하는 느낌을 주는 것으로, 라운드 로빈(Round Robin)방식이라고도 합니다. 멀티 프로그래밍 방식과 결합하여 모든 작업이 동시에 진행되는 것처럼 대화식 처리가 가능하다.
멀티프로그래밍은 자원낭비를 막기 위함이고, 멀티 태스킹은 정해진 시간동안 각각의 task를 번갈아가며 수행하는 것을 의미한다.
멀티 스레딩은 스레드간의 자원 공유가 가능하며, 프로그래밍을 통해 구현 가능하나, 멀티 태스킹은 OS에서 지원하는 것으로 독립된 메모리를 가지며, 서로 간의 자원 공유가 이루어지지 않는다.
자원 공유를 위해 별도의 IPC를 구현해야 하며, 멀티 스레딩에 비해 운영체제에게 부담을 줄 수 있다.
참고
https://wooody92.github.io/os/%EB%A9%80%ED%8B%B0-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C/
https://velog.io/@chy0428/OS-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-%EB%A9%80%ED%8B%B0%ED%94%84%EB%A1%9C%EC%84%B8%EC%8B%B1
https://rebas.kr/850
https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=bycho211&logNo=220994380643
https://velog.io/@tails5555/Thread-%EC%A0%95%EB%A6%AC