일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 징검다리 건너기
- 호텔 방 배정
- Spring Boot
- 트라이 #trie #알고리즘
- 불량 사용자
- Open API
- 크레인 인형뽑기 게임
- 티스토리
- 티스토리 open api
- 튜플
- 트라이
- bulk update
- jdbc
- 프로그래머스
- 보행자 천국
- Python
- 가사 검색
- 카카오 인턴
- CleanCode
- 알고리즘
- Tistory
- pycon
- trie
- Today
- Total
택시짱의 개발 노트
3장 - 컴퓨터 시스템의 동작 원리 본문
www.yes24.com/Product/Goods/90124877
반효경 교수님이 출판하신 운영체제와 정보기술의 원리를 참고하여 작성하였습니다.
1. 컴퓨터 시스템의 구조
컴퓨터 시스템의 구조는 컴퓨터 내부장치인 CPU, 메모리, 컴퓨터 외부 장치인 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등으로 구성 된다.
컴퓨터 내부로 데이터가 들어오는 것을 입력(input)이라 하고, 컴퓨터 외부장치로 데이터가 나가는 것을 출력(output)이라고 한다.
메모리 및 입출력장치 등의 각 하드웨어 장치에는 컨트롤러라는 것이 붙어 있다. 컨트롤러는 일종의 작은 CPU로서, 컴퓨터 전체에 CPU라는 처리장치가 있듯이 컨트롤러는 각 하드웨어 장치마다 존재하면서 이들을 제어하는 작은 CPU라고 할 수 있다.
2. CPU 연산과 I/O 연산
컴퓨터에서 연산을 한다는 것은 CPU가 무언가 일을 한다는 뜻이다. 입출력 장치들의 I/O 연산은 입출력 컨트롤러가 담당하고, 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당한다. 이때 입출력 장치와 메인 CPU는 동시 수행이 가능하다.
각각의 장치를 제어하기 위해 설치된 장치 컨트롤러는 각각의 장치로부터 들어 오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리를 가지고 있는데 이를 로컬버퍼(local buffer)라고 부른다.
예를 들어 디스크나 키보드 등에서 데이터를 읽어오는 경우, 우선 로컬버퍼에 데이터가 임시로 저장된 후 메모리로 전달된다. 이때 장치에서 로컬버퍼로 읽어오는 일은 컨트롤러가 담당한다.
CPU에서 장치로부터 데이터를 가지고 오는 순서는 다음과 같다.
1. 프로그램 X가 수행 중에 디스에서 데이터를 읽어오라는 명령을 내린다.
2. 디스크 컨트롤러가 물리적인 디스크에서 내용을 읽어 이를 로컬버퍼에 저장한다.
3. 원하는 데이터를 로컬버퍼로 다 읽어 오고 나면 프로그램X는 자신이 필요로 하는 데이터를 다 읽어왔으므로 메인 CPU에서 다음 일을 수행 할 수 있다.
CPU는 필요한 데이터가 로컬버퍼에 준비가 되어있는지 알수 없기 때문에 이때 필요한 데이터를 다 읽어 왔다라는 신호를 발생 시켜야 되는데 이 신호를 인터럽트(interrupt) 라고 한다. 이러한 인터럽트를 발생 시키는 주체는 입출력 장치를 관리하는 컨트롤러가 발생 시키게 된다.
CPU는 필요한 데이터가 준비 되어 있는지 즉 신호가 발생했는지 확인 하기 위해 명령 하나를 수행할 때마다 인터럽트가 발생했는지 확인하게 된다.
3. 인터럽트의 일반적 기능
인터럽트에는 하드웨어 인터럽트와 소프트웨어 인터럽트가 있다.
하드웨어 인터럽트는 컨트롤로 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅하고
소프트웨어 인터럽트는 소프트웨어가 CPU의 인터럽트 라인을 세팅한다.
통상적으로 인터럽트라고 하면 하드웨어 인터럽트를 의미하게 된다.
소프트웨어 인터럽트는 트랩(trap)이라는 용어로 주로 불린다. 소프트 웨어 인터럽트의 예로는 예외상황(exception)과 시스템 콜(system call)이 있다.
예외상황이란 사용자 프로그램이 0으로 나누는 연산 등 비정상적인 작업을 시도하거나, 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도할 때 이에 대한 처리를 위해 발생시키는 인터럽트를 말한다.
시스템콜이란 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고자 할때 운영체제에 서비스를 요청하는 방법이다.
시스템콜의 예를 들면 애플리케이션 개발자가 프로그램 작성 중 키보드 입력이나 화면 출력 등의 입출력 작업이 필요한 경우 본인이 직접 입출력을 수행하는 코드를 작성하는 것이 아니라 이미 존재하는 커널의 코드를 호출해서 처리한다.
4. 인터럽트 핸들링
인터렙트 핸들링(interrupt handling)이란 인터럽트가 발생한 경우에 처리 해야 할 일의 절차를 의미한다.
프로그램 A가 실행되고 있을 때 인터럽트가 발생하면 A의 현재 상태를 먼저 저장한다. 이때 현재 상태란 현재 CPU에서 실행 중인 명령의 메모리 주소를 포함해 몇 가지 부가적인 정보들을 의미한다.
CPU에서 명령이 실행될 때에는 CPU 내부에 있는 임시 기억장치인 레지스터(register)에 데이터를 읽거나 쓰면서 작업을 하는데, 이때 인터럽트가 발생해 새로운 명령을 실행하면 기존의 레지스터값들이 지워지게 되므로 CPU 내의 이러한 상태를 저장해두어야 한다.
5. 입출력 구조
입출력(I/O)이란 컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것을 말한다. 이때 입출력 방식에는 동기식 입출력과 비동기식 입출력이 있다.
동기식 입출력은 어떤 프로그램이 입출력을 요청 했을때 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식을 말한다.
동기식 입출력에서 CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리기 때문에 CPU의 자원을 낭비하게 된다.
자원을 낭비하게 되는 큰 이유는 입출력 장치에서 수행하는 연산의 속도가 CPU에서 수행하는 연산의 속도에 비해 상대적으로 느리기 때문이다.
이러한 자원의 낭비를 막기 위해서 CPU는 프로그램 A의 입출력을 기다리는 동안 CPU를 빼앗아 프로그램 B가 CPU를 할당 할 수있도록 한다.
비동기식 입출력은 입출력 연산을 요청한 후에 연산이 끝나기를 기다리는 것이 아니라 CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 곧바로 다시 부여하는 방식을 말한다.
비동기식 입출력을 사용하는 예로는 입출력 요청이 디스크에서 읽어오는 요청이 아니라 디스크에 쓰는 요청이라면 쓰기 작업이 완료되기 전에도 다음 명령을 수행할 수 있는 상황이 있다.
6. DMA
원칙적으로 메모리는 CPU에 의해서만 접근할 수 있는 장치이다. 하지만 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할 때마다 인터터럽를 발생 시켜 CPU의 업무를 방해하게 되면 CPU 사용의 효율성이 떨어질 수 있다. 이러한 문제를 해결하기 위해 CPU 이외에 메모리 접근이 가능한 장치를 하나더 두는 경우가 있는데 이를 DMA(Direct Memory Access)라고 한다.
DMA는 일종의 컨트롤러로서, CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주는 역활을 한다.
DMA를 사용하게 되면 로컬버퍼에서 메모리로 읽어오는 작업을 CPU가 담당하는 것이 아니라 DMA가 대행함으로써 CPU는 원래 하던 작업을 멈추고 인터럽트를 처리할 필요가 없어지게 된다. 그러므로 CPU에 발생하는 인터럽트의 빈도를 줄여 CPU를 좀더 효율적으로 관리하고 입출력 연산을 빠르게 수행할 수 있게 된다.
7. 저장장치의 구조
컴퓨터 시스템을 구성하는 저장장치는 주기억장치와 보조기억장치로 나누어볼 수 있다.
주기억장치는 보통 메모리라고 부르며 전원이 나가면 저장되었던 내용이 모두 사라져버리는 휘발성(volatile)의 RAM을 매체로 사용하는 경우가 대부분이다.
보조기억장치는 전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성(nonvolatile)의 마그네틱 디스크를 주로 사용한다.
8. 저장장치의 계층 구조
컴퓨터 시스템을 구성하는 저장장치는 빠른 저장장치부터 느린 저장장치까지 단계적인 계층 구조로 이루어진다.
빠른 저장장치는 단위 공간당 가격이 높기 때문에 적은 용량을 사용하며, 느린 저장장치는 가격이 저렴해 대용량을 사용하는 반면 접근 속도가 느리다는 단점이 있다. 따라서 당장 필요한 정보는 빠른 저장장치에 넣어두어 수행 속도를 높이고 그렇지 않은 정보는 상대적으로 느린 저장장치에 넣어둔다. 이러한 장단점을 가진 두 저장장치를 효율적으로 사용할수 있는 기법으로는 캐싱기법이 있다.
캐싱 기법이란 상대적으로 용량이 적은 빠른 저장장치를 이용해 느린 저장장치의 성능을 향상시키는 총체적 기법을 일컫는다.
캐싱 기법은 상대적으로 느린 저장장치에 있는 내용 중 당장 사용되거나 빈번히 사용될 정보를 빠른 저장장치에 선별적으로 저장함으로써 두 저장장치 사이의 속도를 완충 시킨다. 빠른 저장장치에 빈번히 사용될 정보를 저장하면 필요한 정보를 빠른 저장장치에서 곧바로 찾을 수 있는 경우가 많아져 전체적인 성능이 향상된다.
9. 하드웨어의 보안
우리가 흔히 사용하는 운영체제는 여러 프로그램이 동시에 실행될 수있는 다중 프로그래밍(multi-programming) 환경에서 동작한다. 그러므로 각 프로그램이 다른 프로그램의 실행을 방해하거나 프로그램 간에 충돌을 일으키는 문제를 막기 위해 하드웨어에 대한 각종 보안 기업이 필요하다.
하드웨어적인 보안을 유지하기 위해서 운영체제는 기본적으로 커널모드(kernel mode, system mode)와 사용자모드(user mode)의 두 가지 모드를 지원한다.
커널모드는 운영체제가 CPU의 제어권을 가지고 운영체제 코드를 실행하는 모드로써 중요한 정보에 접근해 위함한 상황을 초래할 수 있는 연산을 담당하고 모든 종류의 명령을 다 실행할 수 있다.
사용자모드는 일반 사용자 프로그램이 실행되며 제한적인 명령만 수행할 수 있다.
10. 메모리 보안
여러 프로그램이 하나의 메모리에 동시에 올라가서 실행되기 때문에 하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범할 수 있기 때문에 메모리 보안이 필요하다.
메모리를 보호하기 위해서는 2개의 레지스터를 사용하고, 이 2개의 레지스터를 사용하여 프로그램이 접근하려는 메모리 부분이 합법적인지 체크한다. 2가지 레지스터는 기준 레지스터(base register)와 한계 레지스터(limit register)가 있다.
기준 레지스터는 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근할 수 있는 메모리상의 가장 적은 주소를 보관하고 있다.
한계 레지스터는 그 프로그램이 기준 레지스터값부터 접근할 수있는 메모리의 범위를 보관하고 있다.
11. CPU 보호
일반적으로 CPU는 컴퓨터 시스템 내에 하나밖에 존재하지 않기 때문에 특정 프로그램이 CPU를 독점되는것을 막아야한다.
CPU를 독점하는것을 막기 위해서 타이머(timer)라는 하드웨어를 사용한다.
타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 획득할 수 있도록 하는 역활을 수행한다.