Archive for 11월, 2008

부유한 노예, 거슬러 올라가기, 그리고 GM의 몰락

금요일, 11월 28th, 2008

1999년 시애틀과 마이크로소프트 본사가 있는 레드먼드 지역으로 이루어진 워싱턴 주의 킹카운티에서는 23만 5000명의 소프트웨어 개발자들이 스톡 옵션을 포함해 각각 평균 28만 7700달러를 벌었다. 그 지역의 일반 중산층 가정의 평균 수입은 3만 4300달러였다. 왜 이렇게 격차가 심한가? 세계적으로 소프트웨어 개발 서비스는 그 수요가 높지만, 그 지역의 다른 주민들은 수요가 그다지 높지 않은 소매업이나 식당, 호텔, 병원, 운송 서비스에 종사하기 때문이다.

코미디언 제리 사인펠드는 지난 시즌(1997~1998) 자신이 출연하는 인기 프로그램으로 2200만 달러를 받았다. NBC 방송국은 그 정도 가치가 있다고 생각한 것 같다. 매회 방영되는 동안 NBC는 분당 100만 달러의 광고를 내보냈다. … 스튜디오 기술 인력이나 메이크업 담당에게 가능한 한 최저의 임금(과거 노조와의 최저 임금보다 더 낮은 금액)을 지불하고 있다. 다른 방송국도 사정은 마찬가지며, 공중파 방송국을 위협하고 있는 케이블 TV도 여기에 포함된다. 바로 이런 케이블 TV 때문에 NBC는 모회사인 제너럴 일렉트릭(GE)이나 GE의 투자자들(그 중에 내 퇴직 기금 펀드도 있다)에게 잘 보이기 위해서 비용 절감책을 더욱더 사용할 수밖에 없다.

우리 동네 세탁소 점원은 1999년에 1만 3500달러를 벌었다고 나에게 말했다. 무서운 사실은, 미국 경제가 아무리 호황을 누린다 해도 그녀가 세탁소에 월급을 올려달라고 요구하면 대신 일할 사람을 쉽게 찾을 수 있다는 것이다. 나 또한 세탁비로 지금보다 더 많은 돈을 지불하고 싶지는 않다. 물론 그녀에게는 그런 말을 하지는 않았다.

- 로버트 라이시, 부유한 노예 (The Future of Success), 2000, p. 148.

미국의 경우 90년대 들어 빈부격차가 급격히 커지기 시작했습니다.

"구매자 천국" 시대의 다른 일면입니다. 내가 갈수록 좋은 조건으로 물건/서비스를 골라 살수 있는 환경이 되면, 반대급부로 갈수록 내 물건/서비스를 팔 수 있는 조건이 나빠지는 겁니다.

로버트 라이시는 클린턴 행정부때 관료를 지낸 학자입니다. 위에 소개한 책을 꼭 읽어보시길 권합니다.

위와같은 빈부격차 심화가 우리나라엔 IMF이후 김대중,노무현 정권을 거치며 나타났습니다. 대강 10년이죠. 청년들이 가장 체감으로 느낄 수 있는 것이 2000년에 괜찮은 대기업 초봉이 2000만원대였던 데 비해 2008년 현재 그 두배로 올라선 것, 그러나 그에 비해 다른 직장의 월급은 별로 오르지 않은 것으로 추론할 수 있습니다. 
그리고 어르신들이 퇴직하고 할 수 있는 일이 드문 것, 그리고 받을 수 있는 돈이 정말 쥐꼬리라는 것으로도 알 수 있지요.

그렇다고 신러다이트주의자처럼 새로운 체제를 부술 수는 없습니다. 전세계적으로 이뤄지고 있는 현상인데, 우리만 머물러있을 수는 없는 게임이죠. 저 위에 인용한 일은 당연히 우리나라에도 있는 일이고, 중국에도, 베트남에도 벌어지고 있는 일입니다.

GM의 몰락,

미국 최대의 자동차기업인 지엠(GM)의 주가가 10일(현지시각) 뉴욕 증시에서 22% 폭락해 3.36달러를 기록했다. 현금 유동성 부족으로 파산할 우려가 있다는 전망이 나오면서 1946년 이래 62년 만에 최저치로 내려앉은 것이다.

