Media Log

글로벌 소프트웨어를 꿈꾸다 - 9점
김익환 지음/한빛미디어
얼마전에 나온 김익환 선생님의 새 책이다.

이전 책인 소프트웨어 개발의 모든 것과 크게 다른 내용은 아니다. 오히려 이 책에서는 기술적인 사항이나 세부적인 요건들에 대해서는 다루지 않고, 소프트웨어 공학에 있어서의 올바른 그림만을 제시해주고 있다.

그렇기 때문에 이슈 관리시스템이나 소스 관리 시스템 같은 내용을 다루면서도 실제로 어떤 도구들이 있는지에 대해서는 언급하지 않는다.

언제부턴가 나는 어떤 소프트웨어를 선택해야 할 일이 생겼을 때, 항상 위키피디아를 먼저 찾아보게 되었는데 이런 이슈, 소스 관리 시스템을 선택할 때도 위키피디아가 어느 정도 도움이 될 수 있을 것이다. 이 책에서 이 내용을 설명해주지 않아 나처럼 아쉬움이 느껴졌다면 아래 위키피디아 링크에서 해소할 수 있기를 바란다.

이슈관리 시스템
소스관리 시스템

나는 이슈 트래커는 맨티스, 버전 콘트롤은 VSS와 SVN밖에 써본 적이 없기 때문에 어떤 것들이 좋다고 추천해주지는 못하겠다. 위 링크에서 여러가지 조건들을 비교해보고 자신의 상황에 맞는 도구를 선택하면 되겠다.
-사실 어떤 소프트웨어를 선택할 때 내 첫번째 우선순위는 지원되는 기능들보다 해당 프로젝트가 오픈소스인지 아닌지이다. 나는 오픈소스를 무척이나 선호하는데 영감님들이 잔뜩 있는 대기업에 다녔더라면 허구헌날 깨지고 다녔을지도 모르겠다.

다시 책 이야기로 돌아와서, 이 책은 SRS 같은 문서 작성에 대해서 이야기 할 때도 그것의 중요성에 대해서만 다루지 실제로 문서를 어떻게 작성해야 하는지에 대해서는 설명하지 않는다.

그런 기법들을 배우려면 '소프트웨어 개발의 모든 것'이나 다른 소프트웨어 공학 책들을 찾아봐야 할 것이다.

비록 기술적인 내용은 없다만, 이 책에서 말하는 내용들은 모두 공감이 많이 되고 옳은 이야기들만 있기 때문에 충분히 읽어볼만한 가치가 있다.
편하게 개발해오면서 해이해졌던 마음 가짐을 다시 조일 수 있는 계기도 되기 때문에 이런 좋은 충고를 해주는 책들은 주기적으로 읽어주어야 한다. -그런 책 중 가장 좋았던 책은 실용주의 프로그래머였다.

여러 우화나 인용을 제시한 후 그것과 비교하면서 독자를 설득해 나가는 글쓰기 방식도 인상적이다.

이 책에서 말하는 점들을 간추려서 적어보았다.
글에서 묻혀나는 뉘앙스들을 내가 느낀대로 적었기 때문에, 오해한 점도 껴 있을 수 있겠다.

  • 소프트웨어 아키텍쳐는 코더보다 고급 인력이다.
  • 소프트웨어 공학은 뻥이 아니다. 즉, 이를 (잘) 사용하면 개발 시간이 (정말로) 더 단축된다.
  • 그렇다고는 해도 생각없이 무작정 따라하면 쫄딱 망한다.
  • 코딩은 개발의 일부이며, 스펙 작성과 설계를 모두 할 줄 알아야 소프트웨어 개발자라고 할 수 있다.
  • 그리고 코딩보다는 스펙 작성과 설계 능력이 더 중요하고 고급 기술(돈도 많이 버는) 이다.
  • 난이도는 코딩 < 설계 < 스펙 순이다.
  • 중요성도 코딩 < 설계 < 스펙 순이다.
  • 사실 코딩능력은 아무것도 아니다.
  • 소프트웨어를 설계하는데 있어서 가장 중요한 것은 컴포넌트와 인터페이스를 잘 정의하는 것이다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/159 관련글 쓰기

  1. 우리 스스로 변혁해야 할 환경 모델 (글로벌 소프트웨어를 꿈꾸다)
    // Lemonism Territory 2010/10/27 07:13 x
  2. 글로벌 소프트웨어를 꿈꾸다 : 소프트웨어 개발자는 이래야 할 것이다.
    // 죠스, 세상에 나오다 2010/11/02 15:00 x
  3. 글로벌 소프트웨어를 꿈꾸다: 개발자가 행복한 세상에 살고 싶다
    // 아크비스타 :: 아크몬드의 비스타블로그 2010/11/12 21:31 x
  4. 세계적인 소프트웨어 회사 하나 없는 IT강국 - 글로벌 소프트웨어를 꿈꾸다
    // 빈꿈 EMPTYDREAM 2010/11/16 00:34 x
  1. Favicon of http://revirth.me BlogIcon tack at 2010/12/11 13:31 [edit/del]

    그르게요.. 저도 SRS에 대한 관심은 높아졌지만 정작 뭘 어찌 해야 할지는 ㅎㅎㅎ

    Reply

