200GB 하드디스크를 샀는데 포맷하고 인식시키니까 적혀있는 것보다 용량이 적네요!
윈도우 XP에 4GB 꽂았는데 3.2G만 잡혀요
이 글을 보는 분들 대부분은 위와 같은 현상을 겪었거나, 듣거나 본 적이 있을 것입니다.

사실 이 글을 쓰게 된 이유는 윈도우 서버 2008 R2에 대한 내용을 찾다가 우연히 보게 된 어떤 글 때문입니다. 나름 얼리 어답터로 블로그도 열심히 하는 분의 글인데, OS나 CPU에 대한 이해를 잘 하지 못하고 쓴 것 같아 안타까웠습니다. 열심히 자료 수집하고, 실험하면서 쓰신 글인데... 저로서는 실험 진행이나 결과, 변수에 대한 납득이 안갔습니다.

윈도우 비스타 x86과 윈도우 7 x64의 성능 비교 실험이었는데, 애당초 비교 대상이 아닌 두 OS를 비교했네요.. 게다가 벤치마크 프로그램을 써서 한 번 실험하고 미미한 차이가 나니까 오차범위라고..

우선 위에서 언급한 용량 드립에 대한 설명을 드리겠습니다. 하드디스크 용량은 섹터, 실린더, 플래터 등으로 결정됩니다. 200GB라는 용량은 그렇게 해서 계산된 용량입니다. 맞습니다. 실제 하드디스크 용량입니다. 그런데 포맷하면 왜 용량이 줄어들까요?

서점의 예를 들어볼게요. 서점에 규격화된 책장을 사람 다닐 통로만 남기고 빼곡히 채우면 100개가 들어간다고 해봅시다. 그런데, 100개 다 안채우죠. 책 검색을 위한 컴퓨터도 두어야 하고, 계산할 카운터도 두어야 하고, 책 보관할 창고도 있어야 하고.. 그렇게 해서 80개의 책장만 들어갔습니다.

건물주가 책장 100개 들어갈 크기의 매장이라고 광고했는데, 실제로 꼭 필요한 요소들을 위한 공간을 빼고 책장을 놓고 보니 80개만 들어가네요. 이걸 가지고 사기라고 하지 않죠.

하드디스크도 똑같습니다. (하드디스크 뿐만이 아닙니다.) 자기 테이프처럼 그냥 순차적으로 기록만 한다면 200GB 다 쓸 수 있습니다. 그런데, 하드디스크는 그렇게 쓰지 않죠? 아무데나 여러 개의 파일들을 기록하고 읽습니다. 그러려면 파일들의 정보가 어디어디에 흩어져 있는 지 색인도 필요하고, 색인 정보는 어디 있는 지 또 어딘가에 기록해야 합니다.

포맷이라는 작업은 바로 OS가 파일들을 읽고 쓸 수 있도록 하드디스크에 인테리어 작업을 하는 것입니다. 다시 말하면 색인 정보를 위한 공간을 만들고, 파일들의 빈 공간이 어디어디 있는 지 적어두고 (처음에는 없으니 다 적겠죠. 관리하는 방법은 따로 있는데, 설명 드릴 필요는 없을 것 같습니다.) 하드디스크의 전체 정보를 적어 둘 위치도 초기화 하는 등의 작업을 합니다.

문제는 색인 정보나, 하드디스크의 정보를 적어둘 곳도 하드디스크의 공간이라는 것입니다. 실제 파일의 내용은 들어가지 않으면서 공간만 차지합니다. 그래서 포맷하고 나면 하드디스크의 공간이 적어지는 것(혹은 적어지는 것 처럼 보이는 것)입니다.

마찬가지로 RAM도 실제 설치한 것보다 적게 표시됩니다. 1GB를 설치한다고 해도 1GB를 다 쓸 수 없습니다. OS는 실제 설치된 RAM의 용량이 1GB라는 것을 알지만(인식하지만), 실제 작업 관리자 등으로 보면 Physical RAM 크기가 1GB가 안되는 것을 보실 것입니다.
하드디스크와 마찬가지로 일부 영역에 마찬가지로 색인 정보를 적어둡니다. 실제로 프로그램의 정보를 기록하는 것은 아니지만, 공간을 차지합니다. 게다가 OS가 초기화 시에 필요한 몇 가지 정보들도 적어둡니다.

그럼 32비트 운영체제는 4GB 램을 다 쓸 수 있을까요?

