스크래치로 GUI를 작성하며 x86-64 어셈블리를 배우기

2025-09-16

이 기사에서는 저자가 간단한 GUI 프로그램을 만들면서 x86-64 어셈블리 언어를 어떻게 배웠는지 자세히 설명합니다. 기본적인 종료 프로그램부터 시작하여 시스템 콜, 스택 연산, X11 프로토콜 등을 단계적으로 설명하고, 최종적으로 1KB 미만의 바이너리에서 "Hello, world!"를 표시하는 창을 만드는 데 성공했습니다. 이 기사는 체계적으로 구성되어 있으며, 어느 정도의 프로그래밍 경험이 있는 독자에게 적합합니다.

더 보기

디버그 빌드 속도 100배 향상: SIMD와 전용 실리콘의 기적

2025-02-18

C 기반 토렌트 애플리케이션을 개발하는 동안 디버그 빌드 시작 시간이 매우 느린 문제(20~30초)에 직면했습니다. 이는 주로 프로그램 시작 시 다운로드된 파일의 각 조각에 대한 SHA1 해시 값을 검증해야 하고, 디버그 모드의 Address Sanitizer가 SHA1 계산 속도를 크게 떨어뜨리기 때문이었습니다. 이 글에서는 SIMD 명령어와 CPU의 전용 SHA 가속 하드웨어 사용 등 여러 최적화 기법을 시도했습니다. 최종적으로 Intel의 SHA 확장 명령어 세트를 사용하여 시작 시간을 866.9밀리초로 단축하여 성능을 100배 향상시켰습니다. 이 글에서는 다양한 최적화 기법의 구현 세부 정보와 성능 비교를 설명하고, 컴파일러 최적화와 디스크 I/O의 영향에 대해서도 논의합니다.

더 보기
개발

찾기 어려운 크로스 플랫폼 타이머 API: OS API 여정

2025-02-06

이 글에서는 C 프로그래밍에서 크로스 플랫폼 타이머 API의 과제를 탐구합니다. 저자는 Linux, FreeBSD, NetBSD 등 다양한 Unix 시스템이 타이머를 매우 다르게 처리한다는 것을 발견했습니다. 신호를 기반으로 하는 POSIX의 timer_create 함수는 다른 OS 프리미티브와의 상호 운용성 저하, 시그널 마스크 간섭 등 여러 문제점을 가지고 있습니다. 이 글에서는 timerfd_create, kqueue, port_create, io_uring 등 다양한 솔루션의 장단점을 자세히 살펴보고, 크로스 플랫폼 애플리케이션에서는 libuv가 하는 것처럼 사용자 공간에서 타이머를 구현하는 것이 더 효율적이고 안정적인 접근 방식이라는 결론을 내립니다. libuv는 타이머 관리에 최소 힙 데이터 구조를 사용하고, poll/epoll/kqueue 등의 시스템 콜을 다중화에 사용합니다.

더 보기