submit
유저모드에서는 CancelIo 함수를 통해서 해당 장치에 들어간 모든 I/O를 취소할 수 있고 CancelIoEx 함수를 통해서 특정 비동기 I/O만을 취소할 수도 있다.
비스타 이후부터는 CancelSynchronousIo 함수를 통해 CreateFile 같은 동기 함수도 취소할 수가 있다. 비동기가 지원이 되지 않는 함수들은 CreateFile 처럼 금방 수행되는 함수들인데, 이런 함수들을 과연 취소할 필요가 있는가 생각이 들수도 있지만, Network-redirector(SMB 같은)를 이용하여 원격지에 있는 파일에 접근할 경우 네트워크가 지연될 때 응용 프로그램에 꽤 오랜 블록킹이 발생할 수가 있다. 이런 함수를 잘 알고 이용하면 조금 더 응답성이 좋은 애플리케이션을 만들 수 있다.

사실 유저모드에서야 CancelIo를 부를 필요도 없이 애플리케이션을 꺼버리거나 I/O를 하는 장치의 핸들을 닫아버리면 알아서 취소가 되기 때문에 I/O의 취소에 대해서 그다지 고민할 일이 없지만 -대부분의 응용프로그래머들은 CancelIo같은 함수에 크게 관심을 갖지 않는다- 디바이스 드라이버에서는 조금 다르다.

디바이스 드라이버가 I/O의 취소를 제대로 구현해주지 않으면, 애플리케이션이 종료될 때에 Irp가 취소되지 못하고 드라이버에게 계속 잡혀있어서 애플리케이션이 제대로 종료되지 않은 채 계속 좀비로 남아있다거나, 운영체제가 셧다운되지도 않는 몹시 나쁜 상황을 맞이할 수 있기 때문에 I/O 취소의 올바른 구현은 필수적이다. -이런 경우를 조금이라도 방지하기 위해서 윈도우즈는 5분이 지나면 해당 Irp의 데이터구조는 삭제하지 않은채 취소를 시켜준다. 이것은 엄밀히 말하면 I/O의 취소라고는 할 수 없다.

그럼 디바이스 드라이버에서는 I/O를 어떻게 취소하는가.
디바이스 드라이버에게 I/O의 취소라는 것은 단순히 STATUS_CANCELLED 상태로 Irp를 완료시키는 것이다.
Irp에는 취소 루틴의 포인터가 담겨있는데, 우리가 이곳에 취소 로직을 적절히 구현하여 넣어주면 애플리케이션이 I/O의 취소를 요청할 때 I/O 매니저가 이 취소루틴을 호출 해주고 Irp는 취소로 완료될 수 있다.
하지만 드라이버는 취소루틴에서 STATUS_SUCCESS로 완료시켜버릴 수도 있고, STATUS_CANCELLED로 리턴하더라도 그 바로 직전 I/O가 정말로 완료되었을 수도 있기 때문에 유저모드에서 CancelIo 등을 사용해서 I/O가 완전히 끝났는지 잘 취소되었는지를 검사하는 것은 사실 별로 의미가 없다. 그냥 취소 했다는 것에만 의미를 두면 된다.

취소 루틴에 대해 간단하게 이야기 했지만,  취소루틴을 구현한다는 것은 생전 만나보지 못한 어려운 경쟁 상태를 해결해야 하기 때문에 많은 어려움이 따른다.
이런 어려움을 해소해주기 위해 마이크로소프트에서는 언제부턴가 Cancel-Safe Queue 라이브러리를 제공해주고 있다.

나는 다행히도 꽤 편한 세상에서 태어났고 디바이스 드라이버의 세상에 입문한지 얼마 되지 않았기 때문에, Cancel-Safe Queue를 사용하지 않고 직접 취소를 구현하는 드라이버는 구현해보지 않았다. -진심으로 다행이라 생각한다.

Cancel-Safe Queue를 이용하면 이런 골치 아픈 동기화 처리를 직접하지 않아도 된다.
우리는 라이브러리 루틴 내에서 제공하는 몇 가지 콜백함수들만 적절히 구현해주면 되는데, Csq 라이브러리가 자신들의 취소루틴을 붙였다 떼었다 하면서 우리의 콜백 루틴들을 동기화까지 포함해서 적절히 호출해주기 때문에 우리는 취소루틴을 제공할 필요도 없다. 대단하지 않은가. 이런 방식의 라이브러리를 제공한다는 것은 보통 일이 아니다.

