[250204] TIL
오늘 한 것
스레드 학습 및 실습
프로세스
- OS 에게 자원을 할당 받아 실행되는 프로그램
스레드
- 프로세스의 자원을 할당 받아 동시성과 병렬성을 가능하게 해주는 최소한의 흐름 단위
프로세스와 스레드의 차이
- 프로세스는 OS에게 자원을 할당 받고, 스레드는 프로세스에게 자원을 할당 받는다.
- 프로세스 간의 자원 공유는 IPC 통신을 통해 해야하지만, 스레드와 프로세스의 자원 공유는 Code, Data, Heap 영역을 함께 공유하고 있기 때문에 오류가 발생할 위험 부담이 적다.
컨텍스트 스위칭
- CPU 자원을 할당 받은 프로세스나 스레드가 교체될 때, 기존 작업을 저장하고 새로운 컨텍스트로 교체하는 작업을 말함
스레드 오버헤드
- 스레드 오버헤드는 스레드가 동작하면서 발생하는 추가적인 비용을 말한다.
- 대표적으로 과도한 스레드 생성으로 인해 메모리 사용량 증가와 빈번한 컨텍스트 스위칭으로 인한 CPU 부하가 있다.
자바에서 Thread Class를 상속 받는 것과 Runnable Interface를 사용하는것의 차이
- Thread Class 를 사용하면 바로 start 함수를 사용해서 스레드를 생성할 수 있고, Runnable Interface 를 사용하면 runnable 객체를 따로 정의하고 thread 생성자에 넣어서 스레드를 생성한다.
- 단순한 스레드를 만들 때는 thread class 를 바로 상속해서 사용하는 것이 비용을 절감할 수 있는 방법이 될 수도 있겠지만, java는 다중 상속을 지원하지 않기 때문에 상속을 이용할 수 없는 단점이 있다.
- runnable 을 사용하면 thread 객체를 추가 생성 해줘야 하지만, 다중 상속이 가능하고, 재사용성과 더 유연한 설계가 가능하다.
Synchronized
- 자바에서 동시성 제어를 위해 제공하는 키워드
- 해당 키워드가 적용된 영역은 한 번에 하나의 스레드만 접근 가능하다.
- 락 획득/해제 비용으로 성능 저하가 발생할 수 있다. (lock 관련은 추후에 배울 예정)
public synchronized void increment() {
count++;
}
AtomicInteger
- 멀티스레드 환경에서 원자성을 보장하는 정수 자료형
- Synchronized 없이도 안전한 스레드 연산을 제공한다.
-
CAS (Compare-And-Swap) 알고리즘 기반으로 동작한다. ```java public class Counter { private final AtomicInteger value = new AtomicInteger(0);
public void increment() { while (true) { int existingValue = value.get(); int newValue = existingValue + 1; if (value.compareAndSet(existingValue, newValue)) { return; } } } }
```
CAS
- 메모리 값을 변경하지 전에 예상한 값과 일치하는지 확인하고, 일치하는 경우에만 새로운 값으로 메모리 값을 변경하는 원자적 연산
동시성
- 스레드를 동시에 처리하는 것이 아닌, 빠르게 번갈아 작업하면서 동시에 처리되는 것처럼 보이는 것
병렬성
- 실제 물리적으로 동시에 처리되는 것
- 스레드는 동시성과 병렬성 둘 다 챙길 수 있다. 동시성은 단일코어 CPU 일 경우 챙길 수 있고, 병렬성은 멀티코어 CPU 일 경우 챙길 수 있음.
자바 언어에서 지원하는 동시성 관리(간단하게 정리)
- Synchronized 키워드 : 메서드나 블록에 사용하여 한 영역에 하나의 스레드만 접근 허용
- Atomic 클래스들 : 원자적 연산을 지원하는 클래스들을 사용
- volatile 키워드 : 변수의 값을 메인 메모리에서 직접 읽고 쓰도록 보장
- Lock 인터페이스 : 직접 스레드 잠금/해제 관리
- 동시성 컬렉션
CIL 프로그램 클래스 다이어그램 그리기
카카오테크 과제 마무리
기타
- 필라테스
- 말해보카
Leave a comment