운영체제(2)-컴퓨터 시스템의 동작 원리 :computer:

업데이트:

<운영체제와 정보기술의 원리>, 반효경 을 읽고 정리한 내용입니다

컴퓨터 시스템의 구조

  • Controller
    • 각 하드웨어 장치마다 존재하며, 제어하는 작은 CPU

프로그램이 수행되려면 해당 프로그램이 메모리에 올라가 있어야 한다.

운영체제 중 항상 메모리에 올라가 있는 부분을 Kernel이라고 부른다.

CPU와 I/O연산

입출력 장치들의 I/O연산은 I/O컨트롤러가 담당하고,

컴퓨터 내에서 수행되는 연산은 메인 CPU가 담당하게 된다.

  • Local Buffer
    • 장치 컨트롤러 안에 있으며, 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리
    • 입출력 장치에서 데이터를 읽는 경우, local buffer에 데이터가 임시 저장된 후 메모리에 전달된다.
  • Interrupt
    • 입출력 컨트롤러들이 CPU의 서비스가 필요할 때 통보하는 방법
    • CPU가 작업을 하던 중 인터럽트 라인에 신호가 들어오면 멈추고, 인터럽트를 처리한다.

인터럽트의 일반적 기능

운영체제 커널에는 인터럽트가 들어왔을 때 해야 할 일을 미리 프로그래밍하여 보관하고 있다.

인터럽트 발생 수행 코드

먼저, 로컬 버퍼에 있는 내용을 프로그램 B가 사용할 수 있도록 메모리로 전달하고, 이제 B가 CPU를 할당받을 경우 다음 명령(instruction)을 수행할 수 있음을 표시해 둔다.

  • 하드웨어 인터럽트
    • 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅
  • 소프트웨어 인터럽트
    • 소프트웨어가 CPU의 인터럽트 라인을 세팅

인터럽트가 발생하면 CPU는 하던 일을 멈추고 인터럽트를 처리하기 위한 루틴(운영체제 커널 내부 코드)에 들어가 정의된 일을 찾는다.

  • 인터럽트 벡터
    • 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 포인터로 가지고 있는 자료 구조
  • 인터럽트 서비스 루틴
    • 실제 처리해야 할 내용

프로그램의 메모리 주소 구성

  • Stack
    • 실행중인 함수에서 다른 함수를 호출한 경우 호출된 함수의 종료 후 원래 함수의 실행중이던 위치로 돌아가기 위해 복귀 주소를 저장하는 영역
  • Data
    • 전역 변수 등 프로그램이 사용하는 각종 데이터가 저장되는 공간
  • Code
    • 프로그래머가 작성한 코드가 기계어 명령 형태로 저장되는 영역
    • CPU는 매 시점 코드 영역의 명령을 하나씩 읽어와서 수행하게 된다.

인터럽트 핸들링

인터럽트 핸들링

  • 인터럽트가 발생한 경우 처리해야 할 일의 절차

CPU에서 명령이 수행될 때 CPU내부의 임시 기억 장치인 register에 데이터를 읽어오거나 쓰면서 작업을 수행한다.

이 때, 인터럽트 발생하여 새로운 명령 수행하면 기존 레지스터 값들이 지워지게 되므로 레지스터 값 등 CPU 내의 하드웨어 상태를 저장해 두어야 한다.

PCB, 프로세스 제어 블록(Process Control Block)

  • 시스템 내에서 수행되는 프로그램들을 관리하기 위한 자료구조
  • 운영체제 커널 영역에 존재
  • 일부분은 인터럽트 발생시 메모리 주소, 레지스터 값, 하드웨어 상태 등을 저장하기 위한 자료구조로 쓰인다.

인터럽트 루틴이 수행되는 도중에도 함수 호출이 이루어질 수 있어 스택을 이용해야 한다.

인터럽트 처리는 커널의 코드를 수행하는 것이므로, 함수 호출 시 커널의 주소 공간 중 스택 영역을 사용한다.

