System Structure & Program Execution

2019. 7. 24. 17:25운영체제

http://www.kocw.net/home/search/kemView.do?kemId=1046323 

KOCW 반효경 교수님의 운영 체제 강의를 수강하면서 작성한 포스트입니다. 😁이번 챕터는 본격적으로 운영 체제에 대해 공부하기 앞서서 컴퓨터 하드웨어에 대해 공부하는 챕터입니다.

 

컴퓨터 시스템 구조

전문가들이 말하는 컴퓨터는 보통 CPU와 메모리로 구성된 것을 말합니다. I/O 디바이스의 데이터가 컴퓨터로 들어가는 것을 input, I/O 디바이스로 컴퓨터가 데이터를 내보내는 것을 output이라고 합니다. CPU는 매 클럭마다 메모리에서 instruction을 읽어서 실행하게 됩니다. 

 

device controller들은 각 I/O 디바이스마다 붙어 있어서 그 디바이스들을 전담하는 작은 CPU 역할을 합니다. 메인 CPU의 작업 공간인 메인 메모리가 있듯이 device controller들도 그들의 작업 공간이 필요합니다. 이 각각의 공간을 local buffer라고 합니다. CPU와 I/O 디바이스들은 속도 차이가 굉장히 많이 납니다. 당연히 I/O 디바이스 쪽이 느린 쪽입니다. CPU에는 메모리보다 더 빠르면서 정보를 저장할 수 있는 작은 공간인 레지스터가 존재하고, mode bit이라는 것도 존재합니다. mode bit의 역할은 무엇일까요? 지금 CPU에서 실행되고 있는 것이 운영 체제인지 사용자 프로그램인지를 구분해주는 역할을 수행합니다. 그림에서 보면, interrupt line이라는 것이 CPU에 달려 있습니다. CPU는 메모리에서 계속 instruction을 실행하는데, 그 instruction이 I/O 디바이스와 관련된 instruction이라면 CPU가 device controller에 명령을 내립니다. 앞서 언급했던 것처럼 I/O 디바이스는 느리기 때문에, CPU는 응답을 계속 기다리고 있는 것이 아니라, 메모리로부터 다시 instruction을 실행하게 됩니다. device controller는 원하던 작업을 하고 난 후에는 CPU에 interrupt를 겁니다. 다른 프로그램을 실행하던 CPU의 제어권은 interrupt line을 통해 interrupt가 들어오면 운영체제로 넘어갑니다. 특정 프로그램이 CPU를 독점하는 것을 막기 위해, timer라는 것도 존재합니다. 사용자 프로그램에게 CPU를 넘겨줄 때, 그냥 주는 것이 아니라 timer를 세팅한 후 넘겨줍니다. 세팅된 시간이 되면 timer가 CPU에게 interrupt를 걸어줍니다. instruction을 실행하던 CPU가 interrupt line을 체크했을 때, interrupt가 걸려 있다면 다음 프로그램에게 CPU를 넘겨줍니다. 

 

언급 되었던 내용들을 하나씩 자세히 살펴보겠습니다.

 

Mode bit

사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치가 필요합니다.

1: 사용자 모드

0: 커널 모드

mode bit이 0일 때는 어떤 요청이든 다 할 수 있게 정의가 되어 있습니다. 메모리 접근 뿐만 아니라 I/O 접근 또한 가능하게끔 설정되어 있습니다. mode bit이 1일 때는 제한된 instruction만 수행 가능합니다. 사용자 프로그램에게 CPU를 넘기기 전에 mode bit을 1로 세팅해주고, interrupt나 exception이 발생할 경우 하드웨어가 mode bit을 0으로 바꿉니다. 

Timer

타이머는 특정 프로세스가 CPU를 독점하지 않게 하기 위해 필요합니다. time sharing을 구현하기 위해서 널리 이용되는 방식이고, 현재 시간을 계산하기 위해서도 사용합니다. 정해진 시간이 흐른 뒤 운영체제에게 제어권이 넘어가도록 인터럽트를 발생시키고, 매 클럭 틱 때마다 1씩 감소됩니다. 이렇게 감소하다 타이머 값이 0이 되면 타이머 인터럽트가 발생하게 됩니다.

Device Controller

device controller는 I/O device들을 관리하는 일종의 작은 CPU라고 볼 수 있습니다. 제어 정보를 위해서 control register, status register를 가집니다. CPU가 일을 시킬 때 그 정보를 지시하기 위한 것을 제어 정보를 위한 register라고 말할 수 있습니다. 또한 local buffer를 가지고 있습니다. device controller는 I/O가 끝났을 경우 interrupt로 CPU에 그 사실을 알려줍니다. 이럴 경우 CPU가 너무 많은 interrupt를 받을 수 있어서, DMA(Direct Memory Access) controller를 따로 두고 있습니다. CPU와 DMA controller 사이의 중재를 memory controller가 하게 됩니다. 