지난주 지엠은 내년 상반기 안에 현금이 바닥날 가능성이 있다고 발표했다. 고유가와 금융위기가 이어져 자동차 판매가 급감하면서 지엠은 3분기 25억달러 손실을 기록했다.

도이체방크는 이날 지엠의 주가가 0달러까지 떨어질 수 있다는 보고서를 냈다. 다음달 예상되는 현금보유고로는 내년 1월 만기가 돌아오는 채권을 감당하지 못할 것이란 분석이다. 보고서는 “(정부 지원을 얻어) 지엠이 파산을 면하더라도, 거의 파산 상태와 다름없을 것”이라고 전망했다. 바클레이스캐피털도 지엠의 현금유동성 문제를 제기하며 투자의견을 하향 조정하고 주가 전망치를 1달러로 낮췄다.

- 한겨레신문 2008-11-11

GM도 구매자 천국 세상에서 밀려난 예가 되고 있습니다. 노조를 포함한 자기 회사 직원에의 보상에 신경쓰고 팔리는 물건을 만들기 위한 노력이 부족했다죠 아마. "구매자 천국" 좋기는 한데 왠지 맞닥뜨려보면 그렇게 만만하지 않습니다. 자신도 열심히 일해야하고 혁신해야하고 새로운 무언가를 내야합니다. 그렇다고 싫다고 이 게임을 그만두면 몰락하고 맙니다.

잘 살게 됐다하지만 지혜가 필요한 시대입니다. 우리는 어떻게 해야 할 까요? 누구 아는 사람 있나요?

리눅스에서 태스크가 특정 코어에서 동작하게 하기 (affinity 설정)

목요일, 11월 27th, 2008

커널 2.6부터 지원됩니다.

프로세스는 sched_setaffinity()가 있습니다.

쓰레드는 pthread_setaffinity_np()가 있습니다

커널의 소스에 보면 migration하는 경우에도 cpu affinity를 보고 설정된 CPU가 아니면 하지 않습니다.

그러므로 …_setaffinity()를 호출하면 해당 CPU에 고정되는 것이 맞습니다.

Hotplug시 affinity 설정된 모든 CPU가 꺼진 경우만 예외적으로 affinity를 변경합니다.

static void sched_migrate_task(task_t *p, int dest_cpu)
{
migration_req_t req;
runqueue_t *rq;
unsigned long flags;

rq = task_rq_lock(p, &flags);
if (!cpu_isset(dest_cpu, p->cpus_allowed)
|| unlikely(cpu_is_offline(dest_cpu)))
goto out;
....
static
int can_migrate_task(task_t *p, runqueue_t *rq, int this_cpu,
struct sched_domain *sd, enum idle_type idle,
int *all_pinned)
{
/*
* We do not migrate tasks that are:
* 1) running (obviously), or
* 2) cannot be migrated to this CPU due to cpus_allowed, or
* 3) are cache-hot on their current CPU.
*/
if (!cpu_isset(this_cpu, p->cpus_allowed))
return 0;

아래 코드를 2.6.24, x86, 4코어에서 테스트했습니다.

( http://www.thinkingparallel.com/2006/08/18/more-information-on-pthread_setaffinity_np-and-sched_setaffinity/ 에 나온 코드를 컴파일 되도록 수정 )

/* Short test program to test the pthread_setaffinity_np
* (which sets the affinity of threads to processors).
* Compile: gcc pthread_setaffinity_np_test.c
*            -o pthread_setaffinity_np_test -lm -lpthread
* Usage: ./pthread_setaffinity_test
*
* Open a "top"-window at the same time and see all the work
* being done on CPU 0 first and after a short wait on CPU 1.
* Repeat with different numbers to make sure, it is not a
* coincidence.
*/
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#define __USE_GNU
#include <pthread.h>
double waste_time(long n)
{
double res = 0;
long i = 0;
while (i <n * 200000) {
i++;
res += sqrt(i);
}
return res;
}
void *thread_func(void *param)
{
unsigned long mask = 1; /* processor 0 */
/* bind process to processor 0 */
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), (cpu_set_t *)&mask) <0) {
perror("pthread_setaffinity_np");
}
/* waste some time so the work is visible with "top" */
printf("result: %f\n", waste_time(2000));
mask = 2;   /* process switches to processor 1 now */
sleep(2);
if (pthread_setaffinity_np(pthread_self(), sizeof(mask), (cpu_set_t *)&mask) <0) {
perror("pthread_setaffinity_np");
}
/* waste some more time to see the processor switch */
printf("result: %f\n", waste_time(2000));
return 0;
}
int main(int argc, char *argv[])
{
pthread_t my_thread;
if (pthread_create(&my_thread, NULL, thread_func,
NULL) != 0) {
perror("pthread_create");
}
//pthread_exit(NULL);
pthread_join(my_thread, NULL);
return 0;
}

