컴퓨터 시스템의 구조

  • 컴퓨터의 업무 처리 방식은 컴퓨터 외부 장치에서 컴퓨터 내부로 데이터를 읽어와서 각종 연산을 수행한 후 그 결과를 컴퓨터 외부 장치로 다시 내보내는 방식으로 진행된다.
  • 또한, 컴퓨터 내의 각 하드웨어 장치에는 컨트롤러라는 것이 붙어 있다. 컨트롤러는 일종의 작은 CPU로서, 하드웨어를 제어하는 작은 cpu라고 할 수 있다.
    • 메모리를 제어하는 메모리 컨트롤러, 디스크를 제어하는 디스크 컨트롤러

CPU와 I/O 연산

  • 컴퓨터에서 연산을 한다는 것은 cpu가 무언가 일을 한다는 뜻
  • 입출력 장치들의 I/O 연산은 I/O컨트롤러가 담당하고, 컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당하게 된다. 이때, 입출력 장치와 메인 cpu는 동시에 수행이 가능하다.
  • 각 하드웨어의 컨트롤러에는 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리가 존재한다.(로컬 버퍼)
  • 하드웨어가 데이터를 모두 가져 왔는지 확인하는 작업은 메인 cpu가 매번 확인하는 것이 아니라 컨트롤러가 인터럽터를 발생시켜서 cpu에게 알려준다.
  • cpu는 매 시점 메모리에서 명령을 하나씩 읽어와서 수행한다. 이때 cpu옆에는 인터럽트 라인이 있어서, 자신이 작업을 하던 중간에 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고, 인터럽트와 관련된 일을 처리한다.
    • cpu는 명령 하나를 수행할 때마다 인터럽트가 발생했는지를 확인한다, 인터럽트가 발생했으면 다음 명령을 수행하기 전에 인터럽트를 처리하게 되고 그렇지 않으면 다음 명령을 계속 수행한다.

인터럽트

cpu는 매 시점 메모리에서 명령을 하나씩 읽어와서 수행한다. 이때 cpu옆에는 인터럽트 라인이 있어서, 자신이 작업을 하던 중간에 인터럽트 라인에 신호가 들어오면 하던 일을 멈추고, 인터럽트와 관련된 일을 처리한다.

image.png

인터럽트 처리 루틴

  • 운영체제 커널에는 인터럽트가 들어왔을 때 해야 할 일을 미리 다 프로그래밍해서 보관하고 있다.
  • 다양한 인터럽트에 대해 각각 처리해야 할 업무들을 정의한 내용

하드웨어 인터럽트, 소프트웨어 인터럽트

  • 하드웨어 인터럽트는 하드웨어 컨트롤러가 인터럽트 라인을 세팅하는 반면, 소프트웨어 인터럽트는 소프트웨어가 그 일을 수행한다는 차이점이 있다.
  • 하드웨어 인터럽트, 소프트웨어 인터럽트가 발생하면 cpu는 하던일을 멈추고 인터럽트를 처리하기 위한 루틴에 들어가서 정의된 일을 처리한다.

인터럽트 벡터, 인터럽트 서비스 루틴

  • 운영체제는 할 일을 쉽게 찾아가기 위해 인터럽트 백터를 가지고 있다.
    • 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 포인터로 가리키고 있는 자료구조
    • 실제 처리해야 할 내용은 인터럽트 서비스 루틴 이라는 다른곳에 정의 된다.
  • 인터럽트 서비스 루틴을 통해 해당하는 인터럽트 처리를 완료하고 나면 원래 수행하던 작업으로 돌아가 정지되었던 일을 계속 수행하게 된다.
    • 인터럽트 처리 전에 수행중이던 작업이 무엇이었는지 반드시 저장해 두어야 한다. (운영체제가 별도로 가지고 있음)

프로그램 메모리 주소

  • 프로그램의 메모리 주소를 조사해 보면 코드,데이터,스택 등의 영역으로 나눠진다.

image.png

스택

  • 스택은 실행중인 함수에서 다른 함수를 호출한 경우 호출된 함수의 종료 후 원래 함수의 실행중이던 위치로 돌아가기 위해 복귀주소를 저장하는 영역이다.
  • 메인 함수에서 실행되다가 다른 함수를 호출하면 다음 명령을 수행하는 메모리(instruction)의 위치가 바뀌게 된다. (호출된 함수의 영역으로 점프해서 실행)
  • 호출된 함수를 모두 수행하고나면 원래 함수의 수행되던 위치로 돌아가게 되는데 이 때 스택에 저장되어 있는 복귀 주소를 사용하게 된다.

