yooniiverse
개발 블로그
yooniiverse
전체 방문자
오늘
어제
  • 분류 전체보기
    • 운영체제
    • 네트워크
    • ~2023.02
      • 외부교육
      • 대외활동
      • 스터디
      • 동아리
      • TIL
      • IT지식
      • 기타
      • 트러블 슈팅
      • 프로그래밍
      • Python
      • Java
      • JS
      • DB(SQL)
      • JSP
      • Spring
      • 기술면접
      • 자바
      • 코딩테스트
      • 자료구조
      • 알고리즘
      • 백준 문제풀이
      • 인공지능
      • 머신러닝
      • 프로젝트
      • 안드로이드 앱개발
      • 웹개발
      • 웹 서비스
      • 웹퍼블리싱
      • Node.js 백엔드 개발
      • CS
      • 1일 1CS지식
      • 운영체제
      • 네트워크
      • 데이터베이스
      • 정보처리기사
      • 도서 리뷰
      • 개발 관련 도서
      • 기타 도서

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yooniiverse

개발 블로그

~2023.02/운영체제

02_컴퓨터 시스템의 동작 원리

2022. 10. 20. 21:01

목차


1. 컴퓨터 시스템의 구조

2. CPU 연산과 I/O 연산

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

4. 인터럽트 핸들링

5. 입출력 구조

6. DMA

7. 저장장치의 구조

8. 저장장치의 계층 구조

9. 하드웨어의 보안

10. 메모리 보안

11. CPU 보호

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

 

1. 컴퓨터 시스템의 구조


그림

 

2. CPU 연산과 I/O 연산


2.1 로컬버퍼

입출력 장치와 메인 CPU는 동시 수행이 가능하다.

각 장치마다 이를 제어하기 위해 설치된 장치 컨트롤러는 장치로부터 들어오고 나가는 데이터를 임시로 저장하기 위한 작은 메모리를 가지고 있는데, 이를 로컬버퍼(local buffer)라고 한다. 

디스크나 키보드 등에서 데이터를 읽어오는 경우, 우선 로컬버퍼에 데이터가 임시로 저장된 후 메모리에 전달된다. 이때 장치에서 로컬버퍼를 읽어오는 일은 컨트롤러가 담당한다.

 

CPU는 명령 하나를 수행할 때마다 인터럽트 라인을 통해 인터럽트가 발생했는지 확인한다.

인터럽트는 키보드 입력 혹은 요청된 디스크 입출력 작업의 완료 등 CPU에 알려줄 필요가 있는 이벤트가 일어난 경우 컨트롤러가 발생시키는 것이다.

 

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


3.1 인터럽트 처리루틴

프로그램이 요청한 데이터를 디스크 컨트롤러가 로컬버퍼로 읽어온 후 인터럽트를 발생시키면 CPU는 인터럽트가 들어옴을 인지하고 인터럽트 관련 업무를 수행한다.

운영체제 커널에는 인터럽트가 들어왔을 때 해야 할 일이 미리 다 프로그래밍되어 그 코드가 보관돼 있는데, 이것이 바로 인터럽트 처리루틴이다.

 

3.2 하드웨어 인터럽트와 소프트웨어 인터럽트

하드웨어 인터럽트는 컨트롤러 등 하드웨어 장치가 CPU의 인터럽트 라인을 세팅하는 반면,

소프트웨어 인터럽트는 소프트웨어가 그 일을 수행한다는 차이점이 있다.

 

인터럽트 벡터

운영체제는 할 일을 쉽게 찾아가기 위해 인터럽트 벡터를 가지고 있다.

인터럽트 벡터란 인터럽트 종류마다 번호를 정해서, 번호에 따라 처리해야 할 코드가 위치한 부분을 가리키고 있는 자료구조를 말한다.

실제 처리해야 할 코드는 인터럽트 처리루틴(intterupt service routine) 또는 인터럽트 핸들러(interrupt handler)라고 불리는 다른 곳에 저장된다.

 

소프트웨어 인터럽트

보통 인터럽트라고 하면 하드웨어 인터럽트를 의미한다.

소프트웨어 인터럽트는 트랩(trap)이라는 용어로 주로 불린다.

트랩의 예로는 예외상황과 시스템 콜이 있다.

예외상황이나 시스템 콜 모두 사용자 프로세스로부터 CPU의 제어권이 운영체제에 이양되어 처리되는데,

