3. 시스템 호출

거대한 콘서트장에 있다고 상상해 보세요. 일반 관객석에서 특별 백스테이지로 이동하려면 그냥 걸어갈 수 없습니다. 특정 경비가 지키는 문을 통과할 수 있는 특별한 패스가 필요합니다. 컴퓨팅 세계에서 **시스템 호출 (system calls)**은 바로 그러한 특별한 패스입니다.

시스템 호출이란 무엇인가?

시스템 호출 (System calls) 은 종종 'syscalls'로 약칭되며, 사용자 공간 (user-space) 프로세스가 커널에 직접 서비스를 요청할 수 있는 방법을 제공합니다. 커널은 시스템 호출 API 를 통해 일련의 서비스를 노출합니다. 이러한 서비스는 파일 읽기/쓰기, 메모리 관리, 네트워크 연결 처리와 같은 작업에 필수적입니다. 사용 가능한 시스템 호출의 수는 고정되어 있으며 임의로 새로 추가할 수 없습니다. 시스템은 각 시스템 호출이 고유 ID 로 등록된 syscall 테이블을 유지 관리합니다.

리눅스의 시스템 호출 메커니즘

ls와 같은 프로그램을 실행할 때, 그 안에 있는 코드가 시스템 호출 리눅스 (system call linux) 명령을 직접 실행하는 것이 아닙니다. 대신, 래퍼 (wrapper) 역할을 하는 라이브러리 함수를 사용합니다. 이 래퍼 함수는 필요한 매개변수를 설정한 다음 소프트웨어 인터럽트, 즉 "트랩 (trap)"을 발생시킵니다.

이 트랩은 프로세서에게 권한이 없는 사용자 모드에서 권한이 있는 커널 모드로 전환하도록 신호를 보냅니다. 커널 모드에 들어가면 시스템 호출 핸들러가 작업을 인계받습니다. 핸들러는 고유 ID 를 사용하여 syscall 테이블에서 요청된 함수를 조회한 다음 실행합니다. 예를 들어, 파일 상태를 쿼리하는 데 사용되는 stat() 시스템 호출은 이러한 방식으로 찾아 실행됩니다. 커널이 작업을 완료하면 컨텍스트를 사용자 모드로 다시 전환하고 성공 또는 오류를 나타내는 상태 코드를 프로세스에 반환합니다.

strace 를 사용하여 시스템 호출 보기

strace 명령을 사용하면 프로세스가 실시간으로 수행하는 시스템 호출을 관찰할 수 있습니다. 이 도구는 디버깅과 프로그램이 커널과 상호 작용하는 방식을 이해하는 데 매우 유용합니다.

ls 명령이 수행하는 시스템 호출을 보려면 다음을 실행합니다.

strace ls

그러면 ls가 실행되는 동안 수행하는 모든 시스템 호출에 대한 자세한 목록이 출력됩니다.

로그인하여 학습 진행 상황을 저장하세요

로그인

연습 문제

연습이 완벽을 만듭니다! 시스템 호출의 내부 작동 방식은 복잡하지만, 사용자 공간 프로그램이 커널과 상호 작용하는 방식을 이해하는 것은 기본입니다. 이러한 상호 작용을 파악하는 가장 좋은 방법은 이러한 기본 작업을 수행하는 명령으로 연습하는 것입니다. 파일 시스템 상호 작용에 대한 이해를 강화하기 위한 몇 가지 실습 랩이 있으며, 이는 시스템 호출에 크게 의존합니다.

  1. 리눅스 파일 시스템 탐색 - ls, cd, pwd와 같은 필수 명령을 연습하여 리눅스 파일 시스템을 탐색하고 검사하며, 커널의 파일 시스템 서비스와 직접적으로 상호 작용합니다.
  2. 리눅스에서 파일 및 디렉터리 관리 - mkdir, rm, cp, mv와 같은 명령을 사용하여 파일과 디렉터리를 생성, 제거, 복사 및 이동하는 방법을 배우며, 이 모든 작업은 수행을 위해 시스템 호출을 포함합니다.
  3. 리눅스에서 파일 및 명령 찾기 - find, whereis, which를 사용하여 파일과 명령을 찾는 기술을 마스터하여 사용자 명령이 커널 서비스를 활용하여 파일 시스템과 상호 작용하는 방식을 더욱 보여줍니다.

이러한 랩은 파일 시스템 상호 작용 개념을 실제 시나리오에 적용하고 시스템 호출에 암묵적으로 의존하는 기본 리눅스 작업에 대한 자신감을 구축하는 데 도움이 될 것입니다.

퀴즈

사용자 모드에서 커널 모드로 전환하는 데 사용되는 것은 무엇입니까? 두 단어를 사용하여 영어로 답하십시오.