데이터

  • 데이터 영역은 전역 변수 등 프로그램이 사용하는 각종 데이터가 저장되는 공간
  • 데이터 영역에 저장되는 전역 변수들은 동일한 프로그램 내의 모든 함수들이 공유해 사용할 수 있게 된다

코드

  • 프로그래머가 작성한 코드가 기계어 명령(machine instruction)형태로 저장되는 영역
  • cpu는 매 시점 코드부분에 있는 명령을 하나씩 읽어와서 수행하게 된다.

인터럽트 핸들링

인터럽트 핸들링이란 인터럽트가 발생한 경우에 처리해야 할 일의 절차를 의미한다.

인터럽트 발생시 처리 루틴

  1. 프로그램 A가 수행되고 있을 때 인터럽트가 발생하면 A의 현재 상태를 저장해야 한다. (현재 상태는 cpu가 수행중이던 메모리 주소를 포함해 부가정의 정보)

  2. cpu에서는 레지스터에 데이터를 읽어오거나 쓰면서 작업을 수행하게 되는데, 인터럽트가 걸려서 새로운 명령을 수행하면 기존에 실행중이던 A의 정보가 지워지게 되므로 레지스터 값 등 cpu내의 하드웨어 상태를 저장해 두어야 한다.

  3. 임시로 저장한 후에야 인터럽트 처리를 진행한다.

PCB(Process Control Block)

image.png

  • 운영체제 커널 영역에는 현재 시스템 내에서 수행되는 프로그램들을 관리하기 위한 자료 구조인 프로세스 제어 블록(PCB)를 두고 있다.
  • PCB중 일부분은 인터럽트가 발생했을 때 프로그램의 어느 부분이 수행되던 중이었는지를 저장하기 위한 자료구조로 사용된다.
  • 현재 수행중이던 메모리 주소와 레지스터 값, 그리고 하드웨어 상태등이 저장
  • 인터럽트 수행이 끝나면 저장된 값을 cpu상에 다시 복원해 인터럽트 당하기 전의 작업을 이어서 진행한다.

※ 인터럽트 진행되는 동안, 프로그램 내부의 함수 호출?

  • 프로그램 내부에서 함수 호출이 일어나면, 프로그램의 스택 영역을 이용해서 복원지점을 저장한다. 만약 인터럽트 간에 프로그램 함수 호출이 발생한다면 어떻게 처리를 할까?
    • 인터럽트 처리 루틴은 운영체제 커널 프로그램 중 일부이고, 커널 역시 함수구조로 이루어 져 있으므로 인터럽트 처리코드가 수행되는 도중에도 함수 호출이 이루어질 수 있어 스택이 필요함
    • 인터럽트의 처리는 커널의 코드를 수행하는 것이므로 인터럽트 처리 중 발생하는 함수 호출시에는 "운영 체제 커널의 주소 공간 중 스택 영역"을 사용
    • 만약, 여러개의 프로그램이 작업하고 있다면, 커널 스택은 프로그램 개수만큼 n만큼의 독자적인 공간을 둔다. (인터럽트 처리 루틴으로 넘어와서 함수호출이 일어날 경우에 각 프로세스 별로 독자적인 스택공간을 할당하기 위해서)

인터럽트 처리중에 또 다른 인터럽트 발생하는 경우

  • 원칙적으로는 데이터 일관성이 유지되지 않기 때문에 인터럽트 처리중에 또다른 인터럽트를 허용하지 않는다.
  • 예외적으로, 우선순위가 높은 인터럽트가 발생할 경우가 있기 때문에 예외처리가 필요
    • 중요도가 더 높은 인터럽트가 발생하는 것을 허락할 필요가 있ㅇ므
    • 현재 처리중이던 인터럽트 코드의 수행 지점을 커널 스택에 저장하고 우선순위가 높은 인터럽트를 처리
    • 인터럽트가 끝이나면, 커널 스택에 저장된 주소로 복귀해 이전에 수행하던 인터럽트 처리 코드를 마저 처리한다.

입출력 구조

