프로세스와 스레드의 차이
프로세스는 실행중인 프로그램이고, 스레드는 프로세스 안에서 실행하는 단위이다.
유튜브 : 프로그램
좋아요버튼,구독버튼 등 : 프로세스
프로세스는 메모리와 cpu를 프로세스마다 할당받아서 사용하는데 스레드는 프로세스 안에서 다른 스레드와
메모리 cpu를 공유해서 사용한다.
프로세스는 각각 독립된 영역(code,data,stack,heap의 구조)를 할당받는다.
-각 프로세스는 별도의 주소 공간에서 실행되며, 한 프로세스는 다른 프로세스의 변수나 자료구조에 접근할 수 없다.
-한 프로세스가 다른 프로세스의 자원에 접근하려면 프로세스간의 통신(IPC)을 사용해야 한다. (EX.파이프,파일,소켓등)
IPC란 : 서로 통신하고 데이터 또는 리소스를 공유하기 위해 프로세스에서 사용하는 메커니즘이다.다중 프로세스 환경에서 각 프로세스는 독립적으로 실행되며 자체 메모리 공간이 있다. 그러나 작업을 수행하기 위해 프로세스가 서로 통신해야 하는 상황이 생기는데 IPC는 이러한 프로세스가 정보를 교환하고 활동을 조정하는 방법을 제공한다.
다중 처리, 분산 컴퓨팅 및 클라이언트-서버 시스템과 같은 영역에서 일반적으로 사용된다.
스레드는 프로세스 내에서 실행되는 여러 흐름의 단위
-스레드는 프로세스 내에서 각각 STACK 만 따로 할당받고 CODE,DATA,HEAP 영역은 공유한다.
-한 스레드가 프로세스 자원을 변경하면 , 다른 이웃 스레드도 그 변경결과를 즉시 볼수 있다.
가시성과 원자성
-여러 스레드가 동시에 동일한 공유 메모리 구조에 엑세스 하고 수정하는 경우 경쟁 조건 및 기타 동기화 문제의 위험이있다.
가시성은 한 스레드가 다른 스레드에 의해 공유 메모리에 적용된 변경사항을 볼수 있는 능력을 말하며 이는 스레드가 공유 메모리의 최신 값으로 작업하는지 확인하는데 중요하다. 적절한 가시성 메커니즘이 없으면 한 스레드에서 부실하거나 일관성 없는 데이터를 볼 수 있으며 이는 프로그램 충돌이 발생할수 있다.
원자성은 여러 스레드가 동시에 동일한 공유 메모리 위치에 엑세스 하고 수정하는 경우 데이터 손상 및 일관성 없는 상태의 위험이 있다. 원자성 작업은 특정 작업이 분할할 수 없는 중단되지 않는 단일 작업 단위로 수행되도록 하는 방법을 제공하여 다른 스레드가 작업을 방해하지 않도록 하고 공유 메모리의 일관성을 보장한다.
가시성과 원자성은 스레드 간 메모리를 관리하는데 중요하다.
멀티 프로세스와 멀티 스레드의 차이
멀티 프로세스
-하나의 응용프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는
-독립적인 프로세스라 자식프로세스가 죽어도 다른 프로세스에 영향을 끼치지 않음
-프로세스는 각각의 독립된 메모리 영역을 할당받았기 떄문에 프로세스 사이에서 공유하는 메모리가 없어
ContextSwitching가 발생하면 캐쉬에 있는 모든 데이터를 모두 리셋하고 다시 캐쉬 정보를 불러와야 한다.
ContextSwitching: CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는데 이 과정을 ContextSwitching라 한다.
-동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업
멀티 스레드
-하나의 응용프로그램을 여러개의 스레드로 구성하고 각 스레도 하여금 하나의 작업을 처리하도록 하는 것
-윈도우, 리눅스 등 많은 운영체제들이 멀티 프로세싱을 지원하고 있지만 멀티스레딩을 기본으로 하고 있다.
-웹 서버는 대표적인 멀티 스레드 응용프로그램이다.
장점
-시스템 자원 소모 감소 (자원의 효율성증대)
-프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리
-시스템 처리량 증가(처리 비용감소 )
-스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
-스레드 사이의 작업량이 작아 ContextSwitching 이 빠르다
-간단한 통신 방법으로 인한 프로그램 응답시간 단축
-스레드는 프로세스 내의 stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적다.
단점
-주의 깊은 설계가 필요하다.
-디버깅이 까다롭다.
-멀티 스레드의 경우 자원 공유의 문제가 발생한다.
-하나의 스레드에 문제가 발생하면 전체 프로세스가 영향을 받는다.
멀티 프로세스 대신 멀티 스레드를 사용하는 이유
프로그램을 여러개 키는 것보다 하나의 프로그램 안에서 여러 작업을 해결하는 것이 좋다.
여러 프로세스(멀티프로세스)로 할 수 있는 작업들을 하나의 프로세스에서 여러 스레드로 나눠가면서 하는 이유?
자원의 효율성 증대
-멀티 프로세스로 실행되는 작업을 멀티스레드로 실행할 경우 , 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리
-프로세스간의 ContextSwitching 시 단순히 CPU 레지스터 교체 뿐만 아니라 RAM과 CPU 사이의 캐쉬메모리를 공유하기 떄문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어들게 돈다.
처리 비용 감소 및 응답시간 단축
-스레드는 STACK 영역을 제외한 모든 메모리를 공유하기 때문에
-프로세스 간의 통신(IPC) 보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어든다.
ContextSwitching 시 스레드는 STACK 영역만 처리하기 떄문에 프로세스 간의 전환속도보다 스레드전환속도가 빠르다.
동기화 문제
스레드 간의 자원 공유는 전역 변수(데이터 세그먼트)를 이용하므로 함께 상용할 때 충돌이 발생할 수 있다.
멀티스레딩에서 여러 스레드가 동일한 메모리 공간과 리소스를 공유하기 때문에 제대로 관리하지 않으면 경합상태, 교착상태 및 기타 동기화 문제가 발생할 수 있다.예를 들어 두 스레드가 동일한 데이터를 동시에 수정하려고 하면 데이터 손상이나 잘못된 결과를 발생할수 있다.
이러한 문제를 방지하기 위해 잠금,세마포어 및 장벽과 같은 동기화 메커니즘을 사용하여 스레드가 조정된 방식으로 공유 리소스에 엑세스 할 수 있도록 한다. 이러한 메커니즘을 사용하면 한 번에 하나의 스레드만 특정 리소스에 엑세스할 수 있으므로 경합상태 및 기타 동기화 문제를 방지할 수 있다.
전반적으로 동기화는 멀티스레딩을 사용할 때 잠재적인 문제가 될 수 있지만 동기화 메커니즘을 사용하여 효과적으로 관리할 수 있다. 적절한 관리와 주의를 기울이면 멀티스레딩은 성능향상, 오버헤드 감소, 리소스 활용도 향상 등 멀티프로세싱에 비해 많은 이점을 제공할 수 있다.
적당한 비유(멀티스레딩을 사용하는 이유)
식당에서 요리사가 음식을 요리하는 것을 생각해 보십시오. 셰프는 두 가지 옵션이 있습니다. 동일한 스토브에서 여러 버너를 사용하여 동시에 여러 요리를 요리하거나(멀티스레딩) 자체 스토브가 있는 별도의 주방에서 각 요리를 요리할 수 있습니다(멀티프로세스).
요리사가 별도의 주방에서 각 요리를 요리하기로 선택한 경우 모든 것이 제대로 요리되고 있는지 확인하기 위해 주방 사이를 왔다 갔다 해야 합니다. 이는 시간이 많이 소요될 수 있으며 서로 다른 주방 간에 많은 조정이 필요합니다.
반면에 셰프가 같은 스토브에서 여러 버너를 사용하여 동시에 여러 요리를 요리하도록 선택하면 모든 것을 면밀히 주시하고 각 요리가 제대로 요리되는지 확인할 수 있습니다. 또한 여러 요리에 동일한 재료와 도구를 사용하여 시간을 절약할 수 있습니다.
마찬가지로 프로그래밍할 때 멀티스레딩을 사용하면 동일한 리소스(CPU, 메모리 등)를 사용하여 동시에 여러 작업을 실행할 수 있습니다. 이는 각 작업에 대해 별도의 프로세스를 생성하고 프로세스 간에 더 많은 리소스와 조정이 필요한 다중 프로세스를 사용하는 것보다 더 효율적일 수 있습니다.