본문 바로가기



프로그래밍/JAVA

[JAVA] 6코어 이상의 CPU를 사용하면 예제와 다른 결과(순서)가 나올 수 있습니다.

AMD 계열 시피유가 코어수가 데스크탑의 경우에는 일반용이  12~16코어에 이르고, 노트북의 경우에도 최대 8코어를 달성하고 있습니다. 인텔의 경우에도  데스크탑 i5는 6코어 12스레드, 노트북 H 고전력 라인업은 6코어 넘어갑니다. 문제는 이런 다중코어의 멀티스레드 때문에 기존 자바 프로그래밍에서 예시로 쓰는 코드들을 그대로 쓰면, 전혀 다른 순서로 결과가 계속 나옵니다. 초보자들은 돌릴때마다 동떨어진 순서 결과에 상당히 난감할 수 밖에 없습니다. 왜 이렇게되지?  

8core 16thread에서 처리 시간
4코어로 8스레드 제한에서 처리시간

자바의 경우 멀티스레드를 애초에 지원하기 때문에, 코어가 너무 많을 경우 영향받는 subclass api가 상당히 많습니다. 그래서 코드를 작동시킬때마다 책이나 강의에 나오는것과 다르게 처리속도가 들쑥날쑥하거나 전혀 다른 결과를 나타낼때가 있습니다. 이는 강사나 교수님들의 피시가 보통 4코어 8스레드여서 그 안에서 돌리면 얼추 비슷한 순서로 처리가 됩니다. 파이썬의 경우 기본적으로 멀티스레드를 지원하지 않는것이 이상했는데, 최근 추세를 보니 그렇게 처리하고 필요한 부분에서 멀티스레드를 동원하는게 효율적인 분야가 있고, 파이썬은 그 분야에 최적화된 언어라고 생각하면 설득력이 있었던것입니다.

초기에 정신없이 실습할때는 멀티스레드 예제만 그런것같았는데, 여러 예제들을 따라해 보다보니, 자바는 기본적으로 멀티스레드를 지원하기 때문에, 예제에 따라 데이터양이  늘어나거나 줄어들면 다른 순서 결과를 나타냅니다. 심지어 어떤 경우는 4코어로 제한한 경우가 8코어를 모두 사용한 경우보다 처리속도가 미세하게 더 빠른 경우도 나옵니다. 이러면 처리속도 별로 문제를 해결할려고 할때 뒤에 나와야될 결과가 앞에 나옵니다. 단순이 처리만 하면 괜찮은데 이걸 받아서 다음 처리를  해야하면 순서가 꼬여서 오류메시지를 내는 경우도 있습니다.  숙련자라면 당연히 블러킹이나, 동기화방법으로 처리하겠지만, 처음 프로그래밍을 하는 초보자가 그 코드를 쓸줄 알면 초보자가 아니겠죠? 해서, 자바 영상강의나, 서적에나오는 결과의 순서들(결과값은 맞음)은 항상 그대로 나오지 않는다는것을 초보자들에게 알려야 할것이라고 생각합니다. 

특히나 AMD를 잘 모르는 초보자들의 경우에 주변에서 컴퓨터 잘아는 사람이 추천해줘서 노트북을 삿다고 치면, 순서가 이렇게 다르게 나오거나 간혹 코드에 이상이 없는데 에러가 나면 추천해준사람을 잡아먹으려(?) 할 수 있을것입니다. 컴퓨팅자체에 대해서 이해가 없으면 더그렇구요. 그래서 이 글을 작성하면서 말미에 드는 생각은 잘모르는 친구들에게 추천할때는 4코어8스레드의 대기업제품이 최고라는것입니다.