[CS 스터디] 운영체제 10일차 - 스토리지/입출력

강아람·2023년 1월 5일
0

운영체제

목록 보기
10/11
post-thumbnail

📚 스토리지

컴퓨터에 데이터를 저장하는 저장소 역할을 수행하는 부품이다.
컴퓨터의 하드 디스크와 동일한 역할을 수행하는 부품으로, 스토리지를 서버와 직접 연결할 수 있다.

대용량 저장장치 (Mass-Storage)

  • 비휘발성, secondary storage system
    주로 HDD(Hard disk driver), SSD(Solid-state driver)

하드 디스크 (HDD, Hard Disk Driver)

자기적인 방식으로 데이터를 저장하는 보조기억장치

구성 요소

  • 플래터 (Platter) : 실질적으로 데이터가 저장되는 곳으로 자기 물질로 덮여 있어 수많은 N극과 S극 저장(0과 1)
  • 스핀들 (Spindle) : 플래터를 회전시키는 구성 요소
  • 헤드 (Head) : 플래터를 대상으로 데이터를 읽고 쓰는 구성 요소
  • 디스크 암(Disk Arm) : 헤드가 부착되어 있어 헤드를 원하는 위치로 이동시키는 구성 요소

플래터

단위 : 트랙(Track), 섹터(Sector), 실린더(Cylinder)

  • 트랙 : 플래터를 여러 동심원으로 나누었을 때 그 중 하나의 원
  • 섹터 : 트랙을 나눈 하나의 조각
  • 실린더 : 여러 겹의 플래터 상에 같은 트랙이 위치한 곳을 모아 연결한 논리적인 단위

저장된 데이터에 접근하는 시간

1) 탐색 시간
접근하려는 데이터가 저장된 트랙까지 해드를 이동시키는 시간

2) 회전 지연
헤드가 있는 곳으로 플래터를 회전시키는 시간

3) 전송 시간
하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간



플래시 메모리 (Flash Memory)

전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반의 저장 장치

특징
읽기와 쓰기는 페이지 단위로, 삭제는 블록 단위로 이루어진다!!!!

예. SSD(Solid-State Driver), SD 카드, USB 등

단위 : 셀 (Cell)


SLC (Single Level Cell)

하나의 셀에 1bit의 데이터 저장

  • 하나의 셀로 0, 1 두 개의 정보 표현 가능
  • 장점 : 빠른 비트 입출력, 긴 수명
  • 단점 : 용량 대비 비싼 가격

MLC (Multiple Level Cell)

하나의 셀에 2bit의 데이터 저장

  • 하나의 셀로 4가지의 정보 표현 가능
  • 장점 : SLC에 비해 용량 대비 저렴, 대용화 가능
  • 단점 : SLC에 비해 속도와 수명이 떨어짐

TLC (Triple Level Cell)

하나의 셀에 3bit의 데이터 저장

  • 하나의 셀로 8가지의 정보 표현 가능
  • 장점 : SLC, MLC에 비해 용량 대비 저렴, 대용화 가능
  • 단점 : SLC, MLC에 비해 속도와 수명이 떨어짐



📚 DAS, NAS, SAN

DAS (Direct Attached Storage)

PC나 서버에 직접 연결하여 사용하는 저장 장치

서버와 하드웨어를 1:1로 연결하고, 저장 공간이 부족할 경우 새로운 DAS 연결로 저장 공간의 확장이 가능하다.

장점

  • 전용선을 이용하기 때문에 성능이 보장되고 안정성이 높음
  • 비교적 확장이 쉬움

단점

  • 데이터가 증가함에 따라 외부 저장 장치를 추가하는 경우 운영 효율성이 떨어짐
  • 호스트에 장애가 발생할 경우 저장장치 접근이 제한됨
  • 물리적인 공간이 부족할 경우 확장이 어려움
  • 파일 시스템을 공유하는 기술이 없어 파일 공유 불가능

NAS (Network Attached Storage)