이 과정에서 프로그램 코드가 직접 인터럽트 라인을 세팅하는 명령을 실행해 인터럽트를 발생시킨 후 제어권이 넘어가게 되므로 넓은 의미에서 이들도 인터럽트의 범주에 포함시키는 것이다.

더보기

예외상황

사용자 프로그램이 0으로 나누는 연산 등 비정상적인 작업을 시도하거나 자신의 메모리 영역 바깥에 접근하려는 시도 등 권한이 없는 작업을 시도하려고 할 때 이에 대한 처리를 위해 발생시키는 인터럽트를 말한다.

 

시스템 콜

사용자 프로그램이 운영체제 내부에 정의된 코드를 실행하고 싶을 때 운영체제에 서비스를 요청하는 방법이다.

사용자 프로그램 자신의 코드는 직접 CPU를 가지고 실행하지만,

사용자 프로그램에 정의되지 않고 운영체제 커널에 있는 코드를 사용자 프로그램이 실행하고자 할 때에는 인터럽트 라인 세팅을 통해 CPU 제어권을 운영체제로 넘겨 실행하게 되는 것이다.

 

4. 인터럽트 핸들링


4.1 인터럽트 핸들링

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

 

4.2 프로세스 제어블록

운영체제는 현재 시스템 내에서 실행되는 프로그램들을 관리하기 위해 프로세스 제어블록(Process Control Block, PCB)이라는 자료구조를 둔다.

PCB는 각각 프로그램마다 하나씩 존재하며, 해당 프로그램의 어느 부분이 실행 중이었는지를 저장하고 있다. (프로그램이 실행 중이던 코드의 메모리 주소, 레지스터 값, 하드웨어 상태 등)

 

어떤 프로그램이 실행되던 중에 인터럽트가 발생하면 그 프로그램의 실행 상태를 PCB에 저장한 후 CPU 제어권이 인터럽트 처리루틴으로 넘어가게 되며,

인터럽트 처리가 끝나면 저장된 상태를 PCB로부터 CPU상에 복원해 인터럽트 당하기 직전의 위치부터 실행이 이어지게 되는 것이다.

 

5. 입출력 구조


5.1 입출력(I/O)이란?

컴퓨터 시스템이 컴퓨터 외부의 입출력 장치들과 데이터를 주고받는 것이다.

입출력 방식에는 동기식 입출력과 비동기식 입출력이 있다.

 

5.2 동기식 입출력

어떤 프로그램이 입출력 요청을 했을 때 입출력 작업이 완료된 후에야 그 프로그램이 후속 작업을 수행할 수 있는 방식이다.

 

동기식 입출력에서 CPU는 입출력 연산이 끝날 때까지 인터럽트를 기다리며 자원을 낭비하게 된다.

(CPU의 명령 수행 속도는 빠르지만 입출력 장치에서 데이터를 읽어오는 등의 입출력 연산은 상대적으로 느리기 때문이다.)

따라서 일반적으로 프로그램이 입출력을 수행 중인 경우 CPU를 다른 프로그램에게 이양해 CPU가 계속 쉬지 않고 일할 수 있도록 관리한다.

 

운영체제는 이를 관리하기 위해 프로그램을 몇 가지 상태로 나누고 입출력 중인 프로그램의 경우 봉쇄 상태(blocked state)로 전환시킨다.

봉쇄 상태의 프로그램에게는 CPU를 할당하지 않고, CPU 할당 시 곧바로 명령을 수행할 수 있는 프로그램에게만 CPU를 할당한다.

 

입출력이 수행 중일 때 다른 프로그램에게 CPU를 양도하게 되므로 다수의 입출력 연산이 동시에 요청되거나 처리될 수 있다.

동기식 입출력에서는 입출력 요청의 동기화를 위해 장치별로 큐(queue)를 두어 요청한 순서대로 처리할 수 있도록 한다.

즉, 이와 같이 다수의 프로그램이 동시에 입출력 연산을 요청하는 경우 동기성(synchronization)을 보장하기 위해 장치마다 큐를 두어 요청된 순서대로 처리할 수 있도록 하는 것이다.

 

연산 완료의 통보는 인터럽트를 통해서 수행하며, 이때 운영체제 커널은 인터럽트 처리루틴으로 가서 입출력 연산을 끝낸 프로그램이 CPU를 할당받을 수 있도록 그 프로그램의 상태를 봉쇄 상태로부터 해제시키게 된다.

 

