[운영체제및실습]10주차 1회차: 인터럽트 처리

2025. 5. 10. 16:42·운영체제및실습

이 시간에는 인터럽트 처리 방법에 대해 다루겠습니다!

 

1. Kernel entry points(커널 진입 방법)

인터럽트는 디바이스가 자신에게 어떤 일이 발생했으니까 처리해달라고 커널에게 요청하는 방법입니다.

컴퓨터 시스템 내에 이벤트(상황)이 발생하면 os에게 알려 운영체제가 신속히 처리하도록 해야 합니다.

발생 가능한 상황 별로 그 상황에 대처하는 코드가 os 내부에 구현되어 있습니다. 따라서 어떤 상황이 생기면 os로 들어와서 해당 이벤트를 처리하는 커널 코드를 실행해야 합니다.

커널에 구현된 상황을 처리하는 코드를 실행하게 만드는 방법이 3가지가 있습니다. 

커널 코드 실행한다는 말은 커널진입방법(=kernel entry points)입니다.

Interrupt, Trap(software interrupt), System call이 있습니다.

 

인터럽트가 걸리면, 커널에게 디바이스가 처리해달라고 신호를 보내는 것이고, 결국 커널이 실행되니까 커널진입 방법이 되는 것입니다.

trap은 software interrpt라고 하는데, interrupt의 한 종류입니다.

System call은 유저 프로세스가 커널에게 시스템콜로 정의된 함수에 해당되는 일을 해달라고 요청하는 방법입니다.

 

interrput에 대해서 먼저 알아봅시다.


2. Interrupt

 

인터럽트는 비동기적인(asynchronous) 이벤트가 발생했다는 사실을 주변 장치가 운영체제에게 알리는 방법입니다.

비동기적이라는 것은 이벤트 발생 시점이 미리 정해지지 않은 경우를 말합니다. 이벤트가 장치에서 언제 발생할지 알 수 없다는 말입니다. 미리 정해진 시점에만 가능하면, 동기적입니다.

인터럽트가 비동기적인 이유는 키보드의 경우, 사람이 언제 입력할 지 모릅니다.

 

인터럽트 관련 하드웨어 구성을 봅시다.

tty라는 키보드 장치에서 입력이 들어왔거나, disk에서 입출력이 끝났다고 하면, 입출력 장치의 컨트롤러가 cpu까지 연결된 컨트롤러를 통해서 이 디바이스 드라이버가 PIC라는 것에 신호를 보내게 됩니다. PIC의 장치에 신호가 올테고, PIC는 신호가 오면, CPU에 핀에 연결된 선으로 신호를 중계합니다. 

이런 장치들 외에 System clock은 별도의 선에 연결됩니다. 그 이유는 클럭은 시간의 흐름을 알려주는 중요한 하드웨어이며, 자주 인터럽트를 걸기 때문에 PIC보다 직접 거쳐서 오는 것이 효율적이기 때문입니다.

CPU는 인스트럭션 하나를 실행한 후에 인터럽트가 걸렸는지 선에 신호를 확인하며, 인터럽트가 안 걸렸으면, 다음 인스트럭션을 실행합니다. 또 마찬가지로 선에 신호가 걸렸는지 확인하는 과정을 거칩니다. 

 

CPU가 어떤 인스트럭션 실행 후 신호가 걸렸다고 가정합시다.

방금 인스트럭션 실행하고 나서 register영역에 중간값이 저장이 되어있는데, 레지스터값을 커널 스택에 저장하고, mode change를 해서 커널에 진입합니다.

 

인터럽트 처리 과정이 나옵니다.

1. 만약, 유저 모드였다면, 커널모드로 변경합니다.(커널 모드였다면, 모드 체인지를 할 필요 없습니다.)

2. 레지스터 안에 있던 cpu값을 커널 스택에 저장합니다.

3. 지금 실행하던 당시의 프로세스 실행을 잠시 중단합니다. 인터럽트 핸들러라는 함수를 실행합니다. 인터럽트 함수가 누가 인터럽트를 걸었는지를 조사합니다. (만약, 유저 프로세스 실행 도중이라면, cpu가 인터럽트 핸들러라는 것을 실행하기 위해 모드 체인지를 한 후, 커널에 들어와서 인터럽트 함수를 진행하며, 커널 모드 안에서 인터럽트가 걸린것이라면 모드 체인지 안 하고 바로 커널 스택에 저장하고 인터럽트 핸들러로 점프를 해서 실행합니다.) 아까, cpu에 클럭으로부터 직접 오는 선에서 신호가 오면, 클럭 인터럽트가 발생한 것이고, pic와 cpu에 연결된 선에서 신호가 오면, cpu는 interrput handler를 실행해 pic에게 물어봐서 몇 번의 장치가 인터럽트를 발생시킨 거냐고 묻고, pic는 몇 번으로부터 신호가 온거다라고 interrput handler에게 표시를 합니다. 고유한 인터럽트 식별 번호인 핀 번호를 이용해서 pic는 tty가 인터럽트를 건 것이다라고 하면 2번이다처럼 번호를 알고서 인터럽트 핸들러에게 말해줍니다. 

 

