본문 바로가기

운영체제

[운영체제] Computer System Overview

기본 요소 - Processor(CPU), Main Memory, System bus, I/O modules 

Processor (CPU): ALU(Arithmetic Logic Unit), CU(Control Unit), Register로 구성

- ALU: 연산 담당

- CU: 컨트롤

- Register: 매우 작지만 CPU 안에 있어서 접근 속도 빠름, 연산을 위한 저장 공간

 

1. data I/O registers: CPU와 메모리 간 데이터를 주고 받기 위함

  • Memory address register (MAR); 메인 메모리에 대한 주소
  • Memory buffer register(MBR); 메인 메모리에 대한 버퍼

   => MAR에 적힌 주소에 MBR에 적힌 데이터를 LOAD(read)/STORE(write)

  • I/O address register, I/O buffer register

2. Control and status registers: CPU 동작 제어 및 연산 상태 저장

  • Program Counter(PC): 다음에 가져와야 할 명령어의 주소 저장

       - PC는 프로그램 시작 시 첫 명령어의 주소를 가리킴

       - 실행마다 값 1씩 증가

  • Instruction Register(IR): 프로그램 코드가 기계어로 변환되었을 때 instructions는 크게 4가지 중 하나임

       - Processor-memory 간 데이터 주고받는 명령어

       - Processor-I/O device 간 데이터 주고받는 명령어

       - Data processing 명령어: +, - 등 실제 연산 

       - Control 명령어: JUMP 등

        

   => CPU가 PC에서 주소를 가져와, 그 주소로 이동해서 명령어를 가져와서 IR에 넣음

 

* CPU 명령어 실행 과정

- Fetch: CPU가 PC에 적힌 주소의 명령어를 IR에 넣는 과정

- Execute: 실행

 

프로그램 실행 예시

 

  • Program Status Word(PSW)

       - Condition codes: 명령어 실행 결과 저장, 문제가 발생했을 때 빠르게 대처하기. 위함

       - Interrupt enable/disable: 인터럽트 허용 여부 저장

       - Supervisor/user mode: 현재 수행하는 코드가 사용자가 짠 코드인지, 운영체제 코드인지

 

Interrupt: CPU가 현재 실행 중인 fetch-execute 과정을 멈추고 해야 하는 일이 생길 때의 매커니즘

ex) 동영상 보고 있는데 마우스 커서 움직이는 경우

- I/O 장치는 매우 느리기 때문에 기다리면 개손해, CPU는 interrupt 넘겨놓고 다른 일을 할 수가 있음

Interrupt & Interrupt handler

 

Fetch-Execute-Interrupt check

Simple Interrupt Processing

Simple Interrupt Processing

 

Interrupt 전 현재 상태 보존 과정

Changes in Memory and Registers for an Interrupt

Program Flow with Interrupts: Short I/O Wait

 

Program Flow with Interrupts: Long I/O Wait

-> I/O는 많이 느리기 때문에 최적화를 위해 순서를 바꾸는 경우 생김

 

3. User-visible registers: 코드 내에서 어셈블리로 레지스터에 사용자 직접 접근 가능

나머지 레지스터는 운영체제를 통해 접근 가능

 

Main Memory: 휘발성, 전기가 나가면 데이터가 사라져버리는, 무척 빠르기 때문에 주기억장치로 사용

Memory Hierachy

Locality of reference(참조 지역성): 모든 데이터를 균일하게 접근하지 않고 특정 데이터, 명령어들을 빈번하게 접근하더라~

 

Cache 

필요성: CPU와 DRAM 간 속도 차를 줄일 필요가 있겠구나

- 메모리의 속도 때문에 CPU의 명령어 실행 속도가 제한될 수밖에 없다는 걸 해결하기 위해 DRAM보다 훨씬 빠른 SRAM 사용

- 가격은 비싸고 용량은 적지만 속도가 빠름

Cache Design

- 자주 접근되는 놈이 전부 다 캐시에 올라가면 좋겠지?

   ㄴ> 얘의 크기가 그렇게 크지 않아서 캐시의 크기가 그렇게 크지 않아도 효과가 굳

- Block 단위로 한 번에 많은 범위를 캐시로 올렸다 내렸다 해서 메모리 접근 횟수를 줄일 수 있음

- Mapping function: 캐시는 메모리가 아니기에 주소로 찾아갈 수 없음 -> 빠르게 찾기 위한 수단 필요, 알고리즘

- Replacement algorithm: 캐시 꽉 차면 block 버려야 함

            LRU(Least-Recently-Used) 알고리즘; 방금 사용된 놈이 또 사용되겠다는 상식적 아이디어

- Write policy: 만약 캐시에만 STORE(write)하면 메모리와 달라짐 -> 심각한 문제

 

Disk Cache

DRAM 사용, 메모리와 하드 디스크 간 속도 차 -> 하드 디스크 접근 줄여야 

 

System bus: CPU, 메모리, I/O modules가 데이터를 주고받는 통로

 

I/O modules: 주변 장치

 

I/O: 메모리와 버퍼 사이의 입출력

ㄴInput: 컨트롤러 안의 버퍼에 있는 데이터를 메모리로 가져오는 것

ㄴOutput: 메모리에 있는 데이터가 컨트롤러의 버퍼로 나가는 것

 

디바이스가 메모리에 직접 접근하지 못해 CPU가 word 단위로 Loop를 돌아야 해서 비효율적임

=> Direct Memory Access(DMA); CPU가 아닌 신뢰할 수 있는 다른 장치(I/O 장치 X, 믿을 수 없음)가 메모리에 직접 접근할 수 있도록 함

    - DMA 컨트롤러(I/O를 담당하는 별도의 장치)가 CPU가 하던 일을 독립적으로 알아서 함

 

Multiprogramming

CPU가 할 일이 있는데도 놀면 죄악, 하나의 프로그램만 수행하기 때문에 생기는 문제

-> 여러 프로그램 동시 실행

- Interrupt오면 다른 프로그램 실행

- 우선순위가 높은 프로그램 먼저 실행 => CPU 스케줄링

- 단, interrupt 수행이 끝나고 원래의 프로그램으로 돌아간다는 보장이 없음. 관리는 복잡해지지만 어쨌든 일만 하면 되니까 효율성을 높임

 

 

컴퓨터 부팅 과정

운영체제 안 깔아도 기본 동작 ㅇ -> bootstrap 프로그램(read only 메모리에 박혀있고, 메인보드에 존재)이 장치 initialize, os kernel 탑재함

 

한양대학교 강수용 교수님 운영체제 강의 내용 정리