프로그래밍

Kosta비대면 교육 - Linux System & Network Programming

Victory_HA 2022. 6. 5. 15:09

과정 제목

  • Linux System & Network Programming

교육 목표

  • 리눅스 운영체제를 기반으로 한 시스템 기능 또는 어플리케이션 개발 능력 심화 향상
  • 리눅스 운영체제 확용 능력 심화

리눅스 시스템 프로그래밍

  • Hardware를 이용하기 위해선 kernel을 활용해야 합니다.
  • system call을 이용하면 kernel에 명령을 요청할 수 있습니다.
  • libraries와 Tool을 잘 활용해야 어플리케이션 개발이 용이해지고, 최종적으로 Hardware를 제어 할 수 있습니다.

커널의 세부 기능

  • 프로세스 관리 (Process Management)
  • 메모리 관리 (Memory Management)
  • 파일 시스템 관리 (File System Management)
  • 장치 관리 (Device Management)
  • 네트워크 관리 (Network Management)

시스템 콜 (System Call)

  • 프로세스가 커널에게 명시적으로 서비스를 요청하는 인터페이스
  • system call은 kernel api라고도 부릅니다.
    • 커널이 사용자 레벨의 응용 프로그램에게 서비스를 제공하는 인터페이스
    • 사용자 모드에서 사용할 수 있도록 밖으로 노출되어 있는 커널 함수
  • 어플리케이션 개발자들은 libraries를 사용해 system call 이용할 수 있습니다.
  • Software Interrupt를 이용하여 커널에 대한 서비스 요청합니다.
  • system call을 잘못 사용하면 kernel 메모리 영역을 침범하여, 프로세스 혹은 시스템에 심각한 손상을 초래합니다.

파일

  • 흔히 리눅스 시스템에서 모든 것을 파일라고 합니다.
  • 파일의 상호작용은 상당부분 읽기, 쓰기를 사용합니다.
  • 프로세스가 이 파일들을 접근할 때 파일 디스크립터(fd)라는 개념을 이용합니다.
    • 파일에 접근하려면 파일을 열어야합니다.
    • 동일한 프로세스 또는 다른 프로세스에서 단일 파일을 여러 번 open 할 수 있고, 열린 파일의 인스턴스에 고유한 file descriptor(fd)가 부여됩니다.
  • 리눅스 시스템 프로그래밍의 대부분은 파일을 열고, fd를 할당받고 fd를 이용하여 파일을 조작하는데 사용합니다.

시그널

  • 비동기 이벤트를 처리하기 위한 메커니즘을 제공하는 소프트웨어 인터럽트
  • 프로세스 간 통신의 기본 형태의 하나로, 커널에서 프로세스로, 프로세스에서 다른 프로세스로, 또는 프로세스 스스로에게 전송 할 수도 있습니다.
  • 리눅스 시스템에서 사용되는 시그널은 signal.h 헤더 파일에 정의되어 있습니다.

시그널 종류 확인

  • $ kill -l

  • SIGKILL, SIGTERM 시그널은 주로 kill 명령에 따라 특정 프로세스에 전송하는 시그널
    • kill 명령에 -9 옵션을 함께 이용하면 SIGKILL 신호가 pid 프로세에 전송됩니다.
    • ex) $ kill -9

프로그램, 프로세스, 쓰레드 개념

프로그램(Program)

  • 소스 코드가 컴파일 된 실행 코드, binary로 disk 같은 저장 매체에 휴면 상태로 저장되어 있는 것입니다.
  • 규모가 크고 중요한 프로그램을 어플리케이션이라고도 합니다.

프로세스(Process)

  • 실행중인 프로그램은 물론 프로그램을 실행하는 데 필요한 모든 환경, 즉 context을 통틀어 프로세스라 합니다.
  • 프로세스에는 커널에서 유일한 식별자 pid가 할당됩니다.
  • 리눅스의 모든 프로세스는 부모와 자식 관계를 이루면서 실행됩니다.

쓰레드(Thread)

  • 프로세스 내부의 활동 단위
  • 단일 쓰레드 프로세스에서 프로세스는 가상화 된 메모리 인스턴스와 가상화 된 프로세서가 하나씩 있습니다.

IPC(Inter Process Communication)

  • 프로세스 간 통신
  • 프로세스끼리 서로 데이터를 주고받는 행위 또는 그에 대한 방법을 말합니다.

IPC 종류

공유 메모리 (Shared Memory)

  • 프로세스끼리 특정 메모리 영역을 공유하며 상호간 통신하는 방법입니다.
  • 데이터 자체를 공유하며, 한 프로세스에서 변경한 메모리 공간의 내용을 다른 프로세스에서 접근할 수 있습니다.
  • 메모리 접근 시 동기화 처리가 필요합니다.

