본문 바로가기
CS/OS

[OS] 03. 컴퓨터 시스템의 동작 원리

by 원만사 2021. 12. 14.
반응형

1. 컴퓨터 시스템의 구조

  • 컴퓨터는 내부장치인 CPU, 메모리와 외부장치인 디스크, 키보드, 마우스, 모니터 등으로 구성된다.
  • 컴퓨터는 외부장치에서 내부장치로 데이터를 읽어와 각종 연산을 수행한 후, 그 결과를 외부장치로 다시 내보내는 방식으로 업무를 처리한다.
  • 컴퓨터 내부로 데이터가 들어오는 것을 입력(input), 외부장치로 데이터가 나가는 것을 출력(output)이라고 한다.
  • 메모리 및 입출력장치 등의 각 하드웨어 장치에는 이들을 제어하는 작은 CPU인 컨트롤러라는 것이 존재한다.
  • 운영체제는 각종 자원들을 관리해야 하므로 컴퓨터의 전원이 켜진 순간부터 항상 메모리에 올라가 있다.
  • 하지만, 전체가 올라가지 않고 운영체제 중 핵심적인 부분만 항상 메모리에 올라가 있으며 이 부분을 커널(kernel)이라고 부른다.

컴퓨터 내부장치와 외부장치 구조

 

2. CPU 연산과 I/O 연산

  • 입출력 장치들의 I/O 연산은 입출력 컨트롤러가 담당하고, 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당한다.
  • 입출력 장치와 메인 CPU는 동시 수행이 가능하다.
  • 각 장치의 컨트롤러에는 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리인 로컬버퍼(local buffer)를 갖고 있다.
  • 디스크나 키보드 등에서 데이터를 읽어오는 경우, 우선 로컬버퍼에 데이터가 임시로 저장된 후 메모리에 전달된다. 장치에서 로컬버퍼로 읽어오는 일은 컨트롤러가 담당한다.
  • 데이터를 읽어오는 작업이 끝났으면 컨트롤러가 인터럽트를 발생시켜 CPU에게 보고한다.
  • CPU는 명령 하나를 수행할 때마다 인터럽트가 발생했는지 확인한다. CPU 옆에 있는 인터럽트 라인(interrupt line)을 통해서 인터럽트 발생을 확인하면 다음 명령을 수행하기 전에 인터럽트 처리를 하게 되고, 그렇지 않으면 다음 명령을 계속 수행한다.

 

3. 인터럽트의 일반적 기능

  • 운영체제 커널에는 인터럽트가 들어왔을 때 해야 할 일이 미리 프로그래밍되어 저장되어 있다. 이를 인터럽트 처리루틴이라고 한다.
  • 인터럽트에는 하드웨어 인터럽트소프트웨어 인터럽트가 있다.
  • CPU의 서비스가 필요한 경우, 인터럽트 라인에 신호를 보내서 인터럽트가 발생했음을 알려주는 방식은 동일하다.
  • 하지만 하드웨어 인터럽트는 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅하는 반면, 소프트웨어 인터럽트는 소프트웨어가 그 일을 수행한다는 차이점이 있다.
  • 운영체제는 인터럽트 벡터(interrupt vector)를 가지고 있다. 인터럽트 벡터란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조를 말한다.
  • CPU는 인터럽트 처리 전에 수행중이던 작업으로 돌아가기 위해 이를 저장해 두는데 운영체제에는 이를 위한 저장 장소를 별도로 가지고 있다.
  • 소프트웨어 인터럽트에 대해 자세히 알아보자.
    • 인터럽트는 보통 하드웨어 인터럽트를 의미하고, 소프트웨어 인터럽트는 주로 트랩(trap)이라고 불린다.
    • 트랩에는 예외상황(exception)시스템 콜(system call)이 존재한다.
    • 예외상황은 비정상적인 작업을 시도할 때 발생하고, 시스템 콜은 권한이 없는 작업을 시도할 때 발생한다.
    • 시스템 콜은 사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법이다.
    • 사용자 프로그램은 자신의 코드를 실행시킬때는 직접 CPU 제어권을 가지고 실행하지만, 운영체제 커널에 있는 코드를 사용할 때는 CPU의 제어권을 운영체제로 넘겨 실행한다. 
    • 시스템 콜이나 예외상황 모두 사용자 프로세스로부터 CPU의 제어권이 운영체제에 이양되어 처리된다. 이 때, 프로그램 코드가 직접 인터럽트 라인을 세팅하는 명령을 실행하여 인터럽트를 발생시킨 후 제어권이 넘어가게 된다.

 

