운영체제- Computer System

boms·2024년 3월 13일
1

Computer Basic Components

  • 프로세서 (CPU)
  • 메인 메모리
    - 휘발성: 전기가 나가면 데이터가 사라짐
    • 주 기억 장치
  • 시스템 버스
    - CPU, 메모리, I/O 모듈들이 서로 데이터를 주고 받기 위한 통로
    • CPU가 메모리에서 데이터, 명령어를 가져오고
    • CPU가 I/O 모듈로 부터 데이터, 명령어를 쓰고 읽고
  • I/O 모듈
    - 주변 장치 ex) HDD
    • 통신 장치 ex) 네트워크 카드
    • 터미널

CPU Components

  • Arithmatic Logic Unit
    - 계산 담당
  • Control Unit
    - CPU 자체를 제어
  • Register
    • CPU내 데이터 저장 장치

Register

  • CPU가 연산을 위해 필요한 매우 작은 저장 장치
  • CPU 안에 있어서 속도가 매우 빠름

Register for Data I/O

  • 메모리와 CPU 사이의 데이터를 주고 받기 위한 레지스터
  • CPU가 메모리로부터 계산에 필요한 데이터를 가져오고 (LOAD) 나 메모리에 계산 값을 쓴다 (STORE)

Memory Address Register (MAR)

  • CPU가 메모리에서 데이터를 읽어올때 어느 위치에 있는 data인지 알아야한다
  • 그 위치는 메모리 주소로 표시된다
  • MAR은 이 메모리 주소값을 저장하는 레지스터다

Memory Buffer Register (MBR)

  • MBR은 메모리에서 읽어온 데이터를 CPU안에 저장하는 역할을 한다

  • LOAD 과정
    - 읽고자하는 데이터의 메모리 주소를 MAR에 적고 LOAD 명령 실행하면 실제로 그 메모리 위치에가서 데이터를 읽어와 MBR에 저장된다

  • STORE 과정
    - 쓰고자하는 데이터의 메모리 주소를 MAR에 적고 데이터를 MBR에 적고 STORE 명령 실행하면 그 메모리 위체에 MBR에 적힌 데이터가 써진다

I/O Address Register, Buffer Register

  • MAR, MBR은 기본적으로 메인 메모리에서 데이터 I/O할 때 쓰인다
  • I/O 장치에도 동작 원리가 똑같은 레지스터들이 존재한다

CPU는 메모리 주소만 아는데 CPU가 어떻게 I/O 장치에 접근할까? 메모리를 거쳐서

  • 모든 I/O 장치에는 제어 장치인 controller가 있고 이 안에는 buffer 메모리가 있다
  • buffer 메모리는 메인 메모리의 특정 주소 영역과 매핑 되었있다
  • CPU가 이 특정 영역의 데이터에 대해 메모리 operation을 수행하면 매핑된 buffer 메모리에 대해 메모리 operation하는 행위로 변환된다
  • CPU는 메모리 접근인지 I/O인 구분할 필요없이 매핑된 주소 영역에 메모리 operation를 수행하여 I/O 장치에 접근한다

User-visible Registers

  • 개발자가 직접 건드릴 수 있는 레지스터
  • 자주 실행되는 부분의 속도를 빠르게 하기 위해 high level language를 compile하지 않고 개발자가 직접 assembly language로 코딩할 때 사용된다

Program Counter (PC)

  • cpu가 명령을 수행하려면 instruction을 가져와야한다
  • cpu는 메모리에 올라온 instruction을 가져와서 실행한다
  • PC는 다음번에 실행되야하는 instruction의 메모리 주소들을 저장한다

Instruction Register (IR)

  • PC에 적힌 메모리 주소로 가서 거기 있는 instruction을 가져와서 IR에 저장한다
  • 즉 IR에는 지금 실행해야하는 instruction이 저장된다
  • CPU는 IR의 instruction을 읽고 실행한다

Instruction Categories

  • 프로그램을 구성하는 instruction들은 4가지 중 하나에 해당한다
  • Processor-memory
    - processor와 메모리 사이에 데이터를 LOAD STORE하기 위한 명령어
  • Processor-I/O
    - processor와 IO 장치 사이에 데이터를 LOAD STORE하기 위한 명령어
  • Data processing
    - 논리, 산수 계산 명령어
  • Control
    - jmp와 같이 instruction 실행 순서를 바꾸는 명령어

Program Status Word (PSW)

