OS 구조와 원리 study

from Programming 2008/09/27 12:33

한빛미디어에서 나온 "OS 구조와 원리: OS 개발 30일 프로젝트"를 읽고 있다. 물론 그냥 읽는 게 아니고 하나씩 따라하면서 읽고 있다. 거의 책의 진도에 맞춰서 나가려고 하고 있는데, 주말에는 좀 더 나가야겠지?

아무튼, 4일 째가 되어서 뭔가 화면이 나왔기에 기념샷 하나 올려둔다. ㅋㅋㅋ

사용자 삽입 이미지


2008/09/27 12:33 2008/09/27 12:33

16 bit registers

  • AX ... accumulator
  • CX ... counter
  • DX ... data
  • BX ... base
  • SP ... stack pointer
  • BP ... base pointer
  • SI ... source index
  • DI ... destination index

8 bit registers

  • AL ... accumulator low
  • CL ... counter low
  • DL ... data low
  • BL ... base low
  • AH ... accumulator high
  • CH ... counter high
  • DH ... data high
  • BH ... base high

segment registers

  • ES ... extra segment
  • CS ... code segment
  • SS ... stack segment
  • DS ... data segment
  • FS ... dummy segment
  • GS ... dummy segment
2008/09/25 22:53 2008/09/25 22:53

사용자 삽입 이미지

그림출처: amazon.com

Code Optimization: Effective Memory Usage

지금 회사에서 Internal Study를 진행하고 있는 책입니다. 내용은 제목에서 보는 바와 같이 프로그램 코드를 어떻게 하면 좀 더 최적화할 수 있는가에 대한 내용입니다. 주로 메모리 관련하여 하드웨어적으로 깊숙히 들어가서 살펴보고 있습니다.

그런데, 가독성이 정말 떨어집니다. 이해하기가 힘들어요. 하드웨어를 잘 아시는 분들이시라면 쉽게 이해하실지도...

그리고 책이 나온 시점이 꽤 되는 관계로 최신 하드웨어를 반영하고 있지는 못하다는 점이 아쉽네요. 그래도 전체적으로 내용은 좋습니다. Micro Optimization이 필요하다면 한 번쯤 봐 두는 것도 나을 듯.

아무튼, 다음 주에는 제가 발표할 차례라 준비를 해야하는데... 처음부터 제대로 읽어보려고 했더니 너무 힘드네요...ㅡ.ㅡ;;

more..


  1. 뭐 그래도 번역서와 집필서는 다르겠죠? 문장력보다는 내용에 실망한 것이니...
2008/07/24 16:52 2008/07/24 16:52

