멀티프로세스와 멀티쓰래드에서 CPU 배분 관련 내용입니다.

trymp의 이미지


멀티프로세스에서는 kernel 에서 자동적으로 scheduling 해서 CPU core 를

배분하는 것 같은데요. ps -eo psr,pid,cmd 로 확인..

그런데 멀티쓰래드 같은 경우에는 쓰래들별로 CPU를 배분해서 사용하나요?

아니면 그 프로세스 자체에 해당하는 CPU 만 계속 사용할 수 있나요?

가령

멀티프로세스는 kernel 에서 자동적으로 core 가 아래와 같이 배분이 되는데,

daemon1 daemon2 daemon3
CPU1 CPU2 CPU3

멀티쓰래드일 경우에는

daemon
thread1 thread2 thread3
CPU1 CPU2 CPU3

위와 같이 배분이 되나요? 아니면 daemon 의 모든 thread 가 한 CPU core 에

의해서만 동작이 되나요?

알려주시면 감사하겠습니다.

고수님들의 많은 조언 부탁드립니다.

라스코니의 이미지

쓰레드는 하나의 프로세스 안에 있어야 합니다.
그래서 멀티 쓰레딩을 하더라도 공유 변수 같은 것에 접근할 수 있는 것이죠.

쓰레드 안에서 여러 CPU를 쓰고 싶으면 openMP 같은 특수 라이브러리를 써서 돌려야 합니다.

즉 하나의 프로그램은 별도의 조작을 하지 않는 이상 하나의 CPU core에서만 돕니다.

요즘 게임 같은 경우 GUI, Audio, 게임 조작 등이 각각 다른 CPU core에서 돌도록 되어 있다는 군요.

pastime의 이미지

리눅스의 기본 스케줄링 단위는 스레드이고
스케줄러는 상황에 따라 적절한 cpu를 선택하도록 되어 있습니다.
즉, 별도의 조작을 하지 않는 이상 여러 cpu에서 돌도록 되어 있습니다.

공유 변수 접근은 메모리 (주소 공간)를 공유한다는 뜻이고
실행되는 cpu와는 관련이 없습니다.

$ ls /sys/devices/virtual/cpuid/
cpu0  cpu1  cpu2  cpu3
$
$ cat thread-cpu.c
#define _GNU_SOURCE
#include <stdio.h>
#include <pthread.h>
#include <utmpx.h>
 
void *thread_fn(void *unused)
{
	printf("cpu: %d\n", sched_getcpu());
	return NULL;
}
 
#define NR_THREADS 4
int main(void)
{
	int i;
	void *ret;
	pthread_t thid[NR_THREADS];
 
	for (i = 0; i < NR_THREADS; i++)
		pthread_create(&thid[i], NULL, thread_fn, NULL);
 
	for (i = 0; i < NR_THREADS; i++)
		pthread_join(thid[i], &ret);
 
	return 0;
}
$
$ gcc thread-cpu.c -pthread
$ ./a.out
cpu: 3
cpu: 0
cpu: 1
cpu: 2
chadr의 이미지

요즘 운영체제는 대부분 스레드단위 스케줄링을 합니다. 윈도우도 마찬가지입니다.
그냥 스레드 많이 만들어 놓으면 운영체제가 알아서 잘 스케줄링 해줍니다.

-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.

익명 사용자의 이미지

위에 분들이 말씀하신대로 thread 단위로 스케쥴링을 하는건 맞습니다

인텔은 잘 모르겠지만 ARM SMP(Cortex-A9)에서는 L1 캐시를 코어별로 따로 가지고 있고

L2 캐시를 모든 코어가 공유하는 구조를 가지고 있습니다.

이럴경우 가상 메모리를 공유하는 2개의 thread가 각각의 Core 0,1번에서 동시에 동작을 하면서

data 영역, head 영역을 read/write를 하게되면 소위 말하는 cache thrashing이 발생하게 되면서

SCU ( snoop control unit )이 무지하게 힘들어 합니다.ㅎㅎㅎ

따라서 성능 최적화를 위해서는 몇가지 고민을 하시는게 좋을듯 합니다.

1. 동일한 번지의 데이터를 각각의 코어가 따로 읽고 쓰면 성능이 매우 저하됩니다
2. 그렇다고 한 코어에서만 thread를 돌리면, 여러 코어가 있어도 프로그램의 수행시간은 줄지 않습니다.
3. 따라서 동일한 번지를 읽고 쓰지 않도록 thread 프로그래밍을 하는 마인드를 가지는 것이 좋습니당

trymp의 이미지

좋은 답변주셔서 감사합니다

댓글 달기

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