ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SW 정글 63일차] 예외 상황
    기타/SW 사관학교 정글 2021. 10. 5. 02:57

    오늘은 새로운 주차를 시작하기 전에 컴퓨터 시스템 8장 예외적인 제어흐름을 읽으면서 안 내용들을 정리하려고 한다.

    이전에 읽은 적이 있지만 이번에 다시 읽으면서 제대로 나의 것으로 만들려고 노력했다.

     

     

     

    1. 예외 상황

    책에 나온 예외 상황에 대한 정의를 말하기 전에 내가 책을 읽고 이해한 예외 상황에 대해 말하려고 한다.

    우리는 어떠한 프로그램을 실행하고 그 프로그램은 프로세스가 된다.

    프로세스에는 인스트럭션(instruction)들이 존재하고 인스트럭션이 순차적인 흐름으로 진행하면서 예기치 못한 상황을 접할 수 있다.

    예를 들면, 0으로 나누는 연산을 한다던가, 메모리 상에 접근 불가한 영역을 접근하려고 한다던가 등..

    이러한 상황들을 예외 상황이라고 생각한다.

     

    예외 상황은 부분적으로는 하드웨어와 운영체제에 의해서 구현된 예외적인 제어흐름의 한 가지 형태이다.

    즉, 하드웨어를 설계한 사람이나 운영체제를 설계한 사람이 어떠한 여러 예외 상황들에 대해 정의했다는 것이다.

     

    그러면 예외 상황이 일어났을 때 어떠한 흐름이 이루어지는지 알아보자.

    출처 : 컴퓨터 시스템 p.696

    프로세서가 어떠한 인스트럭션 Icurr을 실행하고 있을 때, 프로세서 상태에 변화가 일어났고 이를 이벤트라고 부른다.

    프로세서가 이벤트가 발생했다는 것을 감지하면 예외 테이블을 통해 발생한 이벤트를 처리하기 위해 서브루틴(예외처리 핸들러)으로 간접 프로시저 콜을 하게 된다.

    예외처리 핸들러가 처리를 완료하면 이벤트의 종류에 따라 아래의 세 가지 일 중 한 가지 일을 진행한다.

    1. 현재 인스트럭션(Icurr) 즉, 이벤트가 발생했을 때 실행되고 있던 인스트럭션으로 되돌린다.

    2. 에외상황이 발생하지 않았으면 다음에 실행되었을 인스트럭션인 Inext로 돌려준다.

    3. 프로세스를 종료한다.

     

    그러면 이제 예외 상황이 발생했을 때 어떠한 예외 처리가 진행되는지 알아보자.

     

     

     

     

    2. 예외 처리

    하나의 시스템 내에서는 발생할 수 있는 예외상황의 종류마다 중복되지 않는 양의 정수 예외번호로 할당하고 있다.

    이 예외번호는 프로세서 설계자가 부여하기도 하고 운영체제 커널 설계자가 부여하기도 한다.

    이렇게 부여한 예외번호에 대한 각각의 예외처리 핸들러 코드의 주소를 가지는 예외 테이블이 존재한는데 이 예외 테이블은 부팅 시에 운영체제가 항당하여 초기화를 진행한다.

     

    예외 상황이 발생이 되면 그에 대응하는 예외 번호 K를 결정하고 예외 테이블의 엔트리(행이라고 생각하면 편할듯하다) K를 통해서 예외 처리 핸들러에게 간접 프로시저 콜이 간다.

    이 상황을 보면 어떻게 예외 테이블의 위치를 알 수 있을까하는 의문이 든다.

    알 수 있는 방법은 프로세서 내에 있는 레지스터에 저장된 예외 테이블 베이스 레지스터에 예외 테이블이 저장이 되어있고 예외 번호와의 연산을 통해 예외 테이블의 어떠한 위치에 해당하는 예외 번호에 대한 정보가 있는지 알 수 있다.

     

    위에서 보았지만 어떠한 예외 처리를 한 후에는 세 가지 일 중 한 가지 일을 진행한다고 했는데 이를 위해 핸들러로 분기하기 전에 스택에 리턴주소를 푸시한다.

     

     

     

     

    3. 예외의 종류

    우리는 예외 상황과 그에 대해 예외 상황이 어떻게 처리되는지 알아봤다.

    그러면 예외 상황에는 어떠한 종류들이 있을까?

    예외 상황에는 인터럽트, 트랩, 오류(fault), 중단(abort) 4가지가 존재한다.

     

    - 인터럽트

    인터럽트는 프로세서 외부에 있는 입출력 디바이스로부터의 시그널의 결과로 비동기적으로 발생하는 예외이다.

    여기서 비동기적이라는 말은 특정 인스트럭션을 실행해서 발생하는 것이 아니라는 것이다.

    인터럽트를 발생할 수 있는 것은 네트워크 어댑터에 데이터가 수신되었다거나 디스크 컨트롤러에서 어떠한 데이터가 푸시되었다는 것을 알려주거나 타이머 칩이 타이머가 다 돌았다는 것을 알려주는 경우들이 있다.

     

    - 트랩과 시스템 콜

    트랩은 의도적인 예외상황으로 어떠한 인스트럭션을 실행한 결과로 발생한다.

    트랩을 처리하기 위한 트랩 핸들러는 다음 인스트럭션으로 리턴한다.

    트랩이 발생하면 사용자 프로그램과 커널 사이의 프로시저와 유사한 인터페이스를 제공하는 시스템 콜을 사용한다.

     

    - 오류(fault)

    오류는 핸들러가 정정할 수 있을 가능성이 있는 에러 조건으로부터 발생하는 것이다.

    오류가 발생하면 프로세서는 제어를 핸들러로 이동해주고 핸들러가 에러 조건을 정정할 수 있다면 제어를 오류를 발생시킨 인스트럭션으로 돌려주어서 거기서부터 재실행시킨다.

    만약에 정정할 수 없다면 핸들러는 커널 내부의 abort 루틴으로 리턴해서 오류를 발생시킨 응용프로그램을 종료시킨다.

     

    - 중단(abort)

    중단은 복구할 수 없는 치명적인 에러에서 발생하는 것이다.

    abort가 발생하면 핸들러는 응용프로그램으로 제어를 리턴하지 않고 종료시킨다.


    [오늘 하루는 어땠을까?]

    이전부터 진행했던 아침에 일찍 나와서 알고리즘 문제풀기 스터디가 조금 변형되어 30분 더 일찍 나와 어제 푼 문제를 다시 풀고 새로운 문제를 풀도록 개선했다.

    그러기 위해서는 8시에 나왔어야했는데 하고있던 공부가 마무리 되지 않아 오늘은 8시 30분까지 나간다고 스터디원들에게 말했다.

    그런데 8시 30분까지도 나가지 못했다....

    이유는 룸메 형이랑 얘기를 하다보니 시간이 흘렀고 잠 자는 시간이 생각보다 부족했다.

    그래서 알람을 듣고 일어났을 때 5분만 더자야지 한게 9시가 되어버렸다.

     

    솔직히 룸메 형이랑 말한 것은 나에게 어떻게든 핑계를 대고 싶은 것이고 그냥 내가 해이헤지고 의지가 없었던 것이다.

    우리 스터디의 이름은 "기강확립"인데 진짜 기강이 해이헤졌다...

    내일은 꼭 8시까지 나가서 부족한 코딩테스트 준비를 해야겠다.

     

    다시 빡세게 나를 굴리자.

    댓글

Designed by Tistory.