———————————

프로세스의 경우 소스는 다음과 같습니다.

/* Short test program to test sched_setaffinity
* (which sets the affinity of processes to processors).
* Compile: gcc sched_setaffinity_test.c
*            -o sched_setaffinity_test -lm
* Usage: ./sched_setaffinity_test
*
* Open a "top"-window at the same time and see all the work
* being done on CPU 0 first and after a short wait on CPU 1.
* Repeat with different numbers to make sure, it is not a
* coincidence.
*/
#include <stdio.h>
#include <math.h>
#include <unistd.h>
#define __USE_GNU
#include <sched.h>
double waste_time(long n)
{
double res = 0;
long i = 0;
while(i <n * 200000) {
i++;
res += sqrt (i);
}
return res;
}
int main(int argc, char **argv)
{
unsigned long mask = 1; /* processor 0 */
/* bind process to processor 0 */
if (sched_setaffinity(0, sizeof(mask), (cpu_set_t*)&mask) <0) {
perror("sched_setaffinity");
}
/* waste some time so the work is visible with "top" */
printf ("result: %f\n", waste_time (2000));
mask = 2; /* process switches to processor 1 now */
if (sched_setaffinity(0, sizeof(mask), (cpu_set_t*)&mask) <0) {
perror("sched_setaffinity");
}
/* waste some more time to see the processor switch */
printf ("result: %f\n", waste_time (2000));
return 0;
}

The case for energy-proportional computing

수요일, 11월 26th, 2008

L. Barroso and U. Holzle, “The case for energy-proportional computing,” IEEE Computer, December 2007.

간단한 내용.

구글의 입장에서 서버의 Low power기술이 어떻게 필요한 지 설명

 

image

서버는 모바일 장치와 달리 utilization(사용율)의 비율이 100%(peak), 0%(idle)이 아닌 경우가 많고 10~50% 사이, 특별히 20~40%사이가 많음

image

대강의 전력 소모를 보면 utilization을 기준으로 0일 때도 power(전력)는 peak의 50%를 소모함.(녹색선)

그래서 에너지 효율성(전력을 사용율로 나눔)은 쭈욱 떨어지게 됨(빨강)

 

그래서 아래 그림과 같이 utilization이 0 이 될 때 전력소모가 10%정도로 잘 떨어져주면 좋겠음(결국 그래프 각도가 문제)

그러면 효율은 10~50% 사이에서 꽤 괜찮음

image

그러려면 CPU 말고 주변기기의 전력소모 특성이 높아야 함. 디스크는 쓸 때 안쓸 때 차이가 크지만 대책없이 sleep하면 깨어나는 시간과 전력비용이 크다든지, 네트웍 디바이스는 끄는 모드란 게 없든지 –> Active low power 모드가 필요

귀머거리 벙어리

금요일, 11월 21st, 2008

나이가 많아질수록

귀머거리 3년, 벙어리 3년

컴파일러에서 제공하는 기본 설정 매크로 한 번에 보기

화요일, 11월 18th, 2008

gcc -v -E -dM - < /dev/null

이 명령치면 기본 설정된 매크로 가 한 번에 보입니다

http://kldp.org/node/99917

-v는 불필요합니다.

본문과 관련이 있을 것 같은 URL 올립니다.

* http://predef.sourceforge.net/
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccelng/htm/prepr_18.asp

image

MS projects와 비슷한 무료/오픈소스 프로그램

토요일, 11월 15th, 2008

MS projects와 비슷한 프로그램

Open Workbench
http://www.openworkbench.org/

image

OpenProj
http://openproj.org/openproj

image

나중에 필할 지 몰라서

Function pointer

금요일, 11월 14th, 2008

function pointer 사용법 간단 정리

> 선언
int형을 리턴하며 int형 인자 하나를 받는 함수를 포인터 형식으로 선언
    int (*myhandler)( int );