커널 스택은 수행중인 프로그램의 개수인 n만큼 독립적인 공간을 둔다.

  • 여러 프로그램이 커널 코드를 수행할 수 있으므로
  • 커널은 일종의 공유 코드
  • 각 프로그램은 독자적인 커널 스택을 사용하게 된다.

프로그램 A가 수행 중에 인터럽트가 발생하면

  • 현재까지 수행된 지점을 PCB에 저장하고
  • 인터럽트 처리 루틴으로 와서 커널 코드를 수행
  • 이 때, 함수 호출은 프로세스 A의 커널 스택을 사용한다
  • 인터럽트 처리가 끝나면 PCB에 저장된 주소로 돌아가서 중지된 작업의 나머지 부분을 수행한다.

인터럽트 처리 중에 또다른 인터럽트가 발생하게 되면?

  • 원칙적으로는 허용하지 않는다.
    • 데이터 일관성 유지하기 위해
  • 현재 처리중인 인터럽트보다 높은 우선순위의 인터럽트가 발생하면
    • 처리중인 인터럽트의 수행 지점을 커널 스택에 저장하고
    • 우선순위가 높은 인터럽트를 처리

소프트웨어 인터럽트

  • trap이라고 불린다
  • 하드웨어 인터럽트는 컨트롤러가 발생시킴
    • 소프트웨어 인터럽트는 프로그램 수행 도중 직접 CPU에 인터럽트 라인을 세팅하여 발생시킴
  • exception(예외)
    • 메모리 영역 바깥에 접근하려는 경우
    • 연산 불가능한 작업을 시도하는 경우
  • system call
    • 운영체제에 정의된 함수를 호출하는 것
    • write()

운영체제가 직접 CPU를 점유하는 경우는 인터럽트에 의하지 않고는 발생하지 않는다.

입출력 구조

  • 동기식 입출력
    • 입출력 작업이 완료된 후에 CPU제어권이 돌아간다
    • 입출력 연산은 상대적으로 속도가 느리다. CPU 자원의 낭비를 초래하게 됨
    • 입출력이 완료될 때까지 CPU를 다른 프로그램에게 할당하는 것을 봉쇄 상태(Blocked State)로 전환시킨다고 한다.
    • 동기화 문제가 발생한다.
      • 장치별로 queue를 두어 요청한 순서대로 처리할 수 있도록 한다
    • 입출력 완료되면 인터럽트를 보낸다
    • 운영체제 커널은 해당 프로그램을 봉쇄 상태에서 해제하고 CPU를 할당받을 수 있게 한다
  • 비동기식 입출력
    • 입출력 연산이 끝나는 것을 기다리지 않는다
    • CPU의 제어권을 입출력 연산을 호출한 프로그램에 다시 부여한다.
    • 입출력과 관계없는 작업을 먼저 수행하고
    • 입출력 연산과 관계있는 작업은 입출력이 완료된 후 수행한다
    • 쓰기 작업은 입출력이 끝나지 않더라도 다음 작업을 수행할 수 있다.

실행 예시

  1. 프로그램 A가 디스크에서 데이터를 읽어오는 명령을 만난다
  2. A는 시스템 콜을 통해 CPU에게 소프트웨어 인터럽트를 발생시킨다
  3. CPU는 A의 코드를 수행하던 일을 멈추고 현재 수행 상태를 저장한다
  4. CPU는 인터럽트에 의해 처리해야 할 루틴으로 이동한다
  5. CPU는 컨트롤러에게 입출력 연산을 요청한다
  6. 컨트롤러는 A가 요청한 데이터를 디스크로부터 자신의 로컬 버퍼로 읽어온다
  7. 읽어오는 동안 A는 CPU를 선점당한다.
  8. 운영체제는 A를 봉쇄 상태로 만든다.
  9. 운영체제는 CPU를 다른 프로세스에게 할당해 계속 작업하도록 한다
  10. 데이터가 로컬 버퍼로 다 들어오면 컨트롤러는 CPU에게 하드웨어 인터럽트를 발생시킨다
  11. B를 수행중이던 CPU는 수행지점과 상태를 저장해놓고 인터럽트를 처리한다
  12. 인터럽트 처리 루틴은 로컬 버퍼의 데이터를 A의 메모리 영역으로 읽어오고
  13. A의 봉쇄 상태를 해제한다
  14. B의 지점으로 톨어가서 하던 작업을 마저 수행한다
  15. A는 CPU를 기다리다가 자신의 차례가 되면 CPU를 할당받고 입출력 이후의 작업을 수행한다.

