시스템 콜 System Call
대다수의 운영체제들은 커널 모드 Kernel Mode 와 사용자 모드 User Mode 가 구분되어 있다
커널 모드는 커널 및 커널에 붙는 드라이버들이 작동되는 영역으로 모든 컴퓨터 리소스에 접근할 수 있고
하나의 가상 메모리 영역만을 공유하여 커널과 드라이버가 서로 접근할 수 있다
사용자 모드는 일반 프로그램들이 실행되는 영역으로 컴퓨터 리소스에 제한적으로만 접근할 수 있다
각 프로그램은 독립된 메모리 공간을 사용하는 프로세스로 실행되며, 프로세스 간의 직접적인 메모리 접근은 불가능하다
일반적인 프로그램들은 사용자 모드에서 실행되므로 커널 모드에 대해 직접적인 접근이 불가능하다
하지만 읽기/ 쓰기, 메모리 할당, 프로세스 생성과 같은 거의 모든 시스템 작업은 커널 모드에서 처리해야 하기 때문에
사용자 모드에서 실행 중인 프로그램은 시스템 콜 System 을 통해 커널에 요청을 보낸다
커널은 요청을 처리한 후, 그 결과를 다시 사용자 모드의 프로그램으로 전달한다
시스템 콜은 다양한 기능에 따라 여러 종류로 나뉘며, 운영체제마다 다르지만, 각 시스템 콜에는 고유한 번호가 할당된다
시스템 콜 인터페이스는 시스템 콜 번호와 시스템 콜 테이블 System Call Table 을 유지한다
(System Call Table - 해당 시스템 콜을 처리하는 핸들러 함수의 주소로 구성, 시스템 콜의 번호에 따라 인덱스 되는 테이블)
사용자가 시스템 콜을 호출하면, 운영체제는 커널 모드에서 해당 시스템 콜 번호에 대응하는 함수 (핸들러) 를 테이블에서 찾아 실행한다
이 과정에서, CPU는 트랩 Trap 이라는 소프트웨어 인터럽트를 통해 사용자 모드에서 커널 모드로 전환된다
작업이 완료되면 커널은 다시 사용자 모드로 전환되며, 시스템 콜의 결과를 반환한다
-> 시스템 콜 자체는 소프트웨어 요청에 의해 발생하지만, 트랩을 처리하고 모드 전환을 수행하는 주체는 하드웨어입니다
open() 의 호출
아래 그림은 open() 시스템 콜을 호출했을 때 운영체제에서 어떻게 처리되는지를 보여준다
시스템 콜 예시
리눅스 터미널에 아래 명령어를 입력한다면 이 때 순차적으로 호출되는 시스템 콜은 어떤 것이 있을까?
cp in.txt out.txt
1) 사용자로부터 입력을 받는 I/O 시스템 콜 호출
2) 'cp' 프로그램을 실행시키면, 먼저 'in.txt' 파일이 현재 디렉토리에서의 접근 여부를 확인하는 시스템 콜 호출
접근이 불가능하다면 에러를 발생시킨 후 프로그램이 종료되는데 이 때도 시스템 콜이 호출된다
3) 파일이 존재하고 접근이 가능하다면 복사한 파일을 저장하기 위해 'output.txt' 파일명이 있는지 검사하는 시스템 콜 호출
이 파일명의 존재 여부를 검사하기 위해 시스템 콜을 통해 확인한다
4) 파일명이 이미 존재한다면, 덮어 씌워야 할지, 이어서 붙여야 하는지 User 에게 물어볼 수 있고
사용자에게 질문을 던지는 과정에서 입력을 받기 위한 I/O 시스템 콜이 호출된다
5) 만약 저장하고자 하는 이름이 겹치지 않아 파일을 저장할 때도 시스템 콜을 이용한다
시스템 콜의 유형
시스템 콜은 여섯 가지의 중요한 범주로 나눌 수 있다
1. 프로세스 제어
2. 파일 조작
3. 장치 조작
4. 정보 유지 보수
5. 통신
6. 보호
1. 프로세스 제어 Process Control
- 끝내기 exit, 중지 abort
- 적재 load, 실행 execute
- 프로세스 생성 create process - fork
- 프로세스 속성 획득과 설정 get process attribute and set process attribute
- 시간 대기 wait time
- 사건 대기 wait event
- 사건을 알림 signal event
- 메모리 할당 및 해제 malloc, free
2. 파일 조작 File Mainipulation
- 파일 생성 create file, 파일 삭제 delete file
- 열기 open, 닫기 close
- 읽기 read, 쓰기 write, 위치 변경 reposition
- 파일 속성 획독 및 설정 get file attribute and set file attribute
3. 장치 관리 Device Management
- 하드웨어의 제어와 상태 정보를 얻음 ioctl
- 장치를 요구 request devices, 장치를 방출 relelase device
- 읽기 read, 쓰기, write, 위치 변경 reposition
- 장치 속성 획득 및 설정 get device attribute and set device attribute
- 장치의 논리적 부착 attach 또는 분리 detach
4. 정보 유지 Information Maintenance
- getpid() 현재 프로세스의 프로세스 ID (PID) 반환
- alarm() 지정된 시간 (초) 후에 SIGALRM 신호를 프로세스에 전달
- sleep() 지정된 시간 (초) 동안 프로세스 일시 중지
- 시간과 날짜의 설정과 획득 time
- 시스템 데이터의 설정과 획득 date
- 프로세스 파일, 장치 속성의 획득 및 설정
5. 통신 Communication
- pipe() 프로세스 간에 데이터를 전송할 수 있는 FIFO 버퍼 생성
- shm_open() 공유 메모리 객체를 생성하거나 열기
- mmap() 파일 또는 장치의 내용을 메모리에 매핑하여, 프로세스가 파일을 직접 메모리처럼 접근할 수 있게 하는 기능
- 통신 연결의 생성, 제거
- 메시지의 송신, 수신
- 상태 정보 전달
- 원격 장치의 부착 및 분리
6. 보호 Protection
- chmod() 파일이나 디렉토리의 접근 권한 변경
- umask() 새로 생성되는 파일이나 디렉토리에 대한 기본 권한을 설정하는 마스크 값
- chown() 파일이나 디렉토리의 소유자 변경
'TIL' 카테고리의 다른 글
[TIL] 힙 정렬 Heap Sort (0) | 2024.10.22 |
---|---|
[TIL] DMA, Direct Memory Access (1) | 2024.10.21 |
[TIL] 단편화 Fragmentation (2) | 2024.10.19 |
[TIL] 가상 메모리 Virtual Memory/ 페이징 Paging (1) | 2024.10.18 |
[TIL] RB Tree 구현하기 #2 (1) | 2024.10.17 |