4. 인터럽트 핸들링

  • 인터럽트 핸들링이란 인터럽트가 발생한 경우에 처리해야 할 일의 절차를 의미한다.
  • CPU에서 명령이 실행될 때에는 CPU 내부에 있는 임시 기억장치인 레지스터(register)에 데이터를 읽거나 쓰면서 작업을 하는데, 이때 인터럽트가 발생해 새로운 명령을 실행하면 기존의 레지스터값들이 지워지게 되므로 CPU 내의 이러한 상태를 저장해 두어야 한다.
  • 운영체제는 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 프로세스 제어블록(Process Control Block: PCB)이라는 자료구조를 둔다.
  • PCB는 프로그램마다 하나씩 존재하며 실행중이던 코드의 메모리 주소, 레지스터 값등이 저장된다. PCB는 다음과 같이 사용된다.
    1. 인터럽트 발생
    2. 현재 프로그램의 실행 상태를 PCB에 저장한 후 CPU의 제어권이 인터럽트 처리루틴으로 이양
    3. 인터럽츠 처리 후 저장된 상태를 PCB로부터 CPU상에 복원해 이전 작업을 이어서 수행

 

5. 입출력 구조

  • 입출력(I/O)이란 컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것을 말한다.
  • 동기식 입출력과 비동기식 입출력이 있다.
  • 일반적으로 동기식 입출력이 사용된다. 

동기식 입출력(synchronous I/O)

  • 어떤 프로그램이 입출력 요청을 했을 때 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식
  • 입출력 완료 전까지 다음 명령을 수행할 수 없기 때문에 CPU가 낭비된다는 단점이 있다.
  • 입출력 연산 완료 전까지 다른 프로그램에게 CPU를 양도하는 방법을 사용하지 않으면 매 시점 하나의 입출력 연산만이 일어날 수 있다.
  • CPU의 효율적인 사용을 위해 다른 프로그램에게 CPU를 양도하면 동시에 다수의 입출력이 일어날 수 있다.
  • 이럴 경우 동기성(synchronization)을 보장하기 위해 장치마다 큐를 두어 요청된 순서대로 처리할 수 있도록 한다.
  • CPU의 수행 속도에 비해 컨트롤러의 수행 속도나 장치 자체의 작업 수행 능력은 매우 떨어진다.
  • 그렇기 때문에 입출력과 관련 없는 프로그램을 수행하도록 하고, 요청된 입출력 연산이 완료되면 CPU에게 입출력이 완료되었음을 알려주는 방식으로 진행된다. 
  • 연산 완료의 통보는 인터럽트를 통해서 수행된다. 

 

디바이스 큐와 각 큐에 대기 중인 프로세스

 

비동기식 입출력(asynchronous I/O)

  • CPU의 제어권을 입출력 연산을 호출한 프로그램에게 곧바로 다시 부여하는 방식
  • 입출력 데이터와 관련 없이 수행할 수 있는 작업을 먼저 수행하고, 데이터가 반드시 있어야 수행할 수 있는 일들은 입출력이 완료된 후에 수행한다.

동기식 입출력과 비동기식 입출력

  • 동기식 입출력에서는 입출력 처리가 들어오면 CPU의 제어권이 운영체제의 커널로 넘어가고 입출력 처리와 관련된 코드가 실행된다. 이때 입출력 요청을 한 프로세스는 봉쇄 상태가 되어 입출력이 완료될 때까지 CPU를 할당받지 못한다. 입출력이 완료되면 I/O 컨트롤러가 CPU에게 인터럽트를 발생시키고 프로세스의 봉쇄 상태가 해제되어 CPU를 할당받을 수 있게 된다.
  • 비동기식 입출력에서는 CPU의 제어권이 입출력을 요청한 프로세스에게 곧바로 다시 주어지고 입출력과 무관한 작업부터 처리한다. 입출력 연산이 완료되면 인터럽트를 통해 CPU에게 알려준다.

 

6. DMA