앞으로 점점 많이 사용될 WDF에서는 우리가 취소에 관해 알아야 할 것들이 더욱 줄어들기 때문에 이런 처리가 더욱 쉬워지는데, 아직 WDF를 공부해보지 않아서 어떻게 동작하는 것인지는 모르겠다.

Cancel-Safe Queue의 예제 코드는 WDK 샘플 코드의 /src/general/cancel 위치에 있다.

Csq를 사용하기 위해 우리가 구현해줘야 할 콜백함수들은 다음과 같다.

  • XxxCsqInsertIrp
  • XxxCsqRemoveIrp
  • XxxCsqPeekNextIrp
  • XxxCsqAcquireLock
  • XxxCsqReleaseLock
  • XxxCsqCompleteCanceledIrp

이름에서 볼 수 있듯이 자료구조에 Irp를 넣고 찾고 빼고 잠그는 루틴들을 우리가 구현해주면 되는 것이다.
즉, 자료 구조와 동기화 방식을 우리가 결정할 수 있다. 자료구조는 거의 링크드 리스트를 이용하며, 어떤 커널모드 동기화 방식을 써서 구현해도 상관없지만 성능을 위해 보통 스핀락을 사용한다.
Csq를 쓰면 전역 캔슬 락을 사용해서 구현한 기존의 드라이버들 보다 성능에도 이점이 있다.

각 콜백 함수 구현에 대한 코드는 샘플 코드에서도 찾아볼 수 있지만, 이 문서에는 설명까지 덧붙여 잘 나와있으므로 한 번쯤 읽어보는 것이 좋겠다. 보통의 경우에는 샘플 코드를 복사해서 쓰는 것으로 충분할 것이므로 여기에 따로 코드를 적지는 않는다.

이 루틴들을 다 구현했으면 IoCsqInitialize 함수로 적절한 곳에서 초기화를 하며 콜백 함수들을 등록시켜준 뒤에, Irp가 들어올 때 IoCsqInsertIrp함수를 통해 큐에 집어넣고 나서 I/O 작업을 한다. 작업이 끝나면 IoCsqRemoveIrp함수를 통해 큐에서 빼고 잘 제거된지 확인 한 후에 여느 때처럼 IoCompleteRequest 함수로 Irp를 완료시켜주면 된다. 도중에 애플리케이션들로부터 취소가 요청되면 Csq가 적절히 우리가 작성한 취소 로직들을 이용하여 취소를 수행 해줄 것이다.

위의 설명에서 몇 가지 추가 설명을 해야 할 것들이 있는데, 콜백함수는 우리가 직접 부르는 것이 아니다. 우리 코드에서는 IoCsqInsertIrp처럼 IoCsqXxx 루틴들을 사용 한다. 이 루틴들이 내부에서 우리의 콜백함수를 적절한 곳에서 호출해줄 것이다.

초기화 할 때 IoCsqInitialize가 아니라 IoCsqInitializeEx함수를 이용하면 IoCsqInsertIrpEx 함수를 통해 추가적인 컨텍스트를 담을 수 있다. 이런 추가적인 컨텍스트는 우리가 Queue를 사용하는데 있어서 더 많은 유연함을 가능하게 한다. 

Csq를 사용할 때는 Csq에 관련된 데이터구조가 Irp->Tail.Overlay.DriverContext[3] 에 보관된다.
그러므로 Csq를 사용할 때는 이름이 DriverContext라고 해서 이 곳에 함부로 아무 데이터나 담아서는 안되겠다. 참고로 유저모드 파일시스템 드라이버 프레임워크인 Dokan에서는 Csq를 사용하지 않고 직접 취소루틴을 구현했는데, DriverContext[2]와 [3]에 추가적인 데이터를 담아 사용하고 있다.

위에서 작업이 끝나면 IoCsqRemoveIrp 함수를 통해 큐에서 빼고 잘 제거되었는지 확인하라고 했는데, 이는 그 사이에 취소가 들어왔을 경우 큐에서 이미 빠져버렸을 수 있기 때문이다. 만일 NULL이 리턴되었다면 도중에 취소 요청이 들어와 큐에서 이미 빠진 것이다. 그 Irp는 곧 XxxCsqCompleteCanceledIrp 루틴에 의해 완료되게 될 것이고 이 Irp를 우리가 또 완료시켜서는 안된다.

마지막으로 IRP_MJ_CLEANUP 디스패치 루틴에서는 내 디바이스의 핸들이 닫히는 경우에 큐에 Pending되어 있는 Irp들을 모두 완료 시켜주어야 한다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/158 관련글 쓰기

  1. 디바이스 드라이버 at 2010/10/25 12:44 [edit/del]

    우연히 찾게 되었는데 무척 좋은 글 잘 읽고 갑니다.^^

    Reply

