데이터 엔지니어

[OS Chapter 2] System Structure & Program Execution 본문

컴퓨터 과학(Computer science)/운영체제(Operating System)

[OS Chapter 2] System Structure & Program Execution

kingsmo 2020. 10. 12. 14:32

2번째 챕터입니다.

이번 챕터에서는 운영체제를 설명하기에 앞서 하드웨어적인 동작들을 설명하는 챕터입니다.

하드웨어가 어떻게 동작하는지, 프로그램들이 하드웨어 위에서 어떻게 돌아가는지를 설명해주십니다.

 

2번째 챕터 강의 링크

 

깃헙 레포: github.com/smothly/OS-study-7week-challenge

 

smothly/OS-study-7week-challenge

7주동안 진행 되는 OS 스터디. Contribute to smothly/OS-study-7week-challenge development by creating an account on GitHub.

github.com

 


컴퓨터 시스템 구조

출처: https://wan-blog.tistory.com/32?category=776772

크게 컴퓨터와 I/O device로 나뉨

  • CPU + Memory =  Computer
  • I/O device 랑 disk
    • 각 Device는 컨트롤러가 따로 있음
    • Computer의 메모리와 비슷하게 local buffer가 있음.

메모리

  • CPU의 작업공간
  • 4byte짜리 0과 1의 조합의 명령어(Instruction)를 담고 있음

CPU

  • 레지스터
    • CPU상 메모리
    • CPU 레지스터에서 PC(Program Counter)를 읽어 메모리에 있는 주소로 가서 읽어온다. 
    • CPU가 메모리를 읽으면 4byte가 증가된 주소를 읽는다. (jump나 if문 분기문도 존재)
  • mode bit
    • 0 커널 모드: os가 cpu를 가지고 있음 모든 접근 허용 (= 모니터모드, 시스템 모드)
    • 1 사용자 모드: 제한된 instruction만 가능 (보안상 이유)
    • 인터럽트가 들어오면 하드웨어가 mode bit을 0으로
    • 사용자 프로그램에게 cpu를 넘기기 전에 mode bit을 1로 세팅
  • 인터럽트 라인(Interrupt line)
    • CPU는 기본적으로 명령어만 처리
    • 매 명령어가 끝날때마다 interrupt를 확인함
    • 메모리에 접근하는데 키보드의 입력이나 disk i/o의 끝났음을 알리기 위함(timer도 포함)
  • I/O를 기다리며 다른 명령어를 계속 처리하고 있음
  • 만약에 무한루프가 도는 프로그램이 있다면 CPU를 독점하게 된다. 그래서 timer를 두게 된다.

주의!

프로그램 자체는 I/O를 못함 OS를 통해서만 가능함, 이때 프로그램이 CPU를 OS에게 넘겨줌

I/O가 작업이 끝나 interrupt가 올때까지 다른 프로그램에 CPU를 넘겨줌

 

Timer

  • 특정 프로그램의 CPU 독점 보호
  • 프로그램마다 시간 제한을 걸어 제어권을 넘겨주도록 함

Device controller

  • I/O 장치 유형을 관리하는 일종의 작은 CPU
  • memory와 같은 local buffer를 가지고 있음
  • 명령어 레지스터와 데이터 레지스터가 따로 있음
  • device controller = 하드웨어, device driver = 소프트웨어 

DMA(Direct Memory Access) controller

  • 직접 메모리를 접근하는 것은 원칙적으로 CPU만 가능
  • I/O장치의 인터럽트를 너무 많이 걸경우 CPU에서 Memory로 가져오는 overhead가 너무 큼 
  • DMA가 직접 메모리에 가져오는 작업을 해준다. 그다음에 cpu에 인터럽트를 한번만 건다. 매번 거는 것보단 효율적이게 된다.
  • DMA가 device의 buffer storage의 내용을 메모리에 block 단위로 직접 전송
  • 바이트 단위가 아니라 block 단위로 인터럽트를 발생시킴

Memory controller

  • CPU와 DMA의 중재역할을 해줌

과정 설명

I/O 입출력 실행

  • 모든 입출력 명령은 특권 명령 운영체제를 통해서만 가능하다.
  • 시스템 콜(System Call)
    • 사용자 프로그램이 운영체제에게 I/O 요청
    • 사용자 프로그램이 운영체제의 서비스를 받기 위해 커널함수를 직접 호출

출처: http://egloos.zum.com/rousalome/v/9985629

 

  • 사용자 프로그램이 직접적으로 os에 접근이 불가능함. 그래서 interrupt를 거는 방식을 사용함. 이 때 modebit이 0으로 바뀜.