파이프(Pipe)

  • 통신을 위한 메모리 공간(버퍼)를 생성하여 통신하는 방법입니다.
    • 커널영역의 메모리에 유지되는 단순한 버퍼입니다.

  • 프로세스간 통신을 위한 단방향 데이터 전송을 지원합니다.
    • 양방향 통신을 하려면 pipe 2개를 사용합니다.

쓰레드 (Thread)

  • 쓰레드란 한 프로세스 내에서 동작되는 여러 실행의 흐름으로, 프로세스 내의 주소 공간이나 자원들을 대부분 공유하면서 실행됩니다.
  • 프로세스를 생성하는 것보다 쓰레드를 생성하는 것이 효율적입니다.
  • 특히 멀티 프로세서 환경에서는 더욱 효과가 탁월합니다.
  • 쓰레드 간의 통신이 필요한 경우 별도의 자원을 이용하는 것이 아니라 전역 변수의 공간을 이용하여 데이터를 주고받을 수 있습니다.

쓰레드 장점

  • Programming abstraction (프로그래밍 추상화)
  • Parallelism (병렬처리)
    • 다중 프로세서가있는 시스템에서 쓰레드는 진정한 병렬 처리를 달성하는 효율적인 방법을 제공합니다.
  • Improving responsiveness (응답성 향상)
    • 멀티 쓰레드 환경에서는 적어도 하나의 쓰레드를 사용자 입력에 응답하도록 합니다.
  • Blocking I/O (I/O 차단)
    • 프로세스 전체를 정지시키는 blocking I/O를 처리하는 쓰레드와 계속 진행하는 쓰레드를 분리합니다.
  • Context switching
    • 프로세스 내에서 쓰레드 간 Context Switing은 비용이 매우 저렴합니다.
  • Memory savings
    • 쓰레드는 메모리를 공유하는 동시에 여러 실행 단위를 사용하는 효율적인 방법을 제공. 이러한 방식으로 여러 프로세스에 대한 대안입니다.

쓰레드 단점

  • 멀티 쓰레드를 사용하여 프로그래밍하는 경우 주의 깊게 설계해야 합니다.
  • 시간 차나 잘못된 변수를 공유함으로써 오류가 발생할 수 있습니다.
  • 디버깅이 어렵습니다.

쓰레드 병렬 처리

병렬성(Parallelism)

  • 동시에 진행되는 동시적인 작업
  • 병렬성은 작업들이 동일한 방향으로 독립적으로 진행되는 것을 의미합니다.
  • 다중 프로세서 시스템에서만 동작이 가능합니다.

병렬성(Parallelism) VS 동시성(Concurrency)

  • 병렬성은 정확한 의미로는 오직 다중 프로세서 시스템에서만 가능하지만 동시성은 단일 프로세서와 다중 프로세서 시스템 모두에서 가능합니다.
  • 동시성은 본질적으로 병렬성을 흉내낸 것으로 단일 프로세서에서 동작이 가능합니다.
  • 병렬성은 프로그램이 동시에 두 가지 계산을 하도록 요구하지만, 동시성은 단지 두 가지 일이 동시에 발생하는 것처럼 보이게끔 합니다.

쓰레드 세이프(Thread safe)

  • 다수의 쓰레드가 동시에 함수를 호출하더라도 공유 데이터를 안전하게 보호하는 코드를 말합니다.
    • 동기화 기법을 사용하거나, data-race현상이 발생하지 않도록 합니다.

쓰레드 간 동기화

  • 뮤텍스(mutex)
    • 코드의 임계 영역(critical section)을 한번에 1개의 쓰레드만 사용할 수 있도록 합니다.
    • 소유될 수 있는 Key를 기반으로 한 상호배제 기법이고 Key에 해당하는 어떤 객체(Object)가 있으며, 객체를 소유한 쓰레드가 공유자원에 접근할 수 있습니다.
    • 임계 영역에 진입할 때 lock을 하고, 영역을 빠져 나올 때 release하는 방법으로 동기화합니다.
  • 세마포어(semaphore)
    • 코드의 임계 영역에 여러 쓰레드가 접근하는 것을 방지합니다.
    • 공유 자원에 접근할 수 있는 최대 허용치만큼 동시에 쓰레드가 접근할 수 있으며, 각 쓰레드는 세마포어의 값을 확인하고 변경할 수 있습니다.

컴퓨터 네트워크

  • 통신 채널을 통해서 컴퓨터(호스트와 라우터)들이 상호 연결된 것으로 데이터를 이동 또는 공유하는 것을 말합니다.
  • 호스트(host) : 어플리케이션 프로그램이 실행되는 기계
  • 라우터(router) : 하나의 통신 채널에서 다른 통신 채널로 데이터를 전달하거나 중계하는 기계
  • OSI 7 Layer : ISO(국제 표준화기구)에서 발표한 네트워크 통신을 위한 데이터 통신 프로토콜 모델로 총 7계층으로 구성됩니다.
    • Application
    • Presentation
    • Session
    • Transport
    • Network
    • Data link
    • Physical