GYUD-TECH

[OS 모의 면접 스터디] 컴퓨터 시스템의 동작원리 본문

스터디

[OS 모의 면접 스터디] 컴퓨터 시스템의 동작원리

GYUD 2024. 3. 6. 20:31

 

이번 장에서는 컴퓨터를 구성하는 다양한 장치들에 대해 공부한다.

컴퓨터 구조 수업에서 들었던 내용이 꽤 많이 있었기 때문에 익숙한 내용이 많았다.

 

책에서 소개된 내용 중에서 생소하거나 중요하다고 생각되는 내용만 기록하여 정리하였다.

전체 내용을 공부하고 싶으면 글 하단 참고자료에 있는 책을 읽거나, 강의를 들으면 좋을 것 같다.

 


컴퓨터 시스템의 구조

컴퓨터 시스템은 아래와 같이 내부장치인 CPU, 메모리외부장치인 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등으로 구성된다.

 

컴퓨터는 이렇게 다양한 장치들이 결합하여 외부 장치로부터 데이터를 읽어서 어떤 계산을 하여 외부장치로 결과를 출력하는 연산을 수행하는 기계이다.

 


Device Controller

외부장치에 접근하기 위해서 각 외부장치마다 컨트롤러라는 작은 CPU가 붙어있다.

또한 장치마다 입출력되는 데이터를 임시로 저장하기 위한 작은 메모리인 로컬 버퍼를 가지고 있다.

 

  • 컨트롤러는 장치로부터 데이터를 읽어서 로컬 버퍼에 저장한다.
  • 읽기 작업이 모두 끝났으면 컨트롤러는 인터럽트를 발생시켜 CPU에게 보고한다.
  • CPU는 명령을 수행할 때마다 인터럽트 라인을 확인해서 인터럽트가 발생하면 인터럽트를 먼저 처리한다.

이러한 컨트롤러는 펌웨어로 코딩되어 작동한다.

장치를 처음 설치할때 흔히 사용하는 driver는 특정 하드웨어나 장치의 입출력의 제어하기 위한 소프트웨어로 운영체제에서 해당 장치를 제어하기 위해 컨트롤러에 메시지를 보내주는 소프트웨어이다.

 

즉, 장치 자체는 펌웨어 코딩에 의해서 작동되고, 운영체제는 드라이버를 통해 장치의 소프트웨어에 메시지를 보내면서 장치를 제어한다.

 


Mode Bit

사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에게 피해 발생하지 않도록 하는 보호장치이다.

 

운영체제도 소프트웨어이기 때문에 CPU가 동작하여 운영체제 내의 코드를 실행해야만 시스템을 관리할 수 있다.

만약 특정한 프로그램이 문제를 일으킨다면, CPU의 사용 권한을 빼앗아야 하는데 이런 작업은 운영체제만으로는 하는 것이 불가능하다.

 

이를 도와주는 것이 Mode bit 이다.

mode bit 가 1: 사용자 모드로 사용자 프로그램을 수행한다.
mode bit 가 0: 커널 모드로 OS 코드를 수행한다.

 

CPU의 권한을 누가 가지고 있느냐에 따라서 mode bit을 1이나 0으로 세팅한다.

이때, 특정 프로그램의 사용 시간이 만료되었거나, 인터럽트가 발생하면 mode bit이 0으로 세팅되고 운영체제에게 CPU 사용 권한이 넘어간다.

 

커널 모드일 때는 모든 기능에 접근 가능한 특권명령이 사용가능하지만, 사용자 모드에서는 이를 제한하여 지정된 영역의 데이터만 접근 가능하도록 하는 보안적인 기능도 수행한다.

 


레지스터

CPU는 다양한 연산을 하는데 연산 결과를 일시적으로 저장하기 위한 공간이 필요하다.

CPU내에는 이런 역할을 수행할 아주 작고 빠른 저장공간인 레지스터가 존재한다.

 

PC (Program Counter)

레지스터중 PC라는 레지스터는 다음에 실행할 기계어의 메모리 주소를 가지고 있다.

CPU가 명령을 다 수행하면 PC에 있는 주소의 명령을 수행하고, PC는 다음 수행할 명령으로 업데이느 된다.

 


Timer

CPU의 독점 사용을 막기 위한 하드웨어이다.

 

