UNIX 시스템 호출
시스템 호출은 응용 프로그램이 커널의 서비스를 요청할 때 쓰는 인터페이스다. 사용자 모드에서 트랩을 거쳐 커널 모드로 전환해 커널 서비스를 수행한다. 응용 프로그램은 자원을 직접 제어하지 못하므로 커널이 이를 대신 처리한다. 시스템 호출은 응용 프로그램, 라이브러리…
주요 장면
대본
시스템 호출이란
시스템 호출은 응용 프로그램이 커널의 서비스를 요청할 때 쓰는 인터페이스다.
사용자 모드에서 트랩을 거쳐 커널 모드로 전환해 커널 서비스를 수행한다.
응용 프로그램은 자원을 직접 제어하지 못하므로 커널이 이를 대신 처리한다.
구성요소
시스템 호출은 응용 프로그램, 라이브러리 함수, 트랩, 호출 테이블, 서비스 루틴으로 이루어진다.
앞의 두 요소는 사용자 모드에서, 뒤의 두 요소는 커널 모드에서 실행된다.
트랩 명령은 두 영역이 만나는 경계에 있으며 이 지점에서 권한이 바뀐다.
호출 절차
시스템 호출은 순서대로 처리된다. 먼저 응용 프로그램이 라이브러리 함수를 호출한다.
라이브러리는 호출 번호와 인수를 준비하고 트랩 명령으로 커널 모드에 들어간다.
커널은 호출 번호로 테이블을 찾아 서비스 루틴을 실행한다.
작업이 끝나면 결과를 돌려주고 사용자 모드로 복귀한다.
파일 이름과 링크 카운트
link()는 파일을 복사하지 않는다. 기존 아이노드에 새 이름을 하나 더 붙인다.
이때 커널은 링크 카운트를 1 늘린다.
unlink()는 이름을 지우고 카운트를 1 줄인다. 카운트가 0이 되면 공간이 해제된다.
다만 카운트가 0이어도 열린 프로세스가 있으면 공간은 아직 해제되지 않는다.
프로세스 생성
새 프로세스 생성은 fork()로 부모를 복제한 뒤 exec()로 프로그램을 덮어쓰는 두 호출이다.
fork()는 새 프로세스를 만든다. 자식은 부모의 복제본으로 시작한다.
exec()는 새 프로세스를 만들지 않는다. 기존 프로세스의 영상만 교체한다.
부모는 wait()로 자식의 종료를 기다린다.
하드 링크와 심볼릭 링크
하드 링크와 심볼릭 링크는 같은 데이터를 여러 이름으로 부를 수 있게 한다.
하드 링크는 아이노드를 직접 가리키고, 심볼릭 링크는 경로 이름을 적은 특수 파일이다.
원본 이름을 지워도 하드 링크는 링크 카운트가 0이 될 때까지 데이터가 남는다.
정리와 직접 풀기
정리해 보자. 시스템 호출은 사용자 모드에서 커널 모드로 전환해 커널 서비스를 받는 인터페이스다.
link()와 unlink()는 아이노드 연결을 다루고, fork()와 exec()는 프로세스 생성과 교체를 다룬다.
답안에는 같은 아이노드를 다루는지, 마지막 링크 제거 시 공간이 해제되는지를 명시한다.