라즈베리파이에서 I2C 센서 데이터 읽기 — python-smbus2 실전
센서마다 GPIO 핀을 하나씩 배정하는 방식은 핀 개수 제한과 배선 복잡도 때문에 금방 한계에 부딪힌다. I2C는 SDA/SCL 두 핀만으로 여러 센서를 동시에 연결하는 버스 프로토콜이고, BME280 같은 저가형 온습도/기압 센서는…
센서마다 GPIO 핀을 하나씩 배정하는 방식은 핀 개수 제한과 배선 복잡도 때문에 금방 한계에 부딪힌다. I2C는 SDA/SCL 두 핀만으로 여러 센서를 동시에 연결하는 버스 프로토콜이고, BME280 같은 저가형 온습도/기압 센서는…
numpy 배열을 multiprocessing.Queue/Pipe로 주고받으면 매번 pickle 직렬화·역직렬화가 일어나 배열이 클수록 병목이 된다. Python 3.8부터 표준 라이브러리에 들어온 multiprocessing.shared_memory는 pickle 없이 OS의 진짜 공유 메모리(POSIX /dev/shm)를 이름으로 attach해 여러 프로세스가 같은…
스레드 간, 또는 프로세스 간에 "무슨 일이 일어났다"는 신호 하나만 가볍게 보내고 싶을 때 파이프나 소켓은 다소 과하다. eventfd는 커널이 관리하는 64비트 정수 카운터 하나를 파일 디스크립터로 노출해서, select/poll/epoll 같은…
PID 기반 프로세스 관리(os.kill(pid, sig), os.waitpid(pid, ...))에는 근본적인 문제가 있다. PID는 재사용된다. 어떤 프로세스가 죽고 그 PID가 회수되면, 커널은 그 번호를 완전히 다른 새 프로세스에 다시 배정할 수 있다. 자식…
특정 디렉터리에 새 파일이 생기거나 로그 파일이 갱신될 때마다 즉시 반응해야 하는 스크립트를 짤 때, 가장 손쉬운 방법은 os.listdir()이나 파일의 mtime을 주기적으로 비교하는 폴링(polling)이다. 하지만 폴링 주기를 짧게 잡으면 CPU를…
서버 상태를 점검할 때 uname -a, free -h, df -h, ip addr를 하나씩 따로 실행하고 눈으로 훑어보는 방식은 서버가 한두 대일 때는 문제없지만, 배포 전 자동 점검이나 정기 헬스체크처럼 반복적으로…
서버 여러 대의 상태를 순차적으로 점검하는 스크립트를 짜본 적이 있다면 익숙한 문제가 있다. 호스트 10대를 ping으로 확인하는 데 각각 1초가 걸린다면, for 루프로 하나씩 처리할 경우 전체 실행 시간은 10초에…
ps, top, htop 같은 도구는 어떻게 실행 중인 모든 프로세스의 상태와 메모리 사용량을 실시간으로 보여줄까. 답은 의외로 단순한데, 이 도구들은 별도의 커널 API를 호출하는 게 아니라 /proc 아래의 파일들을 읽어서…
파이썬으로 시스템 프로그래밍을 하다 보면 표준 라이브러리에 없는 저수준 기능이 필요한 순간이 온다. 특정 syscall을 직접 호출해야 하거나, 이미 검증된 C 라이브러리(.so)를 재사용하고 싶거나, 순수 파이썬으로는 느린 연산을 C로 짜둔…
라즈베리파이 4 이하에서 잘 동작하던 RPi.GPIO 기반 코드를 라즈베리파이 5에 그대로 올리면 GPIO 핀 제어가 먹통이 되는 경우가 많다. Pi 5부터는 GPIO·USB·이더넷·카메라 등 외부 인터페이스를 처리하는 RP1이라는 별도 I/O 칩이…