멀티프로세스와 멀티쓰래드에서 CPU 배분 관련 내용입니다.
글쓴이: trymp / 작성시간: 토, 2011/07/02 - 12:36오후
멀티프로세스에서는 kernel 에서 자동적으로 scheduling 해서 CPU core 를
배분하는 것 같은데요. ps -eo psr,pid,cmd 로 확인..
그런데 멀티쓰래드 같은 경우에는 쓰래들별로 CPU를 배분해서 사용하나요?
아니면 그 프로세스 자체에 해당하는 CPU 만 계속 사용할 수 있나요?
가령
멀티프로세스는 kernel 에서 자동적으로 core 가 아래와 같이 배분이 되는데,
daemon1 daemon2 daemon3
CPU1 CPU2 CPU3
멀티쓰래드일 경우에는
daemon
thread1 thread2 thread3
CPU1 CPU2 CPU3
위와 같이 배분이 되나요? 아니면 daemon 의 모든 thread 가 한 CPU core 에
의해서만 동작이 되나요?
알려주시면 감사하겠습니다.
고수님들의 많은 조언 부탁드립니다.
Forums:
쓰레드는
쓰레드는 하나의 프로세스 안에 있어야 합니다.
그래서 멀티 쓰레딩을 하더라도 공유 변수 같은 것에 접근할 수 있는 것이죠.
쓰레드 안에서 여러 CPU를 쓰고 싶으면 openMP 같은 특수 라이브러리를 써서 돌려야 합니다.
즉 하나의 프로그램은 별도의 조작을 하지 않는 이상 하나의 CPU core에서만 돕니다.
요즘 게임 같은 경우 GUI, Audio, 게임 조작 등이 각각 다른 CPU core에서 돌도록 되어 있다는 군요.
적어도 리눅스에서는 아닙니다.
리눅스의 기본 스케줄링 단위는 스레드이고
스케줄러는 상황에 따라 적절한 cpu를 선택하도록 되어 있습니다.
즉, 별도의 조작을 하지 않는 이상 여러 cpu에서 돌도록 되어 있습니다.
공유 변수 접근은 메모리 (주소 공간)를 공유한다는 뜻이고
실행되는 cpu와는 관련이 없습니다.
요즘 운영체제는 대부분 스레드단위 스케줄링을 합니다.
요즘 운영체제는 대부분 스레드단위 스케줄링을 합니다. 윈도우도 마찬가지입니다.
그냥 스레드 많이 만들어 놓으면 운영체제가 알아서 잘 스케줄링 해줍니다.
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
위에 분들이 말씀하신대로 thread 단위로
위에 분들이 말씀하신대로 thread 단위로 스케쥴링을 하는건 맞습니다
인텔은 잘 모르겠지만 ARM SMP(Cortex-A9)에서는 L1 캐시를 코어별로 따로 가지고 있고
L2 캐시를 모든 코어가 공유하는 구조를 가지고 있습니다.
이럴경우 가상 메모리를 공유하는 2개의 thread가 각각의 Core 0,1번에서 동시에 동작을 하면서
data 영역, head 영역을 read/write를 하게되면 소위 말하는 cache thrashing이 발생하게 되면서
SCU ( snoop control unit )이 무지하게 힘들어 합니다.ㅎㅎㅎ
따라서 성능 최적화를 위해서는 몇가지 고민을 하시는게 좋을듯 합니다.
1. 동일한 번지의 데이터를 각각의 코어가 따로 읽고 쓰면 성능이 매우 저하됩니다
2. 그렇다고 한 코어에서만 thread를 돌리면, 여러 코어가 있어도 프로그램의 수행시간은 줄지 않습니다.
3. 따라서 동일한 번지를 읽고 쓰지 않도록 thread 프로그래밍을 하는 마인드를 가지는 것이 좋습니당
감사합니다
좋은 답변주셔서 감사합니다
댓글 달기