[운영체제] Interrupt와 SystemCall

JANG SEONG SU·2023년 8월 13일
0

운영체제

목록 보기
2/4
post-thumbnail

1. 유저/커널 모드

  • 프로그램은 시스템이나 하드웨어에 간섭 또는 악영향을 미칠 가능성이 있기 때문에, 멀티 모드(유저/커널)로 나누어 사용자 및 프로그램이 해당 자원에 쉽게 접근하지 못하도록 보호한다.
  • 응용 프로그램은 실행되는 동안 유저 모드커널 모드를 반복적으로 넘나든다.
  • 시스템에 중요한 영향을 미치는 연산은 커널 모드에서만 실행되도록 함으로써 하드웨어 보안 유지한다.
  • 하드웨어 내부에 존재하는 Mode bit를 통해 구분한다. 모든 비트가 0이면 커널 모드, 1이면 사용자 모드이다.

유저 모드

  • 사용자가 접근할 수 있는 영역을 제한적으로 두고 프로그램의 자원에 함부로 접근하지 못하도록 하는 모드
  • 하드웨어에 직접 접근 불가능하다.
  • 프로그램은 보통 유저모드에서 실행된다.

커널 모드

  • 모든 시스템 메모리 등 하드웨어에 직접 접근 가능하다.
  • 모든 CPU 명령 실행한다.
  • 운영체제 코드나 디바이스 드라이버 같은 커널모드 코드가 실행된다.

2. 인터럽트(Interrupt)

프로그램이 컴퓨터에서 동작하고 있을 때, 입출력 우선 순위가 높은 작업 혹은 예외상황이 발생하여 처리가 필요할 경우 CPU에게 알려주어 처리할 수 있도록 하는 것이다.

인터럽트에는 다음 2가지 종류가 있다.

외부 인터럽트(External Interrupt)

하드웨어 인터럽트이며, CPU의 외부 하드웨어에 의해 발생하는 인터럽트이다. 하드웨어 흐름에 의해 싱기는 인터럽트로, Asynchronous(비동기) 특성을 가지고 있다

🧷종류

  • I/O(입출력) 인터럽트 : 입출력 작업이 종료되어 결과를 반환하거나 오류에 의해 정지되었을 때 발생
  • Power fail(전원 이상) 인터럽트 : 전원이 이상현상에 의해 공급 중단되었을 때 발생
  • Machine check(기계 착오) 인터럽트 : CPU의 기능이 잘못되었을 때 발생
  • External(외부) 인터럽트 : 외부 장치로부터 인터럽트가 오거나 ^C 키 발생, 자원 할당 시간이 끝남을 알리는 타이머에 의해 발

내부 인터럽트(Internal Interrupt)

소프트웨어 인터럽트이며, CPU 내부에서 발생하는 인터럽트이다. Exception라고도 불리며, CPU에서 instruction을 읽으며, 잘못된 명령 혹은 데이터를 사용할 때 발생한다. 프로그램 내부의 명령어에 의하여 고정적인 위치에서 발생하는 인터럽트로 Synchronous(동기적) 특성을 가진다.

🧷종류

  • 프로그램 검사 인터럽트 : 프로그램적으로 발생하는 오류에 의하여 발생( 0으로 나누기, over/under flow, 예외 등)
  • 시스템 콜에 의하여 발생

인터럽트 동작 방식

폴링 방식 : 상태를 주기적으로 검사하여 조건을 만족하면 처리를 하는 방식
인터럽트 방식 : 특정 신호를 발생시켜 운영체제에 처리를 요구하는 방식✔

폴링 방식의 문제점은 주기적으로 검사를 해야 하며 문제가 없더라도 검사를 하기 때문에 CPU가 일을 많이 한다. 그에 비하여 인터럽트 방식은 발생 시에만 처리를 하고 다른 시간에는 다른 작업을 할 수 있기 때문에 효과적으로 관리를 할 수 있다. 따라서 오늘날 거의 모든 컴퓨터가 인터럽트 기반의 시스템을 사용합니다.


3. 시스템 콜(System call)

정의를 보면 운영체제의 커널이 제공하는 서비스에 대해, 응용 프로그램의 요청에 따라 커널에 접근하기 위한 인터페이스이다. 간단하게 말하자면 운영체제 서비스를 접근하기 위한 유일한 수단이다. 프로그램을 실행하거나 프로그램이 컴퓨터 자원을 사용하기 위해서는 시스템 콜을 통해 커널에 자원 사용을 요청을 해야 한다.
(시스템 콜을 할 때는 프로그램이 운영체제에게 스스로 Interrupt80 발생한다.)

시스템 콜의 기능

  • 사용자 모드에 있는 응용 프로그램이 커널의 기능을 사용할 수 있도록 한다. (운영체제 서비스에 접근을 할 수 있게 해준다.)
  • 시스템 호출을 하면 사용자 모드에서 커널 모드로 바뀐다.
  • 커널에서 시스템 호출의 작업이 끝나면 사용자 모드로 돌아간다.

예시

$cp a.txt b.txt            //a.txt를 b.txt에 복사한다.

위 명령어를 실행하면 다음과 같은 과정이 일어난다.

  1. open a.txt, open b.txt : a.txt 파일을 열고 b.txt파일을 새로 만든다.
  2. read a.txt => write b.txt : a.txt의 내용을 읽고 b.txt에 내용을 쓴다.
  3. close a.txt b.txt : 두 파일을 닫는다.

위 과정에서 open 2번, read/write, close 2번 총 6번시스템 콜이 일어났다.

🧷종류

  • 프로세스 제어 : 프로세스를 생성, 중지(fork, exec, exit ...)
    파일 조작 : 파일 생성, 삭제, 속성 관리 등(create, open, close, lseek ...)
  • 장치 관리 : 장치 연결, 방출, 속성 관리 등(open, close, ioctl ...)
  • 정보 유지 : 시간, 날짜 설정, 프로세스와 연결된 파일, 장치 관리 등(time, date, dump, pid ...)
  • 통신 : 통신 연결 생성, 제거, 메시지 송수신 등(open, connect, accept, read, pipe ...), 메모리 공유 방식과 메시지 전달 방식이 있습니다.
  • 보안 : 파일, 사용자 권한 등(chmod, umask ...)

📘시스템 API(Application Programming Interface)

사실 사용자는 보통 시스템 콜을 직접 사용하지 않는다. 대신에 응용프로그램이 OS에 내장되어 있는 High-level language(c/c++/java/..) API를 통해 시스템 콜을 호출한다.

하지만 각 OS의 종류마다 각기 다른 API가 내장되어 있기 때문에, 예를들어, windows에서 실행 가능한 c언어로 만들어진 프로그램을 mac-os나 linux에서 실행할 수 없는 것이다.

즉 정리하자면, windows에서 실행할 수 있는 프로그램은 windows의 API로 시스템 콜을 사용할 수 있도록 만들어졌기 때문에, 다른 API를 갖고 있는 다른 OS에서 사용할 수 없는 것이다.

API 종류
Win32 API : windows용
POSIX API : linux, mac-os용
JAVA API : JVM


profile
Software Developer Lv.0

0개의 댓글