멀티 쓰레드와 멀티 코어에 대해 궁금한게 있습니다.

익명 사용자의 이미지

프로그래밍을 할때 성능에 대해 생각할 때 병렬 처리 역시 하나의 최적화 방법중 하나인데.

이를 위해 결국 멀티 프로세싱을 할지, 멀티 쓰레드를 할지 결정하는거잖아요?

결국 context switching 등에서 조금 더 이점이 있는 쓰레드를 사용하게 되는데요.

근데 하나 궁금한건 제가 배울때는 CPU에서 말하는 core가 하나의 프로세스가 동작하는 아키텍쳐로 알고 있습니다.

그럼 코어가 6개더라도 그냥 for로 무한 루프를 돌리는 프로그램을 만든다면 당연 1개의 코어만 해당 프로세스를 동작 시키겠죠? 멋대로 코어를 여러개 사용해서 병렬 처리 할 것같지는 않습니다.

그럼 1개의 프로세스가 100개의 쓰레드를 가지고 있고 1개의 코어가 16개의 쓰레드를 지원한다고 가정해보겠습니다.

그럼 1개의 코어가 16개의 쓰레드가 동시에 돌아가는건 당연하겠지만 나머지 84개의 쓰레드를 다른 코어가 지원해 줄까요? 만일 안됀다면 1개의 코어만 동작하고 나머지 5개 코어는 놀게 됀다는 결론이 나오는데...

어떤 칼럼에서는 코어가 알아서 스케줄링을 한다고 하는것 같기도 하고 어떤 칼럼에서는 멀티 프로세싱에 대한 처리가 없으면 그런 처리가 없다고 하는것 같기도 한데 이에 대하여 정확히 아시는 분이 있을까요?

라스코니의 이미지

OS/CPU의 입장에서는 몇개의 쓰레드가 돌지 모르는 입장임으로 알아서 할수 밖에 없는 입장이지요.
CPU Affinity로 검색해 보시면 관련한 문건을 많이 보실 수 있을 듯 한데,,, 어떤 OS는 완전 공평한 스케줄링을 위해서 발생한 쓰레드를 1/n 해서 코어에 할당하는 것도 있습니다.

문제는 이러한 동작을 했을 때 성능이 메모리 공유 아키텍쳐 등에 따라 case by case (케바케)라서 어떤게 무조건 좋다라고 할수가 없다는 것이죠.

대부분의 쓰레드간의 동작은 IPC (Inter Process Communication) 에 의해서 동기화가 필수적이기 때문에 실제로 100개의 쓰레드가 한꺼번에 도는 건 공학 시뮬레이션이나 랜더링, 영상 압축 등 특수 상황에서나 가능합니다.

일단 openMP 같은 것을 이야기하시는 건 아닌것 같아서 그냥 사견을 말씀드립니다.

질문작성자의 이미지

일단 답변 해주신점 감사합니다. 하나 배우고 가네요.

다만 답변의 내용은 제가 질문한 취지와 조금 어긋난것 같습니다.

OS/CPU에서는 하나의 쓰레드가 몇개의 쓰레드가 돌지 모른다고 하셨는데 사실 이것에 대해서 질문을 드린거라서요.

가령 커널 레벨에서 프로그램이 만드는 쓰레드에 대한 정보를 제공해서 병렬 처리를 할수 있는 API가 존재한다면 OS/CPU 레벨에서도 병렬처리가 가능하지 않을까 싶어 말씀드립니다.

어디선가 쓰레드를 늘리면 코어에서 알아서 할당을 해준다는 내용도 있더군요.

물론 한개의 프로세스가 코어 여러개를 공유할때 생길 수있는 메모리 앨리어싱이 어긋나는 문제가 발생할 수있고 그거에따라 성능 개선은 케바케라는건 저도 인식하고 있습니다.
다만 이런것에 대해서 아키텍쳐 레벨에서 지원할수 있다면 개선의 정도는 케바케일 수도 있으나 거의 대부분에 상황에서 개선을 만들 수 있지 않을까요?