DMA (Direct Memory Access)

원칙적으로 메모리는 CPU에 의해서만 접근 가능한 장치이다.

모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 주변 장치가 메모리 접근을 원할 때마다 인터럽트를 통해 CPU의 업무가 방해를 받게 되어 CPU사용의 효율성이 떨어지게 된다.

이를 해결하기 위해 CPU이외에 메모리 접근이 가능한 장치를 둔다. 이를 DMA(Direct Memory Access)라 한다.

  • DMA는 로컬 버퍼에서 메모리로 읽어오는 작업을 CPU가 아닌 DMA가 대행하게 된다.
  • DMA는 byte 단위가 아닌 block이라는 큰 단위로 메모리를 읽어온 후 CPU에 인터럽트를 발생시켜 작업의 완료를 알려주게 된다.
  • 이를 통해 CPU에 발생하는 인터럽트의 빈도를 줄인다.

저장 장치의 구조

  • 주 기억 장치
    • 메모리라고 부름
    • RAM (휘발성)
  • 보조 기억 장치
    • 비휘발성
    • 마그네틱 디스크, 플래시 메모리, CD, 마그네틱 테이프 등
    • 용도
      • 파일 시스템. 비휘발성이기 때문에
      • Swap area(스왑 영역)
        • 메모리의 연장 공간
    • 관련 이미지
      • arm이 이동하며 원판에 저장된 데이터를 읽고 쓴다
      • 원판은 track으로 나뉘고
      • 각 트랙은 sector로 나뉜다
        • sector에 최소한의 단위 정보가 저장된다.

저장장치의 계층 구조

저장장치의 계층 구조에 대한 이미지 검색결과

상위 저장 장치일수록 속도가 빠르고 비싸다. 당장 필요한 정보는 상위 저장 장치에 저장해둔다.

Cache란, 상대적으로 느린 저장 장치에 있는 내용 중에 당장 사용되거나 빈번히 사용될 정보를 빠른 저장 장치에 선별적으로 저장해 두 저장 장치 사이의 속도를 완충시키는 기법을 의미한다.

하드웨어의 보안

흔히 사용하는 운영 체제는 multi-programming 환경에서 동작한다.

따라서 각 프로그램들이 다른 프로그램의 실행을 방해하거나 충돌을 일으키는 문제를 막기 위해 보안 기법이 필요하다.

  • 두 가지 모드의 operation
    • Kernel Mode
      • OS가 CPU의 제어권을 가지고 OS 코드를 실행하는 모드
      • 모든 종류의 명령을 다 실행할 수 있다.
      • 시스템에 중요한 연산은 커널 모드에서만 실행 가능
    • User Mode
      • 일반 사용자 프로그램이 실행됨
      • 제한적인 명령만을 수행할 수 있음

그러나, 사용자 프로그램이 CPU를 점유하고 있는 동안 운영체제에서는 CPU를 선점할 수 없으므로 사용자 프로그램을 감시할 수 없다. 따라서 사용자 프로그램 내에서 critical 연산을 수행하게 되면 문제가 된다.

이를 방지하기 위해 하드웨어의 지원을 받는다. CPU 내부에 mode bit를 둔다

  • mode bit 0
    • kernel mode로 모든 명령을 수행할 수 있다.
  • mode bit 1
    • 사용자 모드로 제한된 명령만을 수행할 수 있다.

