Windows 7 로그인 지연의 미스터리: 단색 배경이 범인일까?

2025-04-29
Windows 7 로그인 지연의 미스터리: 단색 배경이 범인일까?

Windows 95부터 단색 배경을 사용해 온 저자는 Windows 7에서 단색 배경 화면을 사용할 때 시작 화면에 30초 지연이 발생하는 것을 발견했습니다. 이는 로그인 시간이 길어진 것이 아니라, 시스템이 배경 화면 로딩 완료 신호를 기다리는 동안 발생하는 시간 초과입니다. 비트맵 정보가 없는 단색 배경 화면은 이 신호를 보낼 수 없습니다. "바탕 화면 아이콘 숨기기" 그룹 정책에도 유사한 문제가 있으며, 코딩 오류로 인해 준비 완료 신호가 전송되지 않습니다. Microsoft는 Windows 7 출시 후 몇 달 만에 이 문제를 해결했습니다. 또한 저자는 버그 보고 및 수정을 용이하게 하기 위해 기본 설정을 선호하는 이유도 설명합니다.

더 보기

자신의 프로세스에서 스레드를 일시 중지하지 마세요!

2025-04-15
자신의 프로세스에서 스레드를 일시 중지하지 마세요!

한 고객이 오랫동안 지속되는 저빈도 멈춤 문제를 겪었습니다. UI 스레드가 커널을 호출한 후 아무런 이유 없이 멈췄습니다. 안타깝게도 커널 덤프에서는 스택이 페이지 아웃되었기 때문에 사용자 모드의 스택을 표시할 수 없었습니다. (멈춘 스레드는 스택을 사용하지 않으므로, 시스템이 메모리 부족 상태가 되면 스택이 페이지 아웃됩니다.) 조사 결과, 워치독 스레드가 UI 스레드를 주기적으로 일시 중지하여 스택 추적을 가져오고 있었지만, 이번에는 5시간 이상 멈췄습니다. 원인은 데드락이었습니다. 워치독 스레드는 UI 스레드의 스택 추적을 가져오려고 했지만, 함수 테이블 잠금이 필요했습니다. 그러나 UI 스레드는 일시 중지되어 있었고, 해당 잠금을 보유하고 있었습니다. 이 문서에서는 자체 프로세스에서 스레드를 일시 중지하지 않도록 강조합니다. 리소스 충돌로 인해 데드락이 발생할 위험이 있기 때문입니다. 스레드를 일시 중지하고 스택 추적을 가져와야 하는 경우, 데드락을 방지하기 위해 다른 프로세스에서 실행해야 합니다.

더 보기

수수께끼의 수동형 USB-PS/2 마우스 어댑터

2025-03-28
수수께끼의 수동형 USB-PS/2 마우스 어댑터

초기 USB 마우스에는 USB Type-A 플러그를 PS/2로 변환하는 녹색 어댑터가 함께 제공되는 경우가 많았습니다. 이것은 스마트 어댑터가 아니었고, 순수하게 기계적인 것으로 회로가 포함되어 있지 않았습니다. 마우스 자체가 변환을 수행하여 신호 유형(USB 또는 PS/2)을 감지하고 그에 따라 조정했습니다. 이것은 간단한 전원 어댑터와 유사하며, 지능은 장치 자체에 있고 어댑터에는 없습니다. 따라서 이러한 것을 발견하면 단순히 물리적 커넥터일 뿐이라는 것을 기억하십시오. 실제 변환은 듀얼 버스 마우스 내부에서 이루어집니다.

더 보기
하드웨어 마우스 어댑터

경쟁 조건 디버깅: RtlRunOnceExecuteOnce 함정

2025-03-23
경쟁 조건 디버깅: RtlRunOnceExecuteOnce 함정