지난 10년을 돌아보고, 앞으로의 10년을 계획하기에 앞서 잠깐 옆에 있는 책장에 꽂혀있는 전산학/컴퓨터 관련 서적들을 꼽아봅니다. 책을 잘 정리하는 편은 못되는지라 그냥 왼쪽 위에서부터 오른쪽으로 꽂혀있는 순서대로입니다.

  1. 누워서 읽는 알고리즘
  2. 행복한 프로그래머
  3. Theory and Applications of Numerical Analysis, 2nd edition
  4. Introduction to Probability Models, 8th edition
  5. Introduction to Algorithms, 2nd edition
  6. Algorithms in C++ (Parts 1~4, 5), 3rd edition
  7. Linear Algebra and Its Applications, 3rd edition
  8. Data Structures & Algorithm Analysis in Java
  9. Data Structures & Problem Solving Using Java
  10. Fundamentals of Data Structures in C++
  11. Data on the Web
  12. Computer Organization & Design
  13. Data Structures, Algorithms and Applications in Java
  14. Java Pitfalls
  15. Constructing Intelligent Agents Using Java, 2nd edition
  16. Web Development with JavaServer Pages
  17. Patterns in Java Volume 1
  18. Beginning XML, 2nd edition
  19. Beginning Java Objects
  20. The Pragmatic Programmer
  21. Programming Pearls, 2nd edition
  22. Database System Implementation
  23. Advanced Programming in the UNIX Environment, 2nd edition
  24. UNIX Network Programming Volume 1, 3rd edition
  25. Effective C++, 2nd edition
  26. Thinking in C++, 2nd edition
  27. 좋은 프로그래밍 습관
  28. Applied Statistics and Probability for Engineers, 3rd edition
  29. UNIX System Administration Handbook, 3rd edition
  30. 윈도우 프로그래머를 위한 MFC 구조와 원리
  31. TCP/IP 소캣 프로그래밍
  32. Design Patterns
  33. 뇌를 자극하는 윈도우즈 시스템 프로그래밍
  34. Operating System Concepts, 6th edition
  35. C Programming FAQs
  36. Programming Microsoft Windows with C#
  37. Managing Projects with make
  38. Programming Windows, 5th edition
  39. Extreme Programming Installed
  40. C++ Primer Plus, 4th edition
  41. Building Parsers with Java
  42. Data Structures and Algorithms in Java
  43. Database System Concepts, 4th edition
  44. JavaServer Faces in Action
  45. Game Architecture and Design
  46. Introduction to 3D Game Programming with DirectX 9.0
  47. 위피 모바일 게임 프로그래밍
  48. C++ FAQs
  49. Swing
  50. 초보자를 위한 비주얼 C++ 5 21일 완성
  51. ASP 프로젝트 실습
  52. Distributed Programming with Java
  53. 일주일만에 배우는 CORBA
  54. 쓰디쓴 자바 - 자바 안티패턴 이야기들
  55. 정보처리기사 필기시험 대비서 1 - 프로그래밍 언어
  56. 서울대 객체지향 DBMS SOP 구축 이야기
  57. 서울대 관계형 DBMS SRP 구축 이야기
  58. 초보자를 위한 비주얼 C++ 6 21일 완성
  59. 98 특별 대비 정보처리기사 1급 필기 - 전산 수학
  60. 예제로 배우는 비주얼 베이직 6 인터넷 프로그래밍
  61. 수학으로 디자인한 플래시의 세계
  62. The Unified Modeling Language User Guide
  63. The Rational Unified Process, An Introduction, 2nd edition
  64. Operating Systems, Design and Implementation, 2nd edition
  65. Refactoring
  66. The Art of Computer Programming Volume 1, 2, 3rd edition
  67. 유전 알고리즘
  68. C++ Coding Standards
  69. Java Examples in a Nutshell
  70. An Introduction to Object-Oriented Programming, 2nd edition
  71. Modern Information Retrieval
  72. Core Java 2 Fundamentals Volume 1
  73. 예제로 배우는 C++ 24시간
  74. Java가 보이는 그림책
  75. 플래시 MX 액션 스크립트
  76. 버그 패턴과 자바
  77. NEW 비주얼 C++ 6 입문
  78. Discrete Mathematics and Its Applications, 4th edition
  79. Visual C++ Programming Bible, 2nd edition
  80. 배시 셸 시작하기
  81. Learning the bash Shell
  82. Game Coding Complete
  83. Essential ActionScript 2.0
  84. BSD Hacks
  85. PHP Web-DB Programming Guide
  86. C Primer Plus, 5th edition
  87. Hackers & Painters
  88. The C++ Programming Language, special edition
  89. Computer Systems, A Programmer's Perspective
  90. HTML & JavaScript 사전
  91. AJAX Hacks

그냥 얼핏 보면서 지나칠 때는 그다지 많아 보이지 않았는데, 생각 외로 꽤 많네요. 사실 금전적인 이유로 책을 잘 사지 못했었는데... 조금 놀랐습니다. 게다가 읽지 않은 책이 반을 넘어간다는 깨달음에 한 번 더 놀랐습니다.

그래도 강과장님의 글 '충분히 낭비할 것을 권장함'처럼 이런 낭비는 괜찮지 않을까 스스로 위안해 봅니다.

2008/07/23 00:51 2008/07/23 00:51
Tag //

php에서는 array()를 이용하여 배열을 만들어 쓸 수 있다. php의 배열에는 numeric과 associative의 두 가지 타입이 있는데, numeric은 Java나 C/C++에서의 array와 비슷하다고 보면 된다.

$names = array("Peter", "John", "Joe");

와 같이 선언하면 다음과 같이 for문을 이용하여 출력할 수 있다. 여기서 array의 크기를 알기 위해서 count()함수를 이용하였는데, sizeof()를 이용해도 된다.

for ($i = 0; $i < count($names); $i++)
echo $names[$i];

