티스토리 뷰

======================================================
안녕하세요 Doridori 입니다.

6년 전쯤 두 달 정도 쉴 시간이 있었는데, 막상 마음이 불안해서 한 달만 쉬고 바로 일을 했습니다. 

그런데 그 한 달조차도 충분히 쉬지 못했다는 아쉬움이 늘 남아 있었습니다.

이번에도 비슷한 시간을 보내고 있지만, 그때처럼 후회하지 않기 위해 하루하루의 일정을 기록하며 정리하고 있습니다.

주변에서는 '마음 편히 내려놓고 쉬는 것도 필요하다'고 하지만, 저는 하루에 뭐라도 해야 쉬는 느낌이 드는 사람인가 봅니다. (허허허)

이번 영상의 주제가 뜬금없는 이야기라고 느껴지실 수도 있지만, 늘 그렇듯 지금의 고민을 정리하는 시간이라고 생각하고 준비하고 있습니다.

저를 잘 아시는 분들은 이런 글을 보면 '아, 요즘 이 친구가 이런 생각을 하고 있구나' 하고 바로 알아보시기도 하고요.

다음 일자리를 알아보는 시간이 생각보다 길어지고 있지만, 그래도 한 단계씩 차근차근 나아가고 있다고 느끼고 있고, 현재는 결과를 기다리는 중입니다.

아직 확정 되지 않아 불안함도 있지만, 하루하루를 충실히 보내다 보면 좋은 소식이 오지 않을까 기대하고 있습니다.

자, 또 시간은 흐르고 있으니 열심히 달려보시죠!

다들 화이팅!!
======================================================

 

34. 내 코드는 왜 멀티 스레드에서만 터질까?(Multi Thread)


교재)

34. 내 코드는 왜 멀티 스레드에서만 터질까(Multi Thread).pdf
0.32MB

 

 

 

 시스템 개발 중 부하 관련되어서 고민을 하다가 Multi Thread용 API들이 별도로 구분되어 있어 해당 내용 관련되서 준비를 해보았습니다.

----------------------------------------------------------------------------------------------------------------------------------

1. 데이터는 어디에 저장 되는가?
  a. 스택 영역(Stack Area): 함수 안에서 선언된 지역 변수를 저장하는 영역
    > Thread 마다 각각의 Stack Area가 생성 되며 해당 영역은 다른 Thread와 
충돌 하지 않음
  b. 힙(Heap) & 데이터(Data) Area: Shared Memory로 전역 변수, 
객체(Instance), 클래스 변수(Static) 등을 저장 하는 영역
    > 모든 Thread가 하나의 Heap Memory Area를 공유
    > A Thread가 수정 중 B Tread가 값을 읽어 가거나 하면서 Exception 발생


 2. 원자성(Atomic Operation)과 문맥 교환(Context Switching)
  a. 원자성: 코드 한 줄(count++)은 단일 연산이 아닌, 여러 단계로 분리된 작업임
    > Read(Load): Memory에서 값을 가져와서 Register로 옮김
    > Modify(ALU): CPU가 값을 1 더함
    > Write(Store): 계산 결과를 다시 Memory에 적음
  b. 문맥 교환(Context Switching): 연산 진행 중 작업 진행 중간에 다른 Thread에서 작업을 요청하게 되어 진행 순서가 바뀌는 경우

3. 문맥 교환을 해결 하는 방법
  a. 비관적 잠금 (Pessimistic Locking)
    > 개념: 진행 중인 내용이 있을 경우 다음 작업이 끼어 들지 못하게 문을 걸어 잠금
    > 방식: 화장실에 들어가면서 문을 잠그고(Lock), 뒤에 온 사람은 앞 사람이 나올 때 까지 하염없이 기다림(Blocking)
    > 언어 별 구현: Java(synchronized), C#(lock, Monitor), Python(threading.Lock)
  b. 낙관적 접근 (Optimistic / CAS)
    > 개념: 일단 진행 하고 누가 변경을 했으면 다시 시도    
    > 방식: CPU의 하드웨어 기능을 이용해서 기억한 값이 그대로면 수정을 진행 하고, 변경 되었으면 다시 시도(Retry), Lock을 잡지 않아서 빠르지만 구현이 어려움
    > 언어 별 구현: Java(AtomicInteger), C#(Interlocked, ConcurrentQueue)

 4. 프로그램 규모가 커지고 Multi Thread 처리가 늘어남에 따라 기존에 수동으로 구현 하던 비관적 잠금 방법에 대한 오류와 속도 문제가 발생 하였고 이에 따라 각각의 언어에서 낙관적 접근 방식을 구현한 API들을 미리 만들어서 제공 함 (Thread-Safe Collection)

※ ALU (Arithmetic Logic Unit): 산술 논리 장치(CPU 안에 있는 계산기)
※ CPU (Central Processing Unit): 중앙 처리 장치
※ CAS (Compare And Swap): 비교 후 교체(확인하고 바꾸기 기술)
※ API (Application Programming Interface): 응용 프로그램 프로그래밍 인터페이스

----------------------------------------------------------------------------------------------------------------------------------

강의)

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함