Condition code

  • 비교연산과 문제 대처용
    -CPU가 메모리에서 명령어를 가져와서 실행했을때 이 결과가 어떤 결과인지 저장한다
  • ex) +,-,0,overflow 여부
  • 문제가 생겼을때 빠르게 대처하기 위해서 필요하다
  • CPU는 워낙 빨리 실행되기 때문에 한 문제가 생기면 파급 효과가 급속도로 커지고 시스템 전체적으로 영향을 미친다
  • 해결 과정 시간을 단축하기 위해 cpu안에서 기본적인 문제를 걸러낼 수 있어야한다
  • PSW의 condition code로 기본적인 검사를 할 수 있다

Interrupt Enable/Disable

  • interrupt 허용 여부 저장

Supervisor/User Mode

  • 현재 cpu가 수행하고 있는 코드가 사용자 코드인지 os 코드인지 나타낸다

Instruction Execution

  • cpu가 메모리에 있는 instruction 실행하는 과정

  • Fetch
    - instruction을 메모리에서 가져오는 단계

    • PC에 적힌 메모리 주소로 가서 instruction을 가져와서 IR에 저장하는 단계
  • Fetch가 끝나면 PC에 적힌 메모리 주소에 1 더하여 그 다음 instruction 주소를 저장한다

  • Execute
    - IR에 저장한 instruction을 실행하는 단계

  • Fetch -> PC값 1증가 -> Execute -> Fetch ..반복

  • cpu는 sequential, pc 값 변경으로 jump

Top-Level Components

  • CPU, memory, I/O 상관 관계
  • CPU
    - Execution Unit == Arithmatic Logic Unit (ALU)
    • Control : PC, IR
    • Data I/O : MAR, MBR
    • I/O 장치의 I/O 작업: I/O AR, I/O BR
  • Memory
    - CPU에서 명령어를 실행하기 위해서 memory에서 데이터와 instruction을 가져온다
    - 프로그램 코드가 instruction sequence로 쭉 저장됨
    - 프로그램 실행을 위한 데이터도 쭉 저장됨
  • I/O module
    - Buffer 메모리: 메인 메모리와 매핑됨

Characteristics of Machine Code

  • 이렇게 구성된 컴퓨터로 프로그램을 실행해보자
  • Opcode: 어떤 명령어인지 나타냄
  • Address: 명령어 대상의 주소
  • ex) opcode가 5이면 address에 저장된 값을 AC에 더한다

  • Fetch
    - PC에 적힌 300 메모리 주소로 가서 1940을 가져와서 IR에 LOAD 한다

    • PC값에 1 더한다
  • Execution

    • opcode 1 (LOAD), address 940이다
    • 940 메모리 주소로 가서 0003을 AC에 LOAD한다
  • Fetch
    - PC에 적힌 301 메모리 주소로 가서 5941을 가져와서 IR에 LOAD 한다

    • PC값에 1 더한다
  • Execution

    • opcode 5 (ADD), address 941이다
    • 941 메모리 주소로 가서 0002을 AC에 ADD한다
  • Fetch
    - PC에 적힌 302 메모리 주소로 가서 2941을 가져와서 IR에 LOAD 한다

    • PC값에 1 더한다
  • Execution

    • opcode 2 (STORE), address 941이다
    • AC의 0005를 941 메모리 주소에 STORE한다

Interrupt

  • 비동기 event를 실시간 처리하기 위해 interrupt 사용

  • CPU가 프로그램을 실행하는 도중에 예기치 않게 I/O 장치에서 입력이 들어올 수 있다

  • ex) 영상보다가 마우스 커서를 움직이면 영상을 보여주면서 커서 움직임도 같이 보여줘야한다

  • I/O에서 커서 움직임 event가 발생했기 때문에 지금 CPU가 하고 있는 일을 잠시 멈추고 event를 처리해야한다

  • 따라서 Interrupt는 CPU의 fetch, execute sequence를 중간에 멈추게 하고 event를 처리하고 돌아가는 과정을 제공한다

  • 동기 event
    - ex) printf -> system call WRITE

    • cpu가 알고 있음
  • 비동 event
    - cpu가 모름 ex) IO 마우스 움직임

  • Interrupt Handler는 커서 움직임, 클릭 등의 I/O event에 해당하는 handler가 있다 / 부팅시 handler에 IRQ 번호 부여
  • OS에서 관리하는 Handler 코드로 해당 handler로 jump한다