5.3 비동기식 입출력

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

 

예를 들어 어떤 프로그램이 데이터를 디스크에서 읽어오라는 요청을 했다고 생각해보자.

보통은 읽어온 결과를 이용해 다음 연산을 수행하지만 경우에 따라서는 그 데이터와 관련 없이 수행할 수 있는 일이 있을 수 있다.

비동기식 입출력에서는 그러한 작업을 먼저 수행하고, 읽어오는 데이터가 반드시 있어야 수행할 수 있는 일들은 입출력이 완료된 후에 수행하게 된다.

 

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

그림

 

6. DMA


6.1 DMA란?

컨트롤러가 CPU에게 인터럽트를 발생시키면 CPU는 컨트롤러의 로컬버퍼와 메모리 사이에서 데이터를 옮기는 일을 하게 된다.

모든 메모리 접근 연산이 CPU에 의해서만 이루어질 경우 입출력 장치가 메모리 접근을 원할 때마다 인터럽트에 의해 CPU의 업무가 방해를 받게되어 CPU 사용의 효율성이 떨어지는 문제점이 발생하게 된다.

이러한 비효율성을 극복하기 위해 CPU 이외에 메모리 접근이 가능한 장치를 하나 더 두는 경우가 많은데, 이러한 장치를 DMA(Direc Memory Access)라고 부른다.

 

DMA는 일종의 컨트롤러로 CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아주는 역할을 한다.

DMA를 사용하면 로컬버퍼에서 메모리로 읽어오는 작업을 CPU가 담당하는 것이 아니라 DMA가 대행함으로써 CPU는 원래 하던 작업을 멈추고 인터럽트를 처리할 필요가 없어지는 것이다.

 

즉 DMA는 CPU에 발생하는 인터럽트의 빈도를 줄여 CPU를 좀 더 효율적으로 관리하고 입출력 연산을 빠르게 수행할 수 있게 한다.

 

7. 저장장치의 구조


컴퓨터 시스템을 구성하는 저장장치는 주기억장치와 보조기억장치로 나누어볼 수 있다.

 

7.1 주기억장치

보통 메모리라고 부르며 전원이 나가면 저장되었던 내용이 모두 사라져버리는 휘발성의 RAM을 매체로 사용하는 경우가 대부분이다.

 

7.2 보조기억장치

전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성의 마그네틱 디스크를 주로 사용한다. (그 밖에도 플래시 메모리, CD, 마그네틱 테이프 등이 사용되기도 한다.)

 

7.3 보조기억 장치의 용도

파일 시스템용

전원이 나가도 유지해야할 정보가 있으면 그것을 파일 형태로 보조기억장치에 저장한다.

메모리는 휘발성 매체이기 때문에 비휘발성 매체인 디스크를 파일 시스템용으로 사용하는 것이다.

 

메모리의 연장 공간인 스왑 영역용

메모리는 크기가 한정되고 가격이 상대적으로 비싼데다 용량이 적은 경우가 대부분이다.

따라서 다수 프로그램이 메모리에 올라가 동시에 수행되는 현대의 컴퓨터 환경에서는 메모리 공간이 부족한 경우가 흔히 발생하게 된다.

이 경우 운영체제는 프로그램 수행에 당장 필요한 부분만 메모리에 올려놓고 그렇지 않은 부분은 디스크의 스왑 영역에 내려놓게 된다. (스왑 아웃)

 

스왑 영역으로는 하드디스크가 가장 널리 사용되며, 이러한 스왑 영역은 프로그램이 실행될 때 내용을 저장했다가 프로그램이 종료될 때 삭제하는 메모리의 연장 공간으로서의 역할을 담당한다.

그러므로 파일 시스템처럼 비휘발성 용도로 사용되는 것과는 역할이 구분된다.

 

8. 저장장치의 계층 구조


그림

 

9. 하드웨어의 보안


9.1 개요

운영체제에는 여러 프로그램이 동시에 동시 실행될 수 있는 다중 프로그래밍 환경에서 동작한다.

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

하드웨어적인 보안 유지를 위해 운영체제는 기본적으로 커널모드(kernel mode, system mode)와 사용자모드(user mode)의 두 가지 모드를 지원한다.

 

9.2 커널모드

운영체제가 CPU 제어권을 가지고 운영체제 코드를 실행하는 모드이다.

이 모드에서는 모든 종류의 명령을 다 실행할 수 있다.

