Bookworm’s Archive 잡동사니 속에 숨겨진 보물 찾기

20Apr/10

프로세스를 지정한 CPU에서 실행하기

AMD Opteron CPU by Samat Jain

요즘 개인용 컴퓨터도 멀티코어를 장착하고 나올 정도로 멀티프로세서(Multiprocessor)가 흔해졌습니다. 덕분에 멀티프로세스(Multiprocess) 프로그래밍으로 개발한 데몬과 같은 것을 실행시켜 보면 여러 프로세서에 적당히 나뉘어 실행되는 것을 쉽게 확인 할 수 있습니다.

그런데 여기에 한가지 욕심을 더 내보자면 특정한 작업을 수행하는 프로세스를 특정한 프로세서에 할당하고 싶다는 생각이 드는 경우가 있습니다. 네트워크 데이터 및 DB 처리는 0번 CPU, 데이터 처리는 1번 CPU 식으로 말입니다.

기본적으로 OS에서 프로세스를 어떤 CPU에 할당하는지는 OS가 가진 자체적인 스케쥴링에 따르도록 되어 있습니다.

[c]
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>

int main(int argc, char *argv[]) {
unsigned int i = 0;
pid_t pid;

if ( (pid = fork()) == 0 ) {
for ( i = 0; i < UINT_MAX; i++) {
}
}
else {
int status;
waitpid(pid, &status, 0);
}

return EXIT_SUCCESS;
}
[/c]

위 소스는 1개의 자식 프로세스를 생성하고 더하기 연산을 반복적으로 수행하여 CPU를 100% 사용하게 만드는 예제입니다.

터미널을 하나 더 열어 top을 실행시킨 후 '1'번 키를 눌러 CPU 별로 사용량을 지켜볼 수 있게 준비를 합니다. 그리고, 소스를 컴파일 해서 여러번 실행시켜 보면 사용량이 100%에 달하는 CPU가 고정적이지 않고 변하는 것을 확인 할 수 있습니다. 물론 OS의 스케쥴링 정책에 영향을 받기 때문에 특정한 CPU에 고정적으로 할당되는 것처럼 보일 수도 있으나 많은 횟수를 실행시켜보면 변한다는 것을 확인 할 수 있습니다.

[c]
#define _GNU_SOURCE

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <getopt.h>
#include <sched.h>

void print_help(char *cmd) {
printf("Usage: %s -n <cpu 개수> -c < 선호CPU>\n\n", cmd);
printf(" CPU 개수 : CPU 코어 개수\n");
printf(" 선호 CPU : CPU 코어 번호 (0 부터 시작)\n\n");
printf(" 예 : 쿼드코어 CPU에서 3번째 코어를 사용하는 경우\n");
printf(" $ %s -n 4 -c 2\n", cmd);
}

int main(int argc, char *argv[]) {
unsigned int i = 0;
pid_t pid;
int max_cpu = -1;
int cpu = -1;
int opt;

while ( (opt = getopt(argc, argv, "n:c:")) != -1 ) {
switch ( opt ) {
case 'c' :
cpu = atoi(optarg);
break;
case 'n' :
max_cpu = atoi(optarg);
break;
case '?' :
default :
print_help(argv[0]);
exit(EXIT_FAILURE);
break;
}
}

if ( max_cpu < 1 || cpu < 0 || cpu >= max_cpu ) {
print_help(argv[0]);
exit(EXIT_FAILURE);
}

if ( (pid = fork()) == 0 ) {
cpu_set_t mask;

CPU_ZERO(&mask);
CPU_SET(cpu, &mask);
pid = getpid();
if ( sched_setaffinity(pid, sizeof(mask), &mask) ) {
fprintf(stderr, "%d 번 CPU를 선호하도록 설정하지 못했습니다.\n",
cpu);
exit(EXIT_FAILURE);
}
else {
printf("%d 번 CPU를 선호하도록 설정했습니다.\n", cpu);
}

for ( i = 0; i < UINT_MAX; i++) {
}
}
else {
int status;
waitpid(pid, &status, 0);
}

return EXIT_SUCCESS;
}
[/c]