시분할 시스템에서는 시간을 나누어서 CPU를 할당해주는데, 이때 특정 프로그램이 CPU를 계속 사용한다면 이를 뻈어와야한다.

이를 위해 운영체제는 CPU의 사용권을 넘기면서 Timer에 일정 시간을 설정한다.

Timer는 정해진 시간이 종료되면 timer interrupt를 발생시켜서 CPU의 권한을 운영체제가 가지도록 한다.

 


인터럽트

특정한 상황으로 인해 CPU의 사용 권한을 운영체제가 가져야 하면 인터럽트를 발생시킨다.

 

인터럽트 진행 절차

인터럽트가 발생하면 CPU는 하던일을 그만두고 작업했던 레지스터의 내용을 프로세스 제어블록(PCB) 라는 자료구조에 저장한다.

PCB는 각각의 프로그램마다 하나씩 존재하며, 실행중이던 코드의 메모리 주소와 레지스터 값, 하드웨어 상태 등이 저장된다.

 

현재 작업이 모두 저장이 되었다면, CPU의 제어권이 인터럽트 처리 루틴으로 넘어간다.

 

인터럽트 처리가 끝나면 PCB로부터 저장된 상태를 CPU상에 복원하여 이전에 수행하던 작업을 연달아서 수행한다.

더보기

사실 운영체제는 인터럽트가 발생했을 때만 사용된다.

 

인터럽트가 발생하지 않으면 CPU의 사용권은 항상 프로그램에 있기 때문에 운영체제는 동작하지 않는다.

매 순간 운영체제가 동작하는것은 아니지만, 전체적인 컴퓨터 자원을 관리하고 보호하는 역할은 충실히 수행한다.

 

인터럽트의 종류

인터럽트가 발생하는 상황에 따라서 인터럽트 처리 루틴이 다른데 발생 가능한 인터럽트에는 3가지 종류가 있다.

 

  • 하드웨어 인터럽트
  • 소프트웨어 인터럽트
  • timer 인터럽트

 

하드웨어 인터럽트는 컨트롤러와 같은 하드웨어 장치가 동작이 완료되었음을 알리기 위해 인터럽트를 발생 시키는 것이다.

 

timer 인터럽트는 특정 프로그램이 정해진 시간만큼 자원을 사용하였을 때, 다른 프로그램에게 자원을 넘기기 위하여 발생시키는 인터럽트이다.

 

소프트웨어 인터럽트소프트웨어 스스로 처리하지 못하는 일을 CPU에게 넘기기 위해 발생시키는 인터럽트이다.

소프트웨어 인터럽트에는 특정 프로그램이 잘못된 연산이나 허용되지 않은 작업을 수행하는 ExceptionSystem call이 포함된다.

 

 

시스템 콜

앞서 CPU가 I/O 장치에 직접적으로 접근할 수 없기 때문에 device controller에게 접근하도록 명령한다.

device controller에게 접근하는 명령은 특권명령이기 때문에 프로그램은 I/O 장치는 물론 device controller에게도 접근할 수 없다.

 

따라서 프로그램이 하드웨어 장치에 접근하기 위해서는 device controller에 접근하는 커널 함수를 호출하고, device controller는 데이터를 읽은인터럽트를 호출하여 이를 알린 후에 CPU가 데이터를 메모리로 옮겨야지만 프로그램에서 데이터를 사용할 수 있다.

 

데이터가 필요한 프로그램은 커널 함수를 호출하기 위해 운영체제에게 CPU 사용 권한을 넘겨야 하는데 이렇게 소프트웨어가 자신의 목적 달성을 위해 인터럽트를 거는 것을 시스템 콜이라고 한다.

더보기

인터럽트는 영어로 끼어들다라는 뜻을 가지고 있다.

 

하드웨어 인터럽트나 타이머 인터럽트의 경우에는 A라는 프로그램이 동작 중에 끼어들어 동작을 중지시키는 것이기 때문에 진정한 인터럽트에 부합한다.

 

반면 소프트웨어 인터럽트의 경우에는 프로그램이 스스로 수행하지 못하는 것을 운영체제에게 의도적으로 넘기는 행위기이 때문에 좁은 의미에서 Trap으로 분류하기도 한다.


입출력 구조

운영체제를 통해 I/O 요청을 전달한 후에도 CPU는 쉬지 않는다.

입출력 장치는 CPU에 비해 훨씬 느리기 때문에 CPU는 입출력 작업이 완료될 때까지 기다리지 않고 다른 프로세스에 할당되어 작업을 수행한다.

 

