멀티코어 프로세서 및 멀티쓰레드
멀티코어 프로세서는 운영체제에서 각각의 코어를 하나의 프로세서로 인식하고 스케줄링하며, 각각의 코어에 쓰레드를 할당하여 수행합니다.
멀티 코어 시스템에서는 캐시를 공유하기 때문에 data, code 등 프로세스의 자원을 공유하는 멀티쓰레드을 효과적으로 수행할 수 있습니다.
멀티쓰레드의 장점은??
응답성
싱글 쓰레드에서, 수행 중이던 쓰레드가 입출력으로 인해 block 된다면 프로세스 전체가 block 될 것입니다.
멀티 쓰레드에서는, 하나의 쓰레드가 block되거나 시간이 걸리는 작업을 하더라도, 다른 쓰레드들은 실행되고 있기에 사용자 입장 에서는 interactive합니다.
자원공유
쓰레드들 간에는 프로세스의 메모리 및 다른 자원들은 공유합니다.
경제성
fork() 시스템 콜을 사용하는 등 여러 개의 프로세스를 생성하여 사용하는 것보다, 여러 개의 쓰레드를 생성하여 사용하는 것이 비용이 적습니다.
확장성
여러 개의 쓰레드가 각각 다른 프로세서에서 동시에 실행이 가능합니다.
사용자 쓰레드가 무엇인가요??
사용자 쓰레드는 커널 영역 위에서 유저 모드에서 동작하는 쓰레드입니다.
사용자 쓰레드가 프로세서를 할당 받아 수행되기 위해선느 커널 쓰레드와의 매핑이 이루어져야 합니다.
즉, 사용자 쓰레드는 커널 쓰레드를 통해서 프로세서를 사용할 수 있습니다.
커널 쓰레드가 무엇인가요??
커널 영역에서 동작하는 쓰레드입니다.
커널 영역에서 쓰레드를 관리하고 생성합니다.
코어가 2개인 시스템이라면, 커널 쓰레드도 2개 있어야 두 개의 서로 다른 쓰레드를 병렬적으로 수행할 수 있습니다.
즉, 멀티코어 시스템에서 커널이 병렬적으로 돌아가기 위해서는 2개의 커널 쓰레드가 반드시 필요합니다.
참고!!
CPU 스케줄링은 커널 쓰레드를 통해 이루어집니다.
CPU 스케줄리은 기본 개념으로는 프로세스가 단위라고 하지만, 쓰레드를 고려한다면, 쓰레드가 CPU 스케줄링의 단위가 됩니다!!
다시 하나의 쓰레드를 사용자 쓰레드와 커널 쓰레드로 구분한다면, 둘중 커널 쓰레드가 CPU 스케줄링의 단위가 됩니다.
스케줄링은 프로세서를 누가 사용할지 결정하는 것입니다.
사용자 쓰레드는 커널 쓰레드와 매핑이 되어야만 프로세서를 사용할 수 있습니다. 커널 쓰레드와 매핑되지 못한 유저 쓰레드는 block됩니다.
사용자 쓰레드와 커널 쓰레드 간 매핑에 대해 설명해주세요.
One to One
가장 단순한 형태의 매핑으로, 각각의 사용자 쓰레드를 커널 쓰레드로 맵핑합니다.
유저 쓰레드가 생성되면, 그에 따른 커널 쓰레드가 생성됩니다.
커널 쓰레드가 모자라지 않기에, 사용자 쓰레드입장에서는 커널 쓰레드가 모자라서 block 되는 문제가 발생하지 않는다.
하나의 쓰레드를 굳이 유저 쓰레드와 커널 쓰레드로 구분할 필요가 없다.
여러 개의 쓰레드를 멀티 프로세서에서 도잇에 수행할 수 있습니다.
커널 쓰레드도 한정된 자원이기 때문에 무한정으로 생성 할 수 없다.
사용자가 수천, 수만 개의 유저 쓰레드를 만든다고 같은 커널 쓰레드를 만들 수 없습니다.
Many to One
여러 개의 사용자 레벨 쓰레드들이 하나의 커널 쓰레드로 매핑된 형태
쓰레드 관리는 유저 레벨에서 이루어집니다.
한 번에 하나의 쓰레드만 커널에 접근할 수 있으므로, 하나의 쓰레드가 시스템 콜을 호출하는 등 커널에 접근하면 나머지 쓰레드들은 대기해야 합니다.
동시에 여러 개의 쓰레드가 시스템 콜을 호출 할 수 없습니다.
=> 즉, concurrency는 지원하지 못합니다. 멀티 프로세서 시스템이더라도, 여러 개의 프로세서에서 동시에 수행하는 것이 불가능합니다.
Many to Many
여러 개의 사용자 쓰레드를 여러 개의 커널 쓰레드로 매핑된 형태
커널 쓰레드는 생성된 유저 쓰레드와 같거나 적은 수 만큼만 생성이되며, 커널은 적절히 매핑을 조절 및 스케줄링 합니다.
One to One처럼 사용할 쓰레드의 수에 대한 고민을 할 필요가 없으며, Many to One처럼 하나의 쓰레드가 시스템 콜을 호출할 경우 다른 쓰레드가 block되는 현상에 대한 고민을 할 필요가 없습니다.