OS가 CPU를 점유해 자신의 코드를 실행하다가 User program에 CPU의 제어권을 넘길 때 mode bit를 1로 세팅하여 넘기게 된다.

User program이 critical 명령을 수행해야 할 떄는 System Call 을 통해 OS에게 CPU 제어권을 넘겨주게 된다. 인터럽트가 발생할 때에는 모드 비트가 자동적으로 0으로 세팅된다.

관련 이미지

메모리 보안

여러 프로그램이 메모리에 동시에 올라가서 실행되기 때문에 하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제 커널이 위치한 메모리 영역을 침범할 수 있다.

이를 해결하기 위해 두 레지스터를 사용해서 프로그램이 접근하려는 메모리 영역이 합법적인지를 체크함으로써 메모리 보호가 이루어진다.

  • 기준 레지스터
    • 프로그램이 합법적으로 접근할 수 있는 메모리 상의 가장 작은 주소를 보관하고 있다
    • 프로그램의 시작 주소
  • 한계 레지스터
    • 프로그램이 기준 레지스터 값부터 접근할 수 있는 메모리의 범위를 보관하고 있다.
    • 프로그램의 길이

사용자 프로그램은 기준 레지스터 ~ 기준 레지스터+한계 레지스터 값 사이의 주소 영역만 접근이 가능

접근하려는 주소가 이 범위에 없다면 Exception 소프트웨어 인터럽트가 발생한다.

Exception은 OS에게 SW interrupt를 발생시켜 CPU의 제어권을 해당 프로그램으로부터 OS로 전달한다.

기준 레지스터 한계 레지스터 operating system에 대한 이미지 검색결과

관련 이미지

메모리 접근 연산은 user program이 CPU를 점유하고 있는 동안에도 수행할 수 있는 연산으로, 특권 명령은 아니다. 다만, 사용자 프로그램이 메모리를 접근하기 전에 하드웨어적으로 그 접근이 합법적인지를 체크하여 메모리를 보호하게 된다.

user mode에서는 base register와 limit register를 사용하여 메모리를 보호하고

kernel mode에서는 메모리에 무제한으로 접근이 가능하다

base register와 limit register의 값을 설정하는 연산은 특권 명령으로 규정해야 한다. OS가 두 레지스터 값을 설정해 주고 user program은 값을 변경할 수 없다.

CPU 보호

일반적으로 CPU는 컴퓨터 내에 하나밖에 존재하지 않기 때문에 특정 프로그램이 CPU의 제어권을 독점하고 있다면 다른 프로그램이나 OS가 CPU의 제어권을 획득할 수 있는 방법이 없게 된다. 이를 막기 위해 OS는 Timer라는 하드웨어를 사용한다.

타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 OS에게 CPU의 제어권을 이양시키는 역할을 수행한다.타이머에 의해 발생되는 인터럽트 처리 루틴은 지금 CPU를 할당받고 수행중인 프로그램에게서 CPU를 선점해 다른 프로그램에게 CPU를 이양하라는 명령이다.

System Call을 이용한 I/O 수행

입출력 명령은 모두 특권 명령에 해당하므로 user program이 직접 수행할 수 없다.

입출력 명령은 모두 OS 코드에 구현되어 있으며, user program은 OS에게 system call 요청을 하여 입출력을 수행하게 된다.

system call은 소프트웨어 인터럽트로서 system call 시에 trap이 발생하여 CPU에 대한 제어권을 OS로 넘겨주게 된다.

3장은 큰 틀에서 컴퓨터 구조에 대해서 살펴보았다. 방대하면서도 중요하지 않은 내용이 없어서 체계적으로 정리를 못한 것 같다 :joy:

다음 4장은 인터럽트에 대해 정리해 볼 것이다.

운영체제(1) - 개요

댓글남기기