정답은 기본적으로는 다 쓸 수 없다는 것입니다. (예외적으로 확장 주소 기법을 사용하면 되긴 합니다... 이에 대한 설명은 안드릴게요... 페이징 기법과 가상 주소 (공간)에 대한 이해를 하셔야 하니까요 ^^;)
이론적으로는 2의 32승, 즉 4GB를 다 쓸 수 있을 것 같지만, CPU가 접근하는 메모리의 주소는 RAM 뿐만이 아니라 다른 목적으로도 사용됩니다. 대표적인 예가 주변 장치들과 데이터를 주고 받을 때 입니다. (x86 계열 CPU들은 IO mapped 방식도 사용해서 좀 덜하지만 그래도 마찬가지.. - 이 부분은 이해 안하셔도 돼요^^)

그렇기 때문에 32비트 운영체제에 4GB 램을 꽂아도 4GB를 인식하지 못합니다. (위에서 언급한, 확장 주소 기법을 활성화시키면 인식합니다) 즉, 4GB RAM 공간 중 일부 공간은 아예 CPU가 접근조차 못한다는 의미입니다.

이 얘기를 언젠가 하고 싶었는데, 위에서 언급한 누군가가 황당하게도.. 블로그의 그 포스트에 이런 얘기를 했습니다.
비스타는 4GB 램을 설치했는데 3.2GB만 인식했고, 윈도우 7은 4GB 전부 인식했습니다.

여기서 실험한 비스타는 x86용, 윈도우 7은 x64용이었습니다.

이론적으로 x86용 운영체제(실제로는 CPU)는 2의 32승 바이트, x64용 운영체제는 2의 64승 바이트의 램을 인식할 수 있습니다.

저 위의 글이 단순히 그냥 그렇더라고 넘어갈 수 없는 이유가, 비스타가 4GB를 다 인식 못하는 애자인데, 윈도우 7은 다 하니까 개선 되었구나 하는 생각을 하게 만들기 때문입니다.

여기서 언급한 내용에 대해 사람들이 잘 몰라도 상관 없지만, 소위 잘 안다고 하는 사람들이 엉뚱한 내용을 전파하는 것은 문제가 있다고 생각합니다.

자신이 알리고 싶은 것을 알릴 때는 대상에 대해 잘 알아야 합니다. 그렇지 않으면 본의 아니게 오해를 불러 일으키게 될 뿐만 아니라 자신도 창피해질 수 있기 때문입니다.

혹시 여기서 언급한 내용에 대해 이론적인 내용의 포스트를 원하신다면 ... 제가 아는 한에서 올려볼게요 ㅋㅋ
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackbacks  1 | Comments  4

지금 경제 상황은 1920년대 이후 최악의 경제 위기라고 합니다. 경제에 거품이 끼었다는 것이 두 위기의 공통점입니다만, 이번 경제 위기는 금융에서의 위기가 실물 경제에 영향을 끼쳤다는 것이 좀 다른 것이겠죠.

하지만 근본적으로 다를 것은 없어 보입니다.
1920년대의 경제 공황은 실물 경제에서의 위기라는 성격이 훨씬 강했습니다. 제가 경제나 경제사에 대해 잘 아는 것은 아니라서 정확하지 않을 수도 있겠으나, 산업 혁명 이후 생산성이 급격히 높아지게 되고, 경제 주체들의 경제 활동이 크게 늘어 수요보다 많은 생산이 이루어지고, 이러한 잉여 생산이 경제에 거품을 만들게 되었던 것으로 알고 있습니다.
이번 경제 위기는 미국의 서브프라임 모기지의 부실에서 비롯되었다고 알려져 있지만, 사실 문제는 역시 실물 경제입니다. GM 계열사인 GMAC, 서브프라임 모기지 업체들, GE의 부실을 야기한 GE 캐피털 등은 공산품이냐 아니냐는 것만 다를 뿐, 실제 제품을 사고 팔기 위한 자금을 빌려주던 회사들입니다. 이에 덩달아 여기에 투자했던 투자은행들이 부실해지면서 위기가 급격히 확산된 것입니다.

위에서 예를 든 GMAC이나 서브프라임 모기지, GE 캐피털 뿐만 아니라 대부분의 소매 대부업체들은 근본적으로 소비를 위한 금융을 합니다. 즉, 어떤 실물을 구매하기 위한 자금을 빌려주는 것으로, 재작년까지의 전세계적인 호황은 “대출->소비 증가->생산 증가->급여 증가->소비 증가->생산 증가->…” 이러한 형식이었던 것이죠. 즉, 돈을 빌려주고 소비를 촉진시키는 식으로 수요의 거품을 만들어냈습니다. 경제 대공황과 비슷하죠? 그런데, 이러한 순환의 고리에 문제가 발생하여 이번 금융 위기가 발생했습니다.

그래서 “대출 상환 불능->금융업 부실->신용 경색->기업의 자금 융통이 안되어 생산 감소->해고 또는 급여삭감->소비 감소->기업의 이익 감소->해고 또는 급여 삭감->…” 이런 악순환이 발생하게 되었습니다. 우리 나라의 경우 환율과 유가와 같은 요소가 추가될 수 있습니다만, 상황은 크게 다르지 않은 것 같습니다. 단, 우리 나라는 아직 본격적으로 금융에서의 부실이 발생하고 있지 않다는 것이 서양과 조금 다릅니다.

