1. 컴퓨터 시스템의 구조
컴퓨터 시스템의 구조는 컴퓨터 내부장치인 CPU, 메모리와 컴퓨터 외부 장치인 디스크, 키보드, 마우스, 모니터, 네트워크 장치등으로 구성된다. 외부장치에서 내부장치로 데이터를 읽어와(입력) 연산을 처리후 그 결과를 외부장치로 내보내는 방식(출력)을 입출력(I/O)이라고 한다.
메모리 및 입출력장치 등의 하드웨어 장치에는 컨트롤러가 있다. 컨트롤러는 일종의 작은 CPU로써 각 하드웨어 장치에서의 제어를 담당한다. 메모리를 제어하는 메모리 컨트롤러, 디스크를 제어하는 디스크 컨트롤러 등이 있다. 운영체제 중 항상 메모리에 올라가 있는 운영체제의 핵심 부분을 커널이라고 한다.
2. CPU 연산과 IO 연산
입출력 장치들의 I/O 연산은 입출력 컨트롤러가 담당하고, 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당한다. 이때, 입출력 장치와 메인 CPU는 동시 수행이 가능하다. 한편 각 하드웨어마다 설치된 컨트롤러는 하드웨어로부터 들어오고 나가는 데이터를 임시로 저장하기 위해 로컬버퍼(local buffer)라는 작은 메모리를 갖고 있다.
디스크나 키보드 등에서 데이터를 읽어오는 경우, 우선 로컬버퍼에 데이터가 임시로 저장된 후 메모리에 전달되는데 이때 장치에서 로컬버퍼로 읽어오는 일을 컨트롤러가 담당한다. 필요한 데이터를 로컬버퍼에 다 읽어왔을 때, 컨트롤러가 인터럽트를 발생시켜 CPU에 보고한다. CPU는 명령(instruction) 하나를 수행할 때 마다 인터럽트가 발생했는지 확인하고 신호가 있으면 자신의 작업을 멈추고 인터럽트와 관련된 일을 먼저 처리한다.
✋ 인터럽트는 키보드 입력 혹은 요청된 디스크 입출력 작업의 완료 등 CPU에 알려줄 필요가 있는 이벤트가 일어난 경우 컨트롤러가 발생시키는 것이다.
3. 인터럽트의 일반적인 기능
운영체제는 하드웨어 및 소프트웨어 자원 관리뿐 아니라 사용자 프로그램에 필요한 서비스도 제공한다. 그래서 운영체제 커널에는 인터럽트가 들어왔을 때 해야 할 일이 미리 프로그래밍되어 그 코드가 보관돼 있다. 이 것을 인터럽트 처리 루틴(interrupt service routine) 혹은 인터럽트 핸들러(interrupt handler)라고 한다.
디스크 컨트롤러가 인터럽트를 발생시키면 CPU가 수행하는 일은 디스크의 로컬버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시해두는 일이다.
하드웨어 인터럽트는 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅하는 반면, 소프트웨어 인터럽트는 소프트웨어가 그 일을 수행한다. 인터럽트가 발생하면, 하던 일을 멈추고 운영체제 커널 내에서 해당 인터럽트 처리를 위해 정의된 코드를 찾는데, 운영체제는 할 일을 쉽게 찾아가기 위해 인터럽트 벡터(interrupt vector)를 가지고 있다.
✋ 인터럽트 벡터란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키는 자료구조를 말한다.
인터럽트 처리루틴을 통해 인터럽트 처리를 완료하고 나면 원래 수행하던 작업으로 돌아가 중단되었던 일을 계속해서 수행하게 된다. 이를 위해, 인터럽트 처리 전에 수행중이던 작업이 무엇이었는지 저장해야 하는데 저장 장소를 운영체제는 별도로 갖고 있다.
통상적으로 인터럽트라고 하면 하드웨어 인터럽트를 의미하고, 소프트웨어 인터럽트는 트랩(trap)이라는 용어로 주로 불린다. 스프트웨어 입터럽트 예로 예외상황(exception)과 시스템 콜(system call)이 있다.
✋ 예외상황은 0으로 나누는 연산 등 비정상적인 작업을 시도하거나 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 말한다. 시스템 콜은 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법이다.
사용자 프로그램 자신의 코드는 직접 CPU를 가지고 실행하지만, 운영체제 커널에 있는 코드를 사용자 프로그램이 실행하고자 할 때에는 인터럽트 라인 세팅을 통해 CPU 통제권을 운영체제로 넘겨 실행하게 되는 것이다.
4. 인터럽트 핸들링
인터럽트 핸들링(interrupt handling)이란 인터럽트가 발생한 경우에 처리해야 할 일의 절차를 의미한다. 프로그램 A가 실행되고 있을 때 인터럽트가 발생하면 A의 현재 상태를 먼저 저장한다. 이 상태를 저장하기 위해 운영체제는 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 프로세스 제어 블록(Process Control Block: PCB)이라는 자료구조를 둔다. PCB는 각 프로그램마다 하나씩 존재하며 해당 프로그램의 어느 부분이 실행 중이었는지를 저장하고 있다. 구체적으로는 프로그램이 실행 중이던 코드의 메모리 주소, 레지스터값, 하드웨어 상태 등이 저장된다.
✋ CPU에서 명령이 실행될 때, CPU 내부 임시 기억장치 레지스터(register)에 데이터를 읽거나 쓴다. 새로운 명령을 실행하면 기존의 레지스터값들이 지워지게 되므로 CPU 내의 이러한 상태를 저장해야 한다.
예를 들어 어떤 프로그램이 실행되던 중에 인터럽트가 발생하면 그 프로그램의 실행 상태를 PCB에 저장한 후 CPU의 제어권이 인터럽트 처리루틴으로 넘어가며, 인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 CPU상에 복원해 인터럽트 당하기 직전의 위치부터 실행이 이어지게 된다. 인터럽트가 발생할 때에만 운영체제 코드 부분으로 CPU가 이양되어 인터럽트 처리를 수행한다. 즉, 오늘날 컴퓨터에서 운영체제는 인터럽트가 발생할 때에만 실행된다.
5. 입출력 구조
입출력(I/O)이란 컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것을 말한다.
동기식 입출력 (Synchronous I/O)
동기식 입출력은 어떤 프로그램이 입출력 요청을 했을 때, 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식을 말한다. 동기식 입출력에서 CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리며 자원을 낭비하게 된다. 따라서 낭비하지 않기 위해 프로그램이 입출력이 수행중인 경우 CPU를 다른 프로그램에게 이양해 CPU가 쉬지 않도록 관리한다. 이때 입출력이 수행중인 프로그램 상태를 CPU가 할당 받을 수 없는 봉쇄 상태(Blocked State)라고 한다.
다만 다른 프로그램에게 CPU를 이양하기에 동기화 문제가 발생할 수 있는데 이때 동기화를 위해 장치별 큐(Queue)를 두어 요청한 순서대로 처리할 수 있도록 한다. 장치마다 큐헤더가 큐를 관리하게 된다. 입출력이 완료될 때까지 CPU가 입출력과 관련 없는 프로그램을 수행하도록 하고 인터럽트로 입출력 연산완료를 전달하게 된다. 이 경우 운영체제 커널은 인터럽트 처리루틴으로 가서 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록 그 프로그램의 상태를 봉쇄 상태로부터 해제시키게 된다.
비동기식 입출력(Asynchronous I/O)
입출력 연산을 요청한 후에 연산이 끝나기를 기다리는 것이 아니라 CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 곧바로 다시 부여하는 방식을 말한다. 즉, CPU의 제어권이 입출력을 요청한 프로세스에게 다시 주어지며, 입출력 연산이 완료되는 것과 무관하게 처리 가능한 작업(데이터를 필요로 하지 않는 작업)부터 처리를 하게 된다. 다만, 비동기식 입출력에서도 입출력 연산이 완료되면 동기식과 마찬가지로 인터럽트를 통해 CPU에게 알려주게 된다. 이시점부터 데이터를 필요로 하는 명령어들을 수행할 수 있다.
6. DMA (Direct Memory Access)
원칙적으로 메모리는 CPU에 의해서만 접근할 수 있는 장치이며, CPU 외의 장치가 메모리의 데이터에 접근하기 위해서는 CPU에 인터럽트를 발생시켜 CPU가 이를 대행하는 식으로만 가능하다. 한편, 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 인터럽트마다 CPU의 업무가 방해를 받아 CPU 사용의 효율성이 떨어지는 문제점이 발생한다. 이러한 비효율성을 극복하기 위해 CPU 이외에 메모리 접근이 가능한 장치를 하나 더 두는 경우가 많은데, 이와 같은 정치를 DMA(Direct Memory Access)라고 부른다. DMA는 일종의 컨트롤러로서, CPU가 입출력 장차들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주는 역할을 한다.
7. 저장장치의 구조
컴퓨터 시스템을 구성하는 저장장치는 주기억장치와 보조기억장치로 나누어볼 수 있다. 주기억장치는 보통 메모리라고 부르며 전원이 나가면 저장되었던 내용이 모두 사라지는 휘발성(volatile)의 RAM을 매체로 사용하는 경우가 대부분이다. 보조기억장치는 전원이 나가도 저장되는 내용을 기억할 수 있는 비휘발성(nonvolatile)의 마그네틱 디스크를 주로 사용한다.
보조기억장치의 용도는 크게 두 가지로 구분된다. 첫 번째는 파일 시스템(file system)용이다. 전원이 나가도 유지해야 할 정보가 있으면 그것을 파일 형태로 보조기억장치에 저장하게 된다. 두 번째 용도는 메모리의 연장 공간인 스왑 영역(swap area)용이다. 운영체제는 프로그램 수행에 당장 필요한 부분만 메모리에 올려놓고 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓게 된다. 디스크에 내려놓는 일을 스왑 아웃(swap out)시킨다고 말하며, 스왑 아웃된 부분이 필요할 때에는 다시 메모리 영역으로 올리게 된다. 스왑 영역은 프로그램이 실행될 때 내용을 저장했다가 프로그램이 종료될 때 삭제하는 메모리의 연장 공간으로서의 역할을 담당하므로 파일 시스템처럼 비휘발성 용도로 사용되는 것과는 역할이 구분된다.
8. 저장장치의 계층 구조
컴퓨터 시스템을 구성하는 저장장치는 빠른 저장장치부터 느린 저장장치까지 단계적인 계층 구초로 이루어진다. 빠른 저장장치는 단위 공간당 가격이 높기 때문에 적은 용량을 사용하며, 느린 저장장치는 가격이 저렴해 대용량을 사용하는 반면 접근 속도가 느리다는 약점이 있다. 따라서 당장 필요한 정보는 빠른 저장장치에 넣어두어 수행 속도를 높이고 그렇지 않은 정보는 상대적으로 느린 저장장치에 보관하게 된다.
저장장치의 계층을 본다면 빠른 순서대로 레지스터, 캐시 메모리, 메인 메모리로 구성되면 이들은 휘발성이다. 그 뒤로는 마그네틱 디스크, 광디스크, 마그네틱 테이프로 구성되며 이들은 비휘발성이다. 여러 캐싱 기법을 이용하여 상대적으로 느린 저장장치에 있는 내용 중 당장 사용되거나 빈번히 사용될 정보를 빠른 저장장치에 선별적으로 저장함으로써 두 저장장치의 사이의 속도를 완충할 수 있다.
9. 하드웨어의 보안
우리가 흔히 사용하는 운영체제는 여러 프로그램이 동시에 실행될 수 있는 다중 프로그래밍 환경에서 동작한다. 그러므로 각 프로그램이 다른 프로그램의 실행을 방해하거나 프로그램 간에 충돌을 일으키는 문제를 막기 위해 하드웨어에 대한 각종 보안 기법이 필요하다.
하드웨어적인 보안을 유지하기 위해 운영체제는 기본적으로 커널모드와 사용자모드 두 가지 모드를 지원한다. 커널모드는 운영체제가 CPU의 제어권을 가지고 운영체제 코드를 실행하는 모드로서, 이 모드에서는 모든 종류의 명령을 다 실행할 수 있다. 반면 사용자모드에서는 일반 사용자 프로그램이 실행되며 제한적인 명령만 수행할 수 있다.
하지만 사용자 프로그램이 CPU를 가지고 있는 동안에는 운영체제가 자신의 코드를 실행하지 못하므로 사용자 프로그램을 감시할 방법이 없어서 하드웨어적인 지원이 필요하다. 그래서 컴퓨터 시스템은 CPU 내부에 모드비트(mode bit)를 두어 사용자 프로그램을 감시하게 된다. 모드비트가 0으로 세팅되어 있으면 커널모드로서 모든 명령을 수행할 수 있고, 모드비트가 1로 세팅되어 있으면 사용자모드로서 제한된 명령만을 수행할 수 있다. CPU는 보안과 관련된 명령을 수행하기 전에는 항상 모드비트를 조사해 그 값이 0으로 세팅된 경우에만 그 명령을 수행한다.
시스템의 보안과 관련된 명령들을 특권명령이라 지칭하며, 특권명령은 모드비트가 0일 때에만 수행할 수 있다.
10. 메모리 보안
여러 프로그램이 메모리에 동시에 올라가서 실행되기 때문에 하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범할 수 있기 때문에 메모리에도 보안이 필요하다. 예를 들어 사용자 프로그램이 운영체제 커널이 위치한 영역을 참조할 수 있으므로 적어도 인터럽트 벡터와 인터럽트 처리루틴이 있는 곳은 보안이 필요하다. 이는 사용자 프로그램이 운영체제만 수행할 수 있는 특권명령을 보안성이 침해되는 이상한 명령으로 변형할 수 있기 때문이다.
이런 문제를 해결하기 위해 프로그램이 접근하려는 메모리 부분이 합법적인지 체크하는 2개의 레지스터를 사용하는데 이를 기준 레지스터와 한계 레지스터라고 한다. 기준 레지스터는 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근할 수 있는 메모리상의 가장 작은 주소를 보관하고 있고, 한계 레지스터는 그 프로그램이 기준 레지스터값부터 접근할 수 있는 메모리의 범위를 보관하고 있다. 즉, 사용자 프로그램은 기준 레지스터에 있는 주소로부터 기준 레지스터 + 한계 레지스터 값까지만 접근할 수 있게 된다. 만일 벗어나게 되면 예외상황이라는 소프트웨어 인터럽트를 발생시키게 된다. 소프트웨어 인터럽트가 발생하게 되면 프로그램으로 부터 CPU의 제어권을 운영체제가 가져가게되고 프로그램을 강제 종료시킨다.
✋ 다만 페이징 기법에서는 2개의 레지스터뿐만 아니라 다른 하드웨어의 지원도 필요하게 된다.
메모리 접근 명령은 특권명령이 아니지만, 올바르지 않은 접근 시도로부터 메모리를 보호하기 위해서는 기준 레지스터와 한계 레지스터의 값을 세팅하는 연산은 특권명령으로 규정해야 한다.
11. CPU 보호
CPU는 컴퓨터 시스템에 하나밖에 존재하지 않기 때문에 특정 프로그램이 부적절한 방법으로 CPU의 사용 권한을 독점하고 있다면 다른 프로그램 및 운영체제가 CPU를 빼앗을 방법이 없게 된다. 이와 같이 CPU가 하나의 프로그램에 의해 독점되는 것을 막기 위해 운영체제는 타이머(timer)라는 하드웨어를 사용한다. 타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 획득할 수 있도록 하는 역할을 수행한다. 이때, 인터럽트 처리루틴은 지금 CPU를 점유하고 있는 프로그램으로부터 CPU를 빼앗아 다른 프로그램에게 CPU를 이양하는 것이다. 한편 타이머는 시분할 시스템에서 현재 시간을 계산하기 위해서도 사용된다.
12. 시스템 콜을 이용한 입출력 수행
입출력 명령은 운영체제 코드에 구현되어 있으며, 사용자 프로그램은 직접 입출력을 수행하는 대신에 운영체제에게 시스템 콜이라는 서비스 대행 요청을 하여 입출력을 수행한다. 시스템 콜은 소프트웨어 인터럽트로서 사용자 프로그램이 시스템 콜을 할 경우 트랩이 발생해 CPU의 제어권이 운영체제로 넘어가게 된다. 그러면 운영체제는 해당 시스템 콜을 처리하기 위한 루틴으로 가서 정의된 명령을 수행한다.
출처
https://product.kyobobook.co.kr/detail/S000001772604
운영체제와 정보기술의 원리 | 반효경 - 교보문고
운영체제와 정보기술의 원리 | 컴퓨터 운영체제와 정보기술의 기본 원리 및 핵심 철학을 큰 틀에서, 풍부한 예시와 함께, 알기 쉽게 설명한 컴퓨터 입문서이 책은 온라인 공개강좌 KOCW에서 꾸준
product.kyobobook.co.kr
'CS > 운영체제' 카테고리의 다른 글
[운영체제와 정보기술의 원리] 5. 프로세스 관리 (0) | 2025.04.27 |
---|---|
[운영체제와 정보기술의 원리] 4. 프로그램의 구조와 실행 (1) | 2025.04.24 |
[운영체제와 정보기술의 원리] 2. 운영체제 개요 (0) | 2025.04.22 |