위 소스 코드는 sched.h에서 제공하는 sched_setaffinity 함수를 사용하여 특정한 CPU에서 프로세스가 실행되도록 한 것입니다.

sched_setaffinity 함수는 3개의 매개변수를 받는데 첫번째는 프로세스 ID(pid)입니다. pid 대신 0을 넘기면 자동으로 현재 동작중인 프로세스로 설정됩니다. 두번째는 cpusetsize 입니다. 보통은 sizeof(cpu_set_t)로 설정하면 됩니다. 세번째는 mask 포인터입니다. mask 포인터는 아래의 매크로 함수들을 사용해서 편리하게 설정 할 수 있습니다.

[c]
void CPU_CLR(int cpu, cpu_set_t *set);
int CPU_ISSET(int cpu, cpu_set_t *set);
void CPU_SET(int cpu, cpu_set_t *set);
void CPU_ZERO(cpu_set_t *set);
[/c]

cpu는 CPU의 번호로 0번부터 시작합니다. 쿼드코어 CPU 라면 0~3번 사이의 값이 됩니다. mask 값을 여러개의 CPU로 지정하는 것도 가능합니다.

sched.h가 정상적으로 동작하기 위해서는 꼭 헤더파일을 인클루드 하기 전에 #define _GNU_SOURCE를 선언 해주어야 합니다. 선언하지 않으면 CPU_XXXXX 매크로 함수를 찾을 수 없다며 컴파일 오류가 발생합니다.

멀티프로세스나 멀티쓰레드를 여러개의 CPU나 코어에 적절히 배치하여 효과적으로 사용하는 것은 매우 어려운 기술입니다. sched_setaffinity 함수를 통해 수동으로 배치했다고 해서 그것이 반드시 OS의 스케쥴링에 의한 배치보다 효율적이라는 보장은 없습니다.

다만 몇가지 특징적인 프로세스들을 적절히 배치하여 CPU 자원을 어느 정도 보장 해주는데 도움이 될 수 있다고 생각합니다.

18Apr/10

미국 달러화 환투자를 했습니다

US Dollar by thinkpanama

두 달 전부터 미국 달러화를 사야겠다는 이야기를 주변에 하고 다녔습니다. 가끔 저는 번뜩이는 영감 비슷한 것을 받는 경우가 있는데 그런 경우 거의 맞아 떨어지는 편이더군요. 이번에 느낀 영감은 달러화가 오른다는 것입니다.

그 동안은 영감을 받아도 그냥 그러려니 했는데 이번에는 한 번 얼마나 제대로 맞는지 행동으로 증명하고 싶어 미국 달러화(USD)를 소액 환전했습니다.

원래는 금(Gold)에 투자를 하고 싶었지만 금이란게 개인이 어떻게 좀 투자하기가 어렵더군요. 소액 투자는 더더욱 힘들구요. 금 펀드가 있기는 하지만 이번에는 제 영감을 증명하는게 목적이었기 때문에 직접 투자를 하고 싶었습니다.

원래 돈 되는 이야기는 주변에 이야기 하지 않는 것이 맞습니다. ‘무슨 종목이 좋다 사라’는 이야기는 사실 귀 담아 들을만한 이야기가 아닙니다. 그렇게 좋다면 직접 사지 그걸 왜 남에게 권하고 있겠습니까. 거기에 더해 저는 자본을 통한 수익 창출에 반대합니다. 그렇기에 이번 환투자는 그냥 리트머스 시험지 같은 성격이지 재테크로서 한 것은 아님을 말씀드립니다.

제가 왜 환투자를 했는지를 읽어 보시는 것은 자유이나 이에 따라 투자를 하시는 것은 언제까지나 본인의 판단과 책임 하에서 손실을 감당 가능한 규모하에 행동하셔야 한다는 점 거듭 강조드립니다.