커널 스택에 저장한다는 것은 앞서 프로세스 관리를 할 때, 커널 스택을 이용하는 방법을 배운 적이 있습니다. 유저 프로그램 실행 시 시스템 콜에 걸린다고 하면, 유저프로그램 실행 당시의 레지스터 값을 커널 스택에 저장하게 됩니다. 또, 인터럽트가 걸리면, 그때 당시의 시스템 콜 당시의 레지스터 값을 위층에 저장하며, 인터럽트를 실행합니다.

 

4. 인터럽트 핸들러는 번호를 받아서 IDT(Interrput Descriptor Table=Interrput Vector Table)에 해당되는 번호에 따라서 테이블의 2번칸으로 가서 tty_interrupt()라는 함수의 주소가 저장이 되어있는데, 이 주소로 점프해서 함수를 실행하게 되며, 실제로 키보드에서 걸린 인터럽트를 처리하는 함수입니다. 특정 장치에 대해서 인터럽트 처리하는 함수를 Interrupt Service Routines(ISR)이라고 부릅니다. => 인터럽트 핸들러는 IDT를 통해 ISR을 불러주는 중간 역할을 하는 것입니다.

 

클럭 인터럽트는 프로세스 관리와 밀접한 관계가 있습니다. 타임 쉐어링에서 타임 슬라이싱이라는 일정한 시간 간격만큼 cpu를 배정한다는 것을 배웠습니다. 일반적으로 유저 프로세스에게는 타임슬라이스의 길이가 100ms입니다. 1/10초입니다. 타임슬라이스가 100ms가 경과하면, 그 cpu를 프로세스로부터 뺏어서 스케쥴링을 거쳐 새로운 프로세스를 정해서 cpu를 줍니다. 타임슬라이스가 다 지났는지 안 지났는지를 어떻게 확인하냐면, 클럭 인터럽트 서비스 루틴에서 합니다. 1ms마다 클럭 인터럽트가 걸리도록 리눅스에서 설정하여, 인터럽트 핸들러가 실행되며, timer_intr()가 실행되게 됩니다. counter값을 1씩 증가시키게 됩니다. 이런식으로 100번의 인터럽트가 걸리면, count=100이 되며, 100인지를 조사합니다. 100이 아니면, 사용자 프로그램으로 다시 돌아가는데, 100번째가 되면, 1ms가 100번 걸렸다는 것이므로 타임슬라이스가 다 경과되었으므로 다른 프로세스로 context switch를 해야 한다는 것입니다. 스케쥴러가 실행되어서 cpu를 뺐어서 새로운 프로세스로 돌아가게 되는 것입니다.

 

이떄, 타임 슬라이스 동안 인터럽트를 1ms마다 걸어서 왜 100번의 인터럽트를 걸리게 만들었을까요?

그 이유는 cpu가 가능한 자주 운영체제를 실행하게 만들려고 했기 때문입니다.

유저 프로그램 실행하는 동안 어쩌면 최장 1/10초 동안 유저 프로그램을 실행하고 커널에 들어가지 않기 때문에 운영체제로서 커널 안에 들어가서 해야 할 시스템 체크(시그널 조사, 미뤄둔 인터럽트 처리, 우선순위 높은 프로세스)를 못하게 됩니다. 그래서 문제를 방지하기 위해 하는 것입니다. 커널에 들어오게 되면, 운영체제로서 해야 할 일을 하고 나오게 됩니다. 

 

운영체제가 24시간 내내 실행되며, 유저 프로그램도 24시간 내내 실행되는 것처럼 느껴지게 됩니다.

 

5. 만약에 예전 인터럽트 처리 도중에 새로운 인터럽트가 도착한다면,

유저 프로그램 실행하다가 인터럽트 걸리면 모드 체인지를 해서 커널로 들어온다라고 했습니다. 그래서 첫번째 인터럽트 실행하고 있었는데, 새로운 인터럽트가 또 걸릴 수 있습니다. 그러면 예전 인터럽트 처리를 중단하고 새 인터럽트를 처리하러 갑니다. 인터럽트 핸들러를 거쳐서 ISR을 실행을 하는데, 이때 실행하는 것이 인터럽트 처리 중 급한 부분을 먼저 실행합니다. 급한 부분 실행하고 끝마치면, 이전 인터럽트의 남은 부분을 실행을 하는데, 또 인터럽트가 걸리면, 새로운 인터럽트를 처리하고 새로운 인터럽트 처리 도중에 또 인터럽트가 걸리면, 인터럽트 걸릴때마다 인터럽트 처리하러 가는 것입니다. 그 이후에 나머지를 처리합니다. 새로운 인터럽트를 걸릴 때마다 바로 가서 처리하도록 구현되어 있습니다. 

