인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

Joy님의 프로필 이미지

작성한 질문수

앨런 Swift Concurrency for Swift 6 (Part-2)

4) 협력적 쓰레드 풀 5) 쓰레드 사용방식의 비교 GCD vs Swfit Concurrency (3강)

재개될 때 스레드 변경시 왜 컨텍스트 스위칭이 발생하지 않는 건가요?

작성

·

41

·

수정됨

0

📌 자주하는 질문 모음

링크: https://pointed-earwig-996.notion.site/Swift-Concurrency-for-Swift-6-Part-2-1acbbab5ec9280a0944edcab00e027dd?pvs=4

안녕하세요. 몇 가지 궁금한점이 있어서 질문남겨요.

part.1의 7강, 책 26페이지에서 멈췄다가 다시 실행될때 다른 쓰레드에서도 실행될 수 있다고 되어있는데요.

우선 제가 이해한 것은

  1. 기존의 프로세스(앱)하나당 여러개로 나뉘어서 쓰던 쓰레드가 CPU-프로세스-쓰레드 각 하나씩으로 연결로 바뀌었다.

  2. 하나의 쓰레드에서 멈췄다 재개했다를 반복하며 재개 전까지 다른 일을 처리할 수 있게 됐다.

  3. 그래서 프로세스 내부에서 일어나던 컨텍스트 스위칭이 없어졌다.

제가 헷갈리는 부분은 아래와 같아요.

  1. 현재강의 3:15에 보면 한 쓰레드에서 멈췄다 재개했다 하며 중간에 다른 일도 처리하고 하는걸로 보여요. 그래서 컨텍스트 스위칭이 일어나지 않는다고 이해했어요. 그런데 다른쓰레드에서 재개되면 쓰레드가 바뀌는데 왜 컨텍스트 스위칭이 일어나지 않는 건가요?

  2. CPU당 하나씩 쓰레드를 가지게 되면 최대 동시 실행할 수 있는 앱은 CPU코어수 만큼으로 제한되나요?

답변 2

0

앨런(Allen)님의 프로필 이미지
앨런(Allen)
지식공유자

네 안녕하세요 Joy!

네 협력적 쓰레드풀 방식은 CPU와 쓰레드가 1대1 관계로 바뀌었기 때문에, CPU코어 이상의 쓰레드를 생성하지 않는 방식이예요. (정확하게, 프로세스(process)라는 건 한개의 앱의 실행을 의미하기 때문에, CPU가 프로세스는 아닙니다. 여러개의 쓰레드 동작을 합쳐서.. 1개의 앱의 실행 == 프로세스(실행 중인 프로그램의 인스턴스)라고 하는 겁니다.)

따라서, 프로세스 내부에서 일어나던 컨텍스트 스위칭이라고 표현하는 건 옳지 않다고 생각하고, CPU에서 다른 쓰레드로 전환하는 과정이 맞을 것 같아요.
(정확하게는 컨텍스트 스위칭은 2개의 개념에서 일어날 수 있는데.. (1) 프로세스(앱) 간의 컨텍스트 스위칭 (2) 하나의 프로세스(실행되고 있는 앱 한개) 안에서의 컨텍스트 스위칭이 일어날 수 있지만, 저는.. 하나의 앱의 실행 과정에 대해서 설명드리고 있는 것이기 때문에.. 제가 설명드리는 부분은 (2)번 내용에 대해서 말씀드리는 것입니다.)
(그래서 프로세스 내부에서 일어나는 컨텍스트 스위칭이 없어진게 아니라, CPU에서 다른 쓰레드로 전환하는 과정이 없어졌다고 표현하는 것이 정확하다고 말씀드리는 거예요.)

헷갈리시는 부분에 대해서
1. 왜 다른 쓰레드에서 재개가 되는 작업이 컨텍스트 스위칭이 일어나지 않는 건지
108페이지 그림을 잘 생각해보시면 좋을 것 같아요. 기존의 방식은 1개의 (운영 체제의 소프트웨어적인) 쓰레드 내부에서 아래 그림처럼 컨텍스트 스위칭이 일어났었는데, 이제 컨텍스트 스위칭이 일어나지 않는 방식으로 바뀌었습니다.

스크린샷 2025-03-22 오후 1.10.01.png.webp

따라서, 비동기 함수가 멈췄다가 다른 쓰레드에서 재개가 되는 것이.. 컨텍스트 스위칭이 일어나지 않는 개념하고는 다른 개념이예요. 예를 들어서, 비동기(async) 함수가 2번 쓰레드에서 실행되다가 3번쓰레드에서 재개가 되더라도..

스크린샷 2025-03-22 오후 1.30.31.png.webp

