∎ 프로세스와 스레드 정의
⦁ 프로세스는 운영체제로부터 자원을 할당받은 작업의 단위
(메모리를 할당받아 올라간 후, CPU 자원을 할당받는다)
⦁ 스레드는 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
∎ 메모리 구조
⦁ 프로세스 한개 당 메모리 할당 : 코드 영역(기계어), 데이터 영역(전역 변수), 스택 영역, 힙 영역(동적 할당)
⦁ 스레드는 스택 영역을 복사해 각자 가지고 있고, 나머지는 공유한다.
∎ 프로세스 문맥 교환 과정
멀티 프로세스의 자원 공유는 CPU 레지스터 교체 뿐 아니라, RAM과 CPU 사이의 캐시 메모리까지 초기화되서 자원 부담이 크다.
스케줄링 알고리즘에 따라 실행순서가 빠른 프로세스 먼저 실행하고, 만약 I/O처럼 외부 이벤트가 일어날 경우, 대기에 들어갔다가 자신의 순서가 오면 다시 실행된다.
이러한 문맥 교환 과정을 통해 마치 프로세스가 동시에 실행되는 것처럼 보이는 것이 동시성의 장점이다.
하지만 문맥 교환 과정에서 CPU 캐시 무효화, PCB 저장 복원, 스케줄링 비용 등이 발생해 오버헤드 발생 가능성이 있다.
⦁ 병렬성은 물리적으로 진짜 여러개가 동시에 실행되는 것
⦁ 동시성은 여러개를 조금씩 실행시키면서, 동시에 실행되는 것처럼 보이게 하는것. 사용자에게 더 빠른 반응성을 제공하기 위함.
동시성이 필요한 이유는 물리적으로 코어의 개수를 늘리는데 한계가 있고
만약 느린 프로세스가 먼저 실행된다면 뒤에 프로세스는 계속 기다려야 하니 성능적으로 좋지 못하기 때문이다.
∎ 멀티 스레드
스레드는 TCB에 정보를 저장하고, PCB 안에 들어있다.
멀티 스레드에서 더 주의해야할 점은 Stack 영역을 제외한 나머지 자원을 공유하고 있기 때문에 동기화 문제가 발생한다.
하지만 문맥교환 해야 하는 정보는 프로세스보다 적기 때문에 상대적으로 가볍다
∎ 멀티 프로세스
⦁ 하나의 응용 프로그램을 여러 개 띄워놓는 경우에 해당한다.
Ex) 웹 브라우저를 여러 개 띄워놓음
⦁ 멀티 프로세스로 운영하는 경우, 부모 프로세스가 자식 프로세스를 생성하고 제어한다.
⦁ 장점
- 웹 브라우저의 경우, 하나의 창이 오류가 생겨도 메모리를 공유하지 않기 때문에 다른 창들은 정상적으로 사용할 수 있다.
- 하나의 서버 안에 멀티 프로세스로 구성하면 비용을 줄일 수 있고, 각 프로세스마다 원하는 모듈을 구성할 수 있다.
⦁ 단점 : 문맥 교환 과정에서 많은 비용이 발생한다. (캐시 무효화, PCB 관리), 자원을 공유하지 않아서 생기는 메모리 낭비가 있다.
∎ 멀티 스레드
장점
메모리를 공유하기 때문에 절약된다. 문맥교환 과정에서 TCB가 가볍다.
웹 서버의 경우, 프로세스를 교환하는 것보다 스레드를 교환하는 것이 빨라 더 빠른 클라이언트의 응답을 처리할 수 있다.
∎ 언제 어떤것을 사용할까?
멀티 스레드는 빠른 응답 교환이 필요한 경우 적합하고,
멀티 프로세스는 각 프로세스마다 메모리를 다르게 사용하고 싶을 때 유리하다.
∎ Spring의 멀티 스레드
스레드 풀을 먼저 만들어놓는다. 그 이유는 스레드를 생성하고 삭제하는 비용이 성능을 저하시키기 때문이다.
<스레드의 단점 극복>
오류 발생 : 예외처리를 잘 해주거나, 스레드 풀에서 남는 스레드를 가져온다.
메모리 동기화를 잘 해주어야 한다.
∎ 동기화 문제의 경쟁 상황을 일어나지 않게 하는 3가지 조건
상호배제, 진행, 유한 대기(방금 사용을 끝낸 프로세스는 일정 시간 동안 이용하지 못하게 하여 무한 대기를 막는다)
<동기화를 위한 뮤텍스, 세마포어>
뮤텍스는 하나의 객체에 하나의 스레드만 접근할 수 있는 락을 거는 방법입니다.
개발자가 멀티 스레드 작업 중 동기화가 필요한 메소드나 블록에 synchronized를 설정하는데요, 다른 스레드가 점유 중일 때는 대기 해야 하고, 점유했던 스레드가 작업을 마치고 나면 lock을 반납합니다.
세마포어는 동기화의 대상이 여러개일 때, 대상의 개수만큼 접근 스레드의 개수를 제한하는 것입니다.
∎ 멀티 스레드가 항상 좋나요?
메모리 동기화 과정에서 락 생성 해제 비용과 스레드의 대기가 발생하게 되고, 캐시 데이터의 일관성을 유지하기 위한 병목 현상도 일어난다.
그리고 컨텍스트 스위칭 과정이 스레드가 많아질수록 점점 오버헤드가 올라간다.
< 스레드 관리 >
이용률이 높은 서비스도 스레드가 많이 필요하지 않은 시간들이 있다. 스레드는 사용되지 않더라도 스케줄링상 CPU를 할당받게 되어있고, 이로 인해 낭비가 일어난다.
이를 컨트롤 하기위해 스레드풀을 설정해 스레드 개수를 제어하자.
< 멀티 스레드의 적절한 예시 >
파일 입출력, 네트워크 통신, DB 조회 같은 경우에는 해당 작업을 수행하는데 블로킹이 발생해 낭비가 되므로, 멀티 스레드가 적절한 예이다.
CPU 연산이 많은 영상 처리와 같은 작업은 연산이 CPU를 통해 이루어져야 하므로, 멀티 스레드를 사용하는 것이 적절한 방법이 아니다.
∎ 프로세스 스케줄링
⦁ FCFS : 준비큐에 삽입된 순서대로 비선점 스케줄링. 호위효과(대기 시간 김)가 생길 수 있음
⦁ SJF : 작업 시간이 긴 것을 나중에 함으로써 호위 효과 방지
⦁ RR : 정해진 시간 만큼 돌아가면서 실행. 선점형 스케줄링
⦁ SRT (최소 잔여 시간) : SJF와 RR을 합침
⦁ 다단계 큐 스케줄링 : 우선순위 별로 큐를 따로 만들어 사용. 큐 별로 스케줄링을 다양하게 사용할 수 있음. 하지만 큐 간의 이동 불가
⦁ 다단계 피드백 큐 스케줄링 : 실행을 다 못한 프로세스는 다음에 더 낮은 우선순위 큐로 삽입. 다단계 큐 스케줄링의 기아 현상을 해결
⦁ 우선순위 스케줄링 단점 : 기아 현상
- 해결법 : 오랫동안 대기했으면 우선순위를 점차 높이기
∎ IPC - 서로 다른 프로세스 간의 데이터를 공유하는 방법
1. 메시지 전달 방식 : 커널에 공유 공간을 만들어서 이곳에 데이터를 저장하고 공유한다. 커널을 거치기 때문에 느리지만, 동기화는 보장한다.
2. 공유 메모리 방식 : A프로세스가 커널에게 시스템 콜하여 B프로세스의 일부 메모리를 할당 받는다. 속도는 빠르지만 동기화 문제가 생기므로, 뮤텍스와 세마포어를 잘 활용해야 한다.
'CS 지식 > 운영체제' 카테고리의 다른 글
인터럽트 - CPU 비동기 처리 원리 (0) | 2024.08.14 |
---|---|
컴퓨터 자원 - 프로세서, 메모리 (0) | 2024.08.14 |
데드락 (DeadLock, 교착 상태)과 예방법 (0) | 2024.08.13 |
공유 자원 동기화 (0) | 2024.08.13 |
메모리 - 커널 영역, 사용자 영역 (0) | 2024.08.13 |