각종 컨트롤러와 인터럽트 라인

  • 모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할 때마다 인터럽트에 의해 CPU의 업무가 방해를 받게 되어 CPU 사용의 효율성이 떨어지는 문제점이 발생한다.
  • 이를 극복하기 위해 메모리 접근이 가능한 장치를 하나 더 두는 경우가 많은데, 이러한 장치를 DMA(Direct Memory Access)라고 부른다.
  • 로컬버퍼에서 메모리로 읽어오는 작업을 CPU가 아닌 DMA가 담당하게 된다. 
  • 블록(block)이라는 단위로 정보를 메모리로 읽어온 후에 CPU에게 인터럽트를 발생시켜 해당 작업의 완료를 알려준다. 
  • DMA를 사용하여 CPU에 발생하는 인터럽트의 빈도를 줄여 CPU를 좀 더 효율적으로 관리하고 입출력 연산을 빠르게 수행할 수 있게 된다. 

 

7. 저장장치의 구조

  • 저장장치는 주기억장치와 보조기억장치로 나누어진다.

주기억장치

  • 보통 메모리라고 불린다.
  • 전원이 나가면 저장되었던 내용이 모두 사라지는 휘발성(volatile)의 성질을 갖고 있다.

 

보조기억장치

  • 전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성(nonvolatile)의 성질을 갖고 있다.
  • 파일 시스템(file system)용스왑 영역(swap area)용으로 사용된다.
  • 전원이 나가도 유지해야 할 정보가 있으면 파일 형태로 보조기억장치에 저장된다.
  • 메모리의 경우 크기가 한정되고, 가격이 상대적으로 비싸며 용량이 적은 경우가 많다. 그렇기 때문에 메모리에는 당장 필요한 부분만 올려놓고 나머지 부분은 디스크의 스왑 영역에 내려놓는다. 이를 스왑 아웃(swap out)시킨다고 말한다.
  • 스왑 아웃된 부분이 필요할 때에 다시 메모리 영역에 올려놓게 된다. 
  • 스왑 영역용으로는 주로 하드 디스크가 사용된다.
  • 하드디스크는 여러 개의 마그네틱 원판이 있고, 암(arm)이 이동하며 원판에 저장된 데이터를 읽고 쓰는 방식으로 동작한다.
  • 디스크 원판의 표면은 트랙(track)으로 나뉘고, 각 트랙은 섹터(sector)로 나뉜다. 섹터에 최소한의 단위 정보가 저장된다.

하드디스크의 물리적 구조

 

8. 저장장치의 계층 구조

  • 저장장치는 빠른 저장장치부터 느린 저장장치까지 단계적인 계층 구조로 이루어져있다.
  • 빠른 저장장치는 단위 공간당 가격이 높기 때문에 적은 용량을 사용한다.
  • 느린 저장장치는 가격이 저렴해 대용량을 사용하는 반면 접근 속도가 느리다는 약점이 있다.
  • 그렇기 때문에 당장 필요한 정보는 빠른 저장장치에 넣어두어 수행 속도를 높이고 그렇지 않은 정보는 상대적으로 느린 저장장치에 보관하게 된다.

컴퓨터 시스템의 저장장치 계층 구조

  • 당장 필요한 정보만을 상위 저장장치에 선별적으로 저장하면 하위에 있는 큰 용량의 저장장치를 가지고 있는 것과 비슷한 성능 효과를 낼 수 있다.

 

9. 하드웨어의 보안

  • 보통의 운영체제는 여러 프로그램이 동시에 실행되는 다중 프로그래밍 환경에서 동작한다.
  • 프로그램 간에 충돌을 일으키는 문제를 막기 위해 하드웨어에 대한 각종 보안 기법이 필요하다.
  • 이를 위해 운영체제는 기본적으로 커널모드(kernel mode, system mode)사용자모드(system mode)의 두 가지 모드를 지원한다.
  • 중요한 정보게 접근해 위험한 상황을 초래할 수 있는 연산은 커널모드에서만 실행되도록 하여 보안성을 확보한다.
  • 커널모드는 운영체제가 CPU의 제어권을 가지고 운영체제 코드를 실행하는 모드로, 모든 종류의 명령을 실행할 수 있다.
  • 사용자모드에서는 일반 사용자 프로그램이 실행되며 제한적인 명령만을 수행할 수 있다.
  • 운영체제가 사용자 모드에서 운영체제의 코드를 실행하지 못하게 감시할 방법이 없기 때문에 하드웨어적으로 이를 해결한다. 컴퓨터 시스템은 CPU 내부에 모드비트(mode bit)를 두어 사용자 프로그램을 감시한다.
  • 모드비트가 0이면 커널모드, 모드비트가 1이면 사용자 모드이다.
  • 사용자 모드에서 보안이 필요한 명령을 수행해야 할 경우 시스템 콜을 통해 운영체제가 대신해줄 것을 요청한다. 이때 CPU의 제어권은 운영체제로 넘어가고 모드비트는 0으로 세팅되어 모든 명령을 수행할 수 있게 된다. 
  • 모든 입출력 명령은 특권명령으로 커널모드에서만 수행할 수 있다.