결론부터 말씀드리자면 길게 잡아 2 ~ 3년 내에 만약 상황이 급변한다면 1 ~ 2 년 내에 달러화의 상당히 오를 것으로 생각됩니다.

물론 한동안은 현재의 원달러 환율이 유지되거나 다소 더 낮아질 가능성이 있습니다. 그러나 2 ~ 3 년 내에는 원달러 환율이 상당히 높아지는 시기가 있을 것으로 봅니다. 그 이유는 이렇습니다.

첫번째는 한국의 부동산 경기입니다. 우리는 엄청난 부동산 버블을 안고 있었음에도 불구하고 서브프라임 사태 때 이를 터뜨리지 않았습니다. 이 덕분에 부동산 버블이 터지면 아주 제대로 터질 가능성이 높습니다. 부동산 경기가 추락할 경우 과거의 IMF 사태 때처럼 환율이 급 상승하게 될 것입니다. 이 둘의 관계는 국내 자본의 해외 자산 구매와 관련있는데 자세한 것은 인터넷에 검색을 해보시면 쉽게 찾으실 수 있습니다.

두번째는 강만수입니다. 아시다시피 강만수와 그와 함께하는 모피아들은 환율을 올려서 대기업 위주의 수출 증대가 한국 경제를 키울 수 있는 최선의 방법이라고 봅니다. 이미 2008년 한 번 겪어보셨을 겁니다. 그러나 그 때에 뭘 배운 것인지 다시 환율을 끌어올리려는 분위기입니다. 이명박은 2008년 사태가 서브프라임 때문에 잘 못 된 것일 뿐 환율을 올려서 수출을 증대해야 한다는 생각을 버리지 않고 있다고 합니다.

세번째는 미국의 출구 전략입니다. 아직은 미국이 금리를 올리지 않고 있지만 이를 계속 몇년씩 방치 할 수는 없을 것이고 결국 미국이 출구 전략으로 금리를 올리기 시작하면 환율이 오를 수 밖에 없습니다. 혹자는 벌써부터 세계 시장에 달러화가 마르기 시작했다는 분석마저 내놓고 있습니다. 아직 저는 이에 동의하지는 않습니다.

물론 이는 단지 예측입니다. 예측은 항시 틀릴 수가 있습니다. 그럼에도 불구하고 제가 과감히 환투자를 한 것은 만약 환율이 지금보다 더 떨어진다면 그것은 우리나라 경제가 건강해졌다는 신호로 생각해도 좋을 것이고, 거기에 더해 외국에서 달러로 사야하는 제품을 많이 쓰는 저로서는 어찌되었거나 일종의 환 헷지가 되겠네요. :cool:

그나저나 환율이 낮을 때 아이패드가 출시되어야 할텐데 큰일입니다. 이러다 막 오르기 시작하면 분명히 아이패드 가격이 비싸질테니까요. 그러기 전에 애플케어부터 사야하는군요. 이래저래 돈 나갈 일만 가득합니다.

PS> 만약 달러 환율이 오르지 않는다면 아마 그 원인은 중국에 있을 것 같습니다. 복잡한 세상입니다.

Tagged as: 4 Comments
15Apr/10

윈도우 7에서 WoW 설정 파일 편집하기

월드 오브 워크래프트 by juanpol

자주는 아니지만 월드 오브 워크래프트를 즐기다 보면 WTF 디렉토리 안에 있는 Config.WTF 파일을 편집기로 수정 할 경우가 있습니다.

그런데 윈도우 7에서는 아무리 Config.WTF 파일을 수정해도 반영이 안 되는 경우가 있는데요. 이것은 윈도우 7이 시스템 보안을 위해 분리된 별도의 공간에 있는 파일을 사용하기 때문입니다.

이런 경우는 Program Files 디렉토리가 아닌 아래의 디렉토리 안에 있는 Config.WTF 파일을 수정해야 합니다.

C:\Users\_사용자_\AppData\Local\VirtualStore\Program Files (x86)\World of Warcraft\WTF

_사용자_ 부분은 컴퓨터마다 다르니 알맞게 바꿔주시면 됩니다.