본문 바로가기
CS/OS

시스템 콜

by yongckim 2022. 8. 30.
728x90
반응형

시스템 콜이란?

운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스입니다.

 

커널모드와 유저모드

커널모드와 유저모드는 커널에서 중요한 자원을 관리하고 있기 때문에, 사용자가 마음대로 중요한 자원에 접근하지 못하도록 모드를 나누어서 관리하기 위해 사용됩니다.

  • 유저모드
    • 유저가 접근할 수 있는 영역을 제한적으로 두고, 프로그램의 자원에 함부로 침범하지 못하는 모드입니다. 
    • 유저모드에서 코드를 작성하고, 프로세스를 실행하는 등의 행동을 할 수 있습니다.
    • 쉽게말해서, 유저가 사용하는 응용 프로그램이 유저 모드에서 실행된다고 할 수 있습니다.
  • 커널 모드
    • 컴퓨터 시스템의 모든 자원(드라이버, 메모리, CPU)에 접근, 명령을 할 수 있습니다.
    • 커널모드에서는 모든 종류의 명령을 실행할 수 있습니다.

시스템 콜의 동작

프로세스가 실행되는 동안에 컴퓨터 시스템 자원에 접근해야하는 경우가 있을 수 있습니다.

이 때, 프로세스는 유저모드에서 시스템 콜을 통하여 커널모드에 자원을 요청하게 됩니다.

다음은 프로세스가 유저모드에서 커널모드에 요청을 보내고 응답을 받는 과정입니다.

1. 프로세스는 유저모드에서 실행되다가 특별한 요청이 필요할때 시스템 콜로 커널에 특정 기능을 요청합니다.

2. 커널모드는 이를 받아서 그 요청에 대한 처리를 한 후 결과 값을 시스템 콜의 리턴 값으로 전해줍니다.

 

예를 들어, 프로세스가 실행되고 있는 중에 fopen이라는 시스템콜을 사용하는 함수를 실행했다고 가정해봅시다.

그렇게 되면 fopen 내부에서 시스템 콜인 open 을 호출하면서 커널모드로 넘어갑니다.

커널모드에서는 시스템 콜을 실행한 결과를 fopen에게 반환하게 됩니다.

시스템 콜의 종류

시스템 콜은 다섯 가지의 중요한 범주, 즉 프로세스 제어, 파일 조작, 장치 조작, 정보 유지 보수와 통신과 보호로 묶을 수 있으며 다음과 같은 역할을 수행합니다.

  • 프로세스 제어(Process Control)
    • 끝내기(end), 중지(abort)
    • 적재(load), 수행(execute)
    • 프로세스 생성, 프로세스 종료
    • 프로세스 속성 획득, 프로세스 속성 설정
    • 시간을 기다림
    • 이벤트를 기다림, 이벤트 발생을 알림
    • 메모리 할당 및 자유화
  • 파일 조작 (File Manipulation)
    • 파일 생성(create file), 파일 삭제(delete file)
    • 열기(open), 닫기(close)
    • 읽기, 쓰기, 위치 변경(reposition)
    • 파일 속성 획득 및 설정
  • 장치 관리(Device Management)
    • 장치를 요구(request), 장치를 방출(release)
    • 읽기 쓰기, 위치 변경
    • 장치 속성 획득, 장치 속성 설정
    • 장치의 논리적 부착 또는 분리
  • 정보유지(Information Maintenance)
    • 시간과 날짜의 설정과 획득
    • 시스템 데이터의 설정과 획득
    • 프로세스, 파일, 장치 속성의 획득
    • 프로세스 파일, 장치 속성의 설정
  • 통신(Communication)
    • 통신 연결의 생성, 제거
    • 메시지의 송신, 수신
    • 상태 정보 전달
    • 원격 장치의 부착 및 분리
  • 보호(Protection)
    • 파일의 권한(permission) 설정(set)
    • 파일의 권한 얻기(get)

주요 시스템 콜

fork()

새로운 프로세스 공간을 별도로 만들고, fork() 시스템 콜을 호출한 부모 프로세스 공간의 데이터를 모두 복사합니다. ( = copy)

기존에 실행되고 있었던 부모 프로세스에 있는 모든 내용을 자식 프로세스에 복사합니다.

프로세스 안에 있는 fork() 시스템 콜을 실행하면 새로운 프로세스 공간을 만든 다음에 fork() 다음 줄에 프로그램 카운터가 놓여서 동일한 코드를 읽어나가게 됩니다.

이 대, fork()의 리턴 값에서 pid가 나오는데 0일 경우에는 자식 프로세스이고, 0보다 큰 값일 경우 부모 프로세스의 id로 리턴이 되어서 자식, 부모 프로세스 간의 실행을 각각 따로 할 수 있습니다.

exec()

exec() 시스템 콜을 호출한 프로세스의 공간의 TEXT, DATA, BSS 영역을 새로운 프로세스의 이미지로 덮어 씌웁니다.

fork()와는 달리 별도의 프로세스 공간을 만들지 않습니다.

프로세스 안에 있는 exec() 시스템 콜을 실행하면 새로운 프로세스를 만드는 것이 아니라 현재 만들어진 exec 인자에 들어가 있는 프로그램 실행 파일을 읽어서 현재 부모 프로세스 공간의 exec 인자에 있는 실행파일에 대한 TEXT, DATA, BSS 영역을 덮어 씌웁니다. (HEAP, STACK은 동적 영역이기 때문)

exec 계열 함수는 현재 프로세스 이미지를 별도 메모리 공간에 복사하지 않습니다.

wait()

자식 프로세스가 종료되기 전까지 부모 프로세스를 기다리게 하는 시스템 콜입니다.

좀비 프로세스를 회수하고 고아 프로세스가 되는 것을 방지합니다.

반응형

'CS > OS' 카테고리의 다른 글

경쟁상황 (Race Condition), 뮤텍스, 세마포어  (0) 2022.09.11
CPU 스케줄링  (0) 2022.09.07
IPC  (0) 2022.09.04
프로세스와 스레드  (0) 2022.08.31
운영체제와 IO / Interrupt  (0) 2022.08.28