동료가 주간 디버깅 세션에서 다루기 어려운 동시성 문제를 만났습니다. 크리티컬 섹션이 두 개의 스레드가 동일한 코드 블록에 진입하는 것을 막지 못하여 `TraceLoggingRegister`의 이중 등록 오류가 발생했습니다. 심층 디버깅을 통해 근본 원인이 밝혀졌습니다. `RtlRunOnceExecuteOnce`의 초기화 함수 `InitializeCriticalSectionOnce`가 `STATUS_SUCCESS`(0)를 잘못 반환했습니다. 이로 인해 `RtlRunOnceExecuteOnce`는 초기화에 실패했다고 판단하고 매번 크리티컬 섹션을 다시 초기화하여 경쟁 조건을 발생시켰습니다. 해결책은 반환값을 `TRUE`로 변경하거나, 더욱 효율적으로 `CRITICAL_SECTION`을 `SRWLOCK`으로 대체하는 것입니다. 이 사례는 반환값의 미세한 오류가 심각한 결과로 이어질 수 있음을 보여주며, 적절한 동기화 프리미티브를 선택하는 것이 중요함을 강조합니다.

더 보기
개발

TypeScript 네이티브 컴파일러: 성능 10배 향상

2025-03-11
TypeScript 네이티브 컴파일러: 성능 10배 향상

TypeScript 팀은 TypeScript 컴파일러와 도구의 네이티브 포팅을 발표하여 성능을 획기적으로 개선했습니다. 이 네이티브 구현은 에디터 시작 시간을 대폭 단축하고, 대부분의 빌드 시간을 10배 줄이며, 메모리 사용량을 상당히 줄일 것으로 예상됩니다. 초기 테스트 결과 여러 대규모 프로젝트(예: VS Code, Playwright)의 컴파일 속도가 10배 이상 향상되었습니다. 미래의 네이티브 TypeScript(TypeScript 7로 계획)는 더욱 고급 리팩토링, 더욱 심도 있는 코드 분석을 지원하고 차세대 AI 개발 도구의 기반이 될 것입니다. TypeScript 6(JS 기반)는 원활한 전환을 위해 계속 유지 관리될 것입니다.

더 보기

C++/WinRT의 미묘한 invoke 문제와 해결책

2025-03-09
C++/WinRT의 미묘한 invoke 문제와 해결책

C++/WinRT의 pull request를 통해 `winrt::impl::promise_base::set_completed`에서 `invoke` 호출의 모호성이 수정되었습니다. 이는 인수 종속 조회(ADL)로 인해 발생했습니다. C++20 코루틴으로 업그레이드하면서 ADL 검색 범위가 확장되어 의도한 `winrt::impl::invoke` 대신 `std::invoke`가 잘못 감지되었습니다. 이 기사에서는 ADL 메커니즘을 자세히 설명하고 이전 버전의 C++/WinRT에 대한 패치를 제공합니다. `winrt::Windows::Foundation` 네임스페이스에 더 적합하게 일치하는 `invoke` 함수를 선언하여 컴파일러를 올바른 함수로 유도합니다. 이 패치에는 C++/WinRT 업그레이드 후 자동으로 무효화되는 정적 어설션도 포함되어 있습니다.

더 보기
개발

열거형의 "기타" 함정: 버전 호환성과 열린 열거형

2025-03-02
열거형의

이 글에서는 C++ 열거형에서 "기타" 값(예: WidgetFlavor::Other)을 사용하는 것의 잠재적 문제점을 논의합니다. 새로운 열거형 값을 추가할 때 이 값들을 어떻게 처리하고 이전 버전 코드와의 호환성을 유지할지가 과제입니다. 저자는 "기타" 값을 피하고 열거형을 열린 형태로 선언할 것을 권장합니다. 이렇게 하면 프로그램이 알 수 없는 값을 독자적으로 처리할 수 있게 되어 버전 호환성 문제를 우아하게 해결할 수 있습니다. 새로운 열거형 값을 추가할 때 혼란을 방지하고 기존 코드와 새 코드 간의 원활한 전환을 보장합니다.

더 보기