시스템에 중요한 영향을 미치는 연산은 커널모드에서만 실행 가능하도록 함으로써 하드웨어 보안을 유지하는 것이다.

 

9.3 사용자모드

일반 사용자 프로그램이 실행되며 제한적인 명령만을 수행할 수 있다.

 

9.4 모드비트

중요한 연산을 운영체제만 수행할 수 있도록 정의하더라도, 사용자 프로그램이 프로그램 내에서 그러한 종류의 연산을 수행해버리면 제어가 아무런 소용이 없게 된다.

이러한 상황을 방지하기 위해서는 하드웨어적 지원이 필요하다.

컴퓨터 시스템은 CPU 내부에 모드비트(mode bit)를 두어 사용자 프로그램을 감시하게 된다.

 

모드비트가 0으로 세팅되어 있으면 커널모드로서 모든 명령을 수행할 수 있고, 1로 세팅되어 있으면 사용자모드로서 제한된 명령만을 수행할 수 있다. 

시스템의 보완과 관련된 명령들을 특권명령이라고 하며, 특권 명령은 모드비트가 0일 때에만 수행할 수 있다.

즉, 특권 명령은 커널모드에서 운영체제에 의해서만 수행할 수 있는 것이다.

 

9.5 하드웨어 장치에서 보안이 유지되는 방식

모든 입출력 명령은 특권명령으로 규정해 사용자 프로그램이 직접 입출력을 하는 것을 차단한다.

입출력이 필요할 때에는 운영체제에 요청하여 운영체제가 입출력 명령을 대신 수행하게 한다.

사용자 프로그램이 입출력을 하고 싶으면 시스템 콜로 운영체제에 요청해야 한다.

 

10. 메모리 보안


10.1 개요

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

보안 문제를 해결하기 위해선 기준 레지스터(base register)와 한계 레지스터(limit register)  2개의 레지스터를 사용해 프로그램이 접근하려는 메모리 부분이 합법적인지 체크함으로써 메모리를 보호할 수 있다.

 

10.2 기준 레지스터와 한계 레지스터

기준 레지스터는 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근할 수 있는 메모리상의 가장 작은 주소를 보관하고 있다.

한계 레지스터는 그 프로그램이 기준 레지스터값부터 접근할 수 있는 메모리의 범위를 보관하고 있다.

즉, 어떤 프로그램이 실제 메모리에 올라가 있는 부분의 시작 주소와 그 프로그램의 길이를 각각 기준 레지스터와 한계 레지스터에 보관해 메모리 접근 연산이 있을 때마다 하드웨어적으로 현재 접근하려는 위치가 합법적인 범위에 있는지 체크하게 되는 것이다.

 

11. CPU 보호


11.1 타이머

CPU가 하나의 프로그램에 의해 독점되는 것을 막기 위해 운영체제는 타이머라는 하드웨어를 사용한다.

타이머는 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 획득할 수 있도록 하는 역할을 수행한다.

타이머의 값을 세팅하는 명령을 로드 타이머(load timer)라고 하며, 이는 특권명령에 속한다.

타이머는 시분할 시스템에서 현재 시간을 계산하기 위해서도 사용된다.

 

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


12.1 시스템 콜

사용자 프로그램은 직접 입출력을 수행하는 대신 운영체제에게 시스템 콜이라는 서비스 대행 요청을 하여 입출력을 수행한다.

시스템 콜은 일종의 소프트웨어적인 인터럽트로서 사용자 프로그램이 시스템 콜을 할 경우 트랩이 발생해 CPU의 제어권이 운영체제로 넘어가게 된다.

그러면 운영체제는 해당 시스템 콜을 처리하기 위한 루틴으로 가서 정의된 명령을 수행한다.

 

'~2023.02 > 운영체제' 카테고리의 다른 글

01_운영체제 개요  (0) 2022.10.20
00_책 선정과 목차 소개  (0) 2022.10.20
[운영체제]03_프로세스 관리#3(작성중)  (0) 2022.06.27
[운영체제]03_프로세스 관리#2  (0) 2022.06.24
[운영체제]03_프로세스 관리#1  (0) 2022.06.21
    '~2023.02/운영체제' 카테고리의 다른 글
    • 01_운영체제 개요
    • 00_책 선정과 목차 소개
    • [운영체제]03_프로세스 관리#3(작성중)
    • [운영체제]03_프로세스 관리#2
    yooniiverse
    yooniiverse

    티스토리툴바