하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것을 말함
✔️ 메모리 공간과 시스템 자원 소모가 줄어들게 됨
✔️ 스레드 간의 통신이 필요한 경우에도 별도의 자원 이용 ❌, 전역 변수의 공간 또는 동적으로 할당된 공간인 Heap 영역을 이용하여 데이터를 주고 받을 수 있다.
그래서 프로세스에 비해 스레드의 통신 방법이 훨씬 간단하고, 빠름
따라서 시스템의 throughput이 향상되고 자원 소모가 줄어들며 자연스럽게 프로그램의 응답 시간이 단축 됨
이러한 장점 때문에 여러 프로세스로 할 수 있는 작업들을 하나의 프로세스에서 스레드로 나눠 수행하는 것임
멀티 스레딩을 기반으로 할 때는 프로세스 간 공유하는 자원이 있기 때문에 동일한 자원에 동시에 접근하는 것을 신경써줘야 함
서로 다른 스레드가 데이터와 힙 영역을 공유하기 때문에 어떤 스레드가 다른 스레드에서 사용 중인 변수나 자료구조에 접근하여 엉뚱한 값을 읽어오거나 수정할 수 있음.
그렇기 때문에 멀티스레딩 환경에서는 동기화 작업이 필요함.
동기화를 통해 작업 처리 순서를 컨트롤하고 공유 자원에 대한 접근을 컨트롤 하는 것이다.
➡️ 병목현상 발생해서 성능 저하될 가능성이 있으므로 과도한 락으로 인한 병목현상 줄여야 함
✔️ 멀티 스레드
멀티 프로세스보다 작은 메모리 공간을 차지하고 문맥 전환이 빠르다는 장점이 있지만, 오류로 인해 하나의 스레드가 종료되면 전체 스레드가 종료될 수 있다는 점과 동기화 문제를 갖고 있음
✔️ 멀티 프로세스
하나의 프로세스가 죽더라도 다른 프로세스에는 영향을 끼치지 않고 정상적으로 수행된다는 장점이 있지만, 멀티 스레드보다 많은 메모리 공간과 CPU 시간을 차지한다는 단점이 존재
두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도 연산 결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태
쉽게 말해, 하나의 함수가 한 스레드로부터 호출되어 실행 중일 때, 다른 스레드가 그 함수를 호출하여 동시에 함께 실행되더라도 각 스레드에서의 함수의 수행 결과가 올바로 나오는 것으로 정의함.
동일한 자원을 동시에 접근하는 작업을 실행하는 코드 영역을 Critical Section이라 함
프로세스들이 Critical Section을 함께 사용할 수 있는 프로토콜을 설계하는 것
1. Lock
하드웨어 기반 해결책으로써, 동시에 공유 자원에 접근하는 것을 막기 위해 CS에 진입하는 프로세스는 Lock을 획득, CS를 빠져나올 때, Lock을 방출해서 동시 접근을 방지함
✔️ 문제점
시간적인 효율성
2. 세마포어
소프트웨어 상에서 CS 문제를 해결하기 위한 동기화 도구
✔️ 종류
✔️ 문제점
뮤텍스는 락을 건 스레드만 CS를 나갈 때 락을 해제할 수 있음
하지만 세마포어는 락을 걸지 않은 스레드도 락을 해제할 수 있고, 세마포어의 카운트를 1로 설정하면 뮤텍스랑 같음
출처 : https://github.com/JaeYeopHan/Interview_Question_for_Beginner/tree/master/OS#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4
https://github.com/ksundong/backend-interview-question