- 프로그램 : 파일이 저장장치에 있지만 메모리에 올라가 있지 않은 정적인 상태, 프로그램을 실행 > 프로세스
->
프로세스 ->
스레드
- 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우, 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 자원을 효율적으로 관리할 수 있습니다. 프로세스 간의 통신보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신 부담이 줄어듭니다.
- 그래서 멀티 스레드 프로그래밍은 주의가 필요합니다.
멀티 프로세스 환경에서 CPU(프로세서)가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존 프로세스의 상태(or 레지스터값)를 저장하고 다음 프로세스를 수행하도록 교체하는 작업입니다.
컨텍스트 스위칭이 일어나는 상황
- I/O interrupt
- CPU 사용시간 만료
- 자식 프로세스 fork
- 인터럽트 처리를 기다릴 때
- 제어권을 태스크를 처리하는 대상이 가지고 있다.
- 작업 완료 여부와 상관없이 계속 새로운 작업을 수행한다.
- 멀티 프로세스에 비해 메모리 자원 소모가 줄어든다.
- 힙 영역을 통해 스레드끼리 통신이 가능하다.
- 프로세스 컨텍스트 스위칭보다 스레드 컨텍스트 스위칭이 빠르다.
- 힙 영역의 자원을 이용할 때는 동기화가 필요하다.
- 동기화를 위해 락을 과도하게 사용하면 성능이 저하된다.
- 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있다.
두 개 이상의 스레드가 race condition(경쟁 상태: 여러 프로세스나 스레드가 동기화 메커니즘 없이 자원에 접근하려는 상황)에 들어가거나 같은 객체에 동시에 접근해도 연산결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미한다.
설계하는 법
- java.util.concurrent 패키지 하위의 클래스를 사용
- 인스턴스 변수를 두지 않는다,
- Singleton 패턴을 사용
- 동기화(syncronized) 블럭에서 연산을 수행
- 그래서 Spring을 사용하는 것, Spring은 Singleton Registry인 Application Context를 가지고 있다.
- Spring이 singleton을 사용하는 이유는 대규모 트래픽을 처리하기 위함
- [Spring] 애플리케이션 컨텍스트(Application Context)와 스프링의 싱글톤(Singleton)_망나니개발자
- 0, 1의 값만 가지는 세마포어, 이진 세마포어 = 뮤텍스
- 상호 배제 : 한 번에 한 프로세스만 해당 자원을 사용할 수 있어야 합니다.
- 점유 대기 : 할당된 자원을 가진 상태에서 다른 자원을 기다립니다.
- 비선점 : 다른 프로세스가 자원의 사용을 끝낼 때까지 자원을 뺏을 수 없습니다.
- 순환 대기 : 각 프로세스가 순환적으로 다음 프로세스가 요구하는 자원을 가지고 있습니다.
- 예방 : 위 4가지 조건 중 하나라도 만족하지 않도록 합니다.
- 회피 : 알고리즘에 데드락을 발생하지 않도록 합니다.
- 회복 : 데드락이 발생했을 때 해결합니다.
- 무시 : 회복과정의 성능 저하가 심하다면 그냥 무시합니다.
- 우선 순위를 변경합니다.
- 우선 순위를 수시로 변경해준다.
- 오래 기다린 프로세스의 우선 순위를 높여준다.
- Queue를 사용합니다.
- Swap 영역은 실제 메모리가 아니기 때문에 지연시간이 많이 발생합니다. 가급적이면 Swap 메모리를 사용하지 않게 설계하는 것이 좋고, 만약 계속 사용량이 증가한다면 메모리 누수를 의심해볼 필요가 있습니다.
- 가장 오래 사용되지 않은 페이지를 교체하는 알고리즘입니다.
- OPT(최적 페이지 교체)와 비슷한 효과를 낼 수 있으며, OPT보다 페이지 교체 횟수가 높지만 FIFO(First In First Out) 알고리즘 보다 효율적입니다.
Reference: