[운영체제] 컴퓨터 시스템 (Computer System)
2022. 8. 4. 13:07ㆍCS/운영체제(OS)
1. 컴퓨터 시스템의 구조
- 내부 장치 : CPU, 메모리 / 외부 장치 : 네트워크 디바이스, 키보드, 마우스, 모니터, 디스크
- 외부 장치에서 내부 장치로 데이터를 읽어와(입력, input) 각종 연산을 처리한 후, 그 연산의 결과를 다시 내부 장치에서 외부 장치로 내보내는(출력, output) 방식의 흐름이다.
- 메모리 및 입출력 장치의 각 하드웨어 장치에는 '컨트롤러'라는 것이 붙어 있다. 이 컨트롤러는 컴퓨터 전체를 제어하는 CPU(중앙처리장치)가 있듯, 각 하드웨어 장치마다 존재하면서 이를 제어하는 작은 CPU라고 볼 수 있다.
- 운영체제의 역할은 여러 프로그램의 동시에 수행되는 시스템을 위한 것이다. 그리고, 이 프로그램들이 실행되기 위해서는 컴퓨터의 메모리 위에 올라가 있어야 한다.
- 이러한 자원들을 관리하는 역할을 수행하기 위해 운영체제는 항상 메모리에 올라가 있어야 하는데 운영체제의 모든 코드들을 메모리에 상주시키는 것은 한정된 메모리의 낭비이다. 따라서, 전체 운영체제 중 핵심적인 부분만 메모리에 상주시키게 되는데 이 핵심적인 부분을 '커널' 이라고 한다.
2. CPU 연산과 I/O 연산
※ 로컬 버퍼(local buffer)
- 컴퓨터의 각 장치에 설치된 장치 컨트롤러는 device로부터 들어오고 나가는 데이터를 임시로 저장하기 위해 작은 메모리를 가지고 있는데 이를 로컬 버퍼라고 한다.
- 디스크나 키보드 등에서 데이터를 읽어온다고 가정했을 때 로컬 버퍼에 데이터가 임시로 저장된 후 메모리에 전달된다.(이 때 device에서 로컬 버퍼로 읽어오는 일은 컨트롤러 담당)
- 예시로, 프로그램이 디스크에서 데이터를 읽어오라는 명령을 내리면, 디스크 컨트롤러가 물리적인 디스크에서 데이터를 읽고 이를 로컬 버퍼에 저장한다. 이 프로그램은 필요로 하는 데이터를 로컬 버퍼로 다 읽어오고 나면 메인 CPU에서는 다음 일을 수행할 수 있게 된다.
- 이 예시에서, 로컬 버퍼로 읽어오는 작업이 끝났는지에 대한 것은 장치 컨트롤러가 인터럽트를 발생시켜 CPU에 보고하는 방식으로 이루어진다. CPU는 명령 하나를 수행할 때마다 인터럽트가 발생했는지 확인하고 인터럽트가 발생했으면 다음 명령을 처리하기 위해 인터럽트 처리를 하게 되고 그렇지 않다면 다음 명령을 계속 수행하게 된다. (인터럽트는 컨트롤러들이 CPU의 서비스가 필요할 때 이를 알리는 방법으로, 키보드 입력 등의 이벤트를 말한다.)
3. 인터럽트
- 인터럽트를 컨트롤러가 발생시키면 CPU는 인터럽트가 들어옴을 인지하고 인터럽트 관련 업무를 수행한다. 운영체제 커널에는 인터럽트가 들어왔을 때 해야 할 일이 미리 다 프로그래밍되어 코드가 보관되어 있다. (운영체제는 하드웨어 및 소프트웨어 자원관리 뿐 아니라 사용자 프로그램에 필요한 서비스도 제공한다. 운영체제의 개발자가 운영체제가 해야 할 일들(인터럽트 처리 루틴)을 미리 프로그래밍해서 커널 내에 포함시켜 두게 된다.)
- 앞선 예에서 디스크 컨트롤러가 인터럽트를 발생시키면 CPU는 이 인터럽트가 발생했을 때 수행하는 코드를 찾아 수행한다. 이 때 수행하는 일은 디스크의 로컬 버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시해두는 일이다.
※ 하드웨어 인터럽트
- 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅한다.
※ 소프트웨어 인터럽트
- 소프트웨어 인터럽트는 트랩(trap)이라는 용어로 자주 불린다. 이 소프트웨어 인터럽트의 예로썬 예외 상황(exception)과 시스템 콜(system call)이 있다.
- 예외 상황 : 사용자 프로그램이 0으로 나누는 연산 등의 비정상적인 작업을 시도하거나, 자신의 메모리 영역 바깥에 접근 시도를 하는 등의 권한이 없는 작업의 처리를 위해 발생시키는 인터럽트
- 시스템 콜 : 사용자 프로그램이 OS 내부에 정의된 코드를 실행하고 싶을 때 OS에 서비스를 요청하는 방법
- 시스템 콜을 실행하고자 할 때는 사용자 프로그램에 정의되어 있지 않은 OS 커널에 있는 코드를 실행해야 하는 것이므로 인터럽트 라인 세팅을 통해 CPU 제어권을 OS로 넘겨 실행하게 된다. 예를 들어, 개발자가 프로그램 작성 중 키보드 입력이나 화면 출력과 같은 입출력 작업을 필요로 하는 경우 이미 존재하는 커널의 코드를 호출하여 처리한다.
- 이들은 모두 CPU 제어권이 사용자 프로세스로부터 OS에 넘겨져서 처리되는데, 이 과정에서 프로그램 코드가 직접 인터럽트 라인을 세팅하는 명령을 실행하여 인터럽트를 발생시키고 제어권이 넘어가게 되는 과정을 거친다.
4. 인터럽트 핸들링
- 인터럽트 핸들링(interrupt handling) : 인터럽트가 발생한 경우에 처리해야 할 일의 절차
- 프로그램 A가 실행되고 있을 때, 인터럽트가 발생하면 먼저 A의 현재 상태를 저장한다. (현재 상태란 CPU에서 실행중인 명령의 메모리 주소를 포함해 몇 가지 부가적인 정보 의미)
- CPU에서 명령이 실행될 때에는 CPU 내부에 있는 임시 기억장치인 레지스터(register)에 데이터를 읽거나 쓰면서 작업을 하는데, 인터럽트가 발생하면 레지스터값이 지워지므로 이러한 상태를 저장해 둘 필요가 있다.
※ 프로세스 제어블록 (PCB, Process Control Block)
- 각각의 프로그램마다 하나씩 존재하며, 해당 프로그램의 어느 부분을 실행중이었는지를 저장하고 있다. (실행중이던 코드의 메모리 주소, 레지스터값, 하드웨어 상태 등)
- 임의의 프로그램이 실행 중 인터럽트가 발생했다고 가정했을 때, 그 프로그램 실행 상태를 PCB에 저장하고 CPU의 제어권이 인터럽트 처리루틴으로 넘어가게 되고, 인터럽트 처리가 끝나면 PCB로부터 저장된 상태를 CPU에 복원해 인터럽트가 발생하기 직전의 위치부터 실행이 이어질 수 있다.
- 오늘날의 운영체제는 인터럽트가 발생할 때만 실행할 수 있다. 인터럽트가 발생했을 경우만 잠깐 CPU의 제어권을 OS가 획득하고 그 이외에는 원래 실행중인 사용자 프로그램이 원하는 만큼 CPU를 계속 점유하고 있게 된다.
5. 입출력 구조
- 입출력(I/O)이란 컴퓨터 시스템이 외부의 입출력 장치들과 데이터를 주고 받는 것.
※ 동기식 입출력
- 동기식 입출력은 어떤 프로그램이 입출력 요청을 했을 때, 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식을 말한다.
- 예시로 프로그램이 디스크에서 어떤 정보를 읽어와달라는 요청을 했을 때 입출력이 완료되고 인터럽트를 통해 그 사실이 전달되고 나서야 CPU의 제어권이 그 프로그램에게 넘어가서 다음 명령을 수행할 수 있다.
- 하지만 문제점은 CPU의 명령 수행속도에 비해 입출력 연산의 속도가 느리기 때문에 입출력이 완료될 때까지 CPU가 대기하는 것은 자원의 낭비를 초래한다. → 따라서 프로그램이 입출력을 수행중이면 CPU를 다른 프로그램에게 이양해 CPU가 쉬지 않고 일할 수 있도록 관리한다.
- 입출력 중인 프로그램에는 CPU를 할당하지 않는다(어차피 입출력중에 명령을 수행하지 못함). 이를 관리하기 위해 OS는 프로그램을 몇 가지 상태로 나누었다. 이 중에 입출력 중인 프로그램은 봉쇄 상태(blocked state)로 전환시킴으로써 CPU를 할당시키지 않고 곧바로 명령을 수행할 수 있는 상태의 프로그램에만 CPU를 할당한다.
▷ 만약 다수의 프로그램이 입출력 연산을 요청한다면??
- 위의 설명대로 CPU의 효율적인 사용을 위해 입출력이 수행되는 동안 다른 프로그램에게 CPU를 양도한다면 동시에 다수의 입출력 연산이 발생할 수 있다.
- 동기성(synchronization)을 보장하기 위해 장치마다 큐를 두어 요청된 순서대로 처리할 수 있도록 한다.
- 위의 그림과 같이 장치마다 큐헤더가 존재하고 장치별로 입출력 수행 순서를 지켜 주기 위한 큐를 관리하고 있다. 컨트롤러는 이 순서에 따라 매 시점 자신에게 주어진 입출력 작업을 처리하게 된다.
- 요청된 입출력 연산이 완료되면 인터럽트를 통해 CPU에게 입출력이 완료되었음을 알리고, 운영체제 커널은 인터럽트 처리 루틴을 통해 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록 그 프로그램의 상태를 봉쇄 상태로부터 해제한다.
※ 비동기식 입출력
- 입출력 연산을 요청한 후에 연산이 끝나기를 기다리지 않고 CPU의 제어권을 입출력 연산을 호출한 그 프로그램에 곧바로 다시 부여한다.
- 입출력 연산과 관련 없는 작업을 먼저 수행하게 된다. 또한 입출력 요청이 디스크에 쓰는 요청이라고 가정하면 더더욱 다음 명령과 상관이 없을 가능성이 높으므로 비동기식 입출력을 사용할 수 있다.
- 동기식 입출력에서는 먼저 OS의 커널로 CPU의 제어권이 넘어와서 입출력 처리와 관련된 커널의 코드가 수행되고, 이 때 입출력을 호출한 프로세스의 상태를 blocked state로 바꾸어 입출력이 완료될 때까지 다시 할당받지 못하도록 한다. 입출력이 완료되면 I/O 컨트롤러가 CPU에게 인터럽트를 발생시켜(하드웨어 인터럽트) 입출력이 완료되었음을 알려주고 OS 커널은 이 프로세스의 봉쇄 상태를 해제시킨다.
- 비동기식 입출력에서는 CPU의 제어권이 입출력을 요청한 프로세스에게 곧바로 다시 주어지며, 입출력 연산과 무관하게 처리 가능한 작업부터 처리한다. 이 경우에도 컨트롤러가 인터럽트를 통해 입출력이 완료되었음을 알리고 프로세스에서 입출력 데이터를 필요로 하는 명령을 수행할 수 있게 된다.
6. DMA (Direct Memory Access)
- 원칙적으로는 메모리는 CPU에 의해서만 접근할 수 있는 장치이다. 따라서 CPU 외의 장치가 메모리에 접근하기 위해서는 CPU에게 인터럽트를 발생시켜 CPU가 이를 대행하는 식으로만 가능하다.
- 컨트롤러가 CPU에게 인터럽트를 발생시키면, CPU는 컨트롤러의 로컬 버퍼와 메모리 사이에서 데이터를 옮기는 일을 하게 된다. 이 때, 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할 때마다 인터럽트에 의해 CPU의 업무가 방해를 받고 CPU의 효율성이 떨어지는 문제점이 발생한다.
- 이런 비효율성을 극복하기 위해 CPU 이외의 메모리 접근이 가능한 장치를 둔 것이 DMA 이다.
- DMA는 일종의 컨트롤러로써 CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주게 된다. (로컬 버퍼에서 메모리로 데이터를 읽어오는 작업을 CPU가 담당하는 것이 아니라 DMA가 담당하게 됨)
7. 저장 장치의 구조
- 주기억 장치 : 보통 메모리라고 부르며 전원이 나가면 저장되었던 내용이 모두 사라지는 휘발성의 RAM을 매체로 사용하는 경우가 대부분이다.
※ 보조기억장치 (전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성의 마그네틱 디스크를 주로 사용)
① 파일 시스템
- 전원이 나가도 유지해야 할 정보가 있으면 그것을 파일 형태로 보조기억 장치에 저장한다. 메모리는 휘발성 매체이기 때문에 비휘발성 매체인 보조기억장치에 저장하게 된다.
② 메모리의 연장 공간인 스왑 영역(swap area)
- 메모리의 크기는 한정적이고 가격이 비싸고 용량이 적은 관계로 다수의 프로그램이 메모리에 올라가 동시에 수행되는 현대의 컴퓨터 환경에서 메모리 공간의 부족은 흔히 발생하게 된다.
- 이 경우 OS는 당장 프로그램 수행에 필요치 않은 부분은 메모리에 올리는 대신 디스크의 스왑 영역에 내려놓게 된다. 이처럼 디스크에 내려놓는 일을 스왑 아웃(swap out)시킨다고 한다.
- 스왑 아웃된 부분이 필요하다면 다시 메모리 영역으로 올리게 된다. 스왑 영역은 하드디스크가 가장 널리 사용된다.
8. 저장 장치의 계층 구조
- 컴퓨터 시스템을 구성하는 저장 장치는 빠른 저장장치부터 느린 저장장치까지 계층 구조로 이루어져 있으며, 빠른 저장장치는 단위 공간 당 가격이 높아 적은 용량을 사용하고 느린 저장장치는 가격이 저렴해 대용량을 사용하는 반면 접근 속도가 느리다는 단점이 있다.
- 당장 필요한 정보만을 상위에 선별적으로 저장하면 하위의 큰 영량의 저장장치를 가지고 있는 것과 비슷한 성능 효과를 낼 수 있음
- 캐싱 기법 : 상대적으로 용량이 적고 빠른 저장장치를 이용해 느린 저장장치의 성능을 향상시키는 총체적 기법을 일컫는다. 예시로, 프로그램의 코드 중 많은 횟수동안 반복되는 코드와 한 번 수행되고 마는 코드가 있다고 할 때, 반복되는 코드를 빠른 저장장치에 올려놓으면 적은 저장공간만으로도 전체 시스템의 평균적인 성능을 향상시킬 수 있다.
9. 하드웨어의 보안
※ 다중 프로그래밍(multi-programming)
- 우리가 흔히 사용하는 운영체제가 동작하는 환경, 여러 프로그램이 동시에 실행될 수 있다.
- 각 프로그램이 다른 프로그램의 실행을 방해하거나 프로그램 간에 충돌을 일으키는 문제를 막기 위해 하드웨어에 대한 각종 보안 기법이 필요하다.
- 하드웨어적 보안을 유지하기 위해 운영체제는 기본적으로 커널모드(kernel mode, system mode)와 사용자 모드(user mode) 두 가지 모드를 지원한다.
- 예시로 어떤 프로그램이 이상한 명령을 수행시켜 다른 프로그램의 메모리 영역이나 파일 영역을 침범하는 경우가 발생할 수 있으므로 중요한 정보에 접근하는 연산은 커널모드에서만 실행되도록 함.
'CS > 운영체제(OS)' 카테고리의 다른 글
[운영체제] 가상메모리 (0) | 2022.08.07 |
---|---|
[운영체제] 메모리 관리 (0) | 2022.08.06 |
[운영체제] CPU 스케줄링 (0) | 2022.08.05 |
[운영체제] 프로세스 관리 (0) | 2022.08.05 |
[운영체제] 프로그램의 구조와 실행 (0) | 2022.08.05 |