Interrupt 활용

  • 프로그램 수행중 하드 I/O에 쓰기 명령을 내렸다
  • 하드는 CPU에 비해 매우 느리기 때문에 CPU는 하드 작업이 끝날 때까지 다음 명령어을 실행 못하고 계속 기다려야한다 -> 프로그램 전체 속도가 매우 느려진다
  • 하드가 작업 완료하면 CPU에게 Interrupt를 보내도록 설계한다면?
    - CPU는 하드에 IO 명령을 내린 뒤 아얘 다른 일을 하다가 하드가 interrupt를 보내오면 IO 작업 뒤의 일을 이어서한다

Interrupt Cycle

  • CPU 입장에서 Interrupt가 왔는지 알아야한다
  • Fetch -> Execute -> Interrupt check (추가!) -> Interrupt Handler로 jump
  • Interrupts Disabled/Enabled?
    - PSW 레지스터의 Interrupt Enable/Disable로 세팅
    - 절대로 중단되어서는 안되는 작업중이면 interrupt check 넘기고 fetch로

Interrupt Processing

  • IO 장치의 controller가 interrupt 발생

  • cpu는 execution 후 interrupt check

  • interrupt있으면 cpu가 achknowledgment 시그널 보냄

  • 현재 작업 상태 (register 값) 보존하기
    - PSW와 PC를 스택에 push

  • PC는 interrupt handler 코드의 위치로 설정

  • 나머지 register를 다 저장

  • interrupt handler 코드 실행

  • 보존해 놓은 register 값들로 설정

  • 보존해 놓은 PSW, PC 값들로 설정하여 돌아오기

Save Memory and Register

Y= Interrupt Handler 코드가 시작되는 주소
L= Interrupt Handler 명령어 갯수

Interrupt 직전 (save)

  • stack pointer는 현재 상태를 저장할 stack의 top을 가르킨다
  • stack top T에 가서 general register M-1개 값 저장하고 PC+1 (N+1)을 저장한다
  • 새로운 stack top은 T-M이 된다
  • 그 다음 PC에 Y (Interrupt Handler 코드가 시작되는 주소)를 저장한다

Interrupt 실행후 (restore)

  • PC가 Y+L이 된 상태다
  • stack top T-M에 가면 돌아가야할 주소값 N+1이 있고 이를 PC에 저장하고 pop
  • 그 밑에 저장해둔 나머지 register 값들을 다 설정하고 pop
  • 새로운 stack top은 다시 T이다

Short I/O Wait

I/O Without Interrupt

  • 1) 유저 프로그램 실행중
  • WRITE) OS에서 하드 IO를 편리하고 안전하게 하기위해 제공하는 system call 실행
  • 4) System call 실행하고 하드에 실제 IO 작업 명령
  • 5) IO 끝나면 System call 마무리 작업
  • WRITE) 종료
  • 2) 유저 프로그램 이어서 실행

4번에서 하드가 실제 IO 작업 하는 동안 CPU는 idle 상태이다.. Interrupt로 CPU 일 시키자!

I/O With Interrupt

  • 4번과 5번을 나누어 하드가 실제 IO 작업 하는 동안 CPU가 다음 instruction 수행할 수 있게 한다
  • 하드 IO가 끝나면 Interrupt을 발생시켜 Interrupt Handler에서 IO 마무리 작업 5)를 실행한다
  • 따라서 CPU는 더 이상 놀지 않는다

I/O가 너무 오래걸러서 2a , 2b가 끝나도 interrupt가 안온다면..?

Long I/O Wait

  • I/O가 오래걸려 Interrupt가 2번 이후에 발생한 케이스다
  • 하드에 I/O 명령이 여러개 왔을때 I/O 처리 순서가 바뀌면 원칙적으로 안된다
  • 따라서 첫번째 명령이 안끝났으면 두번째 명령을 받아서는 안된다
  • System call을 계속 대기하다가 (CPU idle 감수) interrupt가 오고 handler가 종료되면 실행한다

    Interrupt는 만병통치약이 아니다!

Multiprogramming for Long I/O Wait

  • 앞에 보낸 IO 때문에 CPU가 기다려야한다면 기존 프로그램을 벗어나서 다른 프로그램을 수행하면 CPU는 계속 일할 수 있다
  • 따라서 CPU가 실행하는 프로그램은 여러개다 / Multitasking

여러개의 프로그램이 동시에 수행되면 누굴 먼저 실행되야하나? CPU Scheduling

profile
2023.08.21~

0개의 댓글