CPU가 지원하는 쓰레드랑 프로그래밍 상의 쓰레드랑 다른건가요?

adzoo의 이미지

안녕하세요.

TCP/IP 멀티 쓰레드를 공부중입니다.

공부하면서 제가 무언가 이해를 잘못하는 부분이 있는거 같아요.

제 컴퓨터 CPU는 코어4 쓰레드8입니다.

코어 1개에 2개 씩 쓰레드가 가능해서 8쓰레드인 것으로 알고 있습니다.

이상한 것이... 코딩을 하여 한 프로그램을 실행시키면 1프로세스가 생성이 될 텐데

해당 프로세스당 2개의 쓰레드만 가능해야 되는게 맞다고 생각했습니다.

그런데 쓰레드를 생성해보면 100개 이상도 되더라구요.. 제가 뭔가 개념을 잘못 이해하고 있는거 같은데...

CPU의 쓰레드랑 프로그래밍 언어에서 사용하는 쓰레드랑 뭔가 다른게 있는건가요?

제가 뭔가 혼동을 하고 있는 건지, 헷갈립니다. 도움 부탁드립니다.

익명 사용자의 이미지

1코어 1스레드 CPU 쓰던 시절에도 스레드 수십 개씩 띄우는 거 가능했습니다.

엄밀함은 조금 떨어지더라도 쉽게 이해할 수 있게 나눠 설명해드리죠.

CPU가 n코어 m스레드라고 할 때...

n은 말 그대로 "물리적인" CPU 코어 유닛 갯수입니다. 명령어를 메모리에서 뽑아 해석하고 실행하는 반도체 유닛이 n개 있는겁니다.

m은 "논리적" 코어 갯수이며, 경우에 따라 "동시에 실행가능한 스레드 갯수"이기도 합니다. n=m인 경우가 가장 직관적인데 가끔 m이 n보다 크기도 합니다. 이 경우 물리적 코어 하나가 스레드 두 개 이상을 동시에 실행 가능하다는 의미가 됩니다.

