시스템 프로그래밍이란?
컴퓨터는 크게 하드웨어 + 소프트웨어로 이루어 짐
하드웨어: CPU, 메모리, 디스크, 마우스, 키보드 등
소프트웨어: 운영체제, 애플리케이션, 프로그램 등
애플리케이션은 코드로 쓰여져 컴파일 되고 특정한 기능을 수행하는 소프트웨어
애플리케이션은 코드 > 컴파일 > 로드(load) > 패치(fatch) > CPU > 프로세스 과정으로 돌아감
이때 컴파일, 메모리와 CPU로 올려지고 내려지는 과정, 프로세스로 실행되는 과정 모두 시스템 프로그램이라는 소프트웨어에 의해 수행됨
시스템 프로그램이란 애플리케이션이 컴퓨팅되는 환경을 제공해주어 하드웨어와 연결시켜주는 소프트웨어
시스템 프로그램의 종류
- 컴파일 시스템(Compile System)
code > compiler > assembler > linker > loader (+debugger)을 통해 고급언어(high level language)를 어셈블리 언어(assembly language)로 바꾸어준 후, 기계어(machine language)로 바꾸어 줌으로써, 최종적으로 실행 가능한 파일로 만들어주는 시스템 - 운영체제 시스템
운영체제에 존재하는 파일을 관리하는 파일 시스템(file system), 여러 프로세스의 동작을 제어 및 관리하는 스케쥴링(scheduling) 및 synchronization, 하드웨어 자원 관리 등등 컴퓨터가 돌아가는 데 필요한 전체적인 동작을 제어해주는 시스템 - 런타임 시스템
라이브러리 함수(library function), 쉘(shell) 뿐만 아니라, database나 multimedia와 같이 기본적인 운영체제에서 지원이 되지 않지만, 어플리케이션이 도는 데 필요한 추가적인 기능을 제공해주는 시스템
일반적으로 시스템 프로그램은 추상화(abstraction)으로 구현되어 있어 우리는 결과만을 확인했고 추상화로 되어있는 내부와 원리를 알지못함
시스템 콜 vs 라이브러리
- 시스템 콜: 커널에 대한 리소스 요청
하드웨어, 프로세스, 파일의 I/O등을 처리하며 프로그램은 사용자(User) 모드가 아닌 커널 모드로 실행
시스템에 직접 접근하기 때문에 프로그래머가 로우레벨(Low-level)까지 제어할 수 있지만, 커널에 직접 접근하는 만큼 남용하면 성능 손실 발생
예: open, read, write - 라이브러리: 헤더 파일 안에 미리 정의된 함수 모음, 라이브러리 안에 있는 함수들은 결국 시스템 콜 함수를 래핑(Wrapping)한 것
stdio.h 헤더 파일에는 입력 및 출력 조작을 수행하는 다양한 기능이 포함됨
예: fopen, fclose, printf, scanf
read() / write() 및 fread() / fwrite() 비교
Library Call을 사용하더라도 내부적으로 System Call을 사용
fread() / fwrite()의 경우 내부적으로 Buffer에 데이터을 쌓았다가 일정 크기 이상이 되면 read() / write()를 실행
read() / write() 같은 System Call을 사용하는 것보다 fread() / fwrite() 같이 Library Call을 사용함으로써, System Call의 호출 빈도가 확연하게 줄어듦
리눅스 커널(kernal)
리눅스 운영 체제의 주요 구성 요소이며 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스
커널의 기능
- 메모리 관리: 메모리가 어디에서 무엇을 저장하는 데 얼마나 사용되는지를 추적
- 프로세스 관리: 어느 프로세스가 중앙 처리 장치(CPU)를 언제 얼마나 오랫동안 사용할지를 결정
- 장치 드라이버: 하드웨어와 프로세스 사이에서 중재자/인터프리터의 역할을 수행
- 시스템 호출 및 보안: 프로세스의 서비스 요청을 수신
올바르게 구현된 커널은 사용자가 볼 수 없으며 커널 공간이라는 자신만의 작은 작업 공간에서 메모리를 할당하고 저장되는 모든 항목을 추적
웹 브라우저 및 파일과 같이 사용자가 볼 수 있는 것을 사용자 공간이라고 하는데 이러한 애플리케이션은 시스템 호출 인터페이스(SCI)를 통해 커널과 통신
비유하면 커널은 강력한 경영진(하드웨어)을 위해 일하는 바쁜 비서
비서의 할 일은 직원 및 대중(사용자)으로부터 수신되는 메시지 및 요청(프로세스)을 경영진에게 전달하고, 어디에 무엇이 저장되어 있는지 기억(메모리)하고, 특정한 시간에 누가 경영진을 얼마 동안 만날 수 있는지 결정하는 것
OS 내에서 커널의 위치
커널과 관련하여 Linux 시스템은 다음과 같은 3개 레이어로 구성
- 하드웨어: 시스템의 토대가 되는 물리적 머신으로, 메모리(RAM)와 프로세서 또는 중앙 처리 장치(CPU) 그리고 입출력(I/O) 장치(예: 스토리지, 네트워킹 및 그래픽)로 구성. CPU는 계산을 수행하고 메모리를 읽고 씀
- Linux 커널: OS의 핵심입니다. (한가운데에 있음) 메모리에 상주하며 CPU에 명령을 내리는 소프트웨어
- 프로세스: 실행 중인 프로그램으로 커널이 관리함. 커널은 이러한 프로세스 및 서버가 서로 통신(프로세스 간 통신 또는 IPC라고 함)할 수 있도록 도와줌
커널 모드 vs 유저 모드
시스템에서 실행되는 코드는 커널 모드 또는 유저 모드라는 두 가지 모드 중 하나로 CPU에서 실행
커널 모드는 실행 중인 코드는 하드웨어에 무제한 액세스가 가능
유저 모드는 CPU 및 메모리가 SCI를 통해 액세스하는 것을 제한
메모리도 이와 유사하게 구분(커널 공간 및 사용자 공간)
대부분의 프로그램은 유저 모드에서 실행
프로그램에 메모리나 하드웨어 리소스가 필요한 경우 System Call을 사용하여 커널에 요청을 보냅니다.
그런 다음 모드가 User Mode에서 Kernel Mode로 전환되고, 작업이 끝나면 모드가 Kernel Mode에서 User Mode로 다시 바뀌는데 이러한 모드 전환을 Context Switching, (문맥 교환) 이라고 함