System Programming

    [OS] I/O처리 방식: Non-Blocking

    논 블로킹 모드로 프로그래밍을 한다는 것은 먼저 블로킹의 의미 부터 명확히 해야한다. 일반적으로 블로킹은 "운영체제(커널)에게 어떤 요청을 하고 결과를 운영체제가 알려줄 때까지 기다린다" 를 의미한다. 예를 들어 데이터베이스 서버에 요청하고 그 결과를 데이터베이스 서버가 알려줄 때까지 기다린다도 같은 얘기이다.블로킹: 프로그램이 운영체제(커널) 또는 외부 서비스(DB, 네트워크 등) 에 요청을 보내고, 해당 요청의 결과가 반환될 때까지 대기(멈춤) 하는 상태. connect() 를 호출하면 보통은 운영체제가 원격 서버와 연결하고 그 결과를 알려준다. 연결하는데 지연가능한 시간은 1초 이내, 수초 또는 수분이 될 수 있다. 하나의 연결을 위해 이를 수행하는 프로세스는 장시간을 대기(블로킹)할 수 있으며 그..

    [C/interrupt] IRQs: Hardware, Software

    [C/interrupt] IRQs: Hardware, Software

    장치들은 처리할 작업이 준비되었음을 컴퓨터 시스템의 다른 부분에 알리기 위해 여러가지 방법을 사용한다.하드웨어와 소프트웨어 간의 비동기 통신을 효율적으로 처리하기 위해 IRQ가 필요하다. IRQ는 하드웨어 장치에서 이벤트가 발생했을 때 CPU가 이를 처리하도록 알려주는 역할을 한다. IRQ 정보를 확인하기 위해 다음 명령어를 사용할 수 있다.$ cat /proc/interrupts또는$ mpstat -A handle_IPI는 ARM 아키텍처에서 다중 프로세서 간 인터럽트(IPI)를 처리하는 함수이다.void handle_IPI(int ipinr, struct pt_regs *regs){ switch (ipinr) { case IPI_TIMER: tick_receive..

    Linux Device Driver 기초 #8 PCI 드라이버

    PCI(Peripheral Component Interconnect) 드라이버버스는 전기적 인터페이스와 프로그래밍 인터페이스로 구성된다.주로 현대 데스크탑 및 대형 컴퓨터에서는 PCI 버스 가 많이 사용된다. PCI 장치가 시스템의 하드웨어를 찾고 접근하는 방법특정 드라이버가 하드웨어를 탐지하고 접근할 수 있도록 지원 32비트 데이터 버스를 기본으로 사용하며, 64비트 확장도 포함되어 있음PCI 버스는 ISA보다 높은 클럭 속도로 더 나은 성능을 달성플랫폼 독립성을 고려한 설계로, 다양한 프로세서 아키텍처(IA-32, Alpha, PowerPC, SPARC64, IA-64 등)에서 사용됨특히 중요한 점은 PCI가 인터페이스 보드의 자동 감지 및 구성(auto-detection)을 지원한다는 점이는 점퍼가..

    [C/CPU-affinity] 프로세스 CPU Affinity 설정

    CPU Affinity 란Asymmetric multiprocessing (AMP)와 symmetric multiprocessing (SMP)는 여러 프로세서를 사용하는 멀티프로세서 시스템에서의 처리 방식이다. 이 두 방식의 차이점을 이해하면 멀티프로세서 환경에서 프로세서가 어떻게 상호작용하고 작업을 분배하는지 알 수 있다.Asymmetric Multiprocessing (AMP)하나의 메인 프로세서만 시스템 리소스(예: 메모리, 입출력 장치 등)에 직접 접근하고, 시스템의 데이터 구조에 액세스한다.장점은 시스템 설계가 단순하고, 동기화에 따른 오버헤드가 줄어들어 성능이 향상된다단점은 하나의 프로세서에 작업이 집중될 수 있다는 점이며, 시스템 확장성(scalability)에서 한계가 있다.Symmetri..

    Netlink Sockets #1 내부 아키텍쳐, 메세지 포맷

    Netlink는 Linux kernle 내부 메세징 시스템으로 kernle과 user space 간의 통신 수단으로 사용된다.  ■ Linux의 IP 패킷 포워딩 절차 ____ +---------------+ +->-| FW |---> | TCP, UDP, ... | | +----+ +---------------+ | | ^ v | _|_ +--------->|..

    Linux Device Driver 기초 #5 문자 드라이버

    문자 드라이버는 블록 드라이버나 네트워크 드라이버보다 이해하기 쉽고 간단한 편이다. scull(Simple Character Utility for Loading Localities)scull은 메모리 영역을 디바이스처럼 취급하는 문자 드라이버이다. scull은 커널에서 할당받은 메모리 상에서 동작하기 때문에 하드웨어에 의존적이지 않다는 장점이 있다. 누구나 scull을 컴파일하고 실행시킬 수 있으며 리눅스를 돌릴 수 있는 컴퓨터 아키텍쳐라면 어디나 이식도 가능하다. 하지만 커널과 드라이버 사이에 인터페이스를 보여주고 사용자가 테스트를 할 수 있다는 점을 제외한다면 디바이스 자체는 별다ㅏ른 쓸모가 없다. 드라이버 작성에서 첫단계는 디바이스가 사용자 프로그램에게 제공할 기능을 정의하는 일이다.여기서 작성할 ..

    Linux Device Driver 기초 #4 system daemon과 라이브러리 개발

    IPC프로세스간 통신은 서로 다른 프로세스가 데이터를 교환할 수 있도록 하는 통신 메커니즘이다.  pipe부모 프로세스와 자식 프로세스 사이에서 간단하게 데이터를 주고 받기 위해 사용되는 단방향 통신 방법이다. 한쪽 프로세스가 쓰고 다른 쪽 프로세스가 읽는 방식으로 작동하며 기본적으로 데이터를 한방향으로만 전달한다. socket네트워크 통신을 위한 양방향 통신 방법으로 동일한 시스템 뿐만 아니라 네트워크를 통해 다른 시스템과도 통신할 수 있다. TCP/IP 와 같은 프로토콜을 사용하며 클라이언트와 서버간의 통신을 설정하고 데이터를 주고 받을 수 있다.  named pipenaemd pipe는 이름이 붙어있어 부모-자식 관계가 아닌 프로세스 간에도 사용할 수 있는 통신 방식이다. named pipe는 다음..

    Linux Device Driver 기초 #3 Linux Device Driver 추가하기

    Linux Device Driver 기초 #3 Linux Device Driver 추가하기

    Kernel Module 만들기리눅스 커널 모듈은 커널 코드를 보다 쉽게 로드할 수 있게 함으로써 리눅스 커널 개발에 유용한 인터페이스를 제공하고,동적 로드와 특정한 기능만 선택적으로 로드할 수 있어 리눅스 커널이 차지하는 메모리의 양을 줄일 수 있는 효과가 있다.동적 로드:리눅스 커널 모듈은 시스템이 부팅될 때 커널 이미지에 포함되지 않고 필요 시점에만 메모리에 로드된다.예를 들어 특정 하드웨어 장치가 연결될 때만 해당 장치를 지원하는 모듈을 메모리에 로드하고 사용이 끝나면 unload하여 메모리에 제거할 수 있다.선택적 기능:모든 커널 기능을 한꺼번에 커널 이미지에 포함시키는 대신 커널 모듈을 통해 특정 기능만 선택적으로 사용할 수 있어 부팅 시간과 메모리를 절약할 수 있다.예를 들어 특정 네트워크 ..

    BPF 를 통한 Linux Performance 분석 #1 BPF Program 구성요소

    BPF 를 통한 Linux Performance 분석 #1 BPF Program 구성요소

    BPF란?BPF는 리눅스의 subsystem으로 리눅스 커널 코드를 실행할 수 있는 샌드박스 엔진이다.어떤 면에서는 jvm이나 chrome의 v8엔진과도 비슷하다. BPF를 실행하는 과정은 간단하게 3단계로 이루어진다.Load: BPF 프로그램을 커널에 로드, Verifier를 통해 검증Attach: BPF 프로그램을 특정 이벤트에 연결(BPF는 이벤트 드리븐 방식임)Callback: 이벤트가 발생할 때 BPF 프로그램이 실행됨BPF ProgramBPF를 사용하기 위해 필요한 dependency 는 다음과 같다.# 리눅스 소스코드$ uname -aLinux toor-virtual-machine 6.8.0-45-generic #45~22.04.1-Ubuntu SMP PREEMPT_DYNAMIC Wed Se..