문제가 무엇일까요? 그리고, 어떻게 해결을 해야 할까요?

  1. 기업은 인건비를 비롯한 비용을 최대한 줄여 손실이 나지 않도록 한다.
  2. 정부는 기업이 망하지 않고 후일을 도모할 수 있도록 최대한 혜택을 준다.
  3. 돈이 많은 부자들이 돈을 쓸 수 있는 환경을 조성하여 경제가 순환되도록 한다.
  4. 건전한 경제력을 가진 중산층을 양성하고 빈곤층을 줄여서 건전한 소비자를 양성한다.
  5. 미래의 국민들을 위한 교육에 투자하여 건전한 미래를 도모한다.
  6. 국가의 경제와 힘을 기를 수 있는 연구에 투자한다.

여러분은 어떤 것이 좋은 대책이라고 보시나요?

시간이 흐를 수록 점점 더 앞 날은 불확실하게 느껴집니다. 그래서 사람들은 바로 앞의 이익에 연연할 수 밖에 없습니다. 또한, 공동의 이익보다 개인의 이익이 더 크게 느껴지는 것 역시 당연합니다. 공동의 이익이라는 것 역시 개인에게 있어서는 미래의 이익일 수 밖에 없으니까요.

특히나 임기가 있는 정치인들에게 있어 그 불확실한 미래는 더욱 크게 다가옵니다. 그래서 그들은 단기 경제 부양책에 연연할 수 밖에 없는 것이죠. (물론 그들이 기업가이고, 권력과 경제력이 있는 사람들이라서 그런 것은 아닐 것입니다.)

지금 돈이 없다고 난리입니다. 과연 정말 돈이 없는 것일까요? 몇 년 전, 경제가 호황이었을 때는 지금보다 기준금리도 높았고, 국가 채무도 적었습니다. 즉, 국가에서 돈은 지금 더 많이 뿌려대고 있습니다. 하지만 금융은 여전히 경색입니다. 돈줄은 더 말라갑니다. 특히, 서민들의…

호황기에 돌던 돈들이 어디론가 들어가버렸고, 나오지 않습니다. 이런 상황에서 단순히 인건비 삭감 등의 비용 줄이기는 근본적인 처방이 되지 못합니다. 하지만, 정부의 정책은 반대로 가고 있으니. 입장이 우리와 다른 그들은 아마도 다른 식으로 이 위기를 바라보고 있기 때문에 다른 처방을 내리고 있는 것이겠죠.

사실 우리 나라 사교육 문제가 해결되기 어려운 것처럼, 이 문제 역시 해결되기 어렵습니다. 사회 구성원들의 생각이 모두 다르고, 자신에게 가까운 미래의 이익만 바라보기 때문이지요. 모두 불확실성을 강조하는 사회로 변화되면서 발생한 일입니다. 과거에도 그렇지 않은 것은 아니었습니다만, 최근 이십여 년 간, 그리고 앞으로 점점 더 심해질 것입니다.

사교육이 심해지면 공교육이 부실해져 결국 사회적 손해가 된다는 것을, 그 후유증으로 고등 교육조차 부실해진다는 것을 현상을 통해 모두 보고 있으면서도 모두가 사교육을 다시 선택할 수 밖에 없게 되는 것은 이번 금융 위기의 대응에서도 똑같이 적용됩니다. 이래서 점점 ‘국개론

’이 힘을 얻어가는 모양입니다.

하지만, 저 역시도 불확실한 미래 앞에서 태연해지기는 너무나도 어렵습니다. 남들과의 관계든, 저의 욕심이던 간에…


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackbacks  0 | Comments  0

BSTR은 비주얼 베이직에서 사용하는 문자열 형식입니다. 'Basic String' 혹은 'Binary String'의 약자로 흔히 알려져 있습니다. C나 C++류의 프로그래밍 언어만 다루던 사람들은 당연히 문자열은 끝이 0으로 끝나는 문자들의 배열로 생각합니다. 그런데, 문자열들은 보통 'null-terminated string' 또는 'C-style string'이라고 말합니다. 즉, 문자열을 나타내는 방법의 하나일 뿐입니다. 뭐, 다른 언어에서는 어떻게 표현하는 지 모르겠지만,,, 문자열이라는 자료형이 존재하지 않는 C류의 프로그래밍 언어는 배열을 사용해서 문자열을 나타내기에 저렇게 된 것입니다.

 

그럼 왜 C와 C++에서 BSTR을 사용하게 되었는가를 알아봐야겠지요?

 