이때 입출력 중인 장치에는 CPU를 할당하지 않기 위해서 프로그램을 봉쇄 상태로 전환시킨다.

봉쇄 상태의 프로그램에는 CPU를 할당하지 않는 방식으로 CPU를 최대한 효율적으로 쓰기 위해 노력하는 것이다.

 

 

동기식 입출력 / 비동기식 입출력

앞서 소개하였듯이 CPU는 쉬지않는다.

 

만약 A라는 프로그램이 I/O 를 요청하여 현재 수행중에 있다고 가정하자.

이후 CPU는 B라는 프로그램에 할당되었는데 B라는 프로그램도 우연히 같은 부분에 I/O 요청이 필요하다.

 

이때 I/O controller도 특정한 기준에 의해서 먼저 수행할 작업을 정하는데, B의 I/O 요청이 먼저 실행될 수 있다.

이렇게 되면 개발자가 예상한 결과와 전혀 다른 결과가 나오는 동기화 문제가 발생할 수 있다.

 

이러한 동기화 문제를 해결하기 위해서 동기식 입출력에서는 큐를 사용하여 I/O의 접근을 순차적으로 진행하도록 한다.

또한 봉쇄상태와 인터럽트를 통해 I/O가 끝난 후에만 프로그램이 이어서 실행될 수 있도록 한다.

 

반면 CPU가 보낸 I/O 요청이 끝나는 것을 기다릴 필요 없이 바로 CPU가 동작하는 것을 비동기식 입출력 이라고 한다.

 

해당 내용을 처음 공부하였을 때는 비동기식 입출력의 효과에 대해 의문을 품었다.

I/O 요청을 했다는 것은 데이터가 필요하다는 뜻인데 데이터를 받지 않고 다음 작업을 수행하는 것이 소프트웨어의 목적에 부합하는지 의문이었다.

 

하지만 모든 I/O 요청이 데이터가 필요로 하는 것이 아니라는 것을 깨달았다.

파일에 내용을 쓰는것과 같은 쓰기 요청은 요청만 하고 요청의 결과를 모른 채로 다음 동작을 수행할 수 있다.

요청한 내용이 잘 수행되었는지 확인할 필요가 없다면 비동기식 처리를 선택하여 더욱 효율적으로 CPU를 사용하는것이 좋을 것이다.

 


DMA (Direct Memory Access)

CPU의 효율을 위해서 인터럽트가 너무 자주 걸리는 것을 막기 위한 장치이다.

만약 인터럽트가 너무 자주 발생한다면 인터럽트 자체가 오버헤드이기 때문에 CPU의 성능이 저하된다.

 

따라서 CPU외 메모리에 접근할 수 있는 DMA라는 하드웨어를 사용하여 CPU의 부담을 덜어주는 역할을 수행한다.

DMA는 입출력 버퍼에 block 단위만큼의 정보가 찼을 때 이를 메모리에 직접 옮겨주고, 인터럽트를 걸어서 작업이 끝났음을 보고하는 방식으로 동작한다.

 


저장장치의 구조

시스템을 구성하는 저장장치는 주기억장치와 보조 기억 장치로 나뉜다.

 

주기억 장치는 RAM을 주로 사용하기 때문에 전원을 종료하면 휘발되는것이 특징이다.

반면 보조기억장치는 전원이 종료되어도 내용이 저장되는 비휘발성의 마그네틱 디스크를 사용한다.

 

보조 기억장치에는 플래시 메모리, CD, 마그네틱 테이프와 같은 장치들이 있으며 용도에 따라 두가지로 구분한다.

  • 파일 시스템용: 전원이 종료되어도 유지해야하는 정보를 저장하는 용도로 사용한다.
  • 스왑영역: 메모리의 크기가 한정되어 있기 때문에 당장 필요하지 않은 부분을 스왑영역에 저장한다.
    • 당장 필요하징 않은 정보를 스왑영역에 저장하는 것을 스왑아웃 이라고 하며, 스왑 아웃된 데이터는 필요에 따라 메모리에 올라가기도 한다.
    • 스왑 영역에는 하드디스크가 가정 널리 사용된다.

 

하드디스크

하드디스크는 아래 사진과 같이 여러개의 마그네틱 원판과, 데이터를 읽고 쓰는 역할을 수행하는 으로 구성된다.

