yuchi's Development Home


프로그래밍의 도를 향해#2

조회 수 4416 추천 수 129 2002.04.22 21:43:01
2000년 가을쯤이다.11월 초였던거 같다.그 당시 나는 현재 INetwork.dll이라고 부르는 서버 컴포넌트를 만들고 있었다.현재 GS팀의 전신이 된 서버팀이 창설된지 몇달 안된 시점이었다.

그 전까지 묵향팀의 서버 프로그래머로서 nAge팀과,CBZ게임 팀에 네트웍 모듈을 짜서 제공했었다.서버뿐만 아니라 클라이언트쪽 네트웍 모듈도 제공해줬었는데 지금처럼 COM형태는 아니었다.
당시 cbz팀에선 내가 준 서버,클라이언트 소스를 사용하고 있었는데 어느날 cbz겜팀의 kbs군이 찾아왔다.뭔가 이상하다는 것이었다.

뭔가..이상했다.TCP는 결코 메시지 순서가 뒤바뀌지 않는데 이것은 마지 뒤바뀌는것 같았다.중간에 메시지가 유실되는거 같기도 했다.

'이럴수가...난 분명히 충분한 테스트를 했는데..큐 처리에서 실수한게 아닐까...'

클라이언트측 네트웍 소스는 메시지 기반의 AsyncSelect방식이었다.
대략 이 코드는 이런 식의 메카니즘이었다.

1.메시지가 날라오면 큐에 넣는다.메시지가 붙어올수도 있으므로 한번에 복수개의 메시지가 큐에 찰수도 있다.
2.큐를 한번 훑어서 처리할 수 있는만큼 메시지를 모두 처리한후 처리한 메시지는 일괄적으로 큐에서 제거한다.

아무리 소스를 뜯어봐도 소스엔 이상이 없었다.계속 테스트해보다가 이상한 점을 발견했다.첫번째 메시지를 받고 메시지 박스(MessageBox())를 띄운 후 두번째 메시지를 받으면 다시 메지시 프로시져로 진입하는것이었다.
이렇게 얘기하면 이해가 안갈것이다.

일단 메시지 박스가 뜨고나면...엔터를 치든 어쩌든 해서 메시지 박스를 없애지 않으면 MessageBox()아래 라인으론 수행할수 없다.즉 그 상태로 스레드가 블럭킹되어있어야하는데 다음번 메시지가 날라왔을때 현재 그 코드까지 또 실행이 되는것이었다.
황당해서 크리티컬 섹션으로 잠궈봤다.먼저 진입한 스레드가 leave하기 전에 어떤 스레드가 다시 진입하는걸 확인했다.놀랍게도...같은 스레드가 또 진입했다.리커젼 카운트가 2로 올라가 있었다.즉 재진입이었다.

이 문제는...일단은 어셈블리로 스핀락 비슷한걸 만들어서 일단 땜빵해결을 지었다.
해결이 중요한지 원인 분석이 중요한지 아직도 헷갈리긴 하지만 이 문제에 대한 원인은 다음과 같다.
1.WndProc()는 콜백함수이다.

2.정확히는 GetMessage()등으로 메시지 큐로부터 메시지를 디스패치 하면 호출된다.

3.MessageBox()는 내부적으로 메시지큐에 메시지가 들어오기를 대기한다.

4.따라서 MessageBox()를 호출하고 스레드가 블럭킹 되어있다고 느끼는 순간에도 해당 스레드는 메시지가 디스패치 되기를 기다리고 있으며 Async소켓 메시지가 날라왔을때 WndProc()로 재진입한다.

3,4번이 문제의 핵심이었다.

이 문제를 해결하려면 메시지박스등을 사용하지 말거나 소켓 메시지가 발생했을때 먼저 처리되고 있는 메시지가 있다면 큐를 잠가버려야했다.나중에 2차버젼으로 만든 클라이언트측 네트웍 모듈은 Overlapped방식의 멀티 스레드 모델로 메시지 처리를 완료할때까지는 패킷을 디스패치할 수 없게 만들었다.

이 황당한 버그로...나름대로 윈도우즈의 메시지 체계에 대해서 중요한점을 알수 있었다.여담이지만 그때 새벽 3시 가까이 되어서 퇴근을 했는데 kbs군의 마티즈 승용차를 타고 집 근처에서 내렸다.마티즈 앞좌석이 꽤 넓다고 느낀것이 기억에 남는다.
kbs군은 훈련소 입소를 몇일 앞두고 있었으므로 그 버그를 해결(미봉책으로)한 것이 꽤 의미깊었으리라...




* 여치님에 의해서 게시물 이동되었습니다 (2004-01-09 01:20)
파일 첨부

여기에 파일을 끌어 놓거나 파일 첨부 버튼을 클릭하세요.

파일 크기 제한 : 0MB (허용 확장자 : *.*)

0개 첨부 됨 ( / )
List of Articles
번호 제목 글쓴이 날짜 조회 수sort
天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet



XE Login

天安門大屠殺 六四天安門事件 反右派鬥爭 大躍進政策 文化大革命 六四天安門事件 The Tiananmen Square protests of 1989 天安門大屠殺 The Tiananmen Square Massacre 反右派鬥爭 The Anti-Rightist Struggle 大躍進政策 The Great Leap Forward 文化大革命 The Great Proletarian Cultural Revolution 人權 Human Rights 民運 Democratization 自由 Freedom 獨立 Independence 多黨制 Multi-party system 民主 言論 思想 反共 反革命 抗議 運動 騷亂 暴亂 騷擾 擾亂 抗暴 平反 維權 示威游行 法輪功 Falun Dafa 李洪志 法輪大法 大法弟子 強制斷種 強制堕胎 民族淨化 人體實驗 胡耀邦 趙紫陽 魏京生 王丹 還政於民 和平演變 激流中國 北京之春 大紀元時報 九評論共産黨 獨裁 專制 壓制 統一 監視 鎮壓 迫害 侵略 掠奪 破壞 拷問 屠殺 肅清 活摘器官 障テ社會 誘拐 買賣人口 遊進 走私 毒品 賣淫 春畫 賭博 六合彩 台灣 臺灣 Taiwan Formosa 中華民國 Republic of China 西藏 土伯特 唐古特 Tibet 達償ワ喇嘛 Dalai Lama 新疆維吾爾自治區 The Xinjiang Uyghur Autonomous Region free tibet