3장 - 컴퓨터 시스템의 동작원리

HelloWorld·2022년 10월 24일
0

운영체제

목록 보기
2/3

1. 컴퓨터 시스템의 구조

컴퓨터 내부장치 : CPU, 메모리

컴퓨터 외부장치(입출력 장치) : 디스크, 키보드, 마우스, 모니터, 네트워크 장치 등

컴퓨터 내부로 데이터가 들어오는 것 = 입력(input)

컴퓨터 외부로 데이터가 나가는 것 = 출력(output)

컨트롤러 : 일종의 작은 CPU / 각 하드웨어 장치마다 존재하면서 이들을 제어

커널(kernel) : 항상 메모리에 올라가 있는 부분 (전체 운영체제 중 핵심적인 부분)

2. CPU 연산과 I/O 연산

입출력 장치들의 I/O 연산 - 입출력 컨트롤러가 담당, 컴퓨터 내에서 수행되는 연산 - 메인 CPU 담당

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

CPU는 매 시점 메모리에서 명령(instruction)을 하나씩 읽어와서 수행

작업을 하던 중 인터럽트 라인(interrupt line)에 신호가 들어오면 하던 일을 멈추고 인터럽트와 관련된 일을 먼저 처리

⇒ 명령을 하나 처리할 때마다 인터럽트가 발생했는지 확인

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

운영체제 커널 내에 있는 인터럽트 처리루틴은 다양한 인터럽트에 대해 각각 처리해야 할 업무들을 정의함

ex. 디스크 컨트롤러가 인터럽트 발생시킬 경우

CPU는 하던 일을 멈추고 인터럽트 발생시 실행시킬 코드를 찾아 수행

수행 하는 일 : 디스크의 로컬 버퍼에 있는 내용을 사용자 프로그램의 메모리로 전달하고, 해당 프로그램이 CPU를 할당받을 경우 다음 명령을 수행할 수 있음을 표시하는 일

하드웨어 인터럽트 : 하드웨어 장치가 CPU의 인터럽트 라인을 세팅

소프트웨어 인터럽트 : 소프트웨어가 CPU의 인터럽트 라인을 세팅

⇒ 인터럽트 라인에 신호를 보내서 인터럽트가 발생했음을 알려주는 방식은 둘 다 동일

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

인터럽트 처리 루틴(interrupt service routine), 인터럽트 핸들러(interrupt handler) : 실제 처리해야 할 코드

소프트웨어 인터럽트(트랩, trap)

  • 예외상황(exception)

비정상적인 작업을 시도하거나 권한이 없는 작업을 시도할 때 발생

  • 시스템 콜(system call)

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

4. 인터럽트 핸들링

인터럽트 핸들링(interrupt handling) : 인터럽트가 발생한 경우에 처리해야 할 일의 절차

프로세스 제어 블록(Process Control Block: PCB) : 각각의 프로그램마다 하나씩 존재하며 해당 프로그램의 어느 부분이 실행 중이었는지를 저장

→ 실행 중이던 코드의 메모리 주소, 레지스터 값, 하드웨어 상태 등이 저장

오늘날의 컴퓨터 운영체제는 인터럽트가 발생할 때만 실행됨

5. 입출력 구조

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

*CPU의 명령 수행 속도는 빠르지만 입출력 장치에서 데이터를 읽어오는 등의 입출력 연산은 상대적으로 느림

1) 동기식 입출력

입출력이 진행되는 동안 그 프로그램의 다음 명령을 수행하지 않고 기다림

입출력이 완료되어 인터럽트 통제 사실이 전달된 후에야 CPU의 제어권이 그 프로그램에게 넘어가서 다음 명령 수행 가능

✔️ CPU는 입출력 연산이 끝날 때 까지 인터럽트를 기다리며 자원 낭비

다른 프로그램에게 CPU를 양도하지 않고 입출력 연산이 완료될 때까지 기다린다면, 매 시점 하나의 입출력 연산이 실행

