동시성 처리

아빠는 외계연·2023년 10월 24일
0

Study

목록 보기
10/11
post-thumbnail

동시성 vs 병렬성

  • 동시성
    • 한 CPU에서 동시에 여러 작업을 하는 것처럼 보이게 만드는 것
    • 싱글 코어에서 멀티 쓰레드를 동작시키는 방식
    • 동시에 실행되는 것처럼 보임
    • concurrently
    • 두개의 프로세스가 짧은 시간에 context switch → 사람눈에는 동시에 발생하는 것처럼 느껴짐
  • 병렬성
    • 멀티코어에서 멀티쓰레드를 동작시키는 방식
    • 실제로 동시에 여러 작업이 처리
    • 병렬성 만족 시 동시성 만족
    • RAM = 메인메모리. 주기억장치. 휘발성 메모리
    • CPU가 여러개일 경우 각 CPU별 캐시 메모리에 저장된 데이터가 달라 문제발생 가능

다중 프로세스 vs 다중 스레드 차이

  • 프로세스란 실행중인 프로그램을 의미
    - os로부터 자원을 할당받음
  • 스레드는 프로세스에서 할당받은 자원을 이용하는 실행흐름의 단위
    • 각 스레드는 별도의 register, stack 만 존재.
    • code, data, heap 영역은 공유
  • 프로세스끼리는 메모리 공유X
    - 하지만 IPC(Inter Process Communication)을 통해 소통함
    • 공유 메모리 -> message box, direct message를 활용
  • 다중 스레드 환경의 장점 : context switch 가 발생할 때 프로세스 끼리의 switch 보다는 더 성능이 좋다. 왜냐하면 TCB만 교체하기 때문이다. 메모리를 적게 잡아먹는다.

Context Switch 발생 시 벌어지는 일

  1. PCB를 교체한다.
    • CPU 내부의 pc, register 초기화
  2. TLB를 초기화시킨다.
    • MMU 내부의 Page Table Base Register가 초기화된다.

동시성 이슈

  • 멀티 스레드 환경에서의 문제
  • 각자의 캐시 메모리가 존재하기 때문에 데이터가 달라지는 문제점이 존재.
    - 이는 TLB로 인해 생기는 이슈.
    • TLB란 MMU 내부에 존재하는 캐시 메모리로, 주소 변환시에 메인 메모리에 접근하기 전에 먼저 접근된다.
  • 가시성 문제: 다른 스레드에서 변경한 값이 안보이는 현상, 동시 접근 문제 : 덮어씌어지는 현상

해결 방법

  • synchronized

    • blocking 방식
    • 메서드 단위, 클래스 단위, 블록 단위로 락을 걸 수 있음
    • 한 스레드만 읽고 쓰기가 가능
  • volatile

    • non-blocking 지원
    • 한 쓰레드만 쓰기가 가능
      - 이것이 보장되지 않기 때문에 그런 상황에서만 사용해야 한다.
    • 메인 메모리에서만 데이터를 가져옴
    • 캐시 메모리가 없다고 생각하면 좋음
  • atomic 변수

    • non-blocking 지원

    • volatile 과 CAS 알고리즘 활용

    • CAS 알고리즘이란 compare and swap -> 캐시메모리와 메인 메모리의 값을 비교해서 같으면 값을 변경, 다르면 계속 while문을 돌게끔 한다.

    • ConcurrentHash map에서 사용하는 방식

      • 만약에 map key값이 존재하지 않으면 CAS 알고리즘을 활용하여 안에 넣어버리고 존재하면 synchronized를 걸어서 chaining 기법으로 이루어진 곳에 뒤에 붙여버린다.
    • HashTable은 동기방식(Thread-safe), Hashmap은 비동기 방식이다. 따라서 Hashmap이 성능이 더 좋다.

응용 방식

  • semaphore
    - os단에서 제공하는 락 방식
    • critical section 에 접근하는 다중 스레드의 접근을 막기 위해 사용한다.
    • 숫자를 정해서 해당 숫자만큼의 스레드만 접근 가능하도록 설정한다.
  • mutex
    • binary semaphore과 같은 방식
    • 스핀락 개념이다.
    • critical section 에 하나의 스레드만 접근이 가능하다.
    • key와 비슷한 개념이라 생각하면 쉽다.
    • mutex를 잡지 못할 경우 대기큐에 들어간다.
  • monitor
    • os가 아닌 프레임워크 단에서 제공하는 기능
    • Synchronized를 활용하여 해당 critical section을 하나의 스레드만 점유가능하도록 함

Blocking vs NonBlocking vs Synchronized vs Asynchronized

  • 블락과 동기식의 차이
    - 블락방식은 해당 업무에 지속적으로 관심을 기울이고 있냐 아니냐의 차이이다.
    - ex) 블락방식은 계속 그 업무에 관심을 가져서 다른 일을 못하는 것. 논블락은 다른일도 충분히 가능한 것.
    • 동기식은 누가 관심을 가지고 있느냐의 차이이다.
      • ex ) 동기는 내가 관심을 가지고 있는 것, 비동기는 다른 스레드가 그 일을 처리하고 나한테 결과를 알려주는 것
profile
Backend Developer

0개의 댓글