submit
superuser.comserverfault.com에 이어 stackoverflow.com에도 채팅기능 추가되었다.

플러그인도 요구되지 않고 어떤 브라우저에서나 채팅을 할 수 있는데다가 약간의 스마트 에디팅도 지원되기 때문에 아주 편리하다.

모르는 것도 물어보고 영어 공부도 쉽게 할 수 있으니 1석 2조 아닌가?

한번 구경하러 가보자.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/157 관련글 쓰기

  1. stackoverflow.com -최고의 프로그래밍 질문/답변 사이트
    // 김재호의 디지털보단 아날로그 2010/10/24 11:36 x
  2. Stackoverflow.com에서 탑랭커들의 답변만 피드로 받아보기
    // 김재호의 디지털보단 아날로그 2010/10/24 11:36 x

submit
ReactOS의 새로운 버전이 1년여 만에 릴리즈 되었다.

윈도우즈를 공부하는 사람들에게 이 정도 수준의 참고할만한 프로젝트가 또 있을까.

리버싱 지식이 전혀 없는 나로서는 윈도우 내부가 궁금할 때마다 항상 ReactOS의 코드에서 답을 찾고는 하는데, 이는 정말 많은 도움이 된다.

혹시 이런 프로젝트를 아직까지 모르고 있었다면 당장 코드를 다운받아서 몽땅 태깅해놓고 필요할 때마다 살펴보자.

아직은 구현이 안된 코드들도 상당히 많은데, 빨리 빨리 발전해서 더 많은 코드들을 참고할 수 있었으면 좋겠다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/156 관련글 쓰기

submit
처음 프로그래밍을 배울 때 재귀함수라는 것은 정말 내 머리를 핑핑 돌게하는 어려운 장벽이었다.
데이터구조를 가르치셨던 교수님께서 어느 날 수업 중, 재귀로 프로그래밍을 짜는 것이 가장 쉽다는 말을 한 적이 있었는데 나는 그게 농담인지 진담인지 구분을 못했던 기억이 난다. -물론 진담이었다.

재귀를 이해하기 위해서 좋은 질문이 여기에 있다.
Enjoy recursion.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/155 관련글 쓰기

  1. Favicon of http://mastojun.net BlogIcon mastojun at 2010/10/22 05:15 [edit/del]

    와우 ㅋㅋ 좋은 질문 링크가 처음에 잘못된줄 알았어요 ^.^ 센스에 감탄하고 갑니다~

    Reply

submit
유닉스.리눅스 프로그래밍 필수 유틸리티 - 8점
백창우 지음/한빛미디어

이 책은 2004년도에 1판이 발행되었고, 최근에 2판이 나왔다.
외국에는 1/E, 2/E 처럼 1판 2판이라고 표기하는데, 국내 출판사들은 개정판이라는 용어를 좋아하는 것 같다.
개정판이 뭐지? 2판이라는 말과 뭐가 다르지? 하고 문득 궁금해서 사전을 찾아보았다.
기존 내용이 수정된 것 뿐만이 아니라 subversion 처럼 완전히 새로운 장들이 추가되었는데도 개정판이라고 하는 것은 좀 이상해 보인다.
내가 출판사 사장이면 개정판이란 말은 쓰지 않고 항상 2판 3판 이라는 용어를 사용하겠다. 기든 아니든 그게 장사하는데 더 낫지 않겠는가. 크크.

편집기인 vim 부터 시작해서 make, gcc, gdb, 그리고 형상관리툴인 svn과 cvs까지도 다루어 주므로 리눅스에서 프로그래밍을 시작하는 사람들에게는 필수이자 안성맞춤인 책이라 할 수 있겠다.

vim 챕터는 별로 기대를 하지 않았는데, 꽤 괜찮았다. 다른 책들과는 다르게 딱딱하고 형식적이지 않고 실제로 많이 쓰이는 ctags나 cscope 같은 외부툴과 몇가지 유용한 플러그인들을 함께 소개해주어서 아주 좋았다. 1판이 나왔을 때보다 지금은 좋은 플러그인이 훨씬 많이 나왔는데, 이런 것들을 좀 찾아보고 개정판에 실어주었다면 두말할 나위 없이 더 좋았을 것이다.

책 전체적으로는 도구의 여러 옵션들과 그것들을 이해하기 위해 알고 있어야 할 기본 지식을 따로 설명해주므로 누구든지 읽을 수 있도록 구성되어 있다.
하지만 저자가 OS도 만드는 등 임베디드 쪽에서 많이 일을 해서 그런지 임베디드 리눅스에 치중된 내용을 너무 많이 다루는 것 같은 느낌이 강하게 든다.
사실 리눅스 개발자 중에는 임베디드 개발자도 많지만 일반적인 서버 개발자도 그만큼이나 많지 않은가. 이런 사람들은 필요한 내용들만을 잘 골라내서 읽어야 할 것이다.