구체적으로 어떻게 그렇게 하는가는 SMT(https://en.wikipedia.org/wiki/Simultaneous_multithreading) 같은 걸 찾아보세요. 간단한 기본 원리는 "스레드 하나 가지고는 (물리적) 코어 하나를 100% 활용할 수 없으니 여러 스레드를 동시에 쑤셔넣어보자" 입니다. 또 덧붙이자면, SMT는 조금 학술적인 용어이고 인텔의 마케팅 용어로는 "하이퍼스레딩"이라고 합니다.

운영체제가 스케줄링을 할 때, "동시에 실행 가능한 스레드 수", 즉 할당 가능한 스레드의 슬롯은 m입니다. 하지만, 메모리(및 swap 영역)가 허용하는 한 "소프트웨어적" 스레드 수는 얼마든지 많을 수 있습니다. 이들 중 일부는 하드웨어(유저 입력, 네트워크 패킷, 타이머 인터럽트 등)를 기다리며 잠들어 있을 수 있고, 운영체제는 짧은 주기(보통 수 ms)로 "실행할 준비가 된 스레드"들 중에서 m개를 선택하여 동시에 실행하게 됩니다.

더 엄밀하고 학술적인 설명을 원하시면 마이크로프로세서나 컴퓨터구조 관련 학부 주교재를, 기술적인 설명을 원하시면 인텔의 소프트웨어 개발자를 위한 매뉴얼 등을 찾아보세요.

익명 사용자의 이미지

다 써놓고 질문 다시 읽으니 새삼 쓸데없는 소리만 늘어놓은 것 같네요.

그냥 비유 하나 들어서 두 줄로 요약하죠. 4코어 8스레드란 건 예컨대 상/하권으로 분권된 어떤 책이 4세트(=8권) 있는 겁니다.
그 4세트를 도서관에 두고 사서가 관리하면 대출/반납규정 지켜가며 수십~수백 명의 도서관 회원이 읽을 수 있죠. 한 순간엔 최대 8명까지밖에 못 읽지만.

adzoo의 이미지

너무 설명을 잘해주셔서
그동안 따로따로 공부했던 것들이 전부 퍼즐 조각 맞추어 지듯이
이해가 됬습니다!
이제 소프트웨어적 스레드랑 하드웨어적 스레드를 구분지어 설명할 수 있을거 같습니다!
정말로 감사합니다!

이태현의 이미지

절묘한 비유에 감탄을 하고 갑니다. 혹시 제가 도서관사서를 언급하게 된다면, KLDP를 명시 하겠습니다. 캬~~
책을 챕터별로 모두 분권 해 놓고 각 분권별로 대기자 목록을 만들어 두면 사실 무한대 인 거 맞죠? 물론 물리적인 대기자 목록의 페이지 수의 한계는 분명 있을 거구요. 거기다가 대출중인 1인이 규정을 위반하면 병목현상이 그냥~~ 캬~~

아무튼 절묘하신 비유에 무릎을 탁 치고 갑니다.

rp2kmc의 이미지

만약 8개의 쓰레드를 가진 CPU가 있다면 한번에 처리할수있는 최대 쓰레드가 8개인것이고 같은 8개의 쓰레드를 가진 CPU라도 처리성능에 따라 같은시간에 처리하는 쓰레드 수가 달라지겠네요
쓰레드라는 용어는 많이 들어봤는데 무슨 내용일까 하고 무심코 들어왔다가 큰걸 알아갑니다
감사합니다

지나가다가의 이미지

아래 비유로 설명해주신 것도 좋지만 이 설명이 너무 도움이 됐습니다. 정말 감사합니다!

hgg2468의 이미지

하나의 처리기에서 2개의 스레드를 처리하는 스케줄링... 맞아요 이거 오늘 공룡책보는데나왔었어요 호오. 어느 레벨 단이더라 대칭적 다중 스레딩 스케줄링이구나..

행인의 이미지

감사합니다

pynoos의 이미지

하드웨어에서 쓰레드를 지원하는 대표적인 것은 인텔계열 CPU의 하이퍼 쓰레드입니다
운영체제 혹은 사용자 레벨 쓰레드들은 그 쓰레드와는 말만 비슷하지 대상이 다릅니다.

아이온@Naver의 이미지

하드웨어 thread는 전통적인 의미의 thread 하고는 달라요. 다만 전통적인 의미의 thread 하나가 하나의 하드웨어 thread가 될 수는 있고요. 그런데, 전통적인 의미의 process 하나가 하나의 하드웨어 thread도 될 수 있어요.

하드웨어 thread가 푸는 문제는 한 전통적인 thread나 process 내의 instruction들 간의 의존관계 때문에 생기는 추가적인 delay예요. 설명을 쉽게 하기 위해 core 안에 functional unit이 하나 있어서 한 번에 한 instruction밖에 처리 못한다고 해보죠. 한 프로그램/프로세스/쓰레드에 속하는 두 인접한 명령어는 흔히 의존관계가 있기 쉽습니다.

A[i] = B[i] * c;

이게 어셈블리로 바뀌면, 보통 B[i] load 한 번, 곱셈 한 번, 그리고 A[i] store 한 번일 텐데, 이 셋은 순서대로 이뤄져야 하죠. 만에 하나 load가 몇 사이클 걸린다면, cpu는 그 몇 사이클 동안 놀고 있어야 하구요.

하드웨어나 컴파일러가 수행되는 인스트럭션들의 순서를 좀 바꿔서 그 빈 자리를 채우기는 하지만, 기본적으로 그것도 프로그램/쓰레드/프로세스의 논리적 의존관계가 허용하는 한계 내에서이기 때문에 한계가 있습니다.

이런 문제는 주로 의존관계 때문에 생기고, 의존관계는 인스트럭션들이 하나의 computation(프로그램/프로세스/쓰레드)에 함께 속한다는 사실에서 파생되죠.

그래서 사람들이 생각해 낸 게, 그럼 쓰레드든 프로세스든 뭐든 여러 개를 갖고 있으면서 cpu core한테 인스트럭션을 뒤섞어서 줘보자는 거죠. 예컨대 쓰레드 두 개를 들고, 한 번은 0번, 한 번은 1번에서 명령어를 갖다가 cpu core한테 주게 되면, core가 더 부지런하게 돌게 되겠죠.

거칠게 말하면 이게 질문하신 분이 말씀하시는 CPU thread에요. 그런데 이런 하드웨어 thread는 꼭 소프트웨어 세계에서 전통적으로 널리 쓰이던 thread일 필요는 없죠. 서로 다른 두 프로세스여도 되고요. 뭐든 거기서 각각 뽑아낸 인스트럭션들 사이에 서로 의존관계가 없기만 하면 괜찮습니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.