시스템 콜

nyoung·2023년 10월 2일
0

cs

목록 보기
5/10
post-thumbnail

📞 시스템 콜 (System Call)

시스템 콜이란?

운영 체제(OS)와 응용 프로그램 간의 인터페이스로서, 응용 프로그램이 운영 체제의 기능을 활용하거나 하드웨어 자원에 접근하기 위해 사용하는 메커니즘이다. 시스템 콜은 운영 체제의 커널(Kernel)에 의해 제공되며, 응용 프로그램은 시스템 콜을 호출하여 특정 작업을 수행하거나 리소스에 접근할 수 있다.

운영체제는 사용자 모드(User Mode)와 커널 모드(Kernel Mode)로 나뉘어 동작한다.

* 운영 체제가 두 가지 모드로 나뉘는 이유?

보안성: 모드를 나누어 일반 응용 프로그램이 시스템 리소스에 직접 접근하는 것을 제한할 수 있다. 접근이 허가되지 않은 응용 프로그램으로부터 리소스를 보호한다.
안정성: 사용자 모드에서 실행 중인 프로그램이 커널 모드에서 실행 중인 운영 체제에 예기치 않은 접근을 하지 못하도록 제한한다.

  • 사용자 모드 (User Mode):
    • 대부분의 응용 프로그램이 실행되는 모드이다.
    • 사용자 모드에서 실행 중인 프로세스는 시스템 리소스 및 하드웨어에 직접 접근할 수 없다.
    • 응용 프로그램은 사용자 모드에서 실행되면서 일반적인 작업을 수행한다.
  • 커널 모드 (Kernel Mode):
    • 운영 체제 커널이 실행되는 모드이다.
    • 커널 모드에서 실행 중인 코드는 시스템 리소스 및 하드웨어에 직접 접근할 수 있다.
    • 시스템 콜, 인터럽트 처리, 하드웨어 드라이버 등을 실행한다.

시스템 콜은 사용자 모드에서 커널 모드로 전환하여 운영 체제의 기능을 활용할 수 있게 해주는 인터페이스이다.

시스템 콜의 동작 과정
1. 응용 프로그램이 특정 시스템 콜을 호출.
2. 시스템 콜 호출로 응용 프로그램은 사용자 모드에서 커널 모드로 전환.
3. 커널 모드에서 시스템 콜 핸들러(System Call Handler)가 실행.
4. 작업이 완료되면, 시스템 콜 핸들러를 통해 응용 프로그램으로 결과를 반환.
5. 응용 프로그램은 반환된 결과를 처리하고, 사용자 모드로 전환.

시스템 콜의 종류

시스템 콜은 프로세스 제어, 파일 조작, 디바이스 조작, 정보 유지, 통신, 보호 크게 6가지로 분류할 수 있다.

  1. 프로세스 제어(Process Control)
    프로세스 생성/제거
    끝내기, 중지
    적재, 실행
    대기
    메모리 할당/해제

  2. 파일 조작(File Manipulation)
    파일 생성/삭제
    열기/닫기/읽기/쓰기

  3. 디바이스 조작(Device Manipulation)
    장치 요청/해제
    장치 읽기/쓰기/위치 변경
    속성 설정

  4. 디바이스 조작(Device Manipulation)
    장치 요청/해제
    장치 읽기/쓰기/위치 변경
    속성 설정

  5. 정보 유지(Information Maintenance)
    시간, 날짜 설정/요청

  6. 보호(Protection)
    권한 관리

🖥️ Java와 시스템 콜

자바는 개발자가 메모리 관리를 하지 않기 때문에, 자바는 직접 시스템 콜을 하지 못한다. 하지만 자바 애플리케이션도 운영체제와 상호작용해야 할 때가 있다. 파일 입출력, 네트워크 통신, 메모리 관리 등의 작업은 운영체제의 기능을 활용해야 한다.
이때, JVM은 시스템 콜을 사용하여 운영체제의 서비스를 호출한다.

Java API는 다양한 운영체제 플랫폼에서 개발자가 동일한 Java 코드를 실행할 수 있게 해준다.
JVM은 시스템 콜을 직접 호출하는 것이 아니라, Java API(java.util, java.io 등)를 통해 시스템 콜을 호출한다.
때로는 Java API로 충분하지 않거나 특정 플랫폼의 기능을 직접 활용해야 할 때가 있다. 이런 경우, JNI(Java Native Interface)를 사용하여 네이티브 코드(C, C++ 등)을 자바 애플리케이션에서 호출할 수 있다.

ex. Java로 파일 읽어보기

FileInputStream 클래스를 사용하여 파일을 열고, read 메서드를 통해 파일 내용을 읽을 수 있다.
FileInputStream 클래스의 내부에서는 JVM이 운영체제에 따라 필요한 시스템 콜을 호출한다. 파일을 열기 위해 Windows 운영체제에서는 Windows API를 호출하고, Linux나 macOS에서는 POSIX API를 호출한다.

import java.io.*;

public class FileReadExample {
    public static void main(String[] args) {
        try {
            FileInputStream fileInputStream = new FileInputStream("example.txt");
            int data = fileInputStream.read();
            while (data != -1) {
                System.out.print((char) data);
                data = fileInputStream.read();
            }
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
// JNI의 동작 흐름
1. JVM에서 자바 애플리케이션 실행 중 JNI를 사용하는 코드로 진입.
2. JNI를 통해 네이티브 코드 호출. (네이티브 코드는 시스템 콜을 직접 호출하거나 운영체제 기능을 사용할 수 있기 때문)
3. 시스템 콜을 통해 운영체제가 필요한 작업을 수행.
4. 결과 데이터 또는 리소스는 네이티브 코드에서 다시 JVM으로 복사.
5. JVM은 결과 데이터를 자바 애플리케이션으로 반환.

+) 시스템 콜과 API

API(Application Program Interface)란?

프로그래밍을 할 때 사용하는 함수와 라이브러리의 모음. API는 시스템 콜을 더 쉽게 사용할 수 있도록 추상화된 인터페이스를 제공한다. 이를 통해 프로그래머는 운영체제의 내부 동작을 몰라도 원하는 작업을 수행할 수 있다. 각 운영체제는 해당 운영체제에서 사용할 수 있는 API를 제공한다.

📖 파일을 읽고 쓰는 작업의 경우

A) 시스템 콜 직접 사용 > 운영체제에게 "파일을 열어줘" 라고 명령.
B) API 사용 > "파일을 열어줘"라는 명령을 운영체제가 이해할 수 있는 방식으로 감싸서 제공.

즉, API를 사용하면 운영체제의 종류에 상관없이 동일한 코드를 유지할 수 있어서 프로그램의 이식성과 개발 편의성을 높일 수 있다.

최근에는 많은 프로그래밍 언어와 프레임워크가 API를 통해 시스템 콜을 추상화하고 제공하므로, 개발자들은 대부분 시스템 콜을 직접 다루지 않고 API를 사용한다.


래퍼런스
https://hasensprung.tistory.com/176
https://cloudstudying.kr/lectures/189

profile
새싹 개발자

0개의 댓글

관련 채용 정보