내가 만드는 프로그램이 C++ 언어로만 구현이 되었다면, 다른 언어가 어떻게 생겼든 알 바 아닙니다. 그런데, 요즘은 이런저런 프로그램들이 얽히고 섥혀서 돌아갑니다. MS 워드에 MS 엑셀의 표가 들어가고, 그 표를 더블클릭하면 MS 엑셀의 편집 화면이 워드 안에 생깁니다. 비주얼 베이직 스크립트로 MS 워드의 동작을 막 자동화할 수도 있죠. 이런 복잡한 예가 아니더라도, 비주얼 베이직으로 짠 프로그램이 내가 만든 C++ 프로그램의 기능을 이용하거나, 그 반대가 될 수도 있습니다.

OLE, 자동화, COM 뭐 이런 개념들입니다. 그 말많은 ActiveX도 이러한 류의 기술입니다. 이것들은 여기서 다룰 주제는 아니니 넘어갈게요. (물론, BSTR에 대해 궁금한 분들 대부분이 COM과 같은 것을 공부하는 분들일테니 굳이 안다루어도 되겠죠??)

 

MS에서 아주 강하게 미는 프로그램 개발 환경이 있습니다. 바로 비주얼 베이직이지요. (요즘에는 C#을 미는 것 같지만) 위에서 서로 다른 프로그래밍 언어들이 데이터를 주고 받을 필요가 생겼다고 말씀드렸죠? 기본적인 숫자 형식은 어느 프로그래밍 언어나 대동소이하니까 그냥 쓸 수 있다고 하더라도 다른 것들은 좀 문제가 있습니다. 그 중에서도 기본 숫자 형식들만큼이나 자주 쓰는 것이 문자열이죠.

 

이제 감이 오셨을 것입니다. 왜 BSTR이 사용되는지. 이와 비슷한 이유로 VARIANT나 SAFEARRAY 등도 쓰이는데, 마찬가지로 모두 비주얼 베이직에서 쓰는 자료형입니다.

 

그럼 이제 BSTR이 어떻게 생겼는지 보죠.

  1. typedef WCHAR OLESTR;
  2. typedef OLESTR FAR * BSTR;

WCHAR이라는 것 역시 재정의된 타입 이름인데, 호환성을 위해 short이나 wchar_t 등이라고 보시면 됩니다.

 

bstr-structure(1).gif

  • 앞의 4 바이트 부분은 뒤의 문자열이 몇 개의 문자로 이루어져 있는지를 적는 곳입니다.
  • 중간은 2-byte짜리 문자로 이루어진 배열입니다. 2-byte라는 것이 중요합니다. 최근의 C/C++ (C99 이후)들은 유니코드를 지원하기 위해서 2 바이트짜리 문자형인 wchar_t가 기본적으로 제공됩니다. 뭐 그렇지 않다고 하더라도 우리는 short이라는 자료형이 있으므로 걱정 없습니다.
  • 마지막 2 byte는 0입니다. 이것은 C 스타일의 문자열과 똑같죠. 주의할 것은 BSTR이 2바이트 문자형의 배열이므로 문자열 끝 기호 역시 2바이트로 0입니다. 보통 이 부분을 'Terminator'라고 부릅니다.

 

그런데 재미있는 것은 BSTR이라는 포인터형이 가리키는 곳입니다.

bstr-point(1).gif 

그림처럼 전체의 맨 앞이 아니라 문자가 시작되는 곳을 가리키고 있습니다.

 

그렇다면 이것은 안되겠네요!

  1. BSTR  bstrArtist = L"Muse";

안되는 이유 아시죠?

 

그럼 어떻게 BSTR 문자열을 만들까요?

 

이런 식으로 해볼 수도 있겠네요!

  1. wchar_t* wszArtist = L"Muse";
  2. BSTR bstrArtist = NULL;
  3. unsigned long* pLPrefix = NULL;
  4.  
  5. /* number of chars in wszArtist + size of legnth prefix + size of terminator */
  6. bstrArtist = malloc(wcslen(wszArtist) * sizeof(wchar_t) + 4 + 2);

     

  7. lPrefix = (unsigned long*) bstrArtist;
  8. *lPrefix = wsclen(wszArtist);
  9. bstrArtist += 4/sizeof(wchar_t);
  10. wcscpy(bstrArtist, wszArtist);

이렇게 해서 안될 건 없습니다.

 

문제는 프로그램간 데이터 전송이라는 것입니다. 그래서 특수한 방법으로 메모리를 할당받아야 합니다.

 

이에 대해서는 다음 포스팅에서 다루지요 ^^

 

참고 : MSDN

 

 

이 글은 스프링노트에서 작성되었습니다.

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackbacks  0 | Comments  2

풀리비’s Blog is powered by Daum & Tattertools.com

 

티스토리 툴바