[일반] 2 CPU에서의 프로그래밍 기법

삼량의 이미지

안녕하세요~

초보 프로그래머 삼량이라고 합니다.

좀 전의 질문이 너무 명확하지가 않은거 같아서 좀 정리해서 다시 올려 봅니다.

Unix Server가 CPU2개를 장착하고 있습니다.

0번과 1번이겠죠.

그리고 A라는 프로세스가 있는데 이 프로그램이 하는일을 두개로 분리할 수

있다고 가정하겠습니다.

이 두개의 작업을 CPU 0번과 1번으로 분리해서 수행하게 하고 싶거든요.

이 두개의 작업을 Thread로 작성해서

A-1이라는 Thread는 CPU 0번에서 처리하게 하고 A-2라는 Thread는

CPU 1번에서 처리하게 하고 싶습니다.

음...이 하나의 프로그램을 두개로 분리한다구 하더라도

한쪽 CPU에 집중 시키고 싶지 않구요. OS의 힘을 빌리지 않고

명시적으로 CPU 0번과 CPU 1번에서 돌게 하고 싶습니다.

고수님들의 많은 조언 부탁드리겠습니다. 꾸벅 __(__)__

yielding의 이미지

유닉스 서버가 대게 CPU 2개를 쓰는 거는 아닙니다.. 한 개를 쓸수도 있고 수십 개를 쓸 수도 있고.. 용도에 따라서 다르죠. 그리고 일반적으로 쓰레드 할당은 응용 프로그램이 아니고 운영체제가 합니다.

Life rushes on, we are distracted

hb_kim의 이미지

수정해서 다시 설명하신 내용은 비대칭 멀티 프로세서 개념이며, 초보 프로그래머가 다룰수 있는 내용이 아닙니다.

케인의 이미지

WIN32에서는 각각의 쓰레드들이 특정 CPU에만 스케줄 되도록 '제한'할 수 있습니다만, 보통 이런 기법을 사용하는 이유는 특정한 프로그램이 모든 CPU를 한 번에 장악하지 못하게 할 때입니다. (예컨에 8 CPU 시스템에서 DB 프로세스가 최대 6개만 사용하도록 제한한다거나...)

오늘날의 운영체제 커널에는 수십개의 프로세스가 떠 있기 마련이고 이 들이 한 개 혹은 여러 개의 CPU를 공유하는 구조이기 때문에 한 쓰레드를 특정 CPU에 고정하는 것이 별 의미는 없습니다. 커널은 기본적으로 모든 쓰레드에게 공평하게 기회를 주고, 우선 순위를 높이거나 낮추어서 기회를 조절할 수는 있습니다.

CPU가 두 배이면 모든 쓰레드에게 실행 기회가 두배 높아진다고 생각할 수 있습니다. 물론 유휴 쓰레드를 제외한다면 활성 쓰레드에게는 훨씬 많은 실행 시간이 주어진다고 볼 수 있겠지요. CPU 한 개가 놀고 있음에도 한 프로그램의 두 개의 쓰레드가 한 CPU에만 몰려서 버벅거리는 일은 없습니다.

(단, 커널 쓰레드 기반의 최신 쓰레드 라이브러리를 사용한다는 전제가 있습니다. 과거의 유저 쓰레드 기반의 pthread 라이브러리의 경우 한 프로세스의 쓰레드들은 한 번에 한 CPU만 점유할 수 있었습니다.)

꼭 특정 쓰레드를 특정한 CPU에서 실행하게 하는 것은 제가 아는 한 그럴 이유가 없다고 생각됩니다. -_-; A, B 쓰레드가 CPU0, CPU1을 왔다갔다 해더라도 어쨌든 동시에 실행되기만 하면 되는 것 아닌가요?

(참고로 OS의 힘을 빌리지 않고 쓰레드 스케줄링을 조정할 방법은 없을 것 같은데요. -_-;;; 하드웨어 자체에는 쓰레드의 개념이 없으니까요.)

위와 같이 CPU의 증가에 따라 확률적으로 실행 기회나 시간이 증가하는 것이 아닌 특정 CPU가 특정 쓰레드만 실행한다거나 혹은 두 개의 쓰레드가 항상 두 CPU에 의해서 동시에 실행되게 한다는 것은 보통의 리눅스나 유닉스 커널의 용도를 벗어나는 것입니다.

삼량의 이미지

케인님의 답변 감사 드립니다.

갈증이 해소되는듯 합니다.

짧은 생각에 직접 CPU를 지정해서 프로그램을 돌리면

좀더 낫지 않을까 하는 생각에서 이런 질문을 했습니다.

^^

읽으시면서 좀 답답하셨을 수도 있을텐데 친절한 답변 감사 드립니다.

님의 내용을 기초로 좀더 자세히 알아보도록 하겠습니다.

다시 한번 의견 감사드립니다. 꾸벅 __(__)__

三量의 파란세상.
과거는 침묵하고, 현재는 화살처럼. 하지만 미래는 언제나 망설임으로 다가온다는걸 알고 있어!

댓글 달기

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