생각없이 쓰는 똥글이지만 연차 오래된 프로그래머들도 제대로 모르는 사람이 많음
현대 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 수에 상관없이 활용할 수 있다
외국에선 이미 많이 쓰는 기술이고 중요한 내용인데
네이버에 쳐도 관련내용이 별로 없는거 보면 좀 슬프다
해당 댓글은 삭제되었습니다.
윈도우 운영체제 자체에서 지원하는데 당연히 자바에서도 안될이유가 없겠지? api 는 찾아보면 있지않을까
API만들어주셈
개추
아 나는 거리에 따른 memory 접근시간 차이만 생각하고 있었는데 이런식으로도 사용이 가능했구나 좋은 정보 ㄱㅅ
타이젠에서 쓸 수 있나여?
이 댓글은 게시물 작성자가 삭제하였습니다.
타이젠은 리눅스커널 기반이라 당연히 가능. 리눅스든 윈도우든 커널에서 시스템콜을 만들어서 지원하고있는 기능이니까요
당연히 가능한지는 봐야 알지 리눅스 커널을 가져다 썼어도 커스터마이징하면서 제거했을수도 있고 유저레벨에서는 접근 안되게 해놨을수도 있음 그리고 타이젠은 rtos 아닌가? 굳이 안남겨놨을거같은데
Go언어는 우케함
모든 언어는 결국 기계어로 번역되서 cpu랑 소통한다는 공통점이 있어. 근본적으로 기계입장에서 보면 똑같은거야. 커널 입장에서도 마찬가지
그렇기 때문에 이와같은 system call 은 언어 상관없이 모든 언어에서 공통적으로 쓸 수 있어. 지원하는 라이브러리가 없다면 간단하게 시스템콜 호출하는 라이브러리를 만들면 돼
Node.js는 우케함
ㅋㅋㅋㅋㅋㄱㅋ
컨셉인가 ㅈㄴ 친절하게 알려주는데 애들이 놀리고잇네 - dc App
좆망갤에 웬일로 이런 글이
진짜 올려주셨네 감사
Numa에 대해서도 잘 아시나요 ㅇㅅㅇ?
아뇨 NUMA 개념만 알고 실제로 써보진 않았습니다. NUMA 가 core당 메모리를 구분하지만 대부분 프로세스가 core 들이 자원을 공유해서 같이 엑세스 하기 때문에 NUMA 의 효율은 대부분 프로젝트에서 불필요하지 않나 생각이 듭니다
그래서 현대 기술에서 NUMA 의 단점을 보완하고(core간 자원공유시 속도저하) 장점을 극대화 시키는(memory access time 으로 인한 속도저하) 방향으로 발전되고 있는데 이것이 cpu cache memory 이죠
CPU 속도에 비해 메모리 access 가 너무 느리다 보니 cache memory hit 가 높은 프로그램과 hit 율이 낮은 프로그램과의 속도차이는 천지차이이죠. 그래서 당연히 속도가 중요시되는 대규모 프로젝트에서 프로그래머는 cache memory hit 를 높히는 방향으로 프로그램을 짜야 합니다
memory 에서 자원을 가져올때 cache_aligned 단위로 데이타를 가져오고 (보통 64나 128 bytes) 해당 메모리에 write 동작을 할때 모든 core 의 cache memory 에서 해당 값이 지워지는 캐시 일관성 문제. 그것을 해결하기 위해 cache_aligned 로 변수선언을 하거나 read_mostly 로 write 와 read 영역을 나누어서 cache memory 활용을 극대화하는 기술들을 이미 많이 개발이 되고 프로그래머들도 많이 쓰고 있죠. 아마 이런 방향으로 앞으로 발전될 것 같은데 국내 프로그래밍 교육에선 이런 부분에 대한 교육이 매우 부족한 것 같아요
실제로 국내에서 게임프로그래밍, 서버프로그래밍, 대규모 유틸리티 개발이나 임베디드등 속도에 민감하고 코드 최적화가 필요한 프로그래밍 분야가 매우 많은데도 말이죠
자바는 executors 찾아보고 공부해라
님 회사에서 신입 안 뽑나요...?
시스템 쓸것은 남겨둘것