viewimage.php?id=3dafdf21f7d335ab67b1d1&no=24b0d769e1d32ca73ded84fa11d028310ef2ab22591d9bdbf8feafbf5b59a2eb1046e0fd085a8536b11f6867d4cb63c6e1a33f2adf2ff42086eed81e692d07b5a8810db1de2fc5




생각없이 쓰는 똥글이지만 연차 오래된 프로그래머들도 제대로 모르는 사람이 많음


현대 cpu는 다중코어에 성능이 엄청 좋아져서 제대로된 프로그래머라면 이런 cpu의 성능을 최대한 활용할 수 있어야 한다


보통 요즘 intel 은 한 cpu에 8코어가 있지


그래서 여러 core를 활용하기 위해서 멀티프로세스나 멀티쓰레드를 돌리는 방법등을 사용한다


뭐 쓰레드나 프로세스를 계속 만들다 보면 OS의 스케쥴링 기능이 알아서 다른 core로 골고루 배분해 주니까


동시에 여러 core 를 활용해서 cpu의 성능을 극대화시킬 수 있다


(cpu와 core는 다른개념이다)




하지만 더 나아가서 프로그래머가 좀더 디테일하게 설정할 수 있는데 affinity 기능이다


당연히 OS에서 지원하는 system call 이고 linux 는 sched_setaffinity() 함수를 이용해서 사용 가능하고


windows 는 SetProcessAffinityMask() 함수를 이용해서 사용 가능하다

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setprocessaffinitymask


기술적인 내용은 특정 process 를 해당 cpu 의 task schedule list 에 고정시키는 기능이고


학교에서 보통 OS 의 프로세스 스케쥴링에 대해선 대략 배웠을거라 생각한다 (모르면 구글링)


함수의 사용법은 구글링하면 잘 설명되어 있다




예를 들면 4 core 라면 무거운 기능은 1,2,3 core 에 나눠서 돌리고 가볍지만 빠른 응답성이 필요한 기능은 4 core 에 돌리는 식으로


멀티코어 환경에서 프로그래머의 설계 역량에 따라 대규모 APP 의 성능이 크게 달라질 수 있다


물론 대부분의 프로그램은 이런거 고려 안하고 멀티 프로세스나 멀티 쓰레드로 그냥 돌려도


OS 가 사용량이 적은 cpu 들에 알아서 프로세스들을 분배하기 때문에 (task scheduling) 프로그래머가 신경을 쓰지 않아도 된다




하지만 알아두면 프로그램이 좀더 효율적으로 돌아가게 만들 수 있다


가령 cpu 의 core가 8개이고 모든 core 를 다 사용해야 하는 대규모 어플을 만든다고 할 때


core 수에 맞춰서 멀티 프로세스를 생성하고 각각의 core 에 affinity 로 프로세스를 분배하는 경우도 생각할 수 있다


또는 무거운 프로세스와 가벼운 프로세스로 나누어서


가볍지만 빠른 응답성이 필요한 프로세스는 core 7에서만 실행시키고 core 0~6 에 무거운 프로세스들을 실행시켜서


사용자의 응답성을 높히는 방안도 가능할 것이다


2코어인지 4코어인지 8코어인지는 core 갯수를 읽어온다음 if 문으로 처리하면 되니까 core 수에 상관없이 활용할 수 있다




외국에선 이미 많이 쓰는 기술이고 중요한 내용인데


네이버에 쳐도 관련내용이 별로 없는거 보면 좀 슬프다