Operating System

[Operating System] '동기화 되어있다'는 게 뭐예요?

OptimizerStart 2025. 4. 17. 17:29

Intro

자바 수업을 들으면서 '어떤 클래스가 동기화 되어있다.' 라는 말을 자주 들었다. 이에 깊게 생각하지 않고 공부를 하던 중 다음 문제 때문에 StringBuilder를 보다가 동기화가 나와서 '동기화 되어있다' 의 정확한 의미를 알고자 글을 작성하게 되었다. 
 

궁금해진 이유

StringBuilder의 동기화 되어있다는게 뭘까?

HashSet 클래스에 toString() 메서드가 오버라이딩 되어있지 않다. 그럼 어디에 toString()이 오버라이딩 되어있기에 저장된 값이 '[ 1, 3, 2 ] 처럼 대괄호로 값을 출력할까'에 대한 궁금증으로 조상 클래스를 타고 가보니 AbstractCollection 클래스에서 toString()이 오버라이딩 된 것을 확인했다. 

오버라이딩된 toString()

 
'StringBuilder를 쓴 이유가 있을까?'에 대한 물음은 '동기화가 되어있지 않아서'라고 결론을 내렸다. 그럼 'StringBuffer는 동기화 되어 있어 thread-safe하다'는게 무슨 의미일지 궁금했다.
 

사전 지식 : 싱글 코어, 멀티 코어

싱글 스레드와 멀티 스레드를 이해하려면 싱글 코어와 멀티 코어에 대한 이해가 필요하다. 
 

Core

정의

CPU를 처리하는 단위이고, 명령어를 실행하는 역할을 한다. 
 
평소 컴퓨터 조립할 때 보던  CPU 칩 내부에 마이크로칩 형태인 복잡한 전자 회로로 구성되어 존재한다. 이를 육안으로 보기 어렵고 확대를 하면 전자 회로가 보인다. 
 

규칙

  • 1개의 코어는 1개의 스레드를 이용해 작업한다. 
  • 하나의 코어는 다른 코어와 독립적으로 실행된다. 

주의 사항

  • 공유자원과 CPU 자원은 다르다. 
    • 타임 슬라이싱동안 할당 받은 자원은 CPU 자원이지 프로세스의 공유자원이 아니다. 

 
싱글 코어일 때, 

  • 싱글 스레드이면, 동기화가 필요하지 않다. 
  • 멀티 스레드이면, 동기화가 필요하다.

멀티 코어일 때 

  • 싱글 스레드이면, 동기화가 필요하다. 
  • 멀티 스레드이면, 동기화가 필요하다. 

동기화는 여러 스레드가 공유 자원에 안전하게 접근하도록 보장하는 방법이다. 싱글 스레드 환경에서 CPU는 시분할 방식으로 자원을 아주 짧은 시간 단위로 나누어 각 스레드에 할당한다. 스레드는 이 시간 동안 명령어를 실행하며 공유 자원에 접근할 수 있다. 그러나 CPU 할당 시간이 끝나면 컨텍스트 스위칭이 발생하여 실행 중이던 스레드는 현재 상태를 저장하고 CPU 제어권을 다른 스레드에 넘긴다. 이 과정에서 공유 자원을 사용하던 스레드가 중단되면, 자원 상태가 일관되지 않을 수 있다. 따라서 동기화는 스레드 간 공유 자원 접근을 조율하여 데이터 무결성(변경 되지 않음)을 유지하는 데 필수적이다.

 

싱글 코어

싱글 코어에서 멀티스레드를 구현하면, 여러 스레드가 시분할 방식으로 CPU 자원을 공유하며 실행된다. 이때 스레드들이 동기화 없이 공유 자원에 접근하면, 컨텍스트 스위칭으로 인해 데이터 훼손이 발생할 수 있다. 즉, 공유 자원을 사용하고 싶을 때 데이터가 훼손 되지 않도록 기다리는 것이 동기화라고 보면 된다. 
 
예를 들어, 스레드 A가 계좌 잔액을 100에서 150으로 업데이트하는 중에 컨텍스트 스위칭이 발생하면, 스레드 B가 중간 상태의 잔액을 읽어 잘못된 계산을 할 수 있다. 스레드 B가 계좌 잔액을 100인 상태로 작업하고 다시 스레드 A에게 CPU 제어권이 넘어가면, 스레드 A는 계좌잔액을 150으로 인식하는 데이터 불일치가 발생한다. 
 

멀티 코어

코어는 다른 코어와 독립적으로 실행된다. 따라서 멀티 코어는 여러 코어가 동일한 시각에 여러 작업이 동시에 진행될 수 있음을 의미한다. 또한 멀티 스레드는 하나의 코어에서 작업하는 일꾼이 여러명이라는 것인데 이 일꾼이 공유 자원을 교차하여 접근해 데이터를 훼손할 수 있어, 다른 스레드가 작업을 마치기 전에 공유 자원 접근할 수 없게 하려고 자원 사용을 위해 기다리는 동기화가 생긴 것이다. 
 

Outro

어떤 경우이든 '여러 스레드가 같이 사용하는 자원에 저장된 데이터를 훼손하지 않게 기다린다'는 것이 핵심이다.
향후, 실제 코드를 가지고 어떻게 데이터 불일치가 발생하는지 다뤄볼 계획이다.