시간이 많이 흐른만큼 애플리케이션들도 많은 변화가 있었는데, 개정판에서는 이런 것들이 많이 반영되지 않은 것 같아서 아쉽다. 우분투 사용자를 배려해서 우분투에서의 설치 방법 또한 제공해주는 것은 좋았는데 우분투 버전이 7.04인가 그랬다. 맙소사. 2010년 책인데.
또한 CVS 같은 구식 툴은 과감하게 제거해버리고 svn에 git를 추가해서 설명해줬으면 더 좋았을 것 같다. 최근에는 아주 많이 사용되고 있는 cmake 도 2판에서는 꼭 설명되었어야 할 도구인데 빠져있는 것이 참 아쉽다.

마지막으로 이 책의 표지는 참으로 맘에 안든다.
예전에, 도서관에서나 회사에서 이 책의 1판 표지를 보면 항상 책 내용을 훑어보고 싶도록 나를 이끌었었는데, 이번 개정판은 내용은 전판보다 보강되었을지 몰라도, 워드나 엑셀의 표지에나 어울릴법한 아동틱한 표지로 만들어버렸다. 최근에 한빛미디어에서 나오는 책들은 대부분 이런 아동틱한 밝은 디자인의 표지인데, 개인적으로 이런 표지의 책들을 보면 별로 배울 것이 많이 담겨있지 않을 것 같아 꺼려지게 된다.

그럼 멋진 표지를 가진 책은 무엇이냐고?
지금 딱 생각나는 책이 하나있는데 바로 이런 책이다.
원서가 더 멋있긴 하지만 한글판도 참 잘 나온 것 같다. 하드커버로 나온게 좀 싫었지만.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/154 관련글 쓰기

  1. 개발서적 - 유닉스/리눅스 프로그래밍 필수 유틸리티(개정판)
    // A2공간 - 도움되는 글을 쓰자 2010/10/25 22:56 x
  2. 유닉스 리눅스 프로그래밍 필수 유틸리티
    // 아크비스타 :: 아크몬드의 비스타블로그 2010/10/29 00:18 x
  3. [Review] 유닉스 리눅스 프로그래밍 필수 유틸리티 개정판
    // 하늘과 나의 세상 탐험기 2010/11/01 13:06 x
  1. Favicon of http://ani2life.egloos.com BlogIcon A2 at 2010/10/25 22:58 [edit/del]

    트랙백 타고 왔습니다.
    개정판 이전것도 읽으셨군요.
    그러고보니 글에 쓰신 것 처럼 git이 빠진게 아쉽네요.
    다음판에 기대해봅니다. ^^

    Reply
  2. 곽재상 at 2011/01/13 09:42 [edit/del]

    iamroot.org에서 유명하신 분이네요 전에 세미나 갔다가 한번 뵜는데 후후후

    형 들렸다 갑니다~

    Reply

submit
커널 모드에서 코드를 작성한다는 것은 유저모드에서 보다 어려운 사항이 많이 있다.
언어도 자유롭게 사용할 수 없고, 디버깅도 힘들며, 한 줄이라도 실수하면 여지없이 블루스크린이 발생한다.
그럼 커널 모드 디바이스 드라이버와 같은 것들을 유저 모드에서 구현할 수 는 없을까.

리눅스에는 FUSE라는 것이 있다.
File system in User Space 라는 뜻인데, 유저모드에서 파일 시스템을 구현하도록 제공되는 인터페이스이다.


윈도우에도 물론 비슷한 것들이 있다.
상용 제품인 Callback File System은 콜백 인터페이스를 제공하고 유저모드에서 이 콜백 인터페이스를 구현하기만 하면 CBFS가 알아서 이런 콜백들을 불러준다.


위 그림에서 보면 우리는 Your Application 부분만을 구현하면 되는 것이다.
우측에 있는 Callback File System에서 ReadFile WriteFile등 우리가 미리 등록해둔 콜백 오퍼레이션들을 호출해 줄텐데, 그런 함수들이 호출되면 파일들을 읽고 쓰도록 구현하면 된다.

내 또래의 일본인이 혼자서 열심히 만들고 있는 것 같아 보이는 Dokan 이라는 오픈소스도 있다.


