일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
정비석 선생님이 쓰신 초한지가 읽고 싶어서 헌책방을 뒤지다 들고온 책 입니다. 한 장 한 장 넘기기가 참 힘든 그런 책이더군요. 여자들 이야긴데 왠지 심하게 공감이 가는 그런 책. 결혼을 그닥 하고 싶지 않다는 저의 생각에 느낌표를 하나쯤은 더 던져준 책. 씁쓸한 여운이 남는 책. 그런 책이었습니다. "대체 일부일처제라는 게 인간의 본성에 얼마나 어긋나는 겁니까. 한 인간이 어떻게 한 이성만을 평생 사랑하고 그렇게 산다는 게 가능하기나 한 이야깁니까? 안 그래요?"'무소의 뿔처럼 혼자서 가라'라는 말이 경전에 나온다고 해서 찾아보니 숫타니파타에 나온 내용이라는 군요. 좋아서 퍼왔습니다. 구절 구절 저를 돌아보게 만드는 말이네요. 서로 사귄 사람에게는 |
얼마 전에 버그를 수정하다 신기한 현상을 하나 발견했습니다. 물론 지금까지 저만 멍청하게 생각하고 있었던 건지도 모르겠습니다. ㅋㅋ~ NtQuerySystemInformation이란 함수와 관련된 건데요. 아마 다른 함수들에도 적용이 될 것 같습니다. NtQuerySystemInformation 함수는 시스템 정보를 구해오는 함수입니다. 보통 프로세스 목록이라든지, 스레드 목록, 드라이버 목록 등과 같은 정보를 얻을 때 사용하는 함수죠. 이러한 종류의 윈도우 API를 사용할 때에는 한 가지 원칙이 있습니다. 바로 버퍼 크기를 먼저 구하고 할당한 다음 사용하라는 것이죠. 프로세스나 스레드가 몇 개가 떠 있는지 알 수 없기 때문입니다. 통상적으로 아래와 같은 패턴으로 만들게 되죠. [CPP]DWORD required, size = 0; PVOID buffer = NULL; NtQuerySystemInformation(buffer, size, &required); size = required; buffer = new BYTE[size]; NtQuerySystemInformation(buffer, size, &required);[/CPP] 물론 NtQuerySystemInformation 함수의 인자가 저렇게 단순하진 않습니다. 예시는 핵심만 보여주기 위해서 버퍼, 버퍼 크기, 필요한 크기로 인자를 가정하고 표현해 본 것이죠. 거의 대부분의 경우에 위 코드는 정상적으로 동작합니다. 하지만 특정 경우에 두 번째 호출이 실패하는 경우가 생깁니다. 물론 다른 이유도 아니 버퍼 크기가 부족하다는 이유로 말이죠. 왜 그럴까요? 이유는 간단합니다. 처음 NTQSI를 호출한 시점과 그 다음 NTQSI를 호출한 시점의 시스템 정보가 변경되었기 때문입니다. 예를들어 스레드 목록을 구한다고 한다면, 그 사이에 스레드가 추가적으로 생성된 경우입니다. 어쨌든 저런 식의 코드는 아주 정상적인 환경에서도 실패할 가능성을 가지고 있는 셈이죠. 이런 결함을 없애기 위해서는 결국은 루프를 돌아야 합니다. 정상적일 때까지 말이죠. 물론 가져온 버퍼 크기보다 조금 더 할당하는 꼼수를 사용한다면 루프 회수를 줄일 수는 있겠죠. 같은 원리로 미리 할당된 버퍼를 사용한다면 함수 호출 회수를 더 많이 줄일 수 있습니다. |
2년간 거주했던 부천에서 서울로 이사를 왔습니다. 원래 이사를 하려고 하기도 했었는데, 집주인 아저씨가 처남이 오피스텔에 살기로 했다고 빼달라고 해서 부득이 급하게 이사를 감행하게 되었습니다. 그 때문에 한 2주간 정신이 없었던 것 같습니다. 짐이랄 것도 없는데도 막상 싸서 이사하려고 하니 장난 아니더군요. 여튼 여차저차해서 무사히 어제 이사를 마쳤습니다. 싸온 짐도 대충 정리하고, 아직은 미완성의 상태이지만 곧 완성되겠죠. ㅎㅎ~ 집에 들어가니 이것저것 있는데 어쩌다 보일러 설명서를 보게 되었습니다. 첫 입주라 그런지 보일러 조작기 옆에 꽃아 놓았더군요. 보일러에 난방 모드가 세 가지가 있습니다. 온돌, 실내, 예약 이렇게 있는데, 그것을 설명서는 친절히 이렇게 적어 놓았더군요. 온돌 – 보일러를 온돌 모드로 동작시킵니다. 실내 – 보일러를 실내 모드로 동작시킵니다. 예약 – 보일러를 예약 모드로 동작시킵니다. 좀 어이없죠. 사실 보면서 내심 온돌과 실내 모드의 차이가 뭘까 고민을 했었거든요. 보일러는 스팀이 나오는 것도 아니고, 그렇다고 벽에 파이프가 들어있을리도 없으니깐요. 설명서를 한 세 번 읽고 나도 여전히 어떤 모드로 써야 되는지를 모르겠더군요. 대충 보니 온도 센서 달린 위치가 틀린 것 같긴 하지만 어디까지 추측입니다. 그러면서 문득 떠오르는 코드, [CPP]// i 값을 증가 시킵니다. ++i;[/CPP] 그리곤 드는 생각 -- 나도 저런 글만 쓰고 있는 건 아닐까? 한적함의 로망도, 샤워 부스의 로망도, 통유리 창문의 로망도 없고, 이제 남은 건 티비와 출근 프리미엄뿐이군요. |