본문 바로가기

Back/Java

[JAVA/멀티스레드] JAVA멀티스레딩 - 운영체제기초2 (컨텍스트 스위치)


Context Switch (컨텍스트 스위치)


- OS가 알아서 스레드 관리를 해주는데,
여러개의 스레드가 번갈아 가면서 CPU를 사용할수 있게 한다.
이때, 하나의 스레드에서 다른 스레드로 전환하는 일을을 ‘컨텍스트 스위치’라고 한다.
컨텍스트 스위치가 발생할때는 리소스를 CPU와 메모리에 복원하는 일을 한다.

(사람이 여러가지 일을 한번에 할때 다른일을 하기위해 잠시 머리를 정리하고 준비를 하는것과 비슷)


- 너무 많은 프로세스와 스레드가 실행중일때는 컨텍스트 스위치가 너무 자주 일어나기 때문에 성능저하가 있을 수 있다. (context switch cost 발생)
- 같은 프로세스 내 두 스레드간의 컨텍스트 스위치를 할때는 서로 리소스를 공유하기 때문에
다른 프로세스의 스레드간 컨텍스트 스위치보다 효율적이다.



Threads Scheduling (스레드 스케쥴링)


만약 스레드 시간할당을 공평하게 한다면..?

1. 먼저 도착하는 스레드작업을 먼저 실행하는 경우
  : 그러면 먼저도착한 스레드작업이 길어졌을때, UI를 보여주는 짧은 스레드작업이 늦어질수 있다. 최악의 사용자경험 발생
2. 더 짧은시간이 걸리는 스레드작업을 먼저 실행하는 경우
  : 그러면 오래걸리는 스레드작업은 영원히 실행되지 못할수도.... ㄷㄷ
---> 둘다 기아현상 발생




일반적인 스레드의 스케쥴 관리

  • 에포크에 맞춰 시간을 적당한 크기로 나눈다

   ❓에포크의 정확한 뜻이 궁금하다..

  • 스레드의 타임슬라이스를 종류별로 에포크에 할당한다.
  • 하지만 모든 스레드가 각 에포크에서 실행되거나 완료되지 않는다.



스레드에 시간을 할당하는 방법

  • 운영체제가 각각의 스레드에 적용하는 동적 우선순위에 달렸다.
  • 정적 우선순위는 개발자가 미리 설정하고
  • 나머지는 운영체제가 각각의 에포크마다 조절한다.
  • 이렇게 하면 운영체제는 즉각적인 반응이 필요한 실시간 스레드나 인터렉티브 스레드에게 우선권을 준다.
  • 하지만 동시에 기아현상을 막기위해, 이전 에포크에서 실행시간이 부족했거나 완료되지 않은 스레드도 놓치지 않는다.



Threads vs process 어떤걸 선택할래??

- 많은 데이터를 공유하는 다양한 작업을 실행하혀면 멀티스레드 아키텍쳐 사용.
  : 스레드는 생성과 파기가 빠름
- 보안과 안전이 중요하다면 프로세스 사용.
: 멀티스레드에서 스레드 하나때문에 앱 전체가 다운될 수 있다