OS #3 Interrupt & System Call

김태준·2023년 3월 6일
0

CS & OS Study

목록 보기
6/12
post-thumbnail

실행 중인 두 프로세스의 경우, CPU를 어떻게 점유하게 되는 것인지 의문이 들 수 있다.
두 프로세스를 번갈아가면서 CPU를 점유하도록 하는데, 주체는 OS고 이를 CPU 스케줄링을 통해 관리하게 된다. 이는 OS도 CPU를 점유해야 스케줄링을 수행하는 것을 의미하고 프로세스 자체적으로 OS에게 CPU를 양보하진 않는다. OS에서 위 상황을 기반으로, 입출력 장치들의 입력 사항들이 실시간으로 화면에 출력되며 관리되어야 하는데, 이를 인터럽트 라는 메커니즘을 통해 관리한다.
즉, 주변 장치와 입출력 장치는 CPU나 메모리와 달리 인터럽트를 통해 관리된다.

✅ 인터럽트

: 프로그램을 실행하는 도중에 예기치 않은 상황이 발생할 경우 현재 실행 중인 작업을 즉시 중단하고 발생한 상황에 대해 우선 처리가 필요함을 CPU에게 알리는 것
현재 수행 중인 작업보다 더 중요한 작업(입출력, 우선 순위 연산)이 발생하면 해당 작업을 먼저 처리한다.

사용하는 이유는 ?

입출력 연산이 CPU 명령 수행속도보다 현저히 느리기 때문
종류는 다음과 같다.

  • ✍️ 하드웨어 인터럽트
    : 하드웨어에서 발생하는 이벤트에 대한 인터럽트, 외부 요인에 대한 인터럽트로 발생 시기 예측 하지 못하기에 비동기적인 프로세스를 갖는다.
    ex ) 입출력 장치, 타이머
  • ✍️ SW 인터럽트
    : 프로그램 처리 중 명령의 요청에 의해 발생한 것, SW가 내부적으로 발생시키는 인터럽트 (SVC 인터럽트), SW 인터럽트는 종종 Exception이라 부르며 이 중 특이 케이스로 trap이 존재한다.

일반적인 exception들은 의도치 않게 발생되지만, trap은 의도적으로 발생, 동기적인 프로세스를 가짐

ex ) 사용자가 프로그램 실행 시 발생, SW 이용 중 타 프로세스 실행시키면 시분할 처리 위해 자원 할당 동작 수행, 예외 상황, System Call

인터럽트를 발생시키기 위해 하드웨어/소프트웨어는 CPU내에 있는 인터럽트 라인을 세팅하여 발생시키고, CPU는 매번 명령 수행 전에 인터럽트 라인이 세팅되어있는지를 검사한다.

🎈 인터럽트 발생 처리 과정

  • 주 프로그램 실행되다가 인터럽트가 발생한 경우
  • 현재 수행중인 프로그램 중단 후 상태 레지스터, PC등을 스택에 잠시 저장 후 인터럽트 서비스 루틴으로 간다(잠시 저장 이유: 인터럽트 서비스 루틴 끝난 뒤 원래 작업으로 돌아가야 하기 때문)
  • 인터럽트 기능이 없다면?
    : 컨트롤러는 특정한 어떤 일을 할 시기를 알기 위해 계속 체크 필요(Polling)
  • 폴링 시간에는 많은 기능 제대로 수행 불가

🎈 컨트롤러가 입력을 받는 방법(우선순위 판별방법)

  • ✍️ 폴링 방식
    : 사용자가 명령어를 사용해 입력 핀 값을 계속 읽어 변화를 알아내는 방식
    인터럽트 요청 플래그를 순차적으로 비교하여 우선순위가 가장 높은 인터럽트 자원을 찾아 이에 맞는 인터럽트 서비스 루틴을 수행 (하드웨어에 비해 속도가 느림)

  • ✍️ 인터럽트 방식
    : MCU 자체가 하드웨어적으로 변화를 체크해 변화 시에만 일정한 동작을 하는 방식
    Daily Chain // 병렬 우선순위 부여
    인터럽트 방식은 하드웨어저로 지원을 받아야 하는 제약이 있지만, 폴링에 비해 신속 대응 가능하므로 실시간 대응 필요할 때 필수적인 기능
    💯 인터럽트는 발생시기를 예측하기 힘든 경우에 컨트롤러가 가장 빠르게 대응할 수 있는 방법

✍️ 인터럽트와 특권 명령

  1. 명령어 종류
  • 일반 명령 : 메모리에서 자료를 읽어오고, CPU에서 계산을 하는 등의 명령, 모든 프로그램이 수행할 수 있는 명령
  • 특권 명령 : 보안이 필요한 명령으로 입출력 장치, 타이머 등의 장치를 접근하는 명령 (OS만 수행가능)
  1. kernel mode vs user mode
    OS는 하드웨어적 보안을 유지하기 위해 두 가지 operation 지원
  • kernel mode : OS가 CPU의 제어권을 가지고 명령을 수행하는 모드로 일반 명령, 특권명령 모두 수행 가능
  • user mode : 일반 사용자 프로그램이 CPU 제어권을 가지고 명령을 수행하기에 일반 명령만 수행 가능