커널모드와 사용자모드

 

10. 메모리 보안

  • 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범하지 못하도록 메모리 보안 역시 필요하다.
  • 인터럽트 벡터와 인터럽트 처리루틴이 있는 곳을 사용자 프로그램이 접근하지 못하도록 막는 방법이 필요하다.
  • 이를 위해 기준 레지스터(base register)한계 레지스터(limit register), 2개의 레지스터를 사용해서 프로그램이 접근하려는 메모리 부분이 합법적인지 체크한다.
  • 기준 레지스터는 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근할 수 있는 메모리상의 가장 작은 주소이다.
  • 한계 레지스터는 프로그램이 기준 레지스터값부터 접근할 수 잇는 메모리의 범위를 보관하고 있다.
  • 메모리 접근 연산이 있을 때마다 하드웨어적으로 현재 접근하려는 위치가 기준 레지스터 + 한계 레지스터값 사이의 주소 영역인지 확인한다.
  • 만약 범위를 벗어나면 불법적인 메모리 접근이므로 예외상황이라는 트랩을 발생시켜 CPU의 제어권을 운영체제로 이양시키고, 운영체제는 해당 프로그램을 강제로 종료시킨다.
  • 위의 방법은 프로그램이 메모리의 한 영역에 연속적으로 위치하는 메모리 관리 기법일 경우에만 사용할 수 있다. 추후에 다른 방법에 대해서 살펴볼 것이다.
  • 메모리 접근 연산은 특권명령은 아니지만 기준 레지스터와 한계 레지스터의 값을 세팅하는 연산은 특권명령에 해당한다.
  • 2개의 레지스터값은 운영체제가 직접 세팅해주고 사용자 프로그램은 값을 변경할 수 없게 한다.

기준 레지스터와 한계 레지스터에 의한 메모리 보호

 

11. CPU 보호

  • CPU는 일반적으로 컴퓨터에 하나 밖에 존재하지 않기 때문에 특정 프로그램이 독점하지 못하도록 해야한다.
  • 이를 위해 운영체제는 타이머(timer)라는 하드웨어를 사용한다.
  • 타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 획득할 수 있도록 한다.
  • 타이머가 0이 되는 순간 인터럽트가 발생하고, 운영체제는 현재 프로그램으로 부터 CPU의 제어권을 획득하여 다른 프로그램에게 CPU를 이양한다.
  • 타이머의 값을 세팅하는 명령을 로드 타이머(load timer)라고 하며, 특권명령에 속한다.

 

12. 시스템 콜을 이용한 입출력 수행

  • 사용자 프로그램이 디스크의 파일에 데이터를 쓰거나 디스크의 파일로부터 데이터를 읽어오는 행위, 키보드로부터 입력을 받거나 수행 결과를 화면에 출력하는 행위, 키보드로부터 입력을 받거나 수행 결과를 화면에 출력하는 행위 등은 특권명령인 입출력 명령에 해당한다.
  • 입출력 명령은 운영체제 코드에 구현되어 있으며, 시스템 콜을 통해 CPU의 제어권을 운영체제에게 넘어간다.
  • 운영체제는 장치의 컨트롤러에게 입출력 요청을 수행하도록 명령하고 컨트롤러는 입출력 수행을 마치면 CPU에게 인터럽트를 발생시켜 입출력이 완료되었음을 알리고 해당 프로그램이 다시 CPU를 할당받을 수 있도록 한다. 

 

Reference

 

운영체제와 정보기술의 원리 - 교보문고

이 책은 총 10장으로 구성되어 있다.1장 ‘컴퓨터 및 정보기술의 역사’에서는 운영체제를 설명하기에 앞서 정보기술의 원리와 철학에 대해 정의하고, 컴퓨터와 정보기술 분야의 역사를 간략히

www.kyobobook.co.kr

 

반응형

'CS > OS' 카테고리의 다른 글

[OS] 스핀락, 뮤텍스, 세마포어  (0) 2021.12.22
[OS] 공유 자원 접근 문제  (0) 2021.12.22
[OS] 05. 프로세스 관리  (0) 2021.12.21
[OS] 04. 프로그램의 구조와 실행  (0) 2021.12.20
[OS] 02. 운영체제 개요  (0) 2021.12.13

댓글