네트워크를 통해 연결하여 사용하는 저장 장치

스토리지가 다른 호스트 없이 직접 네트워크에 연결된다.

장점

  • 스케일 아웃 방식(NAS 스토리지 추가 증설)의 NAS는 클러스터 구성이 가능하기 때문에 성능과 용량을 동시에 높일 수 있음
  • 이더넷 네트워크에 스토리지를 연결하기 때문에 구축 비용이 저렴
  • 단순한 시스템 아키텍처 구조로 유지 관리 용이

단점

  • 광케이블에 비해 전송 속도가 느림
  • 공유 네트워크를 사용하기 때문에 병목 현상 발생 가능
  • 네트워크에 문제가 생기면 스토리지에도 문제가 발생할 수 있음

SAN (Storage Area Network)

DAS와 NAS의 단점을 해결한 형태의 저장 장치

스토리지(광 케이블 스위치)와 서버 간에는 SAN 연결, 서버와 클라이언트 간에는 LAN 연결하여 전용 네트워크를 통해 파일을 공유한다.

장점

  • 전용 네트워크를 통해 데이터가 전송되기 때문에 빠름

단점

  • OS가 다를 경우 파일 전송 불가능
  • 광 케이블의 거리 제약
  • 초기 비용이 높음



📚 RAID (Redundant Array of Independent Disks)

데이터의 안정성 또는 높은 성능을 위해 여러 개의 물리적 보조기억장치를 하나의 논리적 보조기억장치처럼 사용하는 기술로, 주로 하드디스크와 SSD를 사용한다.

RAID 레벨

여러 개의 하드 디스크나 SSD를 마치 하나의 장치처럼 사용하는 RAID의 구성 방법

RAID 0

단순히 여러 개의 보조기억장치에 데이터를 나누어 저장하는 방식

  • 스트라이프 (Stripe) : 줄무늬처럼 분산되어 저장된 데이터
  • 스트라이핑 (Striping) : 분산되어 저장되는 방식

장점

여러 번에 걸쳐 나누어 읽고 쓰지 않고, 여러 개의 저장 장치가 동시에 읽고 쓰기 때문에 읽기/쓰기 속도가 빠름

단점

RAID 0을 구성하는 저장 장치 중 하나가 고장나면 다른 저장 장치의 데이터를 읽는데 문제가 발생


RAID 1

RAID 0의 안전성 문제를 보완하기 위해 등장한 방법으로, 스트라이핑과 미러링을 통해 여러 대의 저장 장치로 RAID를 구성하고 이와 똑같은 복사본을 만드는 방식

장점

저장 장치에 문제가 생겨도 복사본을 통해 간단하게 복구 가능

단점

저장 장치 개수가 한정될 경우 사용 가능한 용량이 적음


RAID 4

완전한 복사본을 만드는 대신 오류를 검출하고 복구하기 위한 정보를 저장한 장치를 두는 구성 방식

  • 패리티 비트 (Parity Bit) : 오류를 검출하고 복구하기 위한 정보

장점

패리티 비트를 통해 장치의 오류를 검출, 복구함으로써 RAID 1보다 적은 저장 장치로 데이터를 안전하게 보관할 수 있음

단점

패리티 비트를 저장하는 저장 장치에도 데이터를 쓰게 되기 때문에 병목 현상 발생


RAID 5

패리티 비트를 분산 저장하여 병목 현상을 해소하는 RAID 구성 방식


RAID 6

RAID 5처럼 패리티 비트를 저장 장치에 분산시킴과 동시에 서로 다른 패리티 비트를 하나 더 추가하여 오류 검출, 복구 수단을 증가시킨 방식

장점

RAID 4, RAID 5보다 안전한 구성

단점

새로운 정보를 저장할 때마다 두 개의 패리티 비트를 저장해야 하기 때문에 RAID 5보다 쓰기 속도가 느림



📚 입출력 시스템

입출력 시스템이란?

