해결된 질문
작성
·
495
1
그림판 비유를 보면 컴퓨터에서 동시에 사용하는 프로그램마다 최소한 하나의 프로세스와 쓰레드를 가지고 있는데 컨텍스트 스위칭이 일어난다고 하면 코어 하나만 갈구는거 아닌가요?
그리고 아직 쓰레드를 직접 사용해본적이 없어서 잘 모르겠지만 메모리의 동기화를 보장하기 위하여 멀티스레드 프로그래밍에서 lock를 적극적으로 사용하는데 이러면 어느부분에서 성능향상이 일어나나요? lock을 사용하면 사용할수록 싱글코어와 다를것이 없다고 생각되서요
Web에서 종종 다루는 비동기적 처리를 하기 위해서 스레드를 사용하는건가요?
답변 3
2
그림판 비유를 보면 컴퓨터에서 동시에 사용하는 프로그램마다 최소한 하나의 프로세스와 쓰레드를 가지고 있는데 컨텍스트 스위칭이 일어난다고 하면 코어 하나만 갈구는거 아닌가요?
-> 컨텍스트 스위칭은 유저모드에서 커널모드로 전환되면서 기존 프로세스의 문맥(context)을 교체하는 상황을 얘기하는 것이고 꼭 코어 1개만 개입된다는 얘기는 아닙니다. (그림판 비유에서는 코어1개 + 프로세스 3개니까 1 코어만 갈구는거긴 하겠네요)
그리고 아직 쓰레드를 직접 사용해본적이 없어서 잘 모르겠지만 메모리의 동기화를 보장하기 위하여 멀티스레드 프로그래밍에서 lock를 적극적으로 사용하는데 이러면 어느부분에서 성능향상이 일어나나요? lock을 사용하면 사용할수록 싱글코어와 다를것이 없다고 생각되서요
-> lock을 사용하는건 좋아서 하는게 아니라 동기화 문제를 해결하기 위해 어쩔 수 없이 사용하는겁니다.
lock을 아무렇게나 남발하면 싱글쓰레드 프로그램보다 더 성능이 악화됩니다.
이와 관련된 부분은 본 강의 후반부에 자세히 나옵니다.
Web에서 종종 다루는 비동기적 처리를 하기 위해서 스레드를 사용하는건가요?
-> Web 프레임워크에 따라 다르겠지만 일반적으로 웹(ex. NodeJs)에서 말하는 비동기는 멀티쓰레드를 활용하는게 아니라 유니티의 코루틴처럼 싱글쓰레드 방식이지만 대기하지 않고 다음 연산을 처리하는 (async) 방식에 가깝습니다.
0
그렇다면 코어가 여러개인마이크로 프로세서는 여러개의 프로세스를 처리할때 컴파일러 차원이든 운영체제 차원이든 하드웨어 차원이든 여러개의 코어가 각자 프로세스를 처리하는 작업분배가 보장되어 있나요?
보장되어 있지 않고, 적절히 분배하는게 운영체제의 역할입니다.
또한 하나의 프로그램(프로세스)이 여러개의 스레드를 가질 수 있는데 이때 코어개수 이하의 스레드를 사용한다고 가정하면 코어 여러개가 각각 스레드 하나를 맡아서 처리하는게 보장되는건가요?
보장되어 있지 않습니다.
스레드가 두개있다고 가정할때 코어 하나가 두개의 스레드를 왔다갔다 하는건 성능적으로는 거의 의미가 없어보여서요
네 말씀대로 전혀 의미 없습니다. 그래서 극한의 상황까지 가는 콘솔에서는
애당초 코어 개수만큼의 쓰레드만을 운영합니다.
마찬가지로 IOCP 게임 서버에서도 쓰레드 개수를 코어 개수의 1~1.5배 정도로 유지합니다.
0
좋은 답변 감사합니다.
그렇다면 코어가 여러개인마이크로 프로세서는 여러개의 프로세스를 처리할때 컴파일러 차원이든 운영체제 차원이든 하드웨어 차원이든 여러개의 코어가 각자 프로세스를 처리하는 작업분배가 보장되어 있나요? 또한 하나의 프로그램(프로세스)이 여러개의 스레드를 가질 수 있는데 이때 코어개수 이하의 스레드를 사용한다고 가정하면 코어 여러개가 각각 스레드 하나를 맡아서 처리하는게 보장되는건가요? 스레드가 두개있다고 가정할때 코어 하나가 두개의 스레드를 왔다갔다 하는건 성능적으로는 거의 의미가 없어보여서요