입출력이 실행되는 동안 다른 프로그램에게 CPU를 양도하면, 동시에 다수의 입출력 연산 가능

✔️ 다수의 입출력이 진행될 경우, 명령 수행 순서가 바뀔수 있음

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

연산 완료의 통보는 인터럽트를 통해 수행

운영체제 커널은 인터럽트 처리루틴으로 가서 해당 프로그램의 상태를 봉쇄 상태로부터 해제

2) 비동기식 입출력

CPU의 제어권을 입출력 연산을 호출한 그 프로그램에게 다시 부여

데이터와 관련 없이 수행 할 수 있는 일은 먼저 수행하고, 읽어오(쓰)는 데이터가 있어야 수행 가능한 일은 입출력이 완료된 후에 수행하게 됨

인터럽트를 통해 입출력 완료 여부를 알려줌

6. DMA

원칙적으로 메모리는 CPU에 의해서만 접근 가능함

CPU 외의 장치가 메모리 데이터에 접근하기 위해서는 CPU에 인터럽트를 발생시켜 CPU가 이를 대행해야 함

메모리 접근 연산이 CPU에 의해서만 진행되면 연산 처리 속도 및 효율성이 떨어짐

이를 극복하기 위해 CPU 이외에 메모리 접근이 가능한 장치를 하나 더 둠

DMA(Direct Memory Access)

: 일종의 컨트롤러, CPU가 입출력 장치들의 메모리 접근 요청에 의해 자주 인터럽트 당하는 것을 막아 줌

DMA는 바이트(byte) 단위가 아니라 블록(block) 단위로 메모리 읽어 옴 → CPU에 인터럽트 발생시켜 해당 작업의 완료 알림

7. 저장장치의 구조

1) 주기억장치 (메모리)

대부분 전원이 나가면 저장되었던 내용이 모두 사라져버리는 휘발성의 RAM을 매체로 사용함

2) 보조기억장치

주로 전원이 나가도 저장된 내용을 기억할 수 있는 비휘발성의 마그네틱 디스크를 주로 사용

① 파일 시스템용 (file system)

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

디스크를 파일 시스템용으로 사용

② 스왑 영역 (swap area)

메모리의 연장 공간 (하드디스크가 가장 널리 이용)

프로그램 수행에 당장 필요한 부분만 메모리에 올려놓고 그렇지 않은 부분은 디스크 스왑 영역에 내려 놓음

스왑 아웃(swap out) : 디스크에 내려놓는 일

  • 하드디스크 물리적 구조

여러개의 마그네틱 원판들이 존재하고, 암(arm)이 이동하며 원판에 저장된 데이터를 읽고 쓰는 방식으로 동작

디스크 원판의 표면은 트랙(track)으로 나뉘고, 각 트랙은 섹터(sector)로 나뉨

섹터에 최소한의 단위 정보 저장됨

8. 저장장치의 계층 구조

빠른 저장장치부터 느린 저장장치까지 단계적인 계층구조로 이루어짐

빠른 저장장치 : 단위 공간 당 가격이 높음, 적은 용량 사용

느린 저장장치 : 가격이 저렴하여 대용량으로 사용, 접근 속도가 느림

  • Primary(Excuatable)

CPU 내부에 존재

레지스터(register), 캐시 메모리(cache memory), 메인 메모리(main memory)

휘발성 저자장치로 구성 됨

  • Secondary

전원이 나가도 지워지지 않는 비휘발성 저장장치

당장 필요한 정보만을 선별적으로 저장하면 성능 좋음

  • 캐싱 기법 : 상대적으로 용량이 적은 빠른 저장장치를 이용해 느린 저장장치의 성능을 향싱시키는 기법

9. 하드웨어의 보안

다중 프로그래밍 환경에서 동작함

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

1) 커널 모드(kernel mode, system mode) : CPU의 제어권을 가지고 운영체제 코드를 실행하는 모드 → 모든 종류의 명령 실행 가능

