• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

Context Switching 질문

21.01.25 08:15 작성 조회수 212

0

강의를 진행하며 의문점이 생겨 질문 남깁니다 >>

제가 이해하기론 한 코어로 여러 쓰레드를 처리할땐 각 쓰레드의 로직을 잠깐 실행하고 다음 쓰레드로 넘어가서 다시 로직을 잠깐 실행하고를 반복하며 마치 동시에 실행되는 효과를 얻을 수 있다는걸로 이해했는데 이때 Thread에 Sleep 메서드를 호출하면 해당 코어가 다음 쓰레드를 처리하기 시작하고 Sleep에 할당된 시간 만큼 경과하면 다시 Sleep 메서드가 호출된 쓰레드로 돌아와 처리를 하여 Context Switching 현상이 일어난다고 이해했습니다.

하지만 애초에 코어는 쓰레드를 매순간 옮겨다니며 처리하는데 이건 Sleep이랑 상관없이 코어가 매 쓰레드를 옮겨다닐때 마다 Context Switching 현상이 일어나는게 아닌가요??

추가로 위와는 다른 질문이지만 CPU 시트를 보면 코어, 쓰레드로 성능표기가 되어있는데 인텔 I5-6세대 기준 4코어 4쓰레드라고 표기되어 있는데 그럼 컴퓨터에서 최대 동시에 구동가능한 쓰레드가 4개라는 건가요? 그건 아닌거 같은데 헷갈리네요..

답변 3

·

답변을 작성해보세요.

1

동일 코어의 서로 다른 쓰레드는 애초에 서로 근접하게 접근할 수는 있어도 완벽하게 동시에 접근은 불가능한데
서로 다른 코어에서 동작하는 쓰레드 끼리는 완전 같은 시간상에 접근할 가능성이 있지 않나요?

->
동일 코어에서 실행되는 2개의 쓰레드라면, '완벽하게 동시 접근은 안되는' 것은 맞지만
그럼에도 CPU 명령어들이 atomic하지 않기에 문제가 없는 것은 아닙니다.
예를 들면 num = num + 1;을 한다 하더라도
내부적으로는 

mov eax, dword ptr [num]
inc eax
mov dword ptr [num], eax

와 같이 3 단계로 구성되기에
inc eax를 하다 말고 쓰레드가 교체되면 싱글 코어에서도 문제가 일어날 수 있습니다.

그럼 Interlock 계열의 메서드를 사용하더라도 다른 코어의 쓰레드가 동시에 Interlock에 접근하면
Interlock의 의미가 없어지는것 처럼 느껴지네요.

->
Interlocked 계열 함수를 사용하면
내부적으로 메모리 락을 걸어서 정말로 한 번에 하나의 쓰레드만 접근할 수 있어서
위에서 생각하시는 문제는 일어나지 않습니다.
여기서 알 수 있는 것은 Interlocked을 사용한다고 경합이 없는 것은 아니라는거죠.

여담인데 Lock-Free 프로그래밍에서 Lock을 명시적으로 사용하지 않고 Interlocked을 사용한다고 해서
마치 경합없이 프로그램이 술술 실행되는거로 오인하는 사람들이 많은데,
저 용어 자체부터가 혼동의 여지가 있다고 봅니다.

1

하지만 애초에 코어는 쓰레드를 매순간 옮겨다니며 처리하는데 이건 Sleep이랑 상관없이 코어가 매 쓰레드를 옮겨다닐때 마다 Context Switching 현상이 일어나는게 아닌가요??

맞습니다. 그래서 콘솔과 같이 극한으로 성능을 끌어올려야 하는 경우
애당초 코어 개수와 일치하는 쓰레드 개수를 만들어서 실행합니다.
Sleep과 상관없이 어차피 Context Switching이 일어나는 것도 사실이지만,
원래 할당받은 실행 시간 (timeslice)도 포기하고 바로 cpu 소유권을 반환해버리니
더 빈번하게 유저<->커널 모드 변환이 일어나겠죠.

추가로 위와는 다른 질문이지만 CPU 시트를 보면 코어, 쓰레드로 성능표기가 되어있는데 인텔 I5-6세대 기준 4코어 4쓰레드라고 표기되어 있는데 그럼 컴퓨터에서 최대 동시에 구동가능한 쓰레드가 4개라는 건가요? 그건 아닌거 같은데 헷갈리네요..

쓰레드를 만드는거야 메모리가 버텨주는만큼 무한정 늘릴 수 있겠지만
'동시에' 구동 가능한 쓰레드는 코어(alu) 개수와 동일합니다.

0

enryong님의 프로필

enryong

질문자

2021.01.26

2번 질문의 답변에서 "'동시에' 구동 가능한 쓰레드는 코어(alu) 개수와 동일합니다."라는 뜻은

서로 다른 코어에서 한 전역변수를 동시에 Store할 가능성도 있다는거 아닌가요?
동일 코어의 서로 다른 쓰레드는 애초에 서로 근접하게 접근할 수는 있어도 완벽하게 동시에 접근은 불가능한데 
서로 다른 코어에서 동작하는 쓰레드 끼리는 완전 같은 시간상에 접근할 가능성이 있지 않나요?
그럼 Interlock 계열의 메서드를 사용하더라도 다른 코어의 쓰레드가 동시에 Interlock에 접근하면 Interlock의 의미가 없어지는것 처럼 느껴지네요.