운영체제
[OS] System Call (시스템 콜)
위시리
2025. 4. 14. 13:22
운영체제란
컴퓨터의 시스템 자원을 효율적으로 관리하고, 사용자가 컴퓨터를 편리하고 효과적으로 사용할 수 있도록 환경을 제공하는 여러 프로그램의 모임
- 좁은 의미의 OS : 커널, 컴퓨터가 켜진 후 항상 메모리에 상주하는 운영 체제의 핵심 부분
- 넓은 의미의 OS : 커널을 포함해서 메모리에 상주하지 않는 다양한 유틸리티를 모두 포괄하는 개념
시스템 콜
응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스 역할
- 사용자 모드에서 커널 모드로 전환하기 위한 호출
- 사용자가 일반적으로 사용하는 응용 프로그램은 유저 레벨의 함수만으로는 기능을 구현하기 힘들기 때문에, 커널의 도움을 받아야 한다.
- 운영체제는 하드웨어가 직접 관리, 응용 프로그램은 운영체제가 제공하는 인터페이스를 통해서만 자원을 사용할 수 있다.
- 운영체제에 의해 실행될 동작을 사용자 프로세스가 요청할 수 있게 하는 것
- 시스템 콜은 커널 영역의 기능을 사용자 모드가 사용할 수 있도록 필요한 기능을 수행할 수 있게 해준다.
- 보통 직접적으로 시스템 콜을 사용하기 보다는 API를 통해 사용하게 된다.
커널
운영체제 중 항상 메모리에 올라가 있는 OS의 핵심 부분
"컴퓨터의 관리자이자 통역사"
- 운영체제와 같이 규모가 큰 프로그램이 모두 메모리에 올라가면 메모리 낭비가 심해진다.
- 운영체제 중 항상 필요한 부분만 메모리에 올려놓고, 그 외에는 필요할 때만 메모리에 올려서 사용하는 것이 효율적
- 이때 메모리에 상주하는 운영체제 부분을 커널이라고 한다.
- 하드웨어와 응용 프로그램 사이에서 인터페이스를 제공하는 역할을하고, 컴퓨터 자원들을 관리하는 역할
- 즉, 인터페이스로써 응용 프로그램 수행에 필요한 여러 서비스를 제공
- 여러 하드웨어(cpu, 메모리) 등의 자원을 관리하는 역할
- 커널은 항상 자원들을 바라보고 있기 때문에 사용자와 상호작용은 지원 x
- 사용자와의 직접적인 상호작용을 하기 위한 프로그램 : 쉘 (shell)
- 사용자는 쉘을 통해 커널에게 명령을 내릴 수 있다.
쉘 : 사용자가 컴퓨터에게 전달하는 명령을 해석하는 프로그램
커널과 사용자 간의 다리 역할
이중 동작 모드 (Dual Mode Operation)
- 사용자 프로그램이 하드웨어를 직접 제어하는 것을 막기위해 CPU는 2가지 모드를 가지고 있다.
- 사용자 모드 : 사용자가 접근할 수 있다.
- 커널 모드 : 사용자가 접근할 수 없다.
- 이렇게 사용자로부터 운영체제 자원을 보호하기 위한 장치가 이중 동작 모드이다.
사용자 모드 User Mode
- 개발자가 만든 응용 프로그램이나 소프트웨어가 실행되는 모드
- 시스템 데이터에 제한된 접근만 허용되며, 하드웨어나 시스템에 직접적으로 접근할 수 없다.
- 그렇지 않으면, 하나의 응용 프로그램이 하드웨어를 모두 점유하는 등의 위험 요소가 있기 때문
- 접근을 위해 시스템 콜(System Call)을 사용해야 한다.
커널 모드 Kernel Mode
- 운영체제에서 동작하는 응용 프로그램을 관리하고, 하드웨어와 관련된 작업을 수행하는 모드
- 운영체제가 CPU 제어권을 가지고 커널이 작업을 수행하는 모드
- 시스템의 모든 자원(드라이버, 메모리, CPU 등)에 접근할 수 있고, 모든 CPU 명령을 실행할 수 있다.
- 응용 프로그램은 사용자 모드에서 실행되다가 시스템 자원을 사용해야 할 때 시스템 콜을 호출하여 커널 모드로 전환하고 작업을 수행한 뒤에는 다시 사용자 모드로 전환
모드 전환 Mode Switching
- 사용자 모드에서 시스템 콜 호출 → 커널 모드 전환
- 커널 모드에서 시스템 콜 처리 후 → 다시 사용자 모드로 전환
- 모드 전환 : 사용자 모드에서 커널 모드로 전환하는 것
- 모드 전환은 CPU가 수행하며 이때 CPU는 인터럽트를 사용
처리 과정
- 사용자 프로세스가 시스템 콜 호출 (사용자 모드 → 커널 모드)
- 커널 : 요청 받은 시스템 콜에 대응하는 고유 번호 확인 → 번호에 맞는 서비스 루틴 호출
- 커널은 내부적으로 시스템 콜을 구분하기 위해 기능별로 고유 번호를 할당
- 해당 번호에 해당하는 제어 루틴을 정의
- 커널은 서비스 루틴을 처리하고, 사용자 모드로 전환
시스템 콜 유형
- 프로세스 / 스레드 컨트롤
- 프로세스 생성 및 종료
- 메모리에 로드, 실행 메모리 할당
- ex) fork( ), wait( ), exec( ), exit( )
- 파일 입출력 관리
- 파일 생성, 파일 삭제
- 열기, 닫기, 읽기, 쓰기 등
- ex) open( ), read( ), wirte( ), close( )
- 디바이스 메니지먼트
- 디바이스 요청 및 해제
- 읽기, 쓰기
- ex) read( ), wirte( )
- 정보 관리
- 시간 확인, 시간 지정
- 시스템 데이터 확인, 지정
- ex) time( ), gettimeofday( )
- 통신
- 커뮤니케이션 연결 생성 및 삭제
- 메세지 송신, 수신, 상태 정보 전달
- ex) pipe( ), send( )
- 보안
- Permission 획득, 설정
- ex) chmod( ), chown( )
- 위의 얘시 코드들은 리눅스에서 제공하는 시스템 콜 관련 함수들
- 리눅스는 C언어로 개발되어 있기에 함수들도 C언어로 구현
프로그래밍 언어와 시스템 콜
- 하드웨어 혹은 시스템 관련 기능은 어떤 프로그램이라도 반드시 시스템 콜을 통해서만 사용할 수 있다.
- 프로그래밍 언어를 사용하면서 파일 작업, 네트워크 작업 또는 프로세스/스레드 관련 작업을 할 때 직접 시스템 콜을 사용한 적은 없다.
- 대부분의 프로그래밍 언어는 시스템 콜을 포장(Wrapping)하여 간접적으로 사용할 수 있도록 제공하기 때문이다.
ex) java.lang.Thread 예제
Thread thread = new Thread();
thread.start();
public synchronized void start() {
boolean started = false;
try {
start0();
started = true;
} finally {}
}
private native void start0();
- Thread 클래스의 start() 메서드 내부를 살펴보면, start0() 메서드를 호출하고 있다.
- start0() 메서드는 따로 구현체는 없고 native로 선언되어 있다.
- 자바에서 native로 선언된 메서드는 자바가 아닌 다른 언어로 구현된 메서드를 호출한다.
- 즉 자바 네이티브 인터페이스 (Java Native Interface, JNI)를 통해 기반이 되는 OS의 시스템 콜을 호출한다.
- 만약 리눅스 기반이라면 start0() 메서드는 clone()이라는 시스템 콜을 호출한다.
- 이렇게 개발자들도 프로그래밍 언어를 통해 간접적으로 시스템 콜을 사용할 수 있다.