파일 시스템 애플리케이션(우측 초록색)이 처음 구동되면 워커 쓰레드를 여러개 만들어 DeviceIoControl 함수를 호출해 Dokan File System Driver(아래 파랑색)에게 집어 넣어놓는다. DevceIoControl 함수는 비동기 호출도 가능하고 IOCP도 지원이 되지만 Dokan에서는 간단하게 구현하기 위해서 쓰레드를 여러개 만들어 동기적으로 호출한다.
애플리케이션들로(좌측 초록색) 부터 I/O가 들어오면 Dokan Driver(아래 파랑색)가 이 Irp들을 받아서 잘 정리한 뒤 파일 시스템 애플리케이션(우측 초록색)이 미리 넣어두었던 DeviceIoControl의 버퍼에 데이터를 복사하고 완료시킴으로 유저모드로 작업을 위임한다. 파일 시스템 애플리케이션에서는 해당 이벤트가 뭔지 확인해본 뒤에 실제로 처리를 한 후 파일 시스템 드라이버에게 다시 그 결과를 전달해준다. 그러면 파일 시스템 드라이버는 받은 결과 그대로 애플리케이션들의(좌측 초록색) Irp를 완료시킨다.

이렇게 드라이버가 유저모드의 구현을 위한 인터페이스만을 제공함으로서 파일 시스템 로직 구현을 유저모드로 옮길 수 있으며, 유저모드 개발시의 여러 장점들을 가져올 수 있다.
그림에서 보이는 것처럼 두번씩 왔다 갔다 해야하는 것이 성능의 저하를 가져올 수 있고, 유저모드로 구현이 넘어감에 따라 커널 모드 라이브러리 루틴들을 마음껏 쓸 수 없다는 것은 단점이라 할 수 있겠다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/153 관련글 쓰기

  1. 오곡 at 2012/11/26 11:04 [edit/del]

    좋은 내용 잘봤습니다 ^^

    Reply

submit
한달 쯤 전에 집에서 사용하는 PC를 새로 교체했다.
다른 PC 부품들에 대해서는 별로 욕심이 없는 편인데, 램에는 조금 욕심이 있다.

이제 PC용도 4G짜리 램이 나와서 4G짜리 램 2개를 구입했다. 메인보드는 그래픽 기능이 내장되어 있고 램 슬롯은 2개가 달려있는 아주 싼 저가형 보드를 구입했는데, 그래픽 카드나 비싼 메인보드 값 대신 램에 투자했다고 할 수 있겠다.

기존에 사용하던 PC보다 램이 조금 더 충족해지면서, 1~2기가 정도는 램디스크로 써볼까 하는 생각이 들었다.

램디스크를 설정하기 전에 몇 가지들을 검색해보니, 사람들은 주로 웹브라우저의 임시 파일을 캐시하는 용도로 많이들 사용하고 있었다.

윈도에서는 램디스크를 설치하기 위해 따로 프로그램(램디스크 드라이버)을 구해야 하지만 리눅스에서는 아주 간단하게 설정할 수 있다.
/tmp는 컴퓨터를 껐다켜면 지워지는 장소이므로 리눅스에서 램디스크로 잡아 쓰기에 적당한 곳이라고 할 수 있다.

/etc/fstab 파일을 연 뒤 다음 한 줄을 추가해주면 된다.
ramdisk  /tmp  tmpfs  mode=1777,size=1g

재부팅하면 /tmp가 1기가바이트 크기로 마운트 된다.
이 위치에 실제로 파일 복사등을 해보면서 dstat 같은 유틸리티로 I/O 를 살펴보면 램디스크로서 잘 동작하고 있음을 확인할 수 있다. -똑같은 파일을 또 복사하면 캐시에서 읽어오는 것에 유의해서 확인해야 한다.

웹브라우저가 이 곳을 캐시 저장소로 사용하게 하기 위해서는 브라우저의 캐시위치를 이 위치로 변경해주어야 하는데 구글 크롬을 사용하고 있다면 바탕화면 아이콘을 우클릭해서 속성을 열어 다음처럼 편집해주면 될 것이다.

/usr/bin/chromium-browser %U --disk-cache-dir="/tmp"

이제 원하던대로 웹의 리소스들이 디스크에 쓰여지지 않고 램에 저장된다.
웹페이지에 새로 들어갈 때마다 /tmp의 용량이 조금씩 늘어난다. 잘 동작하는 것 같고 끝내주게 빠른 것 같은 느낌이다.

그렇다면 실제로도 엄청난 속도 변화가 있었을까? 아니다. 그냥 원래 속도와 비슷하다.

웹에서 리소스를 다운로드 받을 때는 램디스크에 저장하던지 하드 디스크에 저장하던지 속도가 똑같다. 램의 쓰기 속도가 하드 디스크보다 훨씬 빠르기는 하지만, 네트워크에서 데이터가 한없이 느리게 읽혀지는데 어떻게 빨리 쓴단 말인가.