인터럽트 (Interrupt)

인터럽트 당한 시점의 레지스터와 program counter를 저장한 후, CPU의 제어를 인터럽트 처리 루틴에 넘깁니다. 하드웨어 인터럽트와 소프트웨어 인터럽트로 구분지을 수 있는데, 하드웨어 인터럽트의 경우 하드웨어가 발생시킨 인터럽트를 말하고, 트랩이라고도 불리는 소프트웨어 인터럽트는 Exception이나 System call에 의해서 발생하는 인터럽트를 말합니다.

* 인터럽트 벡터: 해당 인터럽트의 처리 루틴 주소를 가지고 있습니다.

* 인터럽트 처리 루틴(인터럽트 핸들러): 해당 인터럽트를 처리하는 커널 함수입니다.

사용자 프로그램이 I/O를 하려면

사용자 프로그램이 시스템콜(System call)을 이용해 운영체제에게 I/O를 요청하면 인터럽트 벡터의 특정 위치로 이동하게 됩니다. 이 때 제어권은 인터럽트 벡터가 가리키는 인터럽트 서비스 루틴으로 이동하게 됩니다. 이 때, OS는 올바른 I/O 요청인지 확인한 후 I/O를 수행하게 됩니다. 완료 시, 제어권을 시스템콜 다음 명령으로 옮깁니다.

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

* 하드웨어 인터럽트: I/O 완료 알림 인터럽트

시스템콜 (System Call)

사용자 프로그램이 운영체제의 서비스를 받기 위해 커널 함수를 호출하는 것을 시스템콜이라고 합니다. 

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

  • 동기식 입출력 (synchronous I/O): I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램으로 넘어갑니다.
  • 비동기식 입출력 (asynchronous I/O): I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어갑니다.

두 경우 모두, I/O의 완료는 인터럽트를 통해서 알려줍니다. 

DMA (Direct Memory Access)

빠른 입출력 장치를 메모리에 가까운 속도로 처리하기 위해 사용합니다. CPU의 중재 없이 device controller가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송할 수 있습니다. 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킵니다. DMA를 이용하면서 CPU에 너무 많은 인터럽트가 발생하는 것을 막을 수 있습니다.

저장장치 계층 구조

  • Speed
  • Cost
  • Volatility

가 중요한 요소입니다. 위로 갈 수록 속도가 빠르고, 비용이 크다고 생각하면 됩니다.

 

프로그램의 실행 (메모리 로드)

프로그램은 파일 시스템 안에 실행 파일 형태로 저장되어 있다가 프로그램을 실행하게 되면, 메모리로 올라가서 프로세스가 됩니다. 이 단계에서 바로 물리적인 메모리(Physical Memory)로 올라가는 것이 아니라 가상 메모리(Virtual Memory)라는 단계를 한 단 계 거칩니다. 프로그램마다 자기 자신만의 독자적인 주소 공간(code, data, stack으로 구성)을 만들게 됩니다. 

프로그램이 실행될 때 만들어지는 주소 공간을 물리적인 메모리에 통째로 올리지 않습니다. 당장 필요한 부분들만 올려서 메모리의 낭비를 막습니다. 이 때, 물리적인 메모리에 바로 올라가지 않는 부분들은 swap area에 내려와있게 됩니다.

 

커널 주소 공간

code

  • 시스템 콜, 인터럽트 처리 코드
  • 자원 관리를 위한 코드
  • 편리한 서비스 제공을 위한 코드

 

data

  • 운영체제가 사용하는 여러 자료 구조들
  • cpu, mem, disk, pcb

 

stack

  • process의 커널 스택

 

사용자 프로그램이 사용하는 함수

함수

  • 사용자 정의 함수
    • 자신의 프로그램에서 정의한 함수

 

  • 라이브러리 함수
    • 자신의 프로그램에서 정의하지 않고 가져다 쓴 함수
    • 자신의 프로그램의 실행 파일에 포함되어 있음

 

  • 커널 함수
    • 운영체제 프로그램의 함수
    • 커널 함수의 호출 = 시스템 콜

사용자 정의 함수와 라이브러리 함수는 프로세스의 주소 공간(code)에, 커널 함수는 커널 주소 공간(code)에 존재하게 됩니다.

 

프로그램의 실행

프로그램은 시작되면 계속해서 유저 모드와 커널 모드를 왔다갔다 하게 됩니다.

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

Process Synchronization  (0) 2019.08.05
CPU Scheduling  (1) 2019.07.26
Process Management  (0) 2019.07.26
Process  (0) 2019.07.24
Introduction to Operating Systems  (0) 2019.04.16