Search

[1장 리눅스 개요]3.시스템 콜, 시스템 콜 래퍼

Publish Date
Tags
Status
Done
1 more property
시스템 콜
사용자 모드에서 실행 중인 프로세스가 커널 모드로 전환하기 위해서 시스템 콜 요청이 필요하다. 즉, 시스템 콜은 하드웨어 자원 접근, 파일 시스템 조작, 프로세스 관리 등 커널의 기능을 안전하게 활용할 수 있도록 지원하는 인터페이스이다.

시스템 콜

시스템 콜은 프로세스가 커널에 요청을 전달하는 방법이다. 커널은 사용자 모드에서 동작하는 프로세스와 커널모드에서 동작하는 운영체제 간의 중재자로, 시스템 리소스에 대한 모든 접근을 관리한다.

시스템 콜 동작 과정

1.
프로세스는 시스템 콜을 호출하여 커널에 요청을 전달한다.
2.
사용자 모드에서 커널모드로 전환되며, 시스템 콜이 실행된다.
3.
커널은 요청 내용을 확인하고 처리를 수행한다. 만약 요청이 올바르지 않다면, 실패 메시지를 반환한다.
4.
처리가 완료되면 커널모드에서 사용자 모드로 전환하고, 결과를 프로세스에 반환한다.

커널이 필요한 상황

사용자 모드에서 커널 모드로의 전환은 사용자 프로그램이 운영 체제의 핵심 기능이나 하드웨어 리소스에 접근해야 할 때 필수적이다. 커널은 이러한 요청을 안전하게 처리하고, 하드웨어와 소프트웨어 간의 추상화 계층을 제공하여 시스템의 보안과 안정성을 유지한다. 시스템 콜은 이러한 전환 과정을 사용자에게 투명하게 처리하는 핵심 메커니즘이다.
파일 시스템 조작
파일을 열거나, 읽거나, 쓰거나 삭제할 때.
커널은 디스크 블록과 파일 시스템을 관리한다.
메모리 관리
메모리 할당 및 해제, 가상 메모리 관리.
커널은 각 프로세스가 사용할 메모리를 적절히 배분하고 보호한다.
프로세스 및 스레드 관리
프로세스 생성, 종료, 스케줄링.
CPU 자원을 효율적으로 관리하기 위해 커널이 프로세스를 제어한다.
네트워크 통신
소켓을 생성하고 데이터를 송수신할 때.
커널은 네트워크 카드와 프로토콜 스택을 통해 데이터를 처리한다.
하드웨어와의 상호작용
디스크, 프린터, 키보드, 마우스 등 하드웨어 장치의 제어.
커널은 하드웨어 드라이버를 통해 장치를 제어하고 요청을 처리한다.
보안 및 접근 제어
사용자와 프로세스가 시스템 자원에 접근할 때 권한을 검증.
예: 사용자가 읽기 권한이 없는 파일에 접근하려고 할 때 접근을 차단.

시스템 콜 호출 방식

시스템 콜은 사용자 프로그램이 운영체제의 커널 기능에 접근하기 위해 사용하는 메커니즘이다. 시스템 콜은 CPU 아키텍처에 따라 어셈블리 코드로 작성해야하며, 트랩 명령어를 실행하여 사용자모드에서 커널 모드로 전환한다.

CPU 아키텍처와 트랩 명령어

운영체제는 다양한 CPU 아키텍처에서 작동하기 위해, 각 아키텍처에 맞는 트랩 명령어를 사용한다.
아키텍처
명령어
x86_64
syscall
x86(32비트)
int 0x80
ARM
svc
시스템 콜을 호출하려면 CPU 시스템 콜 번호와 매개변수를 설정한 후, 트랩 명령어를 실행하며 커널모드로 전환한다. 이 과정은 아키텍처에 따라 다르게 구현된다. (예시: getppid() 호출 , 아키텍처 별 어셈블리 코드)
x86_64 아키텍처
mov $0x6e, %eax syscall
Bash
복사
ARM64 아키텍처
mov 8x, <시스템콜번호> svc #0
Bash
복사

고급언어의 함수 호출과 시스템 콜

고급 프로그래밍 언어에서 제공하는 함수는 내부적으로 시스템 콜을 호출하여 작업을 수행한다. 예를 들어 Python의 print()함수는 내부적으로 write() 시스템 콜을 호출한다.
# 파이썬(고급언어)에서 print()함수 print("Hello, World!\n");
Python
복사
print()함수를 호출하는 python 프로그램은 내부적으로 아래와 같은 어셈블리 코드로 변환된다. write() 시스템 콜을 호출하며, syscall 명령어를 통해 사용자모드에서 커널모드로 전환된다.
_start: ; 시스템 콜 번호를 레지스터에 설정 mov rax, 1 ; 시스템 콜 번호 (1: write) ; 시스템 콜 인수 설정 mov rdi, 1 ; 첫 번째 인수: 파일 디스크립터 (1: stdout) mov rsi, message ; 두 번째 인수: 출력할 메시지의 주소 mov rdx, length ; 세 번째 인수: 메시지 길이 ; syscall 명령어 실행 (커널 모드로 전환) syscall ; 프로그램 종료를 위한 시스템 콜 mov rax, 60 ; 시스템 콜 번호 (60: exit) xor rdi, rdi ; 종료 코드 0 syscall
Assembly
복사