user mode에서 특권 명령을 수행할 수 없기에 사용자 프로그램은 입출력 장치에 접근하는 명령 수행할 수 없다. 이런 경우, 사용자 프로그램은 OS에게 시스템 콜을 통해 특권명령을 대신 수행해달라고 요청한다. 시스템 콜의 경우 주소 공간 자체가 다른 곳(kernel의 code 영역)으로 이동해야 하므로 프로그램이 인터럽트 라인에 인터럽트를 세팅하는 명령을 통해 이루어진다.

  • 시스템 콜은 커널 영역의 기능을 사용자 모드가 사용 가능하도록, 즉 프로세스가 하드웨어에 직접 접근해서 필요한 기능을 사용할 수 있게 해준다.

참고 사항

OSTP

✅ 시스템 콜

OS는 사용자에게 최대한 자유를 보장해야하고 그 와중에 시스템에 대한 공격도 대비해야 한다.
따라서 OS는 USER MODE 권한을 통해 사용자에게 자유를 보장하는 한편, kernel 모드 권한을 통해 시스템 위협에 대비해야 한다.
시스템 콜은 user mode, kernel mode 사이에서 사용자가 전달하는 주문서인 셈
시스템 콜 사용 시 다음과 같은 이점이 존재한다.

  • 시스템에 위협이 될만한 작업을 OS가 수행하기에 보안적인 측면에서 이점 존재
  • 프로그래머는 kernel 내부 구현에 대해 알 필요 없이 잘 추상화된 시스템 콜 인터페이스를 호출하기만 하면 되므로 개발 난이도 측면에서 이점이 존재

아래 사진은 open() 시스템 콜 호출 시 OS에서 어떻게 처리되는지 보여주는 과정

  • 통상적으로 시스템 콜은 여러 종류의 기능으로 나뉘어져 있다.
  • 각 시스템 콜에는 번호가 할당되고 시스템 콜 인터페이스는 이러한 번호에 따라 인덱스 되는 테이블을 유지한다.
  • 시스템 콜 인터페이스는 의도하는 시스템 콜을 부르고 시스템 콜의 상태와 반환 값을 돌려준다.

필요한 기능이나 시스템 환경에 따라 시스템 콜이 발생할 때 좀 더 많은 정보가 필요할 수 있다.
그러한 정보가 담긴 매개변수를 OS에 전달하기 위해선 3가지 정도의 방법이 있다.
1. 매개변수를 CPU레지스터 내에 전달한다. 이 경우에 매개변수의 갯수가 CPU 내 총 레지스터 개수보다 많을 수 있다.
2. 위와 같은 경우에 매개변수를 메모리에 저장하고 메모리 주소가 레지스터에 전달한다.
3. 매개변수는 프로그램에 의해 stack으로 전달될 수 도 있다.

두번째나 세번째 방법의 경우 전달되는 매개변수의 개수나 길이에 제한이 없기 때문에 몇몇 운영체제에서 선호하는 방식이다.

✍️ 시스템 콜의 유형

1) 프로세스 제어(프로세스 컨트롤)

  • 끝내기(end), 중지(abort), 적재(load), 실행(exectue)
  • 프로세스 생성(create process), 프로세스 속성 획득과 설정, 시간 대기, 사건 대기, 사건을 알림, 메모리 할당 및 해제(mallokc, free), fork(), exit(), wait()
    2) 파일 조작(파일 매니지먼트)
  • 파일 생성, 파일 삭제 (open(), read(), write(), close())
  • 열기, 닫기, 읽기, 쓰기, 위치 변경
  • 파일 속성 획득 및 설정
    3) 장치 관리(디바이스 매니지먼트)
  • 장치를 요구, 방출 (icotl(), read(), write())
  • 읽기, 쓰기, 위치 변경, 장치 속성 획득, 설정
  • 장치의 논리적 부착, 분리
    4) 정보 유지(관리)
  • 시간과 날짜의 설정, 획득, 시스템 데이터의 설정과 획득 (getpid(), alarm(), sleep())
  • 프로세스 파일, 장치 속성의 획득 및 설정
    5) 통신 pipe(), shm_open(), mmap()
  • 통신 연결 생성, 제거, 메시지 송신 수신, 상태 정보 전달, 원격 장치의 부착 및 분리
    +) 일반적인 통신 모델에는 메시지 전달과 공유 메모리 두가지가 있다. 메시지 전달 모델에서는 두 프로세스 통신에 정보 교환을 위한 메시지, 공유 메모리 모델에서는 다른 프로세스가 소유한 메모리에 접근을 위해 특정 시스템 콜을 호출
    6) 보호
  • 권한 관리
  • chmod(), umask(), chown()

💯 시스템 콜 작동 방식

시스템 콜은 내부적으로 trap을 이용한다.
user mode 프로세스에서 시스템 콜 함수를 호출하면 시스템 콜은 trap을 발생시킨다.
이때 기존 프로세스 정보는 PCB에 저장된 채 kernel mode로 권한이 격상되고 호출된 system call 작업을 OS가 수행한다.
해당 작업은 kernel stack에서 수행되고 수행 완료 시 해당 공간이 제거된다.
작업 완료 시 PCB를 통해 기존 프로세스를 복원하고 시스템 콜에 대한 결과를 반환하며 작동이 끝난다.

💯 시스템 콜 실습

fork() : 새로운 프로세스를 생성하기 위한 시스템 콜, 부모 프로세스를 복제
wait() : 부모 프로세스에서 자식 프로세스가 종료될 때까지 기다려야되는 상황에서 사용
exec() : 다른 프로그램을 실행해야할 때 호출되는 시스템 콜 (새로운 프로세스 생성 X)
아래 깃허브를 참고하면 이해가 더 쉬울 것이다.
System Call Example

profile
To be a DataScientist

0개의 댓글