입출력(I/O)란 컴퓨터 시스템이 컴퓨터 외부의 주변 장치들과 데이터를 주고받는 것을 말하고,입출력은 동기식 입출력과 비동기식 입출력으로 구분할 수 있다.

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

  • 입출력 요청 후 입출력 작업이 완료돈 후에야 CPU의 제어권이 그 프로그램에 다시 넘어갈 수 있는 방식을 말한다.
  • 프로그램이 디스크에서 어떠한 정보를 읽어오라는 요청을 했으면, 디스크 입출력이 완료되기까지 어느 정도의 시간이 걸리는데 입출력이 완전히 완료가 되고 인터럽트가 들어와야 프로그램이 다음 명령을 실행할 수 있다,
  • 입출력 연산이 끝날때 까지 CPU는 아무 일을 수행할 수 없다. 따라서, I/O작업이 있으면 다른 프로그램에게 CPU제어권을 넘겨서 CPU가 쉬지 않도록 한다.
    • A에서 I/O요청이 있어서 B로 전환되었는데 B프로그램에서도 I/O작업이 있다. 이때, 둘이 디스크의 같은 자원에 대해서 동시에 입출력 연산이 일어날 수 있으므로 동기화 문제가 발생한다.
    • 동기성을 유지하기 위해서 장치마다 큐를 두어 요청된 순서대로 입출력을 처리하도록 한다.

image.png

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

  • 입출력 연산을 요청한 후에 연산이 끝나기를 기다리는 것이 아니라 CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 곧바로 다시 부여하는 방식

image.png

DMA(Direct Memory Access)

원칙적으로 메모리는 CPU에 의해서만 접근 가능한 장치이다. 따라서, 주변 장치들이 메모리에 접근하기 위해서는 CPU에게 인터럽트를 걸어서 CPU가 일을 대신 처리하는 식으로만 가능하다. 이때, 프로그램에서 메모리 접근이 필요할때마다 CPU에게 인터럽트를 걸면 CPU사용의 효율성이 떨어지는 문제가 발생한다. 이를 보완하기 위해 등장한 것이 DMA(Direct Memory Access)이다.

  • DMA는 일종의 컨트롤러로서, CPU가 주변 장치들의 메모리 접근 요청에 의해 자주 인터럽트당하는 것을 막아주는 역할을 한다.
  • DMA를 사용하면 로컬 버퍼에서 메모리로 읽어오는 작업을 CPU가 하는거이 아니라, DMA가 대행함으로써 CPU는 원래 하던 작업을 멈추고 인터럽트를 처리할 필요가 없어진다.
  • DMA는 바이트 단위가 아니라 블록이라는 큰 단위로 정보를 메모리로 읽어온 후에 CPU에게 인터럽트를 발생당 작업의 완료를 알려주게 된다. (인터럽트 빈도를 줄여서, CPU를 효율적으로 사용)

[DMA가 없을때 메모리 접근]
image.png

[DMA 존재하는 시스템]

image.png

저장 장치의 구조

  • 컴퓨터 시스템을 구성하는 저장 장치는 주 기억 장치와 보조 기억 장치로 나누어 볼 수 있다.
  • 주 기억 장치는 메모리라고 부르면 전원이 나가면 저장되었던 내용이 모두 사라져 버리는 휘발성의 RAM을 매체로 사용한다.
  • 보저기억장치는 전원이 나가도 저장된 내용을 기억할 수 있는 비휘말성의 마그네틱 디스크를 사용

보조기억 장치 용도

  • 전원이 나가도 유지해야할 정보가 있으면 파일 형태로 보조 기억장치에 저장한다 ( 파일 시스템용으로서의 용도)
  • 메모리의 연장공간인 스왑 영역(swap area)용도로 사용
    • 메모리는 가격이 비싸고 크기가 한정되어 있기 때문에, 다수의 프로그램이 메모리에 올라가면 메모리 공간이 부족한 현상이 발생한다. 이때, 당장 프로그램 수행에 필요한 부분만 메모리에 올리고 그렇지 않은 부분은 디스크의 스왑영역에 내려 놓는다. (swap out)
    • 프로그램이 실행될 때 내용을 저장했다가 프로그램이 종료되면 내용을 삭제하는 메모리의 연장공간으로 사용

image.png

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