시스템 콜 래퍼 함수

시스템 콜을 호출할 때마다 아키텍처에 맞는 어셈블리 코드를 작성하게되면, 굉장히 번거로우며 다른 아키텍처로 이식할 경우 동작을 보장할 수 없는 문제가 발생한다. [그림01-07]
이러한 불편함을 해소하기 위해서 고급 프로그래밍 언어(예: C, Python 등)에서는 시스템 콜 래퍼함수를 제공하여 시스템 콜을 간단히 호출할 수 있게 도와준다. [그림01-08]

시스템 콜 래퍼 함수의 특징:

표준 라이브러리에 포함 시스템 콜 래퍼 함수는 고급 프로그래밍 언어의 표준 라이브러리(Standard Library)에 포함되어 있다.
아키텍처 독립성 제공
래퍼 함수는 내부적으로 아키텍처에 맞는 어셈블리 코드를 실행하여 시스템 콜을 호출한다. 이를 통해 사용자는 직접 어셈블리 코드를 작성하지 않고도 시스템 콜을 사용할 수 있다.
코드 이식성 향상
래퍼 함수는 다양한 운영 체제와 하드웨어 아키텍처에서 동일한 코드로 동작할 수 있도록 지원한다. 이는 코드 작성의 편의성과 이식성을 보장한다.

시스템 콜의 작동 원리

1.
[UserApplicaion]애플리케이션에서 시스템 콜을 요청
애플리케이션이 파일 읽기/쓰기, 프로세스 생성 등 커널 기능을 요청한다.
write(), read() 등의 시스템 콜을 요청한다.
print("Hello, World!\n");
Python
복사
2.
[UserLibrary]라이브러리에서 시스템 콜 실행
glibc 라이브러리가 제공하는 시스템 콜 래퍼 함수를 통해 시스템 콜이 실행된다.
트랩 명령어 실행 시, CPU는 인터럽트 벡터 테이블에서 시스템 콜 핸들러 주소를 확인하고 실행한다.
_start: ; 시스템 콜 번호를 레지스터에 설정 mov rax, 1 ; 시스템 콜 번호 (1: write) ; 시스템 콜 인수 설정 mov rdi, 1 ; 첫 번째 인수: 파일 디스크립터 (1: stdout) mov rsi, message ; 두 번째 인수: 출력할 메시지의 주소 mov rdx, length ; 세 번째 인수: 메시지 길이 ; syscall 명령어 실행 (커널 모드로 전환) syscall ; 프로그램 종료를 위한 시스템 콜 mov rax, 60 ; 시스템 콜 번호 (60: exit) xor rdi, rdi ; 종료 코드 0 syscall
Assembly
복사
3.
[Kernal]커널의 시스템 콜 핸들러 호출
CPU가 인터럽트 벡터 테이블에서 시스템 콜 핸들러 주소를 확인한다.
시스템 콜 번호를 레지스터에서 확인 후, 커널 내부 함수를 실행한다.
4.
[Kernal]요청 처리
커널은 요청된 작업(파일I/O, 프로세스 관리, 네트워크 작업 등)을 수행한다.
필요한 경우 하드웨어 자원 제어 및 커널 기능과 상호 작용한다.
5.
[Kernel → User]시스템 콜 종료 및 복귀
작업 결과(성공여부, 반환 값 등)를 CPU 레지스터에 저장한다.
CPU는 커널모드에서 사용자 모드로 전환한다.
애플리케이션은 레지스터 값을 읽어 결과를 확인한다.

실습

1. 시스템 콜 호출 및 분석 strace

시스템 콜 호출을 확인하려면 strace 명령어를 사용한다. 아래는 간단한 Python 프로그램 hello.py를 작성하고, 이를 strace로 실행하여 시스템 콜을 확인하는 과정이다.
hello.py
#! /usr/bin/python3 print("hello world!")
Python
복사
strace 실행
chmod +x hello.py strace -o hello.py.log ./hello.py cat hello.py.log
Shell
복사
write() 시스템 콜을 통해 "hello world\n" 문자열을 출력한 것을 확인할 수 있다. 모든 출력은 커널을 거쳐 수행되며, strace는 이 과정을 세부적으로 보여준다.

2. 시스템 콜 처리 시간 분석 strace -T