인터럽트 처리가 다 끝나면, 바로 유저로 돌아가는 것이 아니라 붉은색 부분인 시스템 관리 일을 한다음에 유저 프로그램으로 돌아갑니다. 

리눅스 운영체제를 예로 들면, System Call/Interrupt실행후에 할 일을 별도로 만들어 놨습니다.

special code block이 있는데 return from interrupt, return from system call이라고 부릅니다. 거기서 하는 일들은 급하지 않은 것들을 인터럽트 처리를 모아놨었는데, 붉은색 코드를 실행하면서 마저 하게 됩니다. 인터럽트 처리를 하러 들어왔을 때, 급한 부분은 먼저 하고, 급하지 않은 부분은 커널에서 나갈 때 실행해서 잠깐 미뤄놓는 것입니다. 새로운 시그널이 도착한 것이 있는지, 새로운 프로세스가 있는지 보고나서 유저 모드로 되돌아 가는 것입니다.


3. Trap Handling

 

 

Trap을 통해 커널로 들어가는데, 트랩은 동기적인(synchronous) 소프트웨어 이벤트가 발생해 os에게 알리는 방법인데, 이때, 동기적이라는 것은 이벤트 발생 시점이 미리 정해져 있는 시간에  그런 일들이 생긴다는 것입니다. 그럼 왜 소프트웨어 이벤트를 동기적이라고 부르냐면, cpu가 소프트웨어를 실행하면서 소프트웨어 인스트럭션을 실행하면서 인스트럭션 실행 사이클 때 인터럽트를 발생시키기 때문입니다.

트랩의 예로는

분모가 0이어서 계산 못 하는 경우,

인스트럭션 안의 유효하지 않은 머신 코드가 들어있어 명령어가 잘못된 경우 os에게 알려서 os가 해결하도록 합니다. 이때에도 프로세스를 종료시킵니다., 

segmentation fault는 메모리 주소가 잘못된 것입니다. cpu안의 인스트럭션을 실행하려고 하는데, 인스트럭션 안의 주소가 허용되지 않은 메모리 영역의 주소라면 접근할 수 없어서 cpu가 미리 체크하고 실행을 중단합니다. 이때에도 os에게 알려서 프로세스를 중단시킵니다.

protection falut의 경우, 내가 갈 수 있는 주소이긴 한데, 그 영역은 읽기만 허용되고, 쓰기는 안 되는 경우에 쓸려고 하는 경우 발생합니다. 이런 경우에도 os에게 알려서 프로세스를 실행 못 하니까 중단하게 만듭니다.

page fault의 경우, 메모리 관리에서 설명할 것입니다. 메모리가 잘못된 것이 아니고, 실행해야 될 내용이 메인 메모리에 안 들어와있어서 os에게 알려서 메모리로 갖고 들어오라고 알리는 것입니다. 이런 경우에는 프로그램 실행을 종료시키지 않고, 해당되는 내용을 메모리로 갖고 들어오는 작업을 시킵니다.

 

trap에 해당되는 이벤트를 감지하는 것은 cpu의 하드웨어입니다. 분모가 zero인지 주소가 잘못된 것인지 cpu가 알게 됩니다. 소프트웨어 인터럽트라고 하지만, 실제로 이벤트를 거는 것은 cpu라는 하드웨어입니다. 결과적으로 os의 trap handler라는 코드를 실행하기 위해 cpu가 자기 자신에게 인터럽트를 거는 것입니다. 

 

트랩이 걸리면, 유저 프로세스 실행하다가 발생하는 것이므로, 프로세스가 중단되고, 커널로 들어가서 처리해야 합니다. 그래서 모드 체인지를 하고 인터럽트 처리 때처럼 레지스터 값을 커널 스택에 저장하고, 인터럽트 핸들러를 실행하며, IDT에서 몇 번 인터럽트인지 알려주고 ISR로 처리하도록 되어있습니다. 그래서 처리 방법은 인터럽트와 같습니다. 트랩을 인터럽트에 속한 것으로 볼 수 있습니다.

 

트랩의 나머지의 경우에는 프로그램을 실행을 중단하는 일이지만, page fault의 경우 메모리 관리자에게 처리하도록 합니다.


마지막으로 시스템 콜이 어떻게 처리되는지 보겠습니다.

4. System Calls Handling

시스템 콜은 유저 프로세스에게 도움을 요청하는 방법입니다.

커널 함수를 불러 유저 프로세스가 원하는 os서비스를 받는 것입니다.

 

프로그램 실행 중에 입출력 인스트럭션도 시스템 콜로 바뀐다고 했습니다.

