과정 제목
- 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
'프로그래밍' 카테고리의 다른 글
[gRPC] gRPC란? (0) | 2022.06.16 |
---|---|
[Git] 실수로 지운 commit 복구 (0) | 2022.06.16 |
스케일 업(Scale-Up), 스케일 아웃(Scale-Out) (0) | 2022.03.20 |
[프로그래밍] 메모리 사이즈 단위에 대한 고찰, MiB와 MB는 어떻게 다른가? (0) | 2021.09.26 |
[프로그래밍] Visual Studio에 OpenCV 설치하기 (0) | 2021.09.05 |