✨ 입출력(I/O) 수행
- 모든 입출력 명령 특권 명령으로 정의되어 있어,
커널 모드에서 운영체제만 실행 가능하다.
- 그럼 사용자 프로그램은 어떻게 입출력을 수행할까?
💫 시스템 콜(System Call)
- 사용자 프로그램(응용 프로그램)은 I/O에 직접 접근할 수 없기에,
I/O 접근이 필요한 경우 운영체제의 커널 함수를 호출한다.
- 시스템 콜은 사용자 프로그램이 운영체제가 제공하는 서비스를
사용하기 위해 운영체제 함수를 호출하는 것이다. -인터럽트 발생
- 사용자 프로그램은
OS가 상주하는 메모리 주소로 분기가 불가능하다.
시스템 콜의 종류 예시
1. 프로세스 관리
fork(), exec(), exit(), wait()
2. 파일 조작
open(), read(), write(), close()
💫 I/O 요청 과정
1. 사용자 프로그램이 시스템 콜 실행
- 사용자 프로그램은 직접 하드웨어 접근❌, 운영체제에게 요청
2. CPU Mode bit 변경과 제어권
- 시스템 콜을 실행하면 Mode bit를
0(커널 모드)로 변경
- 제어권을 운영체제에게 넘김
3. I/O 작업 수행
trap 명령어를 사용해 인터럽트 벡터의 특정 위치로 이동
- 인터럽트 벡터는 인터럽트가 발생했을 때,
해당 인터럽트를 처리할 루틴(ISR)의 주소를 저장한 테이블
- 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴(
ISP) 실행
- 운영체제는 요청된 I/O가 유효한지 확인 후, 디바이스 컨트롤러에게 전달
- 디바이스 컨트롤러는 입출력 작업 수행
- 디바이스 컨트롤러가 입출력 작업을 수행하면 CPU는 다른 작업을 수행
- CPU는 놀지 않는다!
4. I/O 작업 완료 후, CPU에 인터럽트 발생
- 디바이스 컨트롤러가 CPU에게 작업 완료 신호 전송 - 하드웨어 인터럽트
- 운영체제가 인터럽트를 확인하고, 결과를 사용자 프로그램에 반환
5. 제어권이 사용자 프로그램으로 복귀
- I/O 완료 후, CPU는 사용자 모드로 전환(Mode bit
1)
- 시스템 콜 다음 명령부터 실행을 계속 함
💫 인터럽트(Interrupt)
- 인터럽트는 CPU가 실행 중인 작업을 잠시 멈추고,
더 중요한 작업을 먼저 처리하도록 하는 신호
- 인터럽트가 발생하면 CPU 제어권은 운영체제에게 넘어가가고,
운영체제는 해당 인터럽트를 확인한다.
인터럽트 종류
1. 하드웨어 인터럽트(Interrupt)
- 하드웨어 장치가 발생시키는 인터럽트
- 키보드 입력, 타이머, I/O 요청 등
2. 소프트웨어 인터럽트(Trap)
- 프로그램 내부에서 발생하는 인터럽트
Exception : 오류 발생 시 실행
System Call : 사용자 프로그램이 커널 기능을 요청할 때 실행
💫 인터럽트 처리 과정
1. 인터럽트 발생
- CPU가 실행 중인 프로그램을 수행하는 도중, 특정 이벤트가 발생하면 인터럽트 발생
- 인터럽트 컨트롤러(
Interrupt Controller)가 인터럽트 신호를 CPU에 전달
- 💡인터럽트 컨트롤러 : 여러 개의 인터럽트를 관리하고 우선순위를 조정하는 장치
2. 현재 실행 중인 작업 저장(문맥 저장, Context Saving)
- 현재 실행 중인 프로세스의 프로그램 카운터(
PC), 레지스터, 상태 레지스터를 저장
- 인터럽트 처리가 끝난 후, 원래의 실행 상태로 복귀할 수 있도록 함
3. 인터럽트 벡터 테이블(IVT)에서 핸들러 탐색
IVT는 특정 인터럽트 번호에 해당하는 핸들러의 주소를 저장한 테이블
- CPU는
IVT를 참조해 적절한 인터럽트 핸들러(ISR)을 탐색
- 💡인터럽트 서비스 루틴(ISR) : 특정 인터럽트를 처리하는 커널 함수
4. 인터럽트 핸들러 실행
5. 인터럽트 처리 후 문맥 복원
- 인터럽트 처리 후, 원래 실행 중이던 프로그램으로 복귀하기 위해
저장했던 문맥(Context)을 복원해 원래 상태로 되돌림
ref.
https://www.scaler.com/topics/operating-system/system-calls-in-operating-system/