디스크의 원판에는 데이터가 저장되는데, 가장 작은 단위 정보가 섹터이고 이런 섹터가 모여서 트랙을 구성하며, 트랙이 모여서 마그네틱 원판을 구성한다.

 


보안

Window나 리눅스와 같은 운영체제는 여러 프로그램이 동시에 실행될 수 있는 다중 프로그래밍 환경에서 동작한다.

그래서 실행중인 프로그램들이 서로의 영역을 침범하지 않도록 하는 각종 보안 기법이 필요하다.

 

 

하드웨어의 보안

앞서 Mode bit에서 소개한 커널모드와 사용자모드가 하드웨어의 보안을 유지하기 위한 기법 중 하나이다.

커널 모드에서만 특권 명령을 수행할 수 있기 때문에 프로그램이 다른 장치에 접근하기 위해서는 반드시 운영체제를 거쳐야한다.

그렇기 때문에 운영체제가 올바르지 않은 요청에 대해서 거절하는 것이 가능해진다.

 

메모리 보안

하드웨어와 비슷하게 특정 프로그램이 다른 프로그램의 메모리 영역을 침범하지 않도록 하기 위한 정책이 필요하다.

 

이를 위해 기준 레지스터와 한계 레지스터라는 2개의 레지스터를 사용해서 프로그램이 접근하려는 메모리주소가 올바른지 확인할 수 있다.

 

기준 레지스터프로그램이 접근할 수 있는 메모리의 가장 작은 주소를 보관하고, 한계 레지스터접근할 수 있는 메모리의 범위를 저장한다.

요청이 들어오면 해당 범위에 속하는지 여부를 체크하고, 올바르지 않은 영역의 데이터에 접근하면 예외를 발생시켜서 CPU의 사용 권한을 빼앗는다.

 

책을 읽고 위 방식에 대한 궁금증이 2가지 생겼다.

 

첫번째는 기준 레지스터와 한계 레지스터의 값은 어떻게 세팅하는가였다.

 

프로그램이 CPU를 사용하기 시작하면 메모리에 접근하는 것이 가능해 지기 때문에 프로그램이 CPU 사용 전에 미리 기준 레지스터와 한계 레지스터의 값을 세팅해 주어야 한다.

또한 한번 세팅된 값은 프로그램에 의해 변경되면 안되기 떄문에 이 명령을 특권 명령으로 지정해야 할 것이다.

 

 

두번째 궁금증은 만약 데이터가 메모리에 비연속적인 부분으로 저장되면 어떻게 해야하는가에 대한 궁금증이다.

 

이전 장에서 가상메모리에 대해 이야기 할 때, 가상 메모리 기법을 사용하면 프로그램이 사용하는 데이터가 분할되어 메모리에 올라갈 수 도 있는데 이를 어떻게 기준 레지스터와 한계 레지스터 만으로 범위를 확인할 수 있는지 궁금하였다.

 

추가적으로 자료를 찾아보니 페이징기법에서는 페이징 테이블을 통해서, 세그멘테이션 기법에서는 별도의 기준 및 한계 레지스터 쌍을 통해서 문제를 해결할 수 있었다.

 

한정된 메모리를 효율적으로 사용하기 위해서 가상메모리와 같은 기법을 사용하지만,  레지스터나 페이지 테이블을 두어서 추가적인 데이터를 저장해야한다는 점과, 복잡성이 높아진다는 단점도 존재한다고 느꼈다.

 


참고자료

https://www.aladin.co.kr/shop/wproduct.aspx?ISBN=K762639583&start=pnaver_02

 

운영체제와 정보기술의 원리

온라인 공개강좌 KOCW에서 꾸준히 호평받아온 이화여대 반효경 교수의 컴퓨터 입문서이다. 단순히 컴퓨터 관련 전문 지식을 전달하는 것에서 그치지 않고, 복잡한 문제를 효율적으로 풀 수 있는

www.aladin.co.kr

http://www.kocw.net/home/cview.do?cid=4b9cd4c7178db077

 

운영체제

<교재 및 출처><br/><br/>- A. Silberschatz et al., Operating System Concepts, 9th Edition, John Wiley & Sons, Inc. 2013.<br/><br/>- A. Silberschatz et al., Operating System Principles, Wiley Asia Student Edition<br/><br/>- 반효경, 운영체제와

www.kocw.net