그러나 Java나 C/C++과는 달리 array_push()함수를 이용하여 element를 더 추가할 수도 있다. 이 때 여러 element를 한꺼번에 추가할 수도 있다.

array_push($names, "Doug", "Brian");

associative array는 hashtable과 비슷한데, 0부터 생성되는 숫자로 된 index가 아닌 임의의 숫자/문자열을 index로 쓸 수 있다. 다음과 같이 선언할 수 있다.

$ages = array("Peter" => 32, "John" => 24, "Joe" => 50);

이 경우 다음과 같이 출력할 수 있는데,

echo "Peter's age is ".$ages["Peter"];

이 경우 index로 쓰인 숫자/문자열을 모두 알고 있어야 한다. 만약 모르는 경우에는 다음과 같이 foreach문을 이용하여 iteration할 수 있다.

foreach($ages as $idx=>$val)
echo $idx."'s age is ".$val;

마지막으로 php의 array도 다차원으로 선언해 쓸 수 있는데, 선언하는 방법은 다음과 같다.

$families = array(
"Peter"=>array("George", "Lois", "Megan"),
"John"=>array("Glenn"),
"Joe"=>array("Cleveland", "Loretta", "Junior"));

물론 다음과 같이 할 수도 있다.

$families = array();
$families["Peter"] = array();
$families["John"] = array();
$families["Joe"] = array();
array_push($families["Peter"], "George", "Lois", "Megan");
array_push($families["John"], "Glenn");
array_push($families["Joe"], "Cleveland", "Loretta", "Junior");

출력할 때는 일반적인 다차원 배열에 접근하는 방법과 동일하다.

echo "Peter has ".$families["Peter"][0]." in his family";

참조:
http://www.w3schools.com/php/php_arrays.asp
http://www.plus2net.com/php_tutorial/array_size.php
http://kr2.php.net/manual/en/control-st ··· each.php
2008/06/09 00:49 2008/06/09 00:49
Tag // ,

프로젝트가 워낙 커서 rebuild all을 거의 하지 않고 (rebuild all을 하면 4시간이 걸린다. 8개 CPU를 모두 다 써서 병렬로 컴파일하면 그나마 2시간 정도로 줄어들긴 하지만...) 수정한 모듈만 컴파일 해서 테스트를 하는데, 갑자기 내가 전혀 손대지 않은 곳에서 에러가 난다. 이럴 때는 그냥 새로 전체 rebuild를 해 주는 게 정신 건강에 좋다. 많은 경우 그냥 rebuild all로 문제가 해결되곤한다.

2008/05/27 17:01 2008/05/27 17:01

지난 몇 주간 갑자기 발생한 에러때문에 디버깅으로 시간을 다 보냈다. 덕분에 가끔 미투데이에 남기는 글들 외 따로 블로그에 글을 올리지도 못했다.

이번 문제는 새롭게 빌드한 바이너리1의 성능을 측정하기 위해 벤치마크 테스트를 준비하던 중 발생했다. 보통의 경우에는 미리 만들어 둔 데이타 이미지를 사용해서 성능 측정을 했었는데, 이번 바이너리의 경우에는 이미지의 포맷이 변경되는 바람에 기존 이미지를 가져다 쓰지 못하고 새롭게 만들어야 했는데, 그 과정에서 발생한 것이다.

원인을 분석하고 해결책을 찾아야 했는데, 도무지 원인을 파악할 수가 없었다. 여러 팀이 나누어 구현하고 관리하는 바이너리라 책임 소재를 찾기도 힘들었다. 게다가 디버깅용으로 같이 만들어지는 슬로우 바이너리2를 이용하여 문제를 파악하려고 했더니 슬로우 바이너리에서는 해당 문제가 발생하지 않았다. 진퇴 양난. 결국 선택한 건 지금까지 릴리즈한 바이너리들을 전부 테스트해 보고 처음 문제가 발생하는 바이너리를 찾아서 해당 릴리즈에 수정된 코드를 추가한 사람에게 책임을 묻는 방법이었다.

