[OS] 컴퓨터 시스템의 동작 원리
Updated:
컴퓨터 시스템의 동작 원리
1. 컴퓨터 시스템 구조
컴퓨터 시스템의 구조는 컴퓨터 내부장치인 CPU, 메모리와 컴퓨터 외부 장치인 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등으로 구성된다.
2. CPU 연산과 I/O 연산
- 로컬 버퍼: 각 장치마다 설치된 컨트롤러가 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 메모리이다. 디스크나 키보드 등에서 데이터를 읽어오는 경우, 우선 로컬버퍼에 데이터가 임시로 저장된 후 메모리에 전달된다.
이때 장치에서 로컬버퍼로 읽어오는 일은 컨트롤러가 담당한다.
프로그램이 요청한 데이터를 디스크 컨트롤러가 로컬버퍼로 읽어온 후 인터럽트를 발생시키면 CPU는 인터럽트가 들어옴을 인지하고 인터럽트 관련 업무를 수행한다. CPU는 명령 하나를 수행할 때 마다 인터럽트가 발생했는지 확인한다.
3. 인터럽트의 일반적 기능
-
디스크 컨트롤러가 인터럽트를 발생시키면 CPU는 하던 일을 잠시 멈추고 이 인터럽트가 발생했을 때 수행하도록 정의된 코드를 찾아 수행한다. 이때 수행하는 일은 디스크의 로컬버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시해 두는 일이다(인터럽트 처리 루틴 or 인터럽트 핸들러).
-
운영체제는 할 일을 쉽게 찾기 위해 인터럽트 벡터(interrupt vector)를 가지고 있다. 인터럽트 벡터란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야할 코드가 위치한 부분을 가리키는 자료구조를 말한다.
-
운영체제는 인터럽트 처리 후 돌아갈 위치를 알아야 하므로 인터럽트 처리 전에 수행중이던 작업이 무엇이었는지에 대한 정보를 저장하기 위한 장소를 별도로 가지고 있다.
-
소프트웨어 인터럽트는 트랩(trap)이라는 용어로 주로 불린다. 소프트웨어 인터럽트의 예로는 예외상황(exception)과 시스템 콜(system call)이 있다.
-
시스템 콜: 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법
4. 인터럽트 핸들링(interrupt handling)
-
인터럽트 핸들링이란, 인터럽트가 발생했을 경우에 처리해야 할 일의 절차를 의미한다.
-
CPU에서 명령이 실행될 때에는 CPU 내부에 있는 임시 기억장치인 레지스터에 데이터를 읽거나 쓰면서 작업을 하는데, 이때 인터럽트가 발생해 새로운 명령을 실행하면 기존의 레지스터 값들이 지워지게 되므로 CPU 내의 이러한 상태를 저장해 두어야 한다.
-
운영체제는 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 프로세스 제어블록(Process Control Block: PCB)이라는 자료구조를 둔다. PCB는 각각의 프로그램마다 하나씩 존재하며 해당 프로그램의 어느 부분이 실행 중이었는지 저장하고 있다. 구체적으로는 프로그램이 실행 중이던 코드의 메모리 주소와 레지스터 값, 하드웨어 상태 등이 저장된다.
5. 입출력 구조
- 동기식 입출력(synchronous I/O)
-
어떤 프로그램이 입출력 요청을 했을 때, 현재 진행중인 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식을 말한다.
-
동기식 입출력에서는 CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리며 자원을 낭비하게 된다.
-
자원낭비를 방지하기 위해 운영체제는 입출력 중인 프로그램의 경우 봉쇄상태(block state)로 전환시킨다. 봉쇄상태의 프로그램에게는 CPU를 할당하지 않고, CPU 할당시 곧바로 명령을 수행할 수 있는 프로그램에만 CPU를 할당한다.
-
동기식 입출력에서는 입출력 요청의 동기화를 위해 장치별로 큐(queue)를 두어 요청한 순서대로 처리할 수 있도록 한다.
-
- 비동기식 입출력
- CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 곧바로 다시 부여하는 방식이다. CPU의 제어권이 입출력을 요청한 프로세스에게 곧바로 다시 주어지며, 입출력 연산이 완료되는 것과 무관하게 처리 가능한 작업부터 처리한다. 동기식과 마찬가지로 입출력 연산이 완료되면 인터럽트를 통해 이를 CPU에게 알려준다.
6. DMA(Direct Memory Access)
일종의 컨트롤러로써, CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주는 역할을 한다. DMA를 사용하게 되면 로컬버퍼에서 메모리로 읽어오는 작업을 CPU가 담당하는 것이 아니라 DMA가 대행함으로써 CPU는 원래 하던 작업을 멈추고 인터럽트를 처리할 필요가 없어지는 것이다.
7. 저장 장치의 구조
-
컴퓨터 시스템을 구성하는 저장 장치는 주 기억장치와 보조 기억장치로 나누어 볼 수 있다.
-
주 기억장치는 보통 메모리라고 부르며 전원이 나가면 전원이 나가면서 저장되었던 내용이 모두 사라져버리는 휘발성(volatile)의 RAM 을 매체로 사용하는 경우가 대부분이다.
-
보조 기억장치는 전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성(nonvolatile)의 마그네틱 디스크를 사용한다.
- 파일 시스템용 : 전원이 나가도 유지해야 할 정보가 있으면 그것을 파일 형태로 보조기억장치에 저장.
- 스왑 영역용 : 운영체제는 프로그램 수행에 필요한 부분만 메모리에 올려놓고 그렇지 않은 부분은 디스크의 스왑영역에 내려놓게 된다. 이처럼 디스크에 내려놓는 일을 스왑 아웃시킨다고 말하며 스왑아웃된 부분이 필요할 때에는 다시 메모리 영역으로 올리게 된다.
8. 저장 장치의 계층 구조
(휘발성 저장장치):전원이 나가면 데이터 사라짐
레지스터
캐시 메모리
메인 메모리
————-
(비휘발성 저장장치):전원이 나가도 데이터가 사라지지 않음
마그네틱 디스크
광 디스크
마그네틱 테이프
위의 목록은 휘발성 저장장치와 비휘발성 저장장치의 구조로 위로 갈수록 속도가 빠르지만 용량은 작아진다.
-
여러 가지 캐싱 기법을 이용해 적은 용량의 캐시 메모리를 사용해서도 메인 메모리와 같이 큰 용량을 가진 것처럼 효율적으로 동작하도록 관리할 수 있다.
-
캐싱 기법이란 상대적으로 용량이 적은 빠른 저장장치를 이용해 느린 저장장치의 성능을 향상시키는 총체적 기법을 일컫는다.
9. 하드웨어 보안
-
중요한 정보에 접곤해 위험한 상황을 초래할 수 있는 연산은 커널모드에서만 실행되도록 하며 일반 사용자 프로그램이 직접 위험한 명령을 수행할 수 없도록 하고, 그렇지 않은 일반적인 연산만 사용자 프로그램이 수행하도록 통제하여 보안성을 확보하게 된다.
-
컴퓨터 시스템은 CPU내부에 모드비트(mode bit)를 두어 사용자 프로그램을 감시하게 된다. 모드비트가 ‘0’으로 세팅되어 있으면 ‘커널 모드’로서 모든 명령을 수행할 수 있고, 모드비트가 ‘1’로 세팅되어 있으면 ‘사용자 모드’로서 제한된 명령만을 수행할 수 있다.
-
시스템 보안과 관련된 명령들을 ‘특권 명령’이라 지칭하며, 특권명령은 모드 비트가 ‘0’일 때에만 수행할 수 있다. 즉, 특권명령은 커널모드에서 운영체제에 의해서만 수행할 수 있는 것이다.
ex) 입출력은 특권명령이기 때문에 모드비트가 0일 때에만 수행할 수 있으며, 사용자 프로그램이 입출력을 하고 싶으면 시스템 콜로 운영체제에 요청해야 한다.
10. 메모리 보안
-
인터럽트 벡터와 인터럽트 처리루틴이 있는 곳은 각별한 보안이 필요하다.
-
2개의 레지스터를 사용해서 프로그램이 접근하려는 메모리 부분이 합법적인지 체크함으로써 메모리를 보호할 수 있다. 이때 사용되는 2개의 레지스터가 기준 레지스터(base register)와 한계 레지스터(limit register)이다.
-
사용자 프로그램은 기준레지스터에 있는 주소부터 한계 레지스터 주소 사이의 영역만 접근할 수 있으며, 접근하려는 주소가 이 범위 안에 없으면 불법적인 메모리 접근이므로 예외 상황이라는 일종의 소프트웨어적인 인터럽트가 발생하게 된다. 그러면 CPU의 제어권을 운영체제로 이양시키고, 운영체제는 예외 상황을 발생시킨 프로그램을 강제로 종료시킨다.
11. CPU 보호
-
CPU가 하나의 프로그램에 의해 독점되는 것을 막기 위해 운영체제는 타이머(timer)라는 하드웨어를 사용한다. 타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 휙득할 수 있도록 하는 역할을 수행한다.
-
타이머에 의해 발생되는 인터럽트 처리루틴의 역할은 지금 CPU를 점유하고 명령을 실행중인 프로그램으로부터 CPU를 빼앗아 다른 프로그램에게 CPU를 이양하는 것이다.
12. 시스템 콜을 이용한 입출력 수행
사용자 프로그램이 특권명령 수행을 위해 시스템 콜 요청을 하면 CPU제어권이 운영체제로 넘어가게 되고 시스템 콜을 처리하기 위한 루틴으로 가서 정의된 명령을 수행한다. 특권명령 수행을 마치면 해당 프로그램이 다시 CPU를 할당받을 수 있도록 한다.
참고
- 서적 ‘운영체제와 정보기술의 원리’
Leave a comment