strace-T 옵션을 사용하면 시스템 콜 처리에 소요된 시간을 확인할 수 있다.
strace -T -o hello.time.log ./hello.py
Shell
복사
write() 시스템 콜이 마이크로 54초 동안 실행되었음을 알 수 있다. 이를 통해 특정 시스템 콜이 시스템 성능에 미치는 영향을 분석할 수 있다.

3. CPU 상태 확인 sar

리눅스에서 CPU가 실행 중인 작업의 비율을 확인하는 방법 중 하나는 sar 명령어를 사용하는 것이다. 이를 통해 사용자 모드와 커널 모드에서 각각 얼마나 많은 시간이 사용되었는지를 확인할 수 있다.

sar 명령어로 CPU 사용 비율 확인

sar 명령어는 CPU가 사용자 모드, 커널 모드, 그리고 대기 상태에 있는 시간의 비율을 확인할 수 있는 도구입니다.
sar -P 0 1 1
Shell
복사
sar
CPU가 실행 중인 작업의 비율을 확인 명령어
-P 0
논리 CPU 0번의 데이터를 수집
1
1초 간격으로 데이터를 수집
1
한 번만 데이터를 수집
필드
설명
CPU
CPU 코어나 전체 CPU를 나타냄 특정 CPU 코어 번호 또는 "all"은 전체 CPU 평균
%user
사용자 모드에서 실행 중인 시간 비율 (0 ~ 100%) (%user와 %nice 합계로 사용자 모드 비율을 알 수 있음)
%nice
nice 명령어로 우선순위가 조정된 프로세스가 실행 중인 시간 비율
%system
커널 모드에서 실행 중인 시간 비율 (시스템 콜 포함)
%iowait
CPU가 I/O 작업 완료를 기다리는 시간 비율
%steal
CPU가 가상화 환경에서 다른 가상 머신에 의해 “훔쳐진” 시간 비율 0 ~ 100% 범위에서 CPU 사용 불가능 시간 비율
%idle
CPU가 아무 작업도 하지 않는 시간 비율
모든 값의 합은 100%가 된다.

실습: 사용자 모드 사용률 확인

무한 루프를 실행하여 사용자 모드에서 CPU를 100% 사용하는 간단한 Python 코드이다.
inf-loop.py
#! /usr/bin/python3 while True: pass
Python
복사
taskset -c 0 ./inf-loop.py & sar -P 0 1 1
Shell
복사
%user 값이 100%에 가까운 것을 확인할 수 있다. 이는 CPU가 사용자 모드에서 무한 루프를 실행하며 대부분의 시간을 소비하고 있음을 의미한다.

실습: 커널 모드 사용률 확인

다음은 시스템 콜을 반복 호출하는 Python 코드이다.
syscall-inf-loop.py
#! /usr/bin/python3 import os while True: os.getppid()
Python
복사
taskset -c 0 ./syscall-inf-loop.py & sar -P 0 1 1
Shell
복사
%system 값이 55%로 증가한 것을 확인할 수 있다. 이는 CPU가 커널 모드에서 시스템 콜 처리를 반복 실행하며 대부분의 시간을 소비하고 있음을 의미한다.

실행 중인 프로그램 종료

실행 중인 프로그램 종료:
ps -a kill <프로세스ID>
Shell
복사
sar 명령어를 사용하면 CPU가 사용자 모드와 커널 모드에서 각각 어느 정도의 시간을 사용하고 있는지 확인할 수 있다. 이를 통해 CPU 리소스 사용 패턴을 분석하고, 성능 병목 현상을 파악할 수 있습니다.

마무리

시스템 콜프로세스와 커널 간의 소통 창구로, 커널의 리소스를 안전하고 효율적으로 사용할 수 있도록 지원한다. 이를 통해 프로세스는 직접 하드웨어를 제어하는 위험성을 피하고, 커널의 검증 및 제어를 거쳐 안정적으로 시스템 리소스를 활용할 수 있다. 이번 내용에서는 시스템 콜의 동작 원리와 이를 확인하는 실습 과정을 통해, 시스템 콜이 어떻게 커널과 프로세스 간의 중재자 역할을 수행하는지 살펴보았다. 이를 바탕으로 시스템 성능 최적화와 문제 분석에 활용할 수 있다.

Q&A

Q. 사용자 모드와 커널 모드의 차이는 무엇인가요?
Q.시스템 콜이란 무엇인가요?
Q. 시스템 콜은 왜 필요한가요?
Q.시스템 콜 래퍼 함수란 무엇인가요?
Q.시스템 콜 래퍼 함수가 필요한 이유는 무엇인가요?
Q.시스템 콜 래퍼 함수는 어떻게 동작하나요?
Q. 시스템 콜 래퍼 함수의 단점은 없나요?
Q. strace 명령어는 어떤 용도로 사용되나요?
Search
Main PageCategoryTagskkogggokkAbout MeContact