강의 링크: https://www.udemy.com/course/java-multi-threading/?couponCode=GENAISALE24
0. 서론
애플리케이션 서비스에서 멀티스레드를 사용하곤 하는데, 멀티스레드를 이용하면서 사용방법은 익혔지만, 좀 더 세밀하게 분석해봐야겠다 생각하였고 이를 위해 글또를 통해 유데미 강의를 신청하였습니다.
1. 강의 내용 정리
컨텍스트 스위치
- 하나의 스레드 실행을 멈추고 다른 스레드를 스케줄링한 다음 다시 실행하는 것이 컨텍스트 스위치입니다.
스레드 스케줄링
- 정적 우선순위 + 보너스
- 정적 우선순위는 개발자가 미리 설정
- 보너스는 운영 체제가 각각의 에포크마다 조절
멀티 스레드
- 하나의 프로세스가 여러 개의 스레드를 사용하도록 프로그램을 작성하는 방법
스레드
- 스레드 그 자체를 의미하는 클래스로, 프로그램 실행 시 기본적으로 생성되는 Main 스레드 이외의 스레드를 만들어 작업을 할당할 수 있습니다.
- Thread 생성자의 인자 Runnable은 함수형 인터페이스이기 때문에, Java 8에서 도입된 람다식을 통해 스레드가 수행할 동작을 간단하게 정의할 수 있습니다.
Synchronized
- 임계 영역에 대해 한 번에 하나의 스레드만 접근을 허용하도록 합니다
Volatile
- Volatile은 공유 자원의 값을 메모리에 최신화함으로써 항상 유효값 으로 보장하기 위한 키워드입니다.
- Volatile로 선언된 변수는 그 값이 최신화될 때 다른 스레드가 모두 이 사실을 인지할 수 있도록 만들어줍니다.
- Synchronized가 여러 스레드가 공유 자원을 변경/조회할 때 필요하다면, Volatile은 여러 스레드에서 공유 자원을 읽지만 공유 자원을 변경시키는 것은 단일 스레드일 때 사용하면 Synchronized에 비해서는 효율적 처리를 보장할 수 있습니다.
Locking
- 다수의 스레드 실행으로 공유자원에 접근할 때 필요한 메커니즘
- 락, 언락 상태가 있고 언락 에서만 락을 요청할 수 있습니다.
- Lock은 여러 스레드 간에 자원을 접근하는 매커니즘을 제공합니다. 일반적으로 위에도 언급했던 상호 배제 정책을 통해, 하나의 스레드가 특정 자원에 접근중인 경우에는 다른 스레드가 접근하지 못하도록 제한합니다. 락이 없다면 두 개 이상의 스레 드가 동시에 자원에 접근할 수 있으므로, 데이터의 무결성이 보장되지 않습니다
Semaphore
- 멀티 프로그래밍 환경에서 공유된 자원에 대한 접근을 제한하는 방법입니다.
- 사용하고 있는 스레드/프로세스의 수를 공통으로 관리하는 하나의 값을 이용해 상호배제를 달성합니다.
- 공유 자원에 접근할 수 있는 프로세스의 최대 허용치만큼 동시에 사용자가 접근할 수 있습니다.
Blocking I/O
- I/0작업이 blocking 방식으로 구현되면 하나의 클라이언트가 I/0작업을 진행하면 해당 스레드가 진행하는 작업을 중지하게 됩니다.
- 스레드가 많아지면 시간 할당량은 작아집니다.
- 스레드가 많아지면 컨텍스트 switch 비용 및 인터럽트 횟수와 오버헤드가 증가하여 CPU가 일을 하지 못합니다.
Non-Blocking I/O
- Blocking I/O를 해결하기 위하여 Non-Blocking방식으로 이 문제를 해결하였습니다.
- Non-Blocking I/O 은 I/0작업을 진행하는 동안 쓰레드의 작업을 중단시키지 않습니다.
- 스레드가 커널에게 I/O를 요청하는 함수를 호출하면, 함수 는 I/0를 요청한 다음 진행상황과 상관없이 바로 결과를 반환합니다.
2. 총평
1. 과거에 전공 수업에 들었던 내용이지만, 내용이 희미해졌었는데 지식을 다시 복습할 수 있었습니다.
2. 서론에서도 말했었지만 사용 방법 정도만 알고 있었는데, 강의를 통해 동작 원리를 습득할 수 있었고 병행성 문제를 어떻게 대처할 수 있었습니다.
3. 기본적인 CS는 안다는 가정하에 설명을 해주시기에 CS를 학습하셨거나, 스레드를 사용해보셨던 분들이 듣는다면 좀 더 강의 수강에 도움이 될 것 같습니다.
해당 컨텐츠는 유데미로부터 강의 쿠폰을 제공받아 작성되었습니다.
'Language > Java' 카테고리의 다른 글
[Java] BigDecimal 사용하기 (0) | 2023.12.21 |
---|
댓글