MSVC Address Sanitizer (ASan)의 주요 개선 사항

2025-02-25
MSVC Address Sanitizer (ASan)의 주요 개선 사항

마이크로소프트는 MSVC Address Sanitizer (ASan)의 품질을 크게 향상시켰습니다. ASan의 주요 부분을 LLVM으로 업스트림하여 LLVM 커뮤니티의 개선 사항을 더 빠르게 통합할 수 있게 되었습니다. 또한, 컴파일러, 링커, 도구를 포함한 MSVC 코드베이스에 ASan을 통합하여 지속적인 통합에서 메모리 안전성 문제를 감지할 수 있도록 했습니다. Visual Studio 2022 버전 17.13에는 오탐 감소, 오류 보고 개선, 다중 프로세스 시나리오 처리 등 많은 문제가 수정되었습니다.

더 보기
개발

Windows 95 설치 프로그램: 놀랍도록 복잡한 미니 OS의 이야기

2025-02-17
Windows 95 설치 프로그램: 놀랍도록 복잡한 미니 OS의 이야기

이 글은 Windows 95 설치 프로그램의 숨겨진 복잡성을 드러냅니다. 단순해 보이는 설치 프로그램을 만들기 위해, 팀은 MS-DOS 환경에서 그래픽 라이브러리, 윈도우 매니저, 다국어 지원, 심지어 Windows 3.1과의 호환성을 포함한 미니 운영체제를 처음부터 만들어야 했습니다. 결국 막대한 개발 노력을 피하기 위해 기존 Windows 3.1 런타임을 사용하는 것이 훨씬 효율적이라는 것을 깨달았습니다. 이 이야기는 소프트웨어 엔지니어링에서 코드 재사용의 중요성을 강조하고 Windows 95 설치 프로그램의 놀라울 정도로 복잡한 특성을 보여줍니다.

더 보기
개발

'이제 컴퓨터를 꺼도 안전합니다' 화면: Windows 95 향수 여행

2025-02-16
'이제 컴퓨터를 꺼도 안전합니다' 화면: Windows 95 향수 여행

Windows 95의 '이제 컴퓨터를 꺼도 안전합니다' 메시지를 기억하시나요? 이 글에서는 비행기에서 옆자리에 앉았던 사람이 'Windows가 종료되었습니다' 화면을 보고 컴퓨터를 여러 번 재시작했던 재밌는 이야기를 소개합니다. 이는 오래된 컴퓨터에 전원 관리 기능이 없었음을 보여주며, Windows 95가 이 메시지를 포함시켰던 이유를 설명합니다. 전원 버튼을 눌러도 안전하다는 것을 친절하게 알려주는 메시지였던 것입니다.

더 보기
기술

USB 규격 회의 일화: 반투명 파란색의 프리미엄

2025-02-10
USB 규격 회의 일화: 반투명 파란색의 프리미엄

USB 규격 회의에서 한 회사가 USB 플로피 드라이브를 선보였는데, 놀랍게도 PC와 Mac용 별도 버전을 제공했습니다. 위원회 구성원들은 당황했습니다. 규격에서 동일한 드라이브가 두 시스템 모두에서 작동하는 것이 보장되었기 때문입니다. 담당자는 드라이브는 전자적으로 동일하며, 유일한 차이점은 Mac 버전이 반투명 파란색 플라스틱으로 되어 있고 가격이 더 높다는 것을 설명했습니다. 이는 당시 iMac의 반투명 플라스틱 유행을 반영하며, 일부 제조업체가 디자인 차이를 가격 프리미엄으로 활용했음을 보여줍니다.

더 보기
하드웨어 플로피 드라이브

미사일 소프트웨어의 '널 가비지 컬렉터': 메모리 누수? 문제 없어요!

2025-02-07
미사일 소프트웨어의 '널 가비지 컬렉터': 메모리 누수? 문제 없어요!

