[CORE-007][중급] 운영체제와 애플리케이션의 경계 이해하기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[CORE-007][중급] 운영체제와 애플리케이션의 경계 이해하기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 157회 작성일 26-09-02 08:37

본문

[이번 수업]
앱은 파일과 네트워크를 쓰지만 장치와 메모리를 마음대로 다루지는 못합니다. 앱의 요청이 운영체제에 도달하는 경계를 따라가며 사용자 모드, 커널 모드, API, 시스템 호출을 배웁니다.

[선수지식]
프로그램이 실행되면 프로세스가 된다는 CORE-006 내용을 알고, 터미널에서 Python을 실행할 수 있어야 합니다.

[학습목표]
1. 사용자 모드와 커널 모드가 분리되는 이유를 설명한다.
2. 라이브러리, 운영체제 API, 시스템 호출의 역할을 구분한다.
3. 파일 디스크립터를 열고 쓰고 닫는 예제를 실행한다.

[핵심개념]
사용자 모드는 일반 앱이 제한된 권한으로 실행되는 영역입니다. 커널 모드는 운영체제 핵심 코드가 CPU, 메모리, 파일, 네트워크, 장치를 관리하는 영역입니다. 하드웨어가 권한 수준을 구분하므로 앱은 보호된 커널 메모리나 장치를 직접 수정할 수 없습니다. Windows도 앱은 사용자 모드, 운영체제 핵심 구성 요소는 커널 모드에서 동작한다고 설명합니다.

앱의 모든 명령이 커널로 들어가지는 않습니다. 계산이나 조건 판단은 사용자 공간에서 처리할 수 있습니다. 파일 열기처럼 보호 자원이 필요하면 대체로 언어 런타임·라이브러리 → 운영체제 API → 시스템 호출 → 커널·드라이버 순으로 요청이 갑니다. API(Application Programming Interface)는 서비스를 요청하는 규칙이고, 시스템 호출은 사용자 공간과 커널이 만나는 진입점입니다. 라이브러리 함수와 시스템 호출은 항상 일대일로 대응하지 않습니다. POSIX는 구현보다 이식 가능한 운영체제 인터페이스를 표준화합니다.

운영체제는 프로세스의 권한과 경로를 검사해 결과나 오류를 돌려줍니다. POSIX 계열은 열린 파일을 작은 정수인 파일 디스크립터로 표현합니다. Windows 내부는 핸들을 쓰지만 Python은 비슷한 인터페이스를 제공합니다. 그래도 권한과 경로 규칙까지 같아지는 것은 아닙니다.

[따라하기]
아래 내용을 boundary_demo.py로 저장합니다. 임시 폴더만 사용하고 자동 정리됩니다.

```python
import os
import platform
import tempfile
from pathlib import Path

with tempfile.TemporaryDirectory() as tmp:
    path = Path(tmp) / "boundary.txt"
    fd = os.open(path, os.O_CREAT | os.O_WRONLY | os.O_TRUNC, 0o600)
    try:
        written = os.write(fd, b"app -> os\n")
    finally:
        os.close(fd)

    print("운영체제:", platform.system())
    print("프로세스 ID:", os.getpid())
    print("기록한 바이트:", written)
    print("파일 크기:", path.stat().st_size)
```

macOS·Linux에서는 `python3 boundary_demo.py`, Windows PowerShell에서는 보통 `python boundary_demo.py`로 실행합니다. 운영체제는 Darwin·Linux·Windows 중 하나, 프로세스 ID는 매번 다른 숫자, 기록한 바이트와 파일 크기는 모두 10이 예상됩니다. `os.open`은 정수 `fd`를 돌려주고 `os.write`는 바이트를 기록합니다. `finally`의 `os.close`는 오류가 나도 자원을 닫습니다. 정확한 내부 호출은 운영체제와 Python 구현에 따라 다릅니다.

`0o600`은 macOS·Linux에서 소유자 읽기·쓰기를 뜻합니다. Windows는 ACL(접근 제어 목록) 중심이므로 같은 숫자가 동일한 정책을 뜻하지 않습니다.

[흔한 실수]
- 앱이 장치를 직접 제어한다고 생각한다. 운영체제가 요청을 중재합니다.
- 라이브러리 함수마다 시스템 호출이 하나라고 외운다. 캐시와 런타임 처리 때문에 달라질 수 있습니다.
- `PermissionError`가 나면 관리자·root로 실행한다. 먼저 경로, 소유권, 최소 권한을 확인합니다.
- 파일 디스크립터를 닫지 않아 운영체제 자원을 소모한다.

[보안 주의]
본인 소유의 로컬 폴더에서만 실습하고 관리자 권한은 쓰지 마세요. 사용자 입력으로 경로를 만들 때는 기준 폴더 밖으로 나가는 `..`, 절대 경로, 심볼릭 링크를 검증합니다. 전체 쓰기 권한을 열지 말고 필요한 파일에 최소 권한만 줍니다. 비밀값은 파일명과 로그에 남기지 않습니다. 앱 격리는 피해 범위를 줄이지만 입력 검증을 대신하지 않습니다.

[직접 해볼 과제]
`Path(tmp) / "missing.txt"`를 읽을 때 생기는 `FileNotFoundError`를 `try/except`로 잡아 `type(error).__name__`을 출력하세요. 그 파일을 만든 뒤 다시 읽어 성공 결과도 출력합니다.

[확인문제]
1. 일반 앱의 계산 명령이 모두 시스템 호출이 아닌 이유는 무엇인가요?
2. 운영체제 API와 시스템 호출은 어떤 역할 차이가 있나요?
3. 파일 디스크립터를 `finally`에서 닫는 이유는 무엇인가요?

[다음 학습]
다음 CS-007에서는 자료구조 선택 기준을 배웁니다.

[공식 참고 자료]
- POSIX.1-2024 소개: https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/V1_chap01.html
- Linux 커널 사용자 공간 API: https://docs.kernel.org/userspace-api/index.html
- Windows 사용자 모드와 커널 모드: 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

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
1,415
어제
5,103
최대
16,772
전체
772,469
Copyright © 소유하신 도메인. All rights reserved.