입출력 시스템은 물리적 입출력 장치와 입출력 모듈을 포함하는 개념이다.
입출력 장치에는 모니터, 프린터, 마우스, 키보드 등이 있으며 실제 입출력을 수행하는 장치이다.
입출력 모듈은 메모리, 프로세서 레지스터 등 내부 저장 장치, 물리적 입출력 장치 사이의 이진 정보를 전송하는 역할을 한다.


입출력 하드웨어

입출력 하드웨어의 구성

하드웨어 장치는 케이블 또는 무선 신호를 통해 컴퓨터 시스템과 통신하며, 포트라는 연결점을 통해 컴퓨터에 접속한다.

입출력 하드웨어는 크게 저장 장치, 전송 장치, 사용자 인터페이스 장치 등으로 구분된다. 입출력 하드웨어는 '시스템 버스'와 연결되어야 하는데, 물리적인 입출력 장치가 바로 시스템 버스와 연결되는 것이 아니라 장치 컨트롤러를 통해 연결된다.

장치 컨트롤러 (장치 제어기, 입출력 제어기, 입출력 모듈)

입출력 장치의 다양성, 낮은 전송률로 인한 문제를 해결하기 위해 입출력 장치와 컴퓨터 내부를 연결하는 장치 컨트롤러가 필요하다.

장치 컨트롤러 역할

  • CPU와 입출력 장치 간의 통신 중개
  • 오류 검출
  • 데이터 버퍼링

장치 컨트롤러 내부 레지스터

  • 제어 레지스터 (명령 레지스터) : 입출력 장치가 수행할 내용(읽고 쓰는 동작)에 대한 제어 정보와 명령 저장
  • 상태 레지스터 : 해당 장치에 오류가 있는지, 작업이 진행 중인지, 작업이 완료되었는지 등 장치의 상태 정보 저장, 상태 확인 용도로 사용
  • 데이터 레지스터 (자료 레지스터) : CPU와 입출력 장치 사이에 주고받을 데이터가 담기는 레지스터 (버퍼 역할)

장치 드라이버

장치 컨트롤러의 동작 감시, 제어를 통해 장치 컨트롤러가 컴퓨터 내부와 정보를 주고받을 수 있도록 하는 프로그램


장치 드라이버와 장치 컨트롤러의 상호 작용

장치 드라이버와 장치 컨트롤러의 소통은 장치 컨트롤러 내부에 있는 특정 레지스터들의 값을 장치 드라이버가 읽거나 쓰는 방식으로 수행된다.


입출력 동작 순서

응용 프로그램 - 시스템 콜 - 커널의 장치 드라이버 - 장치 컨트롤러 - 입출력 장치 (입출력 하드웨어)

1) 응용 프로그램(프로세스)이 입출력을 요청한다.
2) CPU는 System Call로 운영체제에 요청을 보낸다.
3) 운영체제가 요청을 받아들여 커널의 장치 드라이버에게 입출력을 요청한다.
4) 입출력이 발생한다.
5) 장치 컨트롤러는 입출력의 완료를 알린다.
6) 장치 드라이버는 입출력 완료를 운영체제에게 알린다.
7) 운영체제는 CPU에게(프로세스에게) 입출력의 완료를 알린다.


입출력 방식

1) 프로그램 입출력 방식

프로그램 속 명령어로 입출력 장치를 제어하는 방식으로, CPU가 프로그램 명령어 실행 과정에서 입출력 명령어를 만나면 장치 컨트롤러와 상호작용한다.

💻 입출력 작업 과정

1) CPU가 백업 명령을 마주침 ▶ CPUI가 하드 디스크 컨트롤러의 제어 레지스터에 쓰기 명령 표시
(백업 명령 = 하드 디스크에 쓰기 명령)
2) 하드 디스크 컨트롤러가 하드 디스크 상태 확인 후 준비 상태가 되면 상태 레지스터에 준비 완료 표시
3) CPU가 주기적으로 상태 레지스터 값을 확인하다가 준비 완료를 확인하면 백업 데이터를 데이터 레지스터에 쓰기