그리고 100개의 쓰레드라는건 예시일뿐입니다. 굳이 100개의 쓰레드가 아니더라도 프로세스의 쓰레드 숫자가 한개의 코어가 지원 가능한 쓰레드 숫자를 넘는일은 흔한 경우니까요.

질문의 요지는 이렇습니다. 가령 C# 코드 기준으로

for(int i=0;i<100;i++){
Task.Run(()=> {while(true){}});
}

정도의 코드를 작성하면 100개의 쓰레드가 무한 루프를 돌리게 됍니다.

이 경우 메인 쓰레드를 수행하는 코어가 아닌 다른 코어에서 쓰레드를 할당 받는지, 만약 받지 못한다면 할당 받을 수있는지에 대해서 질문드립니다.

라스코니의 이미지

>>OS/CPU에서는 하나의 쓰레드가 몇개의 쓰레드가 돌지 모른다고 하셨는데 사실 이것에 대해서 질문을 드린거라서요.

>>가령 커널 레벨에서 프로그램이 만드는 쓰레드에 대한 정보를 제공해서 병렬 처리를 할수 있는 API가 존재한다면 OS/CPU 레벨에서도 병렬처리가 가능하지 않을까 싶어 말씀드립니다.

네. 그런게 있는 것으로 알고 있습니다. 윈도우는 좀 제안적으로 있는 것 같고, 리눅스는 좀 더 선택지에 대한 옵션이 더 많은 것 같고요.

OS 입장에서는 좀 까다로운게,,, 성능을 중시할 것이냐 반응성을 중시할 것이냐에 대한 타협이 있어야 하거든요. 그래서 위해서 "OS는 쓰레드가 몇개가 돌지 모른다"라고 한 것이 정말 사용자가 어떻게 작업을 실행할 지는 아무도 모르거든요.

예를 들어 사용자가 어떤 일을 시켰는데 그 일이 쓰레드 100개가 실행되는 일이다라고 가정하면 OS가 할수 있는 일은
1) 모든 CPU 코어에 일을 균등시키기. 그러면 가장 빨리 실행되겠지만 사용자가 또 다른 작업을 추가로 시켰다면 그 작업을 개시하는데 적지않은 시간이 소요되겠죠. 사용자가 제일 먼저 느끼는 건 아 이 OS 정말 느려터졌네?! 이런 반응이겠죠.
2) 가능한 모든 CPU 코어에 일을 배분하지만 혹시 모르니 한두개의 코어는 여분으로 남겨두기. 이 경우 먼저 시킨 일은 약간 덜 늦게 끝나겠지만 사용자가 추가 작업을 실행시켰을 때 최단시간내 반응할 수가 있겠죠. 사용자는 아, 이 OS 좀 빠릿빠릿한데?! 라고 느낄수 있는 거구요.

그러니 OS, 특히 윈도우나 리눅스와 같은 범용성 OS의 경우에 어느 한쪽으로 극단적으로 치우친 스케줄링 방식을 가져갈 수 없습니다. 이러한 동작은 어플리케이션 단계에서 하는 것이 맞죠. 예를 들어 거의 모든 랜더링 소프트웨어 같은 경우 거의 모든 코어를 사용하도록 되어 있는 것과 같이요.

>>이 경우 메인 쓰레드를 수행하는 코어가 아닌 다른 코어에서 쓰레드를 할당 받는지, 만약 받지 못한다면 할당 받을 수있는지에 대해서 질문드립니다.

가능합니다. 한 쓰레드를 생성한 직 후 그 쓰레드의 CPU core affinity(만약 OS에서 지원한다면)를 검사해서 만약 특정 CPU core에 집중되어 생성된다면 다른 CPU core로 CPU affinity를 변경해 주면 됩니다. 하지만 만약 변경한 쓰레드가 다른 쓰레드가 사용하는 메모리 주소 번지와 의존성이 있다면 실행은 실패하거나 의도하지 않은 결과가 나오게 됩니다.

질문작성자의 이미지

학생 때는 아무 생각 없이 다니다가 막상 일을 할려고 하니까 의문점이 생기네요 ㅠ 물어볼 사람도 없고...

답변 정말 감사드려요! 의문이 해소 되었습니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.