image.png

  • 상위 저장 계층으로 갈수록 접근 속도가 빠르지만 용량은 적다. 당장 필요한 정보만 선별적으로 저장하게 되면 하위에 있는 큰 용량의 저장 장치를 가지고 있는 거소가 비슷한 성능 효과를 낼 수 있다. (캐싱기법)
    • 캐싱기법 ? 상대적으로 느린 저장장치에 있는 내용 중에 당장 사용되거나 빈번히 사용될 정보를 빠른 저장 장치에 선별적으로 저장해 두 저장 장치 사이의 속도를 완충시키는 기법

하드웨어 보안

image.png

현대의 운영체제는 다중 프로그래밍 환경에서 동작한다. 각 프로그램들이 다른 프로그램의 실행을 방해하거나 프로그램간에 충돌을 일으키는 문제를 막기위해 하드웨어에 대한 각종 보안 기법이 필요하다.

커널모드

  • 운영 체제가 CPU의 제어권을 가지고 운영 체제 코드를 실행하는 모드
  • 모든 종류의 명령을 다 실행할 수 있다.

사용자 모드

  • 일반 사용자 프로그램이 실행되며 제한적인 명령만을 수행할 수 있다.
  • 시스템에 영향을 주는 연산은 커널 모드에서만 수행 가능하도록해서 하드웨어 보안을 유지
  • CPU 내부에 모드 비트(mode bit)를 두어 사용자 프로그램을 감시
    • 모드 비트가 0으로 설정되어 있으면 커널 모드로서 모든 명령을 수행
    • 모드 비트가 1이면 사용자 모드로서 제한된 명령만을 수행할 수 있다.
    • cpu는 제한된 명령을 실행할때는 하드웨어의 모드 비트를 확인해서 0인경우만 그 명령을 수행
    • 프로그램 내부에서 제한된 요청이 필요할 경우에는 system call을 통해 운영체제에게 서비스를 대신해 줄 것을 요청

디스크 보안

  • 입출력은 특권 명령이기 때문에 입출력을 하고 싶으면 SYSTEM CALL을 통해서 운영체제에게 대신 요청을 해야한다. (키보드 입력, 데이터 쓰기 읽기, 모니터 출력 등등)
  • 운영체제는 입출력 요청이 올바른 요청인지 확인한 후 입출력을 실행하기 때문에 파일에 대한 보안을 유지할 수 있다.

메모리 보안

image.png

  • 인터럽트 벡터와 인터럽트 처리 루틴이 있는 곳은 각별히 보안이 필요하다.
  • 두 개의 레지스터를 활용해서 프로그램이 접근 하려는 메모리 부분이 합법적인지 체크함으로써 메모리를 보호한다.
    • 기준 레지스터(base register) : 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근할 수 있는 메모리 상의 가장 작은 주소를 보관하고 있다.
    • 한계 레지스터(limit register) : 프로그램이 기준 레지스터 값부터 접근할 수 있는 메모리 범위를 보관하고 있다.
  • 실제 메모리에 올라가 있는 시작 주소와 그 프로그램의 길이를 가지고 있다가 메모리 접근 연산이 있을때 마다 하드웨어적으로 접근 위치가 합법적인지 체크하는 메커니즘
  • 기준 레지스터 + 한계 레지스터값 사이의 영역에만 접근할 수 있다.
  • 단, 커널 모드에서는 메모리에 무제한으로 접근이 가능하다.

cpu 보안

  • cpu가 하나의 프로그램에 의해 독접되는 것으 ㄹ막기 위해 타이머 라는 하드웨어 사용
  • 정해진 시간이 지나면 인터럽트를 발생시켜 운영 체제에게 cpu의 제어권을 이양 시키는 역할 수행
  • 타이머가 0이되는 순간 인터럽트가 발생
  • 시분할 시스템에서 현재 시간을 계산하기 위한 용도로도 사용

※참고자료

https://www.quora.com/What-is-the-function-of-DMA-in-a-computer
http://www.yes24.com/Product/Goods/2824944
https://doc.micrium.com/display/os305/Handling+CPU+Interrupts
https://www.includehelp.com/operating-systems/memory-layout-of-a-process.aspx
https://prepinsta.com/operating-systems/process-control-block/
https://www.enterprisestorageforum.com/storage-hardware/memory-swapping.html
https://www.geeksforgeeks.org/dual-mode-operations-os/
https://www.cs.uic.edu/~jbell/CourseNotes/OperatingSystems/8_MainMemory.html