입출력 장치 컨트롤러의 레지스터 접근 방식

메모리 사상 입출력 (Memory-mapped I/O)
메모리에 접근하기 위한 주소 공간과 입출력 장치를 위한 주소 공간을 하나로 간주하는 방법

메모리 접근과 장치 컨트롤러의 레지스터 접근을 위한 명령어가 다를 필요가 없다.

전체 1024개의 주소 중 512개는 메모리 주소, 512개는 레지스터 주소를 표현한다.

  • 510번지를 읽어라 ▶ 510번지 메모리에 저장된 데이터를 읽어라
  • 517번지를 읽어라 ▶ 프린터 컨트롤러의 상태 레지스터 값을 읽어라

고립형 입출력 (Isolated I/O)
메모리를 위한 주소 공간과 입출력 장치를 위한 주소 공간을 분리하는 방법

제어 버스를 통해 메모리와 입출력 장치 컨트롤러에 대한 접근 제어가 가능하며, 입출력 전용 명령어를 사용해야 한다.


2) 인터럽트 기반 입출력

CPU가 장치 컨트롤러에 입출력 작업을 명령하고 다른 작업을 수행하다 장치 컨트롤러가 인터럽트 요청을 보내면 인터럽트 서비스 루틴을 수행하는 방법이다.

장치 컨트롤러는 입출력 장치를 제어하며 입출력 작업을 수행한 후 작업이 끝나면 CPU에게 인터럽트 요청 신호를 보내 작업 종료를 알린다.


💻 여러 개의 입출력 인터럽트가 발생하면?

  • 인터럽트 발생 순서대로 처리
  • 우선 순위가 높은 인터럽트 순으로 처리

💻 인터럽트 우선순위는 누가 정하나요?

대표적인 방법으로 PIC(Programmable Interrupt Controller)라는 하드웨어를 사용합니다.

PIC는 여러 장치 컨트롤러에 연결되어 있는데, 장치 컨트롤러에서 보낸 인터럽트 요청 중
CPU가 가장 먼저 처리해야 할 인터럽트 요청의 주체인 장치 컨트롤러에 대해 CPU에게 알리는 역할을 합니다.

💻 인터럽트 처리 과정을 알려주세요!

1) PIC가 여러 장치 컨트롤러의 인터럽트 요청을 수신한다.
2) CPU에게 우선 순위가 높은 인터럽트 요청 신호를 전송한다.
3) CPU가 확인 신호를 보낸다.
4) PIC가 CPU에게 인터럽트를 요청한 장치 컨트롤러에 대한 정보를 보낸다. (인터럽트 벡터)
5) CPU가 인터럽트 서비스 루틴을 실행한다.


3) DMA (Direct Memory Access)

CPU를 매번 거치지 않고 직접 메모리에 접근 가능한 입출력 기능으로, 시스템 버스에 연결된 DMA 컨트롤러가 필요하다.

💻 DMA 입출력 과정

1) CPU가 DMA 컨트롤러에 입출력 장치 주소, 수행할 연산, 메모리 주소 등의 정보를 주며 작업을 명령
2) DMA 컨트롤러가 CPU를 대신하여 장치 컨트롤러와 상호작용하며 입출력 작업 수행 (DMA 컨트롤러는 메모리에 직접 접근 가능)
3) 입출력 작업이 끝나면 CPU에게 인터럽트를 걸어 작업 종료를 알림

DMA 컨트롤러가 CPU를 대신해서 입출력 작업을 수행할 때 시스템 버스를 통해 데이터를 전송하는데, 시스템 버스는 공용 자원이므로 동시에 사용 불가능하다.

그래서 DMA 컨트롤러는 CPU가 시스템 버스를 사용하지 않을 때마다 조금씩 이용하거나, CPU가 일시적으로 시스템 버스를 사용하지 않도록 한 후 집중적으로 이용한다.


입출력 버스