일단 한 번 캐시 해두었다면, 그 리소스를 다시 읽을 때는 램디스크에서 읽는 것이 물론 훨씬 빠르다. 컴퓨터를 껐다켜기 전까지는 계속 약발이 통한다. -물론 램디스크 드라이버가 언로딩 되기 직전에 하드디스크로 복사해줄 수도 있지만 이것도 부팅속도나 셧다운이 많이 느려지는 단점이 있다. 램디스크는 램처럼 쓰는 것이 어울린다.
그럼 하드 디스크의 경우에는 램디스크보다 항상 느리냐하면 그것도 아니다. 운영체제가 I/O를 할 때 캐시를 잘 해주기 때문에 최근에 사용된 많은 데이터들이 램 상에 올라가있고 실제로는 디스크 I/O를 하지 않고 램에서 읽는다.

그럼 컴퓨터를 껐다 다시 켜게 되면?
애써 받아놓았던 램디스크의 임시 인터넷 파일들이 날라가고 다시 다운로드를 받아야 한다.
그래서 커다란 용량의 트위터 바탕화면을 사용하는 페이지 같은 곳에 가면 이미지가 새로 다운로드 받아지는 것을 눈으로 확인할 수 있다. 그냥 하드디스크에 저장했으면 다운로드는 다시 안받아도 됐을텐데 말이다.

램디스크를 사용해서 웹서핑을 할 때 미친듯한 속도를 느끼고 있다는 글들이 많이 봤는데, 그들은 도대체 어떻게 속도가 빨라진건지. 내가 모르는 뭔가가 있는것인지 궁금하다.

리눅스의 경우에는 많은 프로그램들이 임시파일을 생성하여 작업할 때에 관례적으로 /tmp 위치에서 한다. 이런 애플리케이션들이 많으면 많을수록 /tmp 를 램디스크로 잡아 놓은 것이 더욱 효과가 있을 것이다.
하지만 용량을 얼마로 잡을것인지가 고민인데, 너무 크게 잡으면 안쓰는 램이 예약되어 버리는 것이 아깝고, 또 너무 작게 잡으면 애플리케이션들의 구현에 따라 오동작 할 수가 있기 때문에 찜찜하다. 잘 만들어진 애플리케이션이라면 I/O할 공간이 없는 것을 알고 메세지를 보여주는 등 예외처리를 시도하겠지만, 그렇지 않은 프로그램들도 참 많다. 이럴 경우에 사용자는 문제의 원인도 찾지 못하고 골탕만 먹게 될 수가 있다.

램디스크를 몇 일 사용해본 후, 나는 운영체제가 그냥 자연스레 캐시로 사용하게 하는 것이 훨씬 낫겠다 싶어서 다시 램디스크 설정을 제거해버리고 말았다.
저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/152 관련글 쓰기

  1. Favicon of http://sisioo.tistory.com/ BlogIcon 장영희 at 2010/11/01 18:25 [edit/del]

    적당한 삽질이였 네요~ ㅎㅎ

    머 컴터 껐다 켜도 남아 있다면........ 음.. 게임 할땐 좀 어떨라나.. 테스트는 게임을 통해서...

    Reply
    • Favicon of http://www.petabytes.org BlogIcon 김재호 at 2010/11/01 19:32 [edit/del]

      컴터 껐다 켜도 남아있게 리부팅될 때 디스크로 복사해주는 드라이버들도 있을꺼야. 난 그런 것은 쓰기 싫지만. 램디스크에 올라가는 데이터는 지워져도 상관없을 임시 데이터여야 제 맛이지.

  2. kkkkjul at 2010/11/10 17:26 [edit/del]

    그럴리가 없을텐데.... 제가 윈도우 환경 넷북에 램디스크써서 인터넷하는데 데탑보다 더빠른기분 들만큼 빠르거같앗는데요.. 물론 한번들어간사이트에서 빠르지요.. 그래서 ssd가진리에요 ㅎㅎ

    Reply
  3. kafka at 2010/11/14 19:08 [edit/del]

    전 익스플로러, 크롬 캐시파일 램디스크로 옮기면서 엄청난 속도 차를 느꼈는데, 사람마다 다르나 보네요.

    Reply
  4. gigi at 2010/11/14 21:57 [edit/del]

    램디스크 저장기능사용하고 크롬및 캐시점부 램디스크로 사용하면 웹브라이저로딩부터 서핑이 확실히 빨라집니다...다만 컴퓨터 부팅과종료가 약간 느려지고여...이것저것 다해보다 전 후자가 싫어서 램디스크에 임시파일과 임시 인터넷파일만 사용합니다.지워져도 상관없고 정리할필요없이 컴터부팅하면 알아서 사라져주니~

    Reply
  5. gwangyi at 2011/11/02 06:17 [edit/del]

    사실 리눅스라 그런 것 같아요. 윈도에 비해서 리눅스가 파일 시스템을 캐쉬하는 양이 훨씬 큰거 같더라구요...

    Reply
  6. 지나가다 at 2012/09/17 10:19 [edit/del]

    신형 컴퓨터로 램디스크 잡는것은 바보같은 짓이죠. 구형 컴퓨터로 일정량 램디스크 잡는것은 좋으나 용량적 한계가 있어서 말씀하신 부분이 찜찜하죠.
    인터넷 서핑 위주의 컴퓨터라면 램디스크 해놓아도 좋습니다.

    Reply