인터럽트

  • 인터럽트 당한 시점의 레지스터와 PC(Program Counter)를 save한 후 CPU의 제어를 인터럽트 처리 루틴에 넘긴다.
  • Interrupt
    • Interrupt: 하드웨어 인터럽트(일반적인 인터럽트)
    • Trap: 소프트웨어 인터럽트 ex) System Call, Exception(0을 나누는 연산)
  • 인터럽트 벡터
    • 처리 루틴 주소를 가지고 있음, 인터럽트의 종류마다 어떤 인터럽트를 처리해야되는지 가지고있음
    • 인터럽트 번호와 쌍을 가지고 있음
  • 인터럽트 처리 루틴
    • interrupt service routine = 실제 인터럽트 처리 
  • I/O를 하기위해서는 2가지 인터럽트가 걸림.
    1. 소프트웨어 인터럽트 OS에게 I/O 해달라고요청
    2. I/O가 끝났을땐 하드웨어 인터럽트를 한다

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

출처: https://yoon1fe.tistory.com/18

동기식 입출력(synchronous I/O)

  • sync = 싱크를 맞추다. 싱크로나이즈 수영
  • 동기는 I/O 요청 후 입출력 작업이 완료된 후에야 다음 사용자 프로그램에 넘어감
  • 구현방법 1. I/O가 끝날 때까지 cpu를 낭비, 매 시점 하나의 I/O만
  • 구현방법 2. I/O가 끝날 때까지 해당 프로그램에게서 cpu를 빼앗음, 다른 프로그램에게 cpu를 줌

비동기식 입출력(asynchronous I/O)

  • 비동기는 I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감

 

두가지 모두 I/O의 완료는 인터럽트를 걸어 알려줍니다.

 

I/O에 두가지 방식이 있음

  1. 메모리만 접근하는 명령어, device를 접근하는 명령어가 분리되어 있는 방식
  2. Memory Mapped I/O: 메모리 접근 명령어로 device도 접근 가능한 방식

저장장치 계층 구조

출처: https://eunhyejung.github.io/os/2018/06/30/operatingsystem-study03.html

위로갈수록 속도와 가격과 휘발성이 높음

 

캐싱은 재사용 목적으로 쓰는 것이다. 같은 요청에 대해서 빨리 접근하기 위함

전부다 올리지는 못하니 기존에 있던걸 쫓아내고 새로운 것을 들여보내야 하는 이슈들이 있음.


프로그램의 실행

출처: 강의

크게 3부분(file system - vitrtual memory - physical memory) 으로 나뉜다.

 

실행 파일을 메모리에 올리면 프로세스가 된다.

사용자 프로그램 실행시키면 virtual memory에 생기고 physical memory에 전부 올리진 않는다.

당장 필요한 거는 물리적인 메모리에 올려넣고 나머지는 disk(swap area)에 내려놓게 된다.

 

주의! swap area는 휘발성이다. file system은 비휘발성이다.

 

Virtual Memory

  • 각 프로그램마다 독자적으로 가지고 있는 주소 공간
  • vm에서 pm으로 갈때 address translation을 한다. 
  • code: 실행할 기계어 코드
  • data: 변수나 자료구조
  • stack: 함수를 호출하거나 리턴할 때 데이터를 쌓거나 팝하는 용도

 

커널 주소 공간

  • 코드: 커널코드 자원 관리, 시스템콜, 인터럽트 처리 코드
  • 데이터
    • 하드웨어 종류마다 관리하기 위한 자료구조가 있음
    • 각 프로그램마다 PCB가 하나씩 만들어져 관리
  • 스택: 사용자 프로그램마다 커널 스택을 따로 두고 있음
  • 관련 내용은 다음 강의들에 있음

 

함수(function)

  • 사용자 정의 함수: 자신의 프로그램에서 정의한 함수
  • 라이브러리 함수: 가져다 쓴 함수 / 자신의 프로그램의 실행 파일에 포함
  • 커널 함수: 운영체제 프로그램의 함수, 커널 함수의 호출 = 시스템 콜 

 

프로그램의 실행

출처: 강의
출처: https://devowen.com/215

kernerl node로 가기 위해서는 시스템 콜이 필요하다.

라이브러리 함수나 유저 정의 함수콜은 user mode 내에서 실행된다.

그림에서는 설명이 없지만 위에서 설명한 mode bit, interrupt과정을 전부 거친다.


하드웨어적으로 OS가 어떻게 돌아가는지 배운 수업이였습니다.

개인적으로 컴퓨터 시스템 구조를 상세하게 설명해주셔서 좋은 강의였습니다. CPU의 역할, I/O의 실행순서를 직접 따라가며 수업해주는 방식이 너무 좋았습니다.

Comments