DMA 컨트롤러를 이용한 입출력 작업은 시스템 버스를 두 번 사용하게 되는 부작용이 존재한다.
시스템 버스를 너무 자주 사용하면 CPU가 시스템 버스를 이용하지 못할 때가 많아진다는 뜻이다.

이 문제를 해결하기 위해 시스템 버스가 아닌 입출력 버스를 별도로 구성하여 DMA 컨트롤러와 장치 컨트롤러 사이를 연결하면 시스템 버스 사용 빈도를 줄일 수 있다.


Blocking I/O vs Non-blocking I/O

Blocking : 호출된 함수가 자신의 작업을 마칠 때까지 호출한 함수에게 제어권을 넘겨주지 않아 호출한 함수가 대기하는 것

자신의 작업 중 다른 주체가 작업을 시작하면 그 작업이 끝날 때까지 대기

Non-blocking : 호출된 함수가 결과에 관계없이 호출한 함수에게 값을 반환(제어권을 넘겨줌)하고, 호출한 함수가 다른 작업을 하는 동안 작업을 수행하다가 결과를 반환하는 것

다른 주체의 작업에 관련없이 자신의 작업을 수행할 수 있음


Blocking I/O

입출력 작업이 진행되는 동안 user process가 자신의 작업을 중단한 채 입출력 작업이 끝날 때까지 대기하는 방식

💻 입출력 작업 과정

1) 프로세스(또는 스레드)가 커널에게 I/O를 요청하는 함수 호출 (system call)
2) 프로세스(또는 스레드)는 작업 결과를 받을 때까지 대기
3) 커널이 I/O 작업을 완료하면 작업 결과 반환


Non-blocking I/O

User Process가 입출력 작업을 요청하면 커널이 I/O 호출에 대해 즉시 응답하여 User Process 작업의 중단 없이 다른 작업을 수행할 수 있도록 하는 방식

💻 입출력 작업 과정

1) 입출력 작업을 위해 커널에게 I/O를 요청하는 함수 호출 (system call)
2) 커널은 입출력 작업의 완료 여부와 관계 없이 즉시 응답
3) 프로세스(또는 스레드)는 입출력 작업이 수행되는 동안 다른 작업 수행 가능
4) 프로세스(또는 스레드)는 다른 작업을 수행하는 동안 주기적으로 system call을 보내 입출력 작업이 완료되었는지 커널에게 요청하고, 완료되면 입출력 작업 완료

모든 작업 수행이 I/O의 진행시간과는 관계없이 빠르게 동작하기 때문에, User Process는 자신의 작업을 오랜시간 중지하지 않고도 I/O 처리를 수행할 수 있다.

그러나 반복적으로 system call이 발생하기 때문에 이것 또한 Resource 낭비가 된다.
이러한 Non-Blocking I/O는 데이터를 입력할 때만 전송하는 게 아니라 주기적으로 계속 반복하기 때문이다.

그래서 Non-Blocking I/O 문제인 반복적인 system call 호출을 해결하기 위해 I/O 이벤트 통지 모델이 도입되었다.


I/O 이벤트 통지 방식

I/O 작업 상황(결과) 반환 방식에 따라 sync, async 방식으로 분류된다.

Synchronous(동기)

호출하는 함수가 호출되는 함수의 작업 완료 후 리턴을 기다리거나, 또는 호출되는 함수로부터 바로 리턴 받더라도 작업 완료 여부를 호출하는 함수 스스로 계속 확인하며 신경쓰는 방식


Asynchronous(비동기)

호출되는 함수에게 callback을 전달해서, 호출되는 함수의 작업이 완료되면 호출되는 함수가 전달받은 callback을 실행하고, 호출하는 함수는 작업 완료 여부를 신경쓰지 않는 방식

https://velog.io/@octo__/BlockingNon-Blocking-IO-IO-%EC%9D%B4%EB%B2%A4%ED%8A%B8-%ED%86%B5%EC%A7%80-%EB%AA%A8%EB%8D%B8

0개의 댓글