이건 컨텍스트 스위칭이 아닙니다. (뒤에 메모리 구조(4강 내용)에서 일어나는 일까지 보시면.. 더 정확하게 이해가 되시겠지만..) 이건 실제로 실행하던 CPU코어가 바뀌었을 뿐이지.. 1개의 CPU가 자기가 실행중인 쓰레드를 전환한 개념은 아닙니다.
(따라서, 이부분을 다시 한번 잘 생각해 보시면 좋을 것 같아요.)


2. CPU당 하나씩 쓰레드를 가지게 되면 최대 동시 실행할 수 있는 앱은 CPU코어수 만큼으로 제한되는지
그건아닙니다. 약간 헷갈리고 계신 것 같은데.. 8코어 CPU라고 하면.. 하나의 앱이 실행되는 동안 최대 8개의 쓰레드를 사용할 수있다는 뜻인데.. 그렇다고 하더라도.. 다른 앱들도.. iOS 운영체제에 의해 백그라운드 쓰레드에서 동작하고 있을 수 있습니다. (그리고 갯수가 꼭 그렇게 코어 만큼으로 제한되지는 않습니다.)

그냥 조금 쉬운 예를 들어서 생각해보면.. 아이폰에서 조금 무거운(?) 하나의 앱을 실행시키셨다고 가정을 해보면.. 그 무거운 앱이 아무리 빡세게 돌아가더라도 8개의 쓰레드(CPU)를 풀로 사용하고 있는 경우는 거의 없습니다. 그러면 예를 들어, 6개의 쓰레드(CPU)를 풀로 사용하고, 2개의 쓰레드(CPU)를 조금 널럴하게 사용하고 있다면.. 운영체제는 알아서 널럴하게 사용중인 2개의 쓰레드(CPU)를 사용해서 백그라운드에서 멜론(?) 같은 앱을 돌릴 수 있습니다. (운영체제가 알아서 하는 부분이기도 하죠.)

이런 것처럼.. CPU(쓰레드)가 8개 이니 무조건 8개의 앱만 돌아가는 것은 아니고, 운영체제는 지금 실행되고 있는 (Foreground에서 돌아가고 있는) 앱은 더 많은 CPU를 활용해서 일처리 하는 것일 뿐인 것이고, 백그라운드에서 돌아가고 있는 앱에는 조금 제한된 CPU 등의 자원을 할당해서 돌아가게 만들 수 있습니다.

따라서, 동시에 실행 가능한 앱의 수는.. CPU 코어 수와는 직접적인 관련이 없고, 8코어(CPU) 기기에서도 10개의 앱을 "실행 중"으로 유지할 수 있습니다. (잘 생각해보시면.. 꼭 iOS 뿐만아니라 그게 macOS라고 하더라도 어차피 인간이 집중해서 처리하는 앱은 일단은 (Foreground에 있는) 한개일 것이기 때문에.. 운영체제가 지금 집중적으로 사용하지 않는 앱은.. CPU등의 리소스를 덜 할당한다.. (아니면 잠시 멈춰놓는다?) 이런 개념으로 생각하시면 됩니다.)

결론적으로 , Swift Concurrency의 협력적 스레드 풀 모델은 (컨텍스트 스위칭을 하지 않아) 1개의 CPU의 효율성을 향상시키는 것이지, 시스템(운영체제) 전체에서 실행 가능한 앱의 수를 제한하는 것은 아닙니다.

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. Joy님께서 질문하신 Swift Concurrency 관련 주제를 확인하였습니다. 비동기 프로그래밍에서의 쓰레드 스위칭과 컨텍스트 스위칭에 대한 궁금증을 해결하기 위해 설명드리겠습니다.

쓰레드 및 컨텍스트 스위칭에 대한 이해

1. 쓰레드 스피닝과 컨텍스트 스위칭

반복적으로 멈추었다가 재개하는 과정은 스레드가 다른 작업을 수행할 수 있도록 하는 기능입니다. 하지만 재개 시 다른 스레드에서 작업이 진행될 수 있으며, 이 과정이 컨텍스트 스위칭을 수반합니다. 즉, 새로운 스레드에서의 재개는 스케줄러가 다른 스레드로 작업을 이동하는 것이며, 이로 인해 작업 자체는 중단되지 않지만 환경(context)을 전환해야 하기에 컨텍스트 스위칭이 일어납니다.

2. CPU와 쓰레드의 관계

CPU의 코어 수는 실제로 동시에 실행될 수 있는 스레드 수를 제한합니다. 하지만 멀티태스킹을 통해 각 CPU 코어가 짧은 시간동안 다수의 쓰레드를 빠르게 전환시켜 실행하기 때문에, 물리적인 코어 수 이상으로 스레드가 실행되는 것처럼 보일 수 있습니다. 그러나 이는 효율적인 스케줄링에 의해 가능한 것이며, 실제 동시 실행은 코어 수에 제한을 받습니다.

추가 정보와 리소스

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

Joy님의 프로필 이미지

작성한 질문수

질문하기