먼저 지금까지 테스트를 위해 사용해 왔던 테스트 데이타 이미지를 생성한 릴리즈 바이너리를 찾았다. 그 바이너리에서는 문제가 발생하지 않았으므로, 그 때를 기준으로 현재 바이너리까지 릴리즈 된 녀석들을 대상으로 바이너리 서치를 수행했다. 결론은 캘린더 위크 07~09 사이에 추가된 코드에 문제가 있을 것이라는 것.

해당 기간 동안 수정 된 코드를 Perforce3에 서브밋한 사람들을 불러 모아서 각자 자신의 수정 사항을 제거한 바이너리를 캘린더 위크 09에 릴리즈한 바이너리의 버전에 맞춰 빌드해 달라고 요청하였다. 이렇게 해서 받은 바이너리들을 테스트해서 결국 에러의 원인이 된 수정 사항을 발견할 수 있었다.

가만히 하나하나 따져가며 논리적으로 문제가 발생하는 부분을 찾아낼 수도 있겠지만, 이렇게 수정 사항들을 하나씩 되돌려보는 무식한 방법이 더 빨리 문제를 해결해 주기도 한다.

  1. 1~2주마다 한 번씩 릴리즈 바이너리를 빌드하고, 해당 바이너리의 성능을 측정한다.
  2. 트레이싱 정보를 출력해주는 바이너리다. 아무래도 많은 정보를 출력하다보니 작업 수행이 느려지게 되므로 슬로우 바이너리라 부른다.
  3. 버전 관리 시스템으로 perforce를 사용하고 있다.
2008/05/07 18:48 2008/05/07 18:48

자바의 GregorianCalendar를 이용하여 date를 계산하는 과정에서 문제가 발생해서 한 동안 애를 먹었다. 평소에 그냥 아무 문제 없이 돌아가던 테스트가 갑자기 에러를 발생시킨 것이다. 문제는 그 이후에 다시 그 문제가 발생하지 않았는데, 그냥 그러려니 하고 넘어가기에는 이해가 안가는 부분이 있어서 에러를 발생시킨 원인에 대해 알아봤다.

문제의 에러는 GregorianCalendar에 현재 timestamp를 저장해 놓고 add() method를 이용해서 13일씩 빼 나가던 중 발생했다. 테스트 시점의 timestemp는 2008-03-18 00:39:51이었고, 다음의 code를 실행시켰다. (그 후에는 아무리 같은 테스트를 수행해도 한 시간이 더해지는 경우는 생기지 않았다. ㅡ.ㅡ;;)

GregorianCalendar cal = new GregorianCalendar();
GregorianCalendar cal1 = (GregorianCalendar) cal.clone();
cal.setTime(new java.util.Date()); // 2008-03-18 00:39:51 이 저장되었다.
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

int step = 13;
for (int i = 0; i < 8000; i += step)
{
cal1.setTime(cal.getTime());
cal1.add(Calendar.DAY_OF_YEAR, -i);
System.out.println(df.format(cal1.getTime()));
}

척 보기에도 아주 간단한 코드인데, 문제는 아래와 같이 결과가 나오던 중 1988-05-08 01:39:51이라는 엉뚱한 값이 나와버린 것이다. 도대체 저 한시간이 어디서 더해진거란 말인가? ㅡ.ㅡ;;

2008-03-18 00:39:51
2008-03-05 00:39:51
2008-02-21 00:39:51
2008-02-08 00:39:51
...
1988-06-03 00:39:51
1988-05-21 00:39:51
1988-05-08 01:39:51 <- 여기가 문제의 값이 출력된 부분이다.
1988-04-25 00:39:51
1988-04-12 00:39:51
...

도전 정신이 생기면 아래 more를 누르지말고 스스로 그 원인을 찾아보길~

more..

2008/04/15 15:06 2008/04/15 15:06

PHP programming in Windows

from Programming 2008/04/05 18:38

아는 사람의 부탁으로 간단한 웹 프로그램을 하나 짜게 됐다. 옛날에는 주로 자바를 이용해서 작업을 했었는데, 간단한 웹 페이지를 만드는거라 왠지 닭잡는데 소잡는 칼을 쓰는 느낌이라 그냥 php로 작업하고 있다.

데스크탑에서 돌리기 위한 거라 서버 까지도 필요 없고, 그냥 윈도우즈에서 돌아가면 되는데 예전에 XAMPP라는걸 본 기억이 나서 찾아봤더니 여전히 살아 있구나. 여러가지 버전이 있는데, 윈도우즈용 라이트 버전을 인스톨러를 쓰지 않고 그냥 압축만 풀어 쓰면 되는 놈으로 설치했다.