입력, 출력도 시스템 콜을 부르는 것이고, 입출력 외에도 시스템 콜로 부를 수 있습니다. 자식 프로세스 만들어달라거나, 파일을 열어달라거나, 소켓을 만들어달라거나 하는 것입니다. 

 

유저 프로그램에서 시스템 콜이 등장하면, 프로그램 컴파일 때 컴파일러가 시스템 콜에 해당되는 어셈블리 인스트럭션으로 번역을 합니다. 이런 시스템 콜에 해당되는 어셈블리 인스트럭션으로 컴파일을 하는데, 그 인스트럭션 중에 하나가 바로 인터럽트 0x80이라고 하는 어셈블리 인스트럭션이 들어가 있습니다. 여기 int는 인티저가 아니라 인터럽트를 걸라는 어셈블리 인스트럭션입니다. 0x80이므로 80번 인터럽트를 건다라는 뜻인데, 십진수로 128번입니다. 그래서 IDT의 128번 칸으로 가면, ISR이 있는 주소가 있습니다. system_call()핸들러라는 함수의 주소가 있어서 그 함수로 점프를 하면, 시스템 콜 핸들러가 실행이 되면서 다시 시스템 콜의 고유 번호에 따라 시스템 콜 테이블의 번호로 가서 실제 시스템 콜을 처리하는 함수를 다시 불러줍니다. 이런 식으로 시스템 콜의 경우 인터럽트 같은 방법으로 IDT를 거치지만, 시스템콜 테이블을 한 번 더 거칩니다. 이런 식으로 서로 다른 테이블을 두 번 거쳐서 하는 이유는 시스템 콜은 종류가 많습니다. 255개의 엔트리가 있는데 255칸 있는 IDT에 전부 넣을 수 없어서 두 단계를 거쳐서 합니다. 실제로 인터럽트가 걸리면, 인터럽트 핸들러가 128번 칸에 있는 시스템 콜 핸들러를 불러서 시스템콜(open,read,write, 입출력) 번호로 가면 거기에 실제로 시스템 콜함수의 주소가 있어서 여기서 함수를 실행하게 됩니다. 그래서 자식프로세스를 만드는 코드가 sys_fork()에 구현이 되어있습니다. 시스템 콜 추가하려면, 새로운 시스템 콜에 해당되는 일을 하는 것을 함수로 구현한 다음, 시스템콜의 테이블의 빈 칸 하나를 받고 이 함수의 주소를 빈칸에 기록하면 됩니다. 빈칸의 인덱스 번호가 나오며, 시스템콜테이블의 고유 식별 번호가 되어서 커널에 등록을 하면, 새로운 시스템콜을 위한 커널 함수가 추가된 것입니다. 이런 작업 한 후에 새로 컴파일 하면, 새로운 시스템 콜을 커널 함수에 추가할 수 있게 되는 것입니다.

'운영체제및실습' 카테고리의 다른 글

[운영체제및실습] 10주차 3회차 : I/O제어 : 인터럽트 I/O, DMA  (0) 2025.05.12
[운영체제및실습] 10주차 2회차: I/O제어 : 폴링  (0) 2025.05.10
[운영체제및실습] 9주차 3회차 : 입출력관리 개요  (0) 2025.05.07
[운영체제및실습] 9주차 2회차: 파일 시스템 사례  (0) 2025.05.06
[운영체제및실습] 9주차 1회차: 데이터 블록 관리  (0) 2025.04.29
'운영체제및실습' 카테고리의 다른 글
  • [운영체제및실습] 10주차 3회차 : I/O제어 : 인터럽트 I/O, DMA
  • [운영체제및실습] 10주차 2회차: I/O제어 : 폴링
  • [운영체제및실습] 9주차 3회차 : 입출력관리 개요
  • [운영체제및실습] 9주차 2회차: 파일 시스템 사례
soyun5
soyun5
개발블로그
  • soyun5
    soyun5
    soyun5
  • 전체
    오늘
    어제
    • 분류 전체보기 (67) N
      • 운영체제및실습 (14)
      • 프로그래밍언어개론 (1)
      • 데이터베이스 (0)
      • 클라우드 (0)
        • 2025 AWS Cloud 초급특강 (0)
      • 스터디 (23)
        • 2024하계모각코 (10)
        • 2024동계모각코 (13)
      • 웹개발 (0)
        • HTML, CSS, 자바스크립트 (0)
      • PS (0)
        • 백준 (0)
        • 프로그래머스 (0)
      • 앱개발 (0)
        • flutter (0)
      • C (0)
      • java (0)
        • 자료구조 (0)
        • 알고리즘 (0)
      • 깃허브 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글쓰기
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    운영체제
    Directory
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
soyun5
[운영체제및실습]10주차 1회차: 인터럽트 처리
상단으로

티스토리툴바