반효경 교수님의 운영체제 강의를 듣고 정리한 글입니다.
이번 주차 주제 : OS에서 하드웨어 관련된 내용에 대한 개괄적인 설명
컴퓨터 시스템의 구조는 컴퓨터 내부 장치인 CPU, 메모리와 컴퓨터 외부장치(I/O device)인 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등으로 구분된다. 컴퓨터는 외부 장치에서 내부 장치로 데이터를 읽어와(input) 각종 연산을 수행한 후, 그 결과를 외부 장치로 내보내는 방식(output)으로 업무를 처리한다.
메모리는 CPU의 작업공간에 해당한다. 메모리는 CPU가 직접 접근할 수 있는 내부 기억장치로, 특정 프로그램이 CPU에서 실행되기 위해선 해당 부분이 메모리에 올라가 있어야 한다. OS는 컴퓨터가 부팅되었을 때 메모리에 올라가 있는데, 메모리에 상주하고 있는 CPU의 작업공간을 Main Memory
라고 부른다.
device controller는 디바이스 각각을 전담하는 작은 CPU이다. 메모리 및 입출력 장치 등의 각각의 하드웨어 장치에는 Device Controller가 붙어있다.
cf) device driver : CPU가 실행하는 각 디바이스에 접근하기 위한 소프트웨어. OS 코드 중 각 장치 별 처리 루틴.
디바이스 컨트롤러가 데이터를 임시로 저장하기 위한 작업공간이다. (마치 메인 CPU의 작업 공간인 메인 메모리와 같다.) 실제 데이터를 저장한다.
메모리에서
instruction(기계어)를 하나씩 읽어서 실행한다.interrupt
가 들어왔다면, 누가 CPU를 사용하고 있었든 상관없이 CPU 제어권이 OS에게 넘어간다.device controller
에게 시킨다. (왜냐하면, CPU에 비해 디바이스 속도가 매우 느리기 때문에 CPU 낭비를 방지하기 위해서)CPU는 메인 메모리
와 Local Buffer
에 접근할 수 있다.
CPU가 자신의 작업을 하던 도중에 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고 인터럽트와 관련된 일을 먼저 처리한다.
인터럽트 라인
은 I/O device에서 작업을 요청해야 하는지, 작업이 끝났는지 CPU에게 알려주는 역할을 수행한다.
I/O 요청이 들어오면 device controller에게 작업을 시킨다.
메모리보다 더 빠르며 작은 정보를 저장하는 저장공간이다. 레지스터 중 메모리 주소를 가리키는 레지스터인 PC(Program Counter)
가 있다. CPU는 PC가 가리키는 메모리 위치에서 instruction을 읽어 수행한다.
CPU에서 실행되고 있는 게 운영체제인지 사용자 프로그램인지 구분해준다.
사용자 모드
모니터 모드
특정 프로그램이 CPU를 독점하는 것을 막기 위한 장치이다. CPU의 Time sharing
구현을 위해 필요하다.
컴퓨터를 시작하면 처음에 운영체제가 CPU를 가지고 있다가 사용자 프로그램에게 CPU를 넘겨준다. 이 때 Timer에 값을 세팅하고 넘겨준다. 시간이 흘러 timer의 값이 0이 되면 타이머 인터럽트가 발생해서 다른 프로그램에게 CPU를 넘겨준다.
🟡 즉, timer의 시간이 되면 program A에서 OS로 CPU 제어권이 넘어가고 OS는 CPU를 program B가 사용할 수 있도록 할당한다.
DMA : Directly Memory Access
이름에서 알 수 있듯, 메모리에 직접 접근이 가능한 장치이다.
원칙적으로는 메모리는 CPU에 의해서만 접근할 수 있도록 만든 장치이다. CPU 외의 장치가 메모리의 데이터에 접근하려면 CPU에게 인터럽트를 발생시켜 CPU가 대신 컨트롤러의 로컬 버퍼와 메모리 사이에서 데이터를 옮겨주는 작업을 한다. 하지만, 인터럽트가 너무 자주 발생하면 CPU 작업에 방해가 된다. 그래서 CPU 이외의 메모리 접근이 가능한 DMA controller를 둔다.
DMA 컨트롤러는 로컬버퍼에서 메모리로 복사해오는 작업을 CPU 대신 수행해준다. 매 순간 CPU에 인터럽트를 거는 것이 아니라 버퍼에 쌓아두다가 일정 크기 이상이 되면 인터럽트를 발생시키고 로컬버퍼의 내용을 DMA가 메모리로 복사한다.
🟡 결론적으로! CPU는 최종 인터럽트 한번만 걸린다. 이렇게 인터럽트 발생빈도를 줄여서 CPU를 더 효과적으로 사용할 수 있다.
모든 입출력 명력은 특권명령
(운영체제만 사용할 수 있음)에 해당한다.
그럼 사용자 프로그램은 어떻게 입출력을 수행할 수 있을까?
사용자 프로그램은 시스템콜(System call)
을 사용하여 입출력을 수행한다.
시스템콜이란 운영체제에게 I/O를 요청하는 것이다. 즉, 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것이다.
프로그램이 운영체제에게 요청하기 위해 interrupt를 건다. mode bit가 0(모니터모드)으로 설정되어 운영체제에게 CPU가 할당된다.
mode bit가 1인 상태로 사용자 프로그램이 실행되고 있다가 I/O를 해야하는 상황이 오면 바로 OS의 주소로 점프할 수 없다. 그래서 프로그램이 직접 인터럽트 라인을 세팅하고 CPU에게 인터럽트를 보내면 CPU는 mode bit를 0으로 바꾸고 CPU 제어권을 OS로 넘긴다.
OS가 들어온 I/O요청이 올바른 요청인지 확인 후 수행한다.
I/O 요청은
소프트웨어 인터럽트
I/O 종료를 알려주는 것은하드웨어 인터럽트
에 해당한다.
일반적으로 하드웨어 인터럽트를 의미(협의)한다.(소프트웨어 인터럽트는
trap
이라고 많이 표현한다.) 넓게 보면 소프트웨어 인터럽트까지 포함
CPU가 프로그램을 실행하고 있을 때, 입출력 하드웨어 등의 장치나 예외 상황이 발생해서 처리가 필요한 경우에 CPU에게 알리는 일종의 이벤트를 뜻한다.
평소 CPU는 PC가 가리키는 메모리에 있는 instruction을 실행하고 있으며 사용자 프로그램이 제어권을 가지고 있다. 그러다 interupt가 발생할 때만 CPU 제어권이 운영체제에게 넘어간다.
인터럽트 벡터
: 인터럽트 종류마다 실행해야할 함수(인터럽트 처리 루틴)의 주소를 가지고 있음
- (인터럽트 번호, 처리해야할 커널함수의 주소)의 쌍을 가지고 있음
- 인터럽트 종류 별로 점프해야할 주소를 가지고 있는 것이 인터럽트 벡터!
인터럽트 처리 루틴
: 실제로 인터럽트를 처리하는 커널 함수(코드)
- 실제로 해야하는 일!
하드웨어 인터럽트
하드웨어가 발생시킨 인터럽트
소프트웨어 인터럽트
1. Exception : 오류에 의해서 인터럽트 발생(ex. 운영체제 메모리를 접근하려는 시도, 0으로 나누는 연산 등)→interrupt line이 자동으로 세팅됨
2. System call : 사용자 프로그램이 의도적으로 운영체제에게 서비스를 해달라고 요청할 시
CPU 인터럽트 라인에 신호를 보내서 인터럽트를 알려주는 방식은 같다. 다만 하드웨어 인터럽트는 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅하는 반면, 소프트웨어 인터럽트는 소프트웨어가 CPU의 인터럽트 라인을 세팅한다.
http://www.kocw.net/home/cview.do?cid=3646706b4347ef09
https://steady-coding.tistory.com/511