Skip to main content

김시용

1. 📌 핵심 개념 정리

✅ 요약하기

각자 해당 챕터에서 중요하다고 느낀 개념이나 아이디어를 간략하게 정리하고 개선 전, 후에 대한 예시 코드를 비교하며 개념을 설명합니다.

  1. 동시성이 필요한 이유
    동시성은 결합을 없애는 전략이다. 즉, 무엇과 언제를 분리하는 전략이다.
    -> 애플리케이션 구조와 효율이 극적으로 나아진다. 작은 협력 프로그램 여럿으로 보인다.
    = 시스템을 이해하기 쉽고 문제를 분리하기도 쉽다.
    응답시간과 작업 처리량 개선으로 인해 동시성이 불가피한 상황도 있다.
    -> 대량의 정보를 병렬로 처리하여 동시성 활용

  1. 동시성의 어려움
    • 동시성은 때로 성능을 높여준다.
    • 동시성 구현시, 무엇과 언제를 분리하기에 시스템 구조가 크게 달라진다.
    • 웹 / EJB 컨테이너 사용해도 동시성 이해 필요.
    • 동시성은 다소 부하를 유발한다.
    • 동시성은 복잡하다.
    • 동시성 버그는 재현하기 어렵다.
    • 동시성 구현 위해서는 근본적인 설계 전략을 재고해야 한다.

동시성 구현이 어려운 이유
두 스레드가 같은 변수를 동시에 참조하면 원치 않는 결과가 발생한다.
코드를 컴파일러가 바이트 코드로 처리하면 경로가 수만~수백만 가지가 발생하므로 일부 경로만 문제를 발생시킴.


  1. 어려움에 대처하는 동시성 방어 원칙
    • 단일 책임 원칙 : 동시성 관련 코드는 다른 코드와 분리하기
    • 자료 범위 제한 : 자료 캡슐화 통해 공유 자료 최소화
    • 자료 사본 사용 : 스레드가 공유 객체 복사해 사용, 다른 스레드가 사본에서 결과 가져와 사용
    • 스레드 독립적으로 구현 : 모든 정보 비공유 출처에서 가져오기, 로컬 변수에 저장
    • 스레드 환경에 안전한 컬렉션 : JAVA 5의 java.util.concurrent 같은 컬렉션 사용
    • 실행 모델 이해하기
      • 생산자-소비자 : 생산자 <-> 버퍼/대기열 <-> 소비자
        버퍼/대기열 비면 생산자가 정보 넣기, 소비자에게 정보 채웠다고 시그널 보내기
        버퍼/대기열 차있으면 소비자가 정보 가져오기, 생산자에게 정보 비었다고 시그널 보내기
      • 읽기-쓰기 : 읽기 스레드 요구와 쓰기 스레드 요구 적절히 만족시켜 처리율 유지하기
    • 동기화하는 메서드 메서드끼리 의존성 없애기 -> 공유 객체 하나에는 메서드 하나만 사용
      동기화 부분 작게 만들기 : 임계영역 수 최소 -> 임계영역 크기도 커지면 안됨
    • 올바른 종료 코드 구현 : 구현 어렵기에 초기부터 고민하고, 이미 나온 알고리즘 검토하기

  1. 스레드 코드 테스트하기
    문제를 노출하는 테스트 케이스 작성
    • 말이 안되는 실패는 잠정적 스레드 문제로 취급 -> 시스템 실패를 "일회성"이라 치부하지 마라.
    • 스레드 환경 밖에서 코드를 올바로 돌려라
    • 다중 스레드 쓰는 코드 부분 -> 다양한 환경에 쉽게 끼어 넣게 구현 / 상황에 맞게 조율되게 구현
    • 프로세서 수 > 스레드 수 : 데드락 일으키는 스와핑 자주 발생시키기 위해
    • 다른 플랫폼에서 돌려보기
    • 코드에 보조 코드 넣어보기

2. 🤔 이해가 어려운 부분

🔍 질문하기

책을 읽으며 이해하기 어려웠던 개념이나 명확하지 않았던 내용을 정리합니다.

  1. 동시성은 때로 성능을 높여준다
    • 어려웠던 부분
      동시성이 항상 성능을 높여주지 않는다?
    • 궁금한 점
      동시성을 높여주지 않는 상황은 무엇이 있을까?
      1. 경합 상태 (Race Condition)와 동기화 비용
        여러 개의 스레드가 동시에 같은 공유 자원에 접근하면 충돌이 발생할 수 있음.
        이를 방지하려면 **락(Lock)이나 동기화(synchronization)**가 필요하지만, 이 과정이 오히려 성능을 저하시킴.
      2. CPU 바운드 작업에서의 오버헤드
        CPU 연산이 많은 작업에서는 스레드를 많이 생성해도 성능이 크게 향상되지 않음.
        오히려 스레드 컨텍스트 스위칭 비용이 증가하여 성능이 저하될 수 있음.
      3. I/O 바운드 작업에서 과도한 스레드 생성
        I/O 작업(예: 파일 읽기/쓰기, 네트워크 요청)에서는 적절한 스레드 수를 유지해야 성능이 향상됨.
        너무 많은 스레드를 사용하면 CPU가 스레드 스케줄링에 많은 시간을 소비하게 되어 성능이 저하될 수 있음.
      4. 캐시 미스(Cache Miss)로 인한 성능 저하
        멀티스레드 환경에서는 캐시 일관성을 유지하기 위해 캐시 코히런시(Cache Coherency) 비용이 발생할 수 있음.

3. 📚 참고 사항

📢 논의하기

관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.

  1. 관련 자료 공유
    • 추가 자료
      관련 블로그 글이나 공식 문서 링크를 제공합니다.

  1. 논의하고 싶은 주제
    • 주제
      동시성 방어 원칙을 준수하면 동시성으로 인해 발생하는 문제가 아예 없는가?
    • 설명
      만약 발생하는 문제가 있을 것 같은데 그러면 애초에 설계부터 잘못된 것인가?