> 할당
  int myfunction( int );
이런 형식의 함수가 있을 때
    myhandler = myfunction;
이렇게 하면 됨

> 실행
    result = myhandler(a);
  또는
    result = (*myhandler)(a);
로 쓴다.

> 인자로 넘길 때
    void pass_it( int (*myfp)(int) );
  이런식으로 씀.

참조 http://oopweb.com/CPP/Documents/FunctionPointers/Volume/CCPP/FPT/em_fpt.html

vim에서 탭 사용하기와 마우스

금요일, 11월 14th, 2008

image

putty에서 탭을 사용한 vi를 띄운 상태입니다.

vim7.0이상에서 지원되며

사용법은

:tabnew 파일명

입니다 (맨 윗줄에 탭 바가 생김)

http://kltp.kldp.org/stories.php?story=07/01/25/5010287

:tabn

:tabp

로 이동가능한데

이게 귀찮아서 마우스를 enable 시켰습니다.

:set mouse=n

전 으로 했습니다. (n이나 a가 적당한 듯)

그런데 그렇게 하니 putty에서 편리하게 쓰던 더블클릭(낱말이 선택됩니다)이 기능이 바뀌더군요

그래서 약간 불편하지만 마우스 모드를 바꾸고 쉬프트를 활용했습니다

:set mousem=popup

이렇게 하고,

쉬프트로 더블클릭하면 원래 터미널(putty)에서 마우스 기능과 비슷하게 선택이 됩니다. 드래그도 먹구요

이렇게 쓰려구요.

모기 잡을때는 손뼉

목요일, 11월 6th, 2008

모기가 아직도 많지요

요새는 겨울에도 모기가 있는 거 같아요

 

벽에 붙은 모기를 잡을 때 어떻게 하시는지,

저의 경험에 비추어보면

보통 다들 손바닥으로 때려서 잡는데,

사진081106_1
그림1 손바닥으로 잡기

이렇게 잡으면 모기가 정말 빨리 빠져나가기 때문에 못잡기 일쑤입니다.

그래서 손뼉치듯이 잡으라고 하는데요

사진081106_2
그림2 손뼉으로 잡기 

모기가 있는 자리에서 옆으로 양손을 벌려 모기가 붙은 벽 위로 1센티쯤 위에서 이렇게 손뼉을 칩니다.

그러면 신기하게 잘 잡힙니다.

원리는 모기가 위험을 감지하면 벽을 기준으로 위험이 적은 방향으로 왼쪽이든 오른쪽이든 위든 아래든 "이륙"을 하는데 거기에 수직으로 (모기에 비교하면)커다란 손바닥이 쓸어서 잡는 겁니다.

모기가 좌우상하로는 쉽게 움직이겠지만 이륙하는 고도는 빠르지 못하니까요 :-)

모기 
그림3 개념도 (그림에선 위로 움직이지만 모기의 이동은 벽면을 따라 상하좌우 어디로든 움직일 수 있습니다. 넓은 손바닥으로 양쪽에서 쓸어 담는다는 생각으로, 대신에 속도는 재빨리 잡아채듯 손뼉을 쳐줍니다)

위 그림처럼 잡히게 됩니다. 확실히 잘 잡혀요

근데 요새는 그것보다 전기모기채가 생겨서 지나가는 모기나 벽에 붙은 모기나 다 이걸로 잡습니다.

잘 잡히는데 생각보다 바로 죽지 않기 때문에(보통 기절해서 땅에 떨어집니다)

"딱" 소리가 나더라도 유심히 살펴봐서 바닥이나 어딘가 튄 기절한 모기를 찾아야됩니다

저희 부모님은 오랫동안 지져서 전기고문해 태워죽이십니다만 흠흠

 

그리고 벽에 붙은 모기의 경우(특히 천장) 모기채의 넓은 면을 사용해 벽면을 덮지 않으면 잘 안잡힙니다. 모기가 의외로 좌우 이동속도가 빠르니까요 아까 언급한 것 처럼

모기채 사진입니다. http://xenix.egloos.com/1797117 에서 퍼왔습니다. :-)

중국산 싸구려. 배터리 연결부가 금방 덜덜 거립니다. 하하 아직까지 한달여 잘 쓰고 있습니다 그래도.