개발자가 미사일 소프트웨어에서 '널 가비지 컬렉터'를 기발하게 적용한 사례를 설명합니다. 비행 시간이 제한적이고 하드웨어 메모리가 충분하기 때문에 프로그램의 메모리 누수는 문제가 되지 않았습니다. 엔지니어들은 비행 중 발생할 수 있는 잠재적 메모리 누수량을 계산하고, 그 두 배의 메모리를 추가하여 미션 완료 전에 프로그램이 충돌하지 않도록 했습니다. 이러한 접근 방식은 프로그램의 실행 시간 제약을 영리하게 활용하여 메모리 누수 문제를 효과적으로 해결했습니다. 일종의 '궁극적인 가비지 컬렉션'이라고 할 수 있습니다.

더 보기

Go 1.24 암호화 개선: FIPS 140-3 준수 달성

2025-02-06

Go 1.24는 암호화 패키지를 대대적으로 리팩토링하여 FIPS 140-3 준수를 달성했습니다. 순수 Go(및 Go 어셈블리)로 구현된 FIPS 140-3 검증 암호화 모듈을 통해 cgo나 시스템 호출에 대한 의존성을 제거한 것이 주요 특징입니다. Microsoft Go 1.24도 업데이트되어 macOS 미리 보기 지원과 향상된 Azure Linux 지원이 추가되었지만, 암호화에는 시스템 라이브러리를 계속 사용하며 공식 Go 방식과는 다릅니다. GODEBUG=fips140=on이나 GOFIPS140=latest와 같은 새로운 환경 변수는 FIPS 모드를 제어합니다. FIPS 준수 시스템(Azure Linux, Windows)에서는 런타임이 자동으로 활성화됩니다.

더 보기
개발

Windows 3D Pipes 화면 보호기의 숨겨진 디자인 결함과 찻주전자

2024-12-28
Windows 3D Pipes 화면 보호기의 숨겨진 디자인 결함과 찻주전자

매혹적인 파이프 애니메이션으로 유명한 Windows 3D Pipes 화면 보호기에는 잘 알려지지 않은 비밀이 숨겨져 있습니다. 바로 거의 나타나지 않는 찻주전자입니다. 이 찻주전자는 컴퓨터 그래픽스에서 표준 참조 객체인 유타 찻주전자에 대한 경의이지만, 출현 빈도가 낮아 생산성 저하에 대한 사용자 불만이 제기되었습니다. 이 기사에서는 이전 버전의 Windows에서는 소프트웨어 렌더링으로 인해 서버의 CPU 사용률이 높아지는 것도 밝히고 있으며, 서버에는 검은색 화면 보호기를 사용할 것을 권장하고 있습니다.

더 보기

C++ 컴파일러 오류: 함수 선언으로 인한 무의미한 오류

2024-12-12
C++ 컴파일러 오류: 함수 선언으로 인한 무의미한 오류

C++ 애플리케이션에 XAML 지원을 추가하려던 개발자는 winrt/Windows.UI.Xaml.h 헤더 파일을 포함하기만 해도 일련의 컴파일러 오류를 만났습니다. 오류는 다음과 같이 보이는 일반적인 함수 선언에서 발생했습니다. `template struct consume_Windows_UI_Xaml_IExceptionRoutedEventArgs { [[nodiscard]] auto ErrorMessage() const; };` 근본 원인은 개발자 프로젝트에 이미 존재하는 ErrorMessage라는 매크로였는데, 함수 이름과 충돌했습니다. 이 매크로는 ErrorMessageString 객체를 만들고 에러 메시지 문자열에 대한 포인터를 반환했습니다. 매크로의 경계가 없기 때문에 컴파일러는 함수 선언을 매크로 호출로 잘못 해석하여 "인수가 부족합니다"와 같은 오류가 발생했습니다. 해결책은 헤더 파일을 포함하기 전에 #pragma undef를 사용하여 매크로를 비활성화하거나 매크로를 완전히 제거하고 인라인 함수로 바꾸는 것입니다.

더 보기