submit
나는 똑딱이 포토그래퍼다 - 8점
안태영(정민러브) 지음/한빛미디어

어제는 불꽃 축제를 다녀왔다.
불꽃 축제는 한화에서 진행하는데, 나는 운이 좋게도 한화 블로그에서 무려 1500분의 1 확률의 이벤트에 당첨이 되어 맨 앞의 좋은 자리에서 너무 편하게 아름다운 장면들을 구경할 수 있었다. 나는 한화하면 류현진이하고 빙그레밖에는 연상되는 것이 없었는데, 이번 일로 호감도가 많이 상승했다.

어쨌거나, 기왕 좋은 자리에서 보는거 사진이라도 몇 장 남겨두고 싶어서 평생 사진에는 관심도 없던 내가 회사에서 동료에게 DSLR을 빌리고, 아침에 도서관에서 DSLR 책과 이 책을 빌려서 몇가지들을 공부하고 조작법을 연습한 뒤에 한강으로 갔다.

불꽃들은 너무도 아름다웠고 가슴이 쿵쾅 쿵쾅 두근 거리도록 감동적이었는데, 집에 돌아와서 찍은 사진들을 컴퓨터에서 열어보니 그 예뻤던 불꽃이 다 불떡이 되어 있는 것이 아닌가.

나는 똑딱이 카메라를 항상 가방에 휴대하고 다니지만, 잘 꺼내지도 않을뿐더러 한 번 찍더라도 모든 아름다운 것들이 떡이 되고 만다. 카메라가 꼬졌구나, 좋은 카메라를 사면 나도 예쁘게 사진을 찍을 수 있을까. 하고 생각해왔었는데, '아, 안되는 놈은 뭘로 해도 안되는구나.' 라는 것을 확실히 깨달았다.

그럼 되는 놈은 뭘로 해도 될까?
얼마 전에 한빛미디어 사이트에서 새로 나온 책들을 살펴 보다가 눈길이 가는 책 제목을 발견해서, 조금 살펴보았었는데 소개글이 너무도 인상적이어서 어제 이 책도 같이 빌려왔었다.

아침에 일어나서 불떡 사진들을 보면서 문득 어제 빌려놨던 이 책이 생각이 났다.
똑딱이로도 사진이 잘 나오긴 하나. 어떤 사진들이 있나 한 번 보고 싶었던 것이었는데, 책이 아주 재미있어서 금새 다 읽었다. 우선 똑딱이로 찍었다는 그 사진들이 너무 좋았고, 세련되지는 않았지만 독자들을 공감하게 하고 설득시키는 글솜씨가 참 마음에 들었다.



책에 나오는 사진들을 보면 사진을 전혀 모르는 나로서는 이게 정말 똑딱이로 찍은게 맞는건지조차 모르겠다.
그 사진들 중에는 시흥역이나 석수역이 종종 등장하는데 그 곳은 우리 동네이기도 하고 내가 어렸을 때 부터 아주 많이 밟고 지나 다녔던 곳이다. 그 익숙한 장소들이 아름다운 사진으로 그려질 수 있다니 나도 사진을 잘 찍어보고 싶다는 욕구가 왕창 생겨버렸지 뭔가.



책을 읽으면서 가장 궁금했던 것은 도대체 이 사진은 정확히 어떤 카메라로 찍었을까 였다. 그런데 카메라 제품에 대해서는 전혀 언급이 없었다. 책에는 없지만 글쓴이의 블로그에서는 정확히 어떤 카메라로 찍었는지에 대한 정보도 공개가 되어 있다. 똑딱이는 똑딱이인데, 물론 역시 내 것보다는 훨씬 좋은 30만원 이상의 카메라들이었기는 했지만 그래도 정말 똑딱이로도 할 수있구나 하는 확신이 들었다.

이 곳이 저자의 블로그이다. 가서 한 번 그의 다른 사진들을 구경해보라.

나는 몇가지 물어보고 싶은 것들이 있었는데, 메일 주소도 찾을 수 없고 로그인한 사람만 글 쓰기를 허용해두고 있어서 그냥 말았다.

저작자 표시 비영리 동일 조건 변경 허락
크리에이티브 커먼즈 라이선스
Creative Commons License

http://www.benjaminlog.com/trackback/151 관련글 쓰기

  1. 아날로그 감성의 똑딱이 카메라, '로모'를 다시 만나다
    // 미도리의 온라인 브랜딩 2011/04/10 20:27 x

submit