2) 사용자 모드(user mode) : 일반 사용자 프로그램 실행 → 제한적인 명령만 수행 가능

  • 모드비트(mode bit)

0으로 세팅되어 있으면 커널모드로서 모든 명령 수행할 수 있음

1로 세팅되어 있으면 사용자모드로서 제한된 명령 수행할 수 있음

CPU는 보안과 관련된 명령을 수행하기 전에는 항상 모드비트 조사 후 수행

인터럽트가 발생할 때 모드비트는 자동으로 0 세팅

요청된 작업이 모두 끝난 후에는 모드비트를 다시 1로 만들어 사용자 프로그램에게 CPU 넘겨 줌

특권 명령 : 시스템의 보안과 관련된 명령들 / 모드비트가 0 일때 = 커널모드에서 운영체제에 의해서만 수행 가능

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

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

(입출력이 필요한 경우, 운영체제가 입출력 명령 대신 수행)

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

10. 메모리 보안

하나의 사용자 프로그램이 다른 사용자 프로그램이나 운영체제가 위치한 메모리 영역을 침범할 수 있기에 보안 필요

적어도 인터럽트 벡터와 인터럽트 처리루틴이 있는 곳은 각별한 보안이 필요

(사용자 프로그램이 인터럽트 처리루틴을 접근하거나 변경할 수 있을 경우, 특권명령을 보안성이 침해되는 명령으로 변형할 수 있기 때문)

2개의 레지스터를 사용해 프로그램이 접근하려는 메모리 부분의 합법성 체크

1) 기준 레지스터(base register)

: 어떤 프로그램이 수행되는 동안 그 프로그램이 합법적으로 접근 가능한 메모리상의 가장 작은 주소 보관

2) 한계 레지스터(limit register)

: 프로그램이 기준 레지스터값부터 접근할 수 있는 메모리의 범위 보관

⇒ 어떤 프로그램이 실제 메모리에 올라가 있는 부분의 시작 주소와 그 프로그램의 길이

접근하려는 주소가 기준 레지스터+한계 레지스터 밖이면 불법적인 메모리 접근 → 인터럽트 발생

(이후 paging 기법에 대해서도 살펴볼 예정)

  • 메모리 접근 연산 - 사용자 프로그램이 CPU를 가지고 있는 동안 수행 할 수 있는 연산(특권 명령 X) 운영체제만이 수행할 수 있는 입출력 연산 - 커널모드에서만 수행 할 수 있는 연산(특권 명령 O)
  • 사용자모드의 경우 - 기준 레지스터와 한계 레지스터를 사용하여 메모리 보호 커널모드의 경우 - 메모리에 무제한으로 접근 가능

⇒ 운영체제가 2개의 레지스터값을 직접 세팅해주고 사용자 프로그램은 값을 변경할 수 없게 함.

11. CPU 보호

CPU가 하나의 프로그램에 의해 독점되는 것을 막기 위해 타이머(timer)라는 하드웨어를 사용

→ 정해진 시간이 지나면 인터럽트를 발생시켜 운영체제가 CPU의 제어권을 획득할 수 있도록 함

일정한 시간 단위로 세팅될 수 있으며, 매 클럭 틱(clock tick) 당 1씩 감소

0이 되는 순가 인터럽트 발생

→ 시분할 시스템에서 현재 시간을 계산하기 위해서도 사용

로드 타이머(load timer) : 타이머의 값을 세팅하는 명령(특권 명령)

시분할 시스템 : 여러 프로그램이 CPU의 시간을 조금씩 나누어 사용하는 시스템

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

입출력 명령은 운영체제 코드에 구현되어 있으며, 사용자 프로그램은 운영체제에 시스템 콜이라는 서비스 대행 요청을 하여 입출력 수행

시스템 콜 : 소프트웨어적인 인터럽트

→ 사용자 프로그램이 시스템 콜을 할 경우 트랩이 발생해 CPU의 제어권이 운영체제로 넘어감

0개의 댓글