[운영체제] 시스템 콜(System Call)

xoey·2024년 10월 28일

운영체제

목록 보기
5/15
post-thumbnail

1. 커널이란?

소프트웨어는 컴퓨터 시스템에서 수행되기 위해 메모리에 그 프로그램이 올라가 있어야 한다. 마찬가지로 운영체제 자체도 소프트웨어로서 전원이 켜짐과 동시에 메모리에 올라가야 한다.

하지만 운영체제처럼 규모가 큰 프로그램이 모두 메모리에 올라가면 한정된 메모리 공간 낭비가 심하다.

이때문에 운영체제 중 항상 필요한 부분만을 전원이 켜짐과 동시에 메모리에 올려 놓고, 그렇지 않은 부분은 필요할 때 메모리에 올려서 사용한다. 이때 메모리에 상주하는 운영체제의 부분을 커널(kernel)이라고 한다.

  • 운영체제의 핵심 부분으로, 시스템의 모든 중요한 관리 작업을 담당한다.
  • 하드웨어와 소프트웨어 사이의 통신을 조정하고, 시스템 리소스를 할당한다.
  • 저수준의 시스템 작업을 수행하여 시스템의 안정성과 효율성을 보장한다.

2. 이중 모드(Dual Mode)

CPU는 유저 애플리케이션이 시스템을 손상시키는 것을 방지하기 위해 2가지 모드를 제공한다.

CPU에 있는 Mode bit로 모드를 구분하여 0커널 모드(kernel mode), 1유저 모드(user mode)로 나뉘어 구동된다.

2.1. 유저 모드(User Mode)

  • 유저 애플리케이션 코드는 유저 모드에서 실행된다.
  • 유저가 접근할 수 있는 영역에 제한이 있기 때문에 해당 모드에서는 하드웨어(디스크, I/O 등)에 접근할 수 없다.

2.2. 커널 모드(Kernel Mode)

  • 운영체제가 CPU를 사용하는 모드
  • 시스템 콜을 통해 커널 모드로 전환이 되면, 운영체제는 하드웨어를 제어하는 명령어(Privileged Instructions)를 실행한다.

3. 시스템 콜(System Call)

운영체제는 다양한 서비스들을 수행하기 위해 하드웨어를 직접 관리한다.

반면에 응용 프로그램은 운영체제가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있다.

운영체제가 커널에 접근하기 위한 인터페이스시스템 콜(System Call)이라고 한다.

3.1. 역할

  • 프로세스 관리, 파일 조작, 장치 관리, 정보 유지 및 통신과 같은 다양한 운영체제 기능에 대한 접근을 관리한다.
  • 시스템 콜은 커널 영역의 기능을 유저 모드가 사용 가능하게 한다. (응용 프로그램은 시스템 콜을 통해 원하는 기능을 수행할 수 있다.)
    • 즉, 유저와 시스템 사이의 중재자 역할을 하여 응용 프로그램이 필요로 하는 복잡한 작업을 운영체제가 대신 수행할 수 있게 한다.

3.2. 유형

3.2.1. 프로세스 제어(Process Control)

  • 끝내기 (exit), 중지 (abort)
  • 적재 (load), 실행 (execute)
  • 프로세스 생성 (create process) - fork
  • 프로세스 속성 획득과 속성 설정
  • 시간 대기 (wait time)
  • 사건 대기 (wait event)
  • 사건을 알림 (signal event)
  • 메모리 할당 및 해제

3.2.2. 파일 조작(File Manipulation)

  • 파일 생성 / 삭제 (create / delete)
  • 열기 / 닫기 / 읽기 / 쓰기 (open / close / read / write)
  • 위치 변경 (reposition)
  • 파일 속성 획득 및 설정 (get file attribute / set file attribute)

3.2.3. 장치 관리(Device Manipulation)

  • 하드웨어의 제어와 상태 정보를 얻음 (ioctl)
  • 장치를 요구 (request device), 장치를 방출 (release device)
  • 읽기 (read), 쓰기 (write), 위치 변경
  • 장치 속성 획득 및 설정
  • 장치의 논리적 부착 및 분리

3.2.4. 정보 유지(Information Maintenance)

  • getpid()alarm()sleep()
  • 시간과 날짜의 설정과 획득 (time)
  • 시스템 데이터의 설정과 획득 (date)
  • 프로세스 파일, 장치 속성의 획득 및 설정

3.2.5. 통신(Communication)

  • pipe()shm_open()mmap()
  • 통신 연결의 생성, 제거
  • 메시지의 송신, 수신
  • 상태 정보 전달
  • 원격 장치의 부착 및 분리

3.2.6. 보호(Protection)

  • chmod()
  • umask()
  • chown()

3.3. 작동 방식

  1. 라이브러리 함수(printf)를 호출한다.
  2. 라이브러리 함수 내부에서 시스템 콜(write)를 호출한다.
  3. 해당 시스템 콜의 인덱스(4)를 CPU 레지스터에 저장한다.
  4. 0x80 인터럽트를 발생시킨다. (커널 모드로 전환)
  5. IDT(Interrupt Descriptor Table)를 참조하여 system_call()을 호출한다.
  6. 이때 3번에서 저장한 인덱스를 system_call() 함수 내에 전달한다.
  7. sys_call_table을 참조해 해당 인덱스에 맞는 기능(sys_write)을 호출한다.
  8. 수행이 모두 끝나면 사용자 모드로 전환된다.

💡 시스템 호출에서의 모드 전환은 컨텍스트 스위칭이다?

컨텍스트 스위칭은 운영체제가 CPU에서 실행 중인 프로세스 또는 스레드를 중단하고, 다른 프로세스 또는 스레드를 실행할 때 일어나는 과정이다. 이 과정에서는 실행 중이던 프로세스의 상태(레지스터, PC 등)를 저장하고, 새로운 프로세스의 상태를 복원하는 작업이 필요하다.

📌 모드 전환(Mode Switching) 과정

시스템 콜이 호출되면 CPU는 사용자 모드에서 커널 모드로 전환된다. 이때, 동일한 프로세스가 실행되지만, 실행 권한이 제한된 사용자 모드에서 더 많은 권한을 가진 커널 모드로 전환되는 것이다. 이 과정에서 프로세스의 상태를 저장하거나 복원하는 작업은 없다. CPU의 권한 모드만 변경되고, 커널이 해당 시스템 콜을 처리하는 것이다.

📌 컨텍스트 스위칭(Context Switching)

반면, 컨텍스트 스위칭은 프로세스 간 전환이다. 만약 시스템 콜을 처리하는 도중, 예를 들어 I/O 작업이 필요해 프로세스가 대기 상태로 전환되면, 그때 다른 프로세스가 CPU를 사용할 수 있도록 컨텍스트 스위칭이 발생한다. 이때는 CPU가 현재 실행 중인 프로세스의 상태를 저장하고, 새로운 프로세스의 상태를 로드하여 다른 작업을 수행하게 된다.

따라서, 시스템 콜의 과정에서 일어나는 모드 전환은 컨텍스트 스위칭이 아니다. 프로세스 자체가 전환되는 것이 아니라, 동일한 프로세스 내에서 권한 모드만 변경되는 것이기 때문이다.

📌 요약

  • 모드 전환: 사용자 모드 ↔ 커널 모드 전환 (동일한 프로세스 실행)
  • 컨텍스트 스위칭: 프로세스 간 전환 (프로세스 상태 저장 및 복원)

Reference

profile
[Roman 8:18] consider that our present sufferings are not worth comparing with the glory that will be revealed in us.

0개의 댓글