인프런 커뮤니티 질문&답변

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

자바 동시성 프로그래밍 [리액티브 프로그래밍 Part.1]

스레드 중지 – flag variable vs interrupt() - 2

스레드 중지 – flag variable vs interrupt() - 2 강의에서 질문

작성

·

223

·

수정됨

0

안녕하세요.

처음 강의 부분에

스레드 1번 2번이 있는데 1번에 sleep을 주어서 컨텍스트 스위칭이 일어나 코어 캐시 메모리에서 false라는 값을 업데이트한다고 하셨는데 sleep을 주지 안 아도 시간 자원이 만료되면 자동으로 컨텍스트 스위칭이 일어나서 둘 이 번갈아 가며 실행 될 때

캐시 메모리가 비워지지 않는 건가요? 이 부분 때문에 이해가 잘 안 갑니다.

 

아니면 멀티 코어 환경이라 스레드1 캐시 메모리는 그대로 true고 sleep으로 인해서 초기화가 된건가요?

답변 2

1

정수원님의 프로필 이미지
정수원
지식공유자

컨텍스트 스위칭이 일어난다 하더라도 프로세스 혹은 스레드간 캐시메모리를 전환시키는 것이지 캐시메모리 정보가 지워지는 것은 아닙니다

다만 sleep의 경우 강제로 cpu 할당을 양보하는 것이기 때문에 시분할에 의한 컨텍스트 스위칭과는 다른 운영체재의 스케줄링 정책이 있을 수 있습니다

이 부분은 OS 에 의한 실행 결과에 있어 차이점을 보이고 있기 때문에 단순히 어떤 규칙이나 원칙보다는 내부적인 OS 정책과 기준에 따라 다양하게 접근해 볼수 밖에 없을 것 같습니다

1

안녕하세요, 인프런 AI 인턴입니다.

스레드 중지에 관해 질문해주셨군요. 우선 컨텍스트 스위칭은 한 스레드에서 다른 스레드로 CPU의 제어를 넘기는 과정을 의미합니다. 이 과정에서 현재 스레드의 상태는 저장되며, 다음 스레드의 상태가 복구됩니다.

질문하신 내용 중 “캐시 메모리가 비워지지 않는 건가요?“에 대한 부분을 살펴보면, 일반적으로 컨텍스트 스위칭이 발생하더라도 각 스레드의 로컬 캐시(예: CPU 코어에 있는 L1, L2 캐시)를 명시적으로 비우는 작업은 하지 않습니다. 대신에 새로 스케줄된 스레드가 실행되면서 필요한 데이터를 캐시에 채우게 됩니다.

멀티 코어 환경에서는 각 코어가 독립적인 캐시를 가지고 있을 수 있습니다. 따라서 스레드 1이 한 코어에서 동작하고 있는 동안 다른 코어에 있는 스레드 2의 캐시에는 영향을 주지 않습니다. 그러나 모든 스레드는 같은 메인 메모리를 바라보고 있고, 캐시 일관성 프로토콜에 의해 여러 코어의 캐시 사이에 데이터가 일관되게 유지되도록 관리됩니다.

sleep을 사용하여 스레드를 일시 정지 시킬 경우, 해당 스레드가 CPU 자원을 사용하지 않도록 하고 다른 스레드가 실행될 수 있는 기회를 줍니다. sleep으로 인한 스레드의 정지가 반드시 캐시를 초기화한다는 것을 의미하지는 않지만, 다른 스레드가 실행될 때 해당 스레드에 필요한 데이터가 캐시에 로드될 수 있습니다.

만약 멀티 코어 환경에서 공유 변수에 대한 가시성이 문제가되는 경우, volatile 키워드 사용, synchronized 블록, 혹은 java.util.concurrent 패키지의 도구들을 통해 메모리 일관성을 보장할 수 있습니다.

강의에서 언급된 특정 부분에 대해 이해가 잘 안되신다면, 이러한 캐시 일관성과 멀티 코어 프로세싱의 복잡성을 고려해 이론적 설명이나 추가 예제를 통해 제공된 컨텍스트를 더 상세히 살펴볼 필요가 있을 것 같습니다.

hoonseung님의 프로필 이미지
hoonseung
질문자

캐시 일관성 프로토콜에 의해 여러 코어의 캐시 사이에 데이터가 일관되게 유지되도록 관리됩니다.

이거는 cpu가 알아서 캐시 <-> 메인 메모리 데이터 업데이트를 해준다는거죠?

그리고 컨텍스트 스위칭 시 스레드는 프로세스 내에서 힙이나 메서드 영역등 서로 공유하고 있는 메모리가 있어서 캐시 초기화를 안하고 프로세스는 독립된 메모리라 다 지우고 이런건가요?

hoonseung님의 프로필 이미지
hoonseung

작성한 질문수

질문하기