기본적으로 apache, mysql, php를 지원하도록 되어 있고, phpmyadmin도 포함되어 있어서 꽤 쓸만한 놈이다.

사용자 삽입 이미지

오랫만에 보는 php는 그다지 부담은 없는데, 오랫만에 해 보는 웹 프로그래밍 자체는 정말 귀찮은 작업이다. 소소하게 손가는 부분들이 참 많구나. html 작성하는 것도 꽤 귀찮은 일이네. 게다가 자바스크립트가 필요한 부분들도 꽤 되고보니 이것 저것 많이 건들게 된다. 그리고 한글 처리를 위해서 고생 좀 했다. 계속 해 오던 일이라면 그다지 고생하지도 않았을텐데 라는 생각을 계속 하면서 꽤나 이것 저것 자료를 뒤지고 테스트해 보면서 겨우 한 가지 방법을 알게 됐다. 다름 아닌 mb_convert_encoding1을 이용하는 것.

고생했던 이야기들은 너무 길어지는 것 같아서 그만둬야겠다.

  1. 이 함수 하나를 알기 위해서 무려 5시간동안 인터넷을 헤맸다. ㅡ.ㅡ;; 최근 php 책이라도 한 권 살 껄 그랬나 하는 고민을 잠깐 했다.
2008/04/05 18:38 2008/04/05 18:38
Tag // ,

원본: http://dodamdodam.org/tc/18

젠장. 덧글로 썼던 글이 너무 길어서 그냥 트랙백으로 하려다가 망했다. 내용을 복사한 후에 덧글을 삭제하고, 트랙백을 걸려고 트랙백을 누른 순간 트랙백 주소가 복사되면서 내 덧글 내용이 날아갔다. ㅡ.ㅡ;; 그냥 짧게 다시 쓰는 수 밖에...

현영이가 Eclipse에서 Vim을 쓰기 위해 고군분투한 내용이 있길래, 그에 대한 내 경험을 살짝 포스팅해 본다.

일단 Eclim이란 놈은 처음 본 놈인데, 실제로 깔아보기 전까지는 그 정체가 뭔지 살짝 헷갈리는 놈이었다. Eclim은 홈페이지에 나오는 말 그대로 Eclipse Integration in Vim을 표방하는 놈이다. 즉, Eclipse의 기능을 확장하기위한 플러그인이라고 보기 보다는 Eclipse의 기능을 Vim에서 쓰기 위한 플러그인인 셈이다. 그래서 Eclim은 Vim에서 동작한다. 물론 Eclipse의 기능을 쓰기 위한 Vim plugin도 같이 제공해준다. 다음 그림을 보면 Vim화면에서 Eclipse의 기능을 제공하고 있음을 쉽게 알 수 있다. (그림 출처는 SourceForge의 eclim project homepage)

사용자 삽입 이미지사용자 삽입 이미지사용자 삽입 이미지

발상의 전환 (Vim in Eclipse가 아닌 Eclipse in Vim)도 재미있고, 나름 상큼한 느낌도 주지만, 결정적으로 모든 기능을 명령 모드에서 명령어로 입력해야 하는 불편함이 있다. (꽤 불편하다) 그리고, 생각 만큼 부드럽게 잘 동작하지는 않는다. 그 외에도 뭔가 어색함이 많아서, 솔직히 잘 이용하게 되지는 않을 것 같다. Eclim을 설치한 후에는 명령 모드에서 :E가 듣질 않는다. 절대 단점이다. 게다가 매번 Eclipse의 plugin폴더에 있는 eclimd.bat을 실행시켜줘야 한다. 이것도 귀찮다. 난 개인적으로 뭔가 저렇게 서버를 띄워 놓는걸 별로 좋아하질 않아서, 처음 실행시부터 좀 거부감이 있었던 것이 사실이다. 아무튼 결론은 나랑은 맞지 않는다는 것!!

VimPlugin은 나중에 계속 써야겠다. ㅡ.ㅡ;;

2008/03/31 14:35 2008/03/31 14:35
Tag // , ,