[OS-001][입문] 커널·사용자 공간·시스템 호출 이해하기
페이지 정보
작성자 기술팀장 작성일 26-08-29 02:32 조회 233 댓글 0본문
[이번 수업]
우리가 실행하는 앱은 디스크나 메모리 같은 하드웨어를 마음대로 다루지 않습니다. 운영체제의 핵심인 커널에 필요한 작업을 요청합니다. 이번에는 사용자 공간, 커널, 시스템 호출이 어떻게 이어지는지 이해하고 파일 입출력으로 흐름을 확인합니다.
[선수지식]
CORE-001의 입력·처리·출력 과정과 PY-001의 Python 실행법을 알면 됩니다. 운영체제 내부 지식이나 관리자 권한은 필요하지 않습니다.
[학습목표]
1. 커널과 사용자 공간의 역할을 구분할 수 있습니다.
2. 시스템 호출이 필요한 이유를 설명할 수 있습니다.
3. Python에서 파일 열기·쓰기·읽기·닫기 흐름을 실행할 수 있습니다.
[핵심개념]
커널(kernel)은 운영체제의 중심부입니다. CPU 시간 배분, 메모리 보호, 파일시스템, 장치, 네트워크 같은 자원을 관리합니다. 여러 프로그램이 동시에 실행되어도 서로의 메모리나 중요한 시스템 데이터를 함부로 바꾸지 못하게 경계를 지킵니다.
일반 앱이 실행되는 제한된 영역을 사용자 공간(user space), 커널 코드가 높은 권한으로 실행되는 영역을 커널 공간(kernel space)이라고 부릅니다. 앱 하나가 잘못되어도 다른 앱과 운영체제 전체로 피해가 번지는 일을 줄이기 위한 분리입니다.
시스템 호출(system call)은 사용자 프로그램이 커널 기능을 요청하는 공식 통로입니다. 파일 읽기, 새 프로세스 만들기, 네트워크 통신처럼 보호된 자원이 필요한 작업에 사용됩니다. 실제 프로그램은 시스템 호출을 직접 조립하기보다 Python 표준 라이브러리나 C 라이브러리 같은 래퍼 함수를 주로 사용합니다. 하나의 고수준 함수가 내부에서 여러 요청을 할 수도 있고 이름과 세부 동작은 운영체제마다 다릅니다.
흐름은 ‘앱의 함수 호출 → 운영체제 인터페이스 → 커널의 권한·인자 검사 → 장치나 파일 처리 → 결과 또는 오류 반환’으로 볼 수 있습니다.
[따라하기]
system_call_demo.py 파일을 만들고 아래 코드를 저장합니다. 현재 폴더에 연습 파일을 만들었다가 마지막에 삭제합니다.
import os
path = "system_call_demo.txt"
data = b"hello, kernel\n"
fd = os.open(
path,
os.O_CREAT | os.O_TRUNC | os.O_RDWR,
0o600,
)
try:
os.write(fd, data)
os.lseek(fd, 0, os.SEEK_SET)
result = os.read(fd, len(data))
print("process id:", os.getpid())
print(result.decode(), end="")
finally:
os.close(fd)
os.remove(path)
Windows는 ‘py system_call_demo.py’, macOS·Linux는 ‘python3 system_call_demo.py’를 실행합니다. process id 뒤 숫자는 실행할 때마다 달라질 수 있고 다음 줄에는 ‘hello, kernel’이 나옵니다. fd는 파일 설명자(file descriptor), 즉 열린 파일을 가리키는 번호입니다. os.open·write·read·close는 운영체제 기능을 쓰는 낮은 수준의 Python 인터페이스이며 실제 시스템 호출 구성은 플랫폼에 따라 다릅니다.
Linux에서 strace가 설치되어 있다면 본인 프로그램만 ‘strace -e trace=openat,read,write,close,lseek python3 system_call_demo.py’로 관찰할 수 있습니다. macOS의 dtruss와 Windows의 Process Monitor는 방식과 권한이 달라 필수 실습에서 제외합니다.
[흔한 실수]
커널을 운영체제 화면 전체와 같은 뜻으로 보지 마세요. 셸과 파일 탐색기 같은 도구는 대개 사용자 공간 프로그램입니다. 함수 한 번이 반드시 시스템 호출 한 번과 일치한다고 단정해서도 안 됩니다. 또한 파일 설명자를 닫지 않으면 자원이 계속 남을 수 있으므로 finally에서 정리합니다.
[보안 주의]
연습 코드는 본인 소유 폴더에서만 실행하세요. 경로와 권한을 검사하지 않은 채 사용자 입력으로 파일을 만들면 중요한 파일을 덮어쓸 수 있습니다. 시스템 호출 추적에는 파일 경로와 데이터가 보일 수 있으므로 결과를 공개하기 전에 비밀정보를 지우고, 이 실습을 위해 관리자 권한을 사용하지 마세요.
[직접 해볼 과제]
data를 b"OS study\n"로 바꾸고 다시 실행하세요. 그다음 os.remove(path)를 잠시 주석 처리해 파일 내용과 권한을 확인한 뒤 직접 삭제하세요. 어떤 작업이 커널의 도움이 필요한지 세 가지로 적어 봅니다.
[확인문제]
1. 사용자 공간과 커널 공간을 나누는 이유는 무엇인가요?
2. 앱이 파일을 읽을 때 시스템 호출이 필요한 이유는 무엇인가요?
3. Python 함수와 실제 시스템 호출이 항상 일대일이 아닌 이유는 무엇인가요?
[다음 학습]
다음 게시 과정은 NET-001 ‘OSI와 TCP/IP를 실제 통신으로 이해하기’입니다. OS 트랙의 다음 단계는 OS-002 ‘프로세스·스레드·스케줄링’입니다.
[공식 참고 자료]
Linux 커널 공식 문서 — 사용자 공간 API
https://www.kernel.org/doc/html/latest/userspace-api/index.html
Linux man-pages — 시스템 호출 개요
https://man7.org/linux/man-pages/man2/syscalls.2.html
Microsoft Learn — 사용자 모드와 커널 모드
https://learn.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode
Python 공식 문서 — os 운영체제 인터페이스
https://docs.python.org/3/library/os.html
우리가 실행하는 앱은 디스크나 메모리 같은 하드웨어를 마음대로 다루지 않습니다. 운영체제의 핵심인 커널에 필요한 작업을 요청합니다. 이번에는 사용자 공간, 커널, 시스템 호출이 어떻게 이어지는지 이해하고 파일 입출력으로 흐름을 확인합니다.
[선수지식]
CORE-001의 입력·처리·출력 과정과 PY-001의 Python 실행법을 알면 됩니다. 운영체제 내부 지식이나 관리자 권한은 필요하지 않습니다.
[학습목표]
1. 커널과 사용자 공간의 역할을 구분할 수 있습니다.
2. 시스템 호출이 필요한 이유를 설명할 수 있습니다.
3. Python에서 파일 열기·쓰기·읽기·닫기 흐름을 실행할 수 있습니다.
[핵심개념]
커널(kernel)은 운영체제의 중심부입니다. CPU 시간 배분, 메모리 보호, 파일시스템, 장치, 네트워크 같은 자원을 관리합니다. 여러 프로그램이 동시에 실행되어도 서로의 메모리나 중요한 시스템 데이터를 함부로 바꾸지 못하게 경계를 지킵니다.
일반 앱이 실행되는 제한된 영역을 사용자 공간(user space), 커널 코드가 높은 권한으로 실행되는 영역을 커널 공간(kernel space)이라고 부릅니다. 앱 하나가 잘못되어도 다른 앱과 운영체제 전체로 피해가 번지는 일을 줄이기 위한 분리입니다.
시스템 호출(system call)은 사용자 프로그램이 커널 기능을 요청하는 공식 통로입니다. 파일 읽기, 새 프로세스 만들기, 네트워크 통신처럼 보호된 자원이 필요한 작업에 사용됩니다. 실제 프로그램은 시스템 호출을 직접 조립하기보다 Python 표준 라이브러리나 C 라이브러리 같은 래퍼 함수를 주로 사용합니다. 하나의 고수준 함수가 내부에서 여러 요청을 할 수도 있고 이름과 세부 동작은 운영체제마다 다릅니다.
흐름은 ‘앱의 함수 호출 → 운영체제 인터페이스 → 커널의 권한·인자 검사 → 장치나 파일 처리 → 결과 또는 오류 반환’으로 볼 수 있습니다.
[따라하기]
system_call_demo.py 파일을 만들고 아래 코드를 저장합니다. 현재 폴더에 연습 파일을 만들었다가 마지막에 삭제합니다.
import os
path = "system_call_demo.txt"
data = b"hello, kernel\n"
fd = os.open(
path,
os.O_CREAT | os.O_TRUNC | os.O_RDWR,
0o600,
)
try:
os.write(fd, data)
os.lseek(fd, 0, os.SEEK_SET)
result = os.read(fd, len(data))
print("process id:", os.getpid())
print(result.decode(), end="")
finally:
os.close(fd)
os.remove(path)
Windows는 ‘py system_call_demo.py’, macOS·Linux는 ‘python3 system_call_demo.py’를 실행합니다. process id 뒤 숫자는 실행할 때마다 달라질 수 있고 다음 줄에는 ‘hello, kernel’이 나옵니다. fd는 파일 설명자(file descriptor), 즉 열린 파일을 가리키는 번호입니다. os.open·write·read·close는 운영체제 기능을 쓰는 낮은 수준의 Python 인터페이스이며 실제 시스템 호출 구성은 플랫폼에 따라 다릅니다.
Linux에서 strace가 설치되어 있다면 본인 프로그램만 ‘strace -e trace=openat,read,write,close,lseek python3 system_call_demo.py’로 관찰할 수 있습니다. macOS의 dtruss와 Windows의 Process Monitor는 방식과 권한이 달라 필수 실습에서 제외합니다.
[흔한 실수]
커널을 운영체제 화면 전체와 같은 뜻으로 보지 마세요. 셸과 파일 탐색기 같은 도구는 대개 사용자 공간 프로그램입니다. 함수 한 번이 반드시 시스템 호출 한 번과 일치한다고 단정해서도 안 됩니다. 또한 파일 설명자를 닫지 않으면 자원이 계속 남을 수 있으므로 finally에서 정리합니다.
[보안 주의]
연습 코드는 본인 소유 폴더에서만 실행하세요. 경로와 권한을 검사하지 않은 채 사용자 입력으로 파일을 만들면 중요한 파일을 덮어쓸 수 있습니다. 시스템 호출 추적에는 파일 경로와 데이터가 보일 수 있으므로 결과를 공개하기 전에 비밀정보를 지우고, 이 실습을 위해 관리자 권한을 사용하지 마세요.
[직접 해볼 과제]
data를 b"OS study\n"로 바꾸고 다시 실행하세요. 그다음 os.remove(path)를 잠시 주석 처리해 파일 내용과 권한을 확인한 뒤 직접 삭제하세요. 어떤 작업이 커널의 도움이 필요한지 세 가지로 적어 봅니다.
[확인문제]
1. 사용자 공간과 커널 공간을 나누는 이유는 무엇인가요?
2. 앱이 파일을 읽을 때 시스템 호출이 필요한 이유는 무엇인가요?
3. Python 함수와 실제 시스템 호출이 항상 일대일이 아닌 이유는 무엇인가요?
[다음 학습]
다음 게시 과정은 NET-001 ‘OSI와 TCP/IP를 실제 통신으로 이해하기’입니다. OS 트랙의 다음 단계는 OS-002 ‘프로세스·스레드·스케줄링’입니다.
[공식 참고 자료]
Linux 커널 공식 문서 — 사용자 공간 API
https://www.kernel.org/doc/html/latest/userspace-api/index.html
Linux man-pages — 시스템 호출 개요
https://man7.org/linux/man-pages/man2/syscalls.2.html
Microsoft Learn — 사용자 모드와 커널 모드
https://learn.microsoft.com/en-us/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode
Python 공식 문서 — os 운영체제 인터페이스
https://docs.python.org/3/library/os.html
댓글목록 0
등록된 댓글이 없습니다.
