운영체제를 모르는 개발자는 땅의 구조를 모른 채 건물을 짓는 사람과 같다. 실무에서 메모리 부족, CPU 점유율 급등, 스레드 병목 같은 문제를 처음 만났을때 대부분 이렇게 느낀다.

 

운영체제(OS)란?

운영체제는 컴퓨터 하드웨어와 소프트웨서 사이에서 통역사 역할을 하는 프로그램이다. 우리가 작성한 코드가 실제 컴퓨터에서 "언제", "어떻게" 실행될지 결정하는 건 바로 이 운영체제다.

 

운영체제가 하는 일 : 

  • 프로그램이 CPU를 사용할 수 있도록 순서 정하기(스케줄링)
  • 여러 프로그램이 동시에 돌아가도 문제없게 메모리 나눠쓰기
  • 파일을 읽고 쓰는 걸 도와주는 파일 시스템 관리
  • 사용자와 하드웨어 장치(키보드, 프린터 등) 사이 중재

 

운영체제 핵심 개념 5가지

 

1. 프로세스 vs 스레드

구분 프로세스 스레드
정의 실행 중인 프로그램 프로세스 내의 작업 단위
메모리 독립된 메모리 공간 같은 메모리 공간 공유
충돌 시 하나 죽어도 다른 프로세스 영향 없음 하나가 죽으면 전체 영향 가능

 

 

2. CPU 스케줄링

운영체제는 모든 프로그램이 CPU를 동시에 사용할 수 없기 때문에 누구를 먼저, 얼마나 오래 실행할지 결정한다.

  • FCFS (First Come First Serve) : 먼저 온 순서대로
  • Round Robin : 시간을 나눠서 조금씩 번갈아 실행
  • Priority Scheduling : 우선순위 높은 작업 먼저 실행

실무에서 배치 작업이 느리거나 웹 요청 응답이 늦을 때, 내부적으로는 CPU 스케줄링이 원인일 수 있다.

 

 

3. 메모리 관리

운영체제는 여러 프로그램이 충돌하지 않도록 메모리를 구획을 나눠 관리한다.

  • Stack / Heap / Data / Code 영역
  • 가상 메모리 : 실제 물리 메모리가 부족할 때 디스크를 RAM처럼 쓰는 기술(swap 발생)

실무에서 발생하는 OutOfMemoryError, GC 지연 현상 등은 메모리 구간 이해가 핵심이다.

 

 

4. 동기화와 데드락

여러 스레드가 하나의 자원을 동시에 접근하면 문제가 생길 수 있다.

운영체제는 Lock이나 세마포어(Semaphore) 같은 방법으로 이를 막는다.

 

데드락 : A는 B의 리소스를, B는 A의 리소스를 기다리는 상황 -> 둘 다 멈춤

 

실무에서 DB 커넥션 풀, 멀티스레딩 환경에서 데드락은 진짜 흔하게 발생한다.

 

 

5. 인터럽트 (Interrupt)

컴퓨터는 외부의 신호 (예 : 키보드 입력, 하드디스크 응답 등)를 기다리지 않고, 인터럽트가 발생하면 즉시 반응한다.

  • 동기 -> 순서대로 기다림
  • 비동기(인터럽트 기반) -> 갑자기 들어오는 요청에도 빠르게 대응

실시간 처리가 중요한 서비스에서는 인터럽트를 효율적으로 처리하는 게 핵심이다.

 

 

왜 OS 지식이 필요한지 예시를 들어보자

fun main() {
    val thread1 = Thread { heavyComputation() }
    val thread2 = Thread { heavyComputation() }
    thread1.start()
    thread2.start()
}

 

위 코드에서 스레드 2개가 동시에 실행될 수 있을까???

 

정답은 아니요 이다. CPU 코어 수, 스케줄러 정책, OS가 허용하는 최대 스레드 수에 따라 실제 동작이 달라진다.

 

 

실무에서 마주치는 메모리 문제는 어떤게 있고, 어떻게 해결하는지도 한번 알아보자.

 

서비스는 점점 느려지고, 갑자기 서버가 죽었다? -> 90%는 메모리 문제라고 봐도 무방하다.

 

자바 개발자가 흔히 마주치는 메모리 이슈에는 다음과 같은 것들이 있다.

 

1. OutOfMemoryError (OOM)

JVM이 힙 공간을 더 이상 확보할 수 없을때 발생한다.

 

원인 : 

  • 무한 루프 안에서 List에 데이터 추가
  • 캐시를 비워주지 않음
  • 너무 많은 객체 생성(ex: 수천 개의 파일을 한 번에 처리)

해결전략 : 

  • JVM 힙 크기 조절 : -Xmx1024m
  • 캐시 정책 설정 (예 : LRU, TTL)
  • 대용량 작업 시 스트리밍 처리 (InputStream, Flux, Cursor)

 

2. GC 튜닝 문제로 인한 성능 저하

메모리는 충분한데 느리다?? -> GC에 시간이 다 잡아먹히고 있을 수 있다.

 

진단 방법. :

  • -Xlog:gc* 옵션으로 GC 로그 분석
  • jvisualvm, GCViewer, JFR (Java Flight Recorder) 사용

해결 전략 : 

  • G1 GC, ZGC 등 최신 GC 사용 고려
  • 객체 생명 주기 짧게 설계 (가비지 생성을 줄이기)
  • 메모리 재사용 (Object Pool 등)

 

3. PermGen / Metaspace 부족 (클래스 메타데이터 문제)

대규모 프로젝트, 플로그인 구조에서 자주 발생하는 문제이다.

 

원인 : 

  • 클래스 로더 누수
  • 동적 클래스 생성(ex: JSP, Proxy)

해결 전략 : 

  • -XX:MaxMetaspaceSize 설정
  • 코드 HotReload 시 reload 제한
  • 메모리 분석 툴로 클래스 로더 누수 확인(jmap, MAT)

 

메모리 문제 해결을 위한 필수 도구 모음

도구  용도
jamap 힙 덤프 추출
jhat, Eclipse MAT 힙 덤프 분석
jstat GC/메모리 상태 확인
VisualVM, JFR 실시간 분석
Netdata, Prometheus + Grafana 전체 시스템 메모리 모니터링

 

 

실전 트러블슈팅 사례 한가지만 살펴보자 

무한 수집 중 OutOfMemoryError 가 발생한 케이스다.

 

문제 상황 : 외부 API에서 대량의 데이터를 수집하여 List에 저장 -> 메모리 부족(OOM) 사용자 요청은 점점 늘고, 서버는 점점 느려지다 뻗어버림

 

문제 코드 (잘못된 예시)

@RestController
class LogCollectorController {

    val collectedLogs = mutableListOf<String>()  // 무한히 쌓임 → 힙 폭발

    @GetMapping("/collect")
    fun collect(): String {
        val externalLogs = callExternalApi()  // 외부에서 로그 1000건씩 수신
        collectedLogs.addAll(externalLogs)   // 계속 메모리에 추가만 됨
        return "Collected ${externalLogs.size} logs"
    }

    fun callExternalApi(): List<String> {
        // 외부 로그 API 시뮬레이션
        return List(1000) { "log line $it" }
    }
}

 

문제점

  • colletedLogs에 데이터를 계속 저장한다.
  • GC가 수거하지 못하는 상태로 누적된다 -> OOM 발생
  • 서버는 정상적으로 작동하는 것처럼 보이지만, 메모리는 계속 쌓임

해결 코드 (스트리밍 처리 + 즉시 저장)

@RestController
class LogCollectorController(val logService: LogService) {

    @GetMapping("/collect")
    fun collect(): String {
        val externalLogs = callExternalApi()

        // 스트리밍 처리로 한 건씩 바로 저장하여 메모리 사용 최소화
        externalLogs.forEach { log ->
            logService.save(log)
        }

        return "Collected ${externalLogs.size} logs"
    }

    fun callExternalApi(): Sequence<String> {
        // Sequence로 lazy하게 한 줄씩 처리
        return generateSequence(0) { it + 1 }
            .take(1000)
            .map { "log line $it" }
    }
}

@Service
class LogService {
    fun save(log: String) {
        // DB 또는 파일 저장 등의 실질적인 처리
        println("Saving log: $log")
    }
}

 

개선 포인트 

  • Sequence 사용 : List 에 다 넣지 않고, 한 줄씩 처리하므로 메모리 부담이 내려간다.
  • 즉시 저장 : GC가 객체를 빠르게 수거 가능하다
  • 상태 유지 X : collectedLogs와 같은 전역 메모리 누적 제거

 

메모리 문제는 버그보다 무섭다. 이유는 단순한데 느리거나 죽기 때문이다. 운영 중인 시스템이라면 예방이 가장 중요하고, 대응할 때는 반드시 근거 있는 추측과 도구 기반 분석이 필요하다.

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

운영체제의 큰 그림  (1) 2024.08.28
운영체제를 알아야 하는 이유  (1) 2024.08.14
장치 컨트롤러와 장치 드라이버  (0) 2024.08.13
RAID 정의와 종류  (0) 2024.08.08
보조기억장치  (0) 2024.07.20

다음의 질문에 답할 수 있는지 생각해보자

  • 커널이란 무엇인가?
  • 운영체제의 서비스 종류는 무엇이 있는가?
  • 시스템 콜과 이중 모드는 무엇인가?

 

 

운영체제의 심장, 커널

운영체제는 현존하는 프로그램 중 규모가 가장 큰 프로그램 중 하나이다.

 

구글에 리눅스 코드의 줄이 몇개인지 검색해보면 2,700백만 줄이라는 것을 볼 수 있다.

 

운영체제는 종류가 다양하고, 제공하는 기능도 다양하다.(가장 핵심적인 서비스는 존재한다)

 

이러한 운영체제의 핵심 서비스를 담당하는 부분을 커널(kernel)이라고 한다.

커널

 

그럼 운영체제에는 속하지만 커널에는 속하지 않는 기능도 있을까? 유저 인터페이스(User Interface)가 여기에 속한다. 사용자와 컴퓨터 간의 통로일 뿐 운영체제의 핵심 기능(커널)은 아니다.

 

 

 

이중 모드와 시스템 호출

사용자가 실행하는 프로그램은 자원에 직접 접근할 수 있을까? ex) 메모리, CPU, 하드디스크 등등...

 

정답은 안된다. 자원에 직접 접근하는 것은 위험하다. 운영체제는 응용 프로그램들이 자원에 접근하려 할 때 오직 자신을 통해서만 접근하도록 하여 자원을 보호한다.

운영체제는 직접 접근을 허락하지 않는다

 

응용 프로그램이 하드 디스크에 접근하는 것을 그림으로 살펴보자.

응용 프로그램이 하드 디스크에 접근할 때

 

운영체제를 통해서 접근하는 것을 볼 수 있다.

 

이중 모드

  • CPU가 명령어를 실행하는 모드를 크게 사용자 모드와 커널 모드로 구분하는 방식
  • 사용자 모드 : 운영체제 서비스를 제공받을 수 없는 실행 모드, 커널 영역의 코드를 실행할 수 없는 실행 모드, 자원 접근 불가
  • 커널 모드 : 운영체제의 서비스를 제공받을 수 있는 실행 모드, 자원 접근을 비롯한 모든 명령어 실행 가능

슈퍼바이저 플래그에서 어떤 모드인지 알 수 있다.

 

이중 모드

 

 

시스템 호출

  • 커널 모드로 전환하여 실행하기 위해 호출
  • 일종의 소프트웨어 인터럽트이다. (시스템 호출이 처리되는 방식은 하드웨어 인터럽트 처리 방식과 유사하다)

시스템 호출

 

리눅스 시스템 코드
모드의 빈번한 전환

 

운영체제의 핵심 서비스

  • 프로세스 관리
  • 자원 접근 및 할당
  • 파일 시스템 관리

프로세스 관리 

  • 프로세스 == 실행 중인 프로그램
  • 수많은 프로세스들이 동시에 실행된다
  • 동시다발적으로 실행/생성/삭제되는 다양한 프로세스를 일목요연하게 관리한다(=프로세스와 스레드, 프로세스 동기화, 교착상태 해결)

작업관리자에서 확인 가능한 프로세스들

 

자원 접근 및 할당

  • CPU (CPU 스케줄링 : 어떤 프로세스를 먼저, 얼마나 오래 실행할까?)
  • 메모리 (페이징, 스와핑 등등)
  • 입출력 장치

 

파일 시스템 관리

  • 관련된 정보를 파일이라는 단위로 저장 장치에 보관
  • 파일들을 묶어 폴더(디렉터리) 단위로 저장 장치에 보관

컴퓨터 부품들은 전기만 공급하면 알아서 작동하지 않는다. 

 

모든 프로그램은 실행을 위해 자원을 필요로 한다.

 

 

자원 / 시스템 자원

  • 프로그램 실행에 있어 마땅히 필요한 요소
  • 컴퓨터의 네 가지 핵슴 부품

 

운영체제는 

  • 실행할 프로그램에 필요한 자원을 할당하고
  • 프로그램이 올바르게 실행되게 돕는
  • 특별한 프로그램

 

 

운영체제의 메모리 관리

운영체제
운영체제의 메모리 관리

 

 

운영체제의 CPU 관리

운영체제의 CPU 관리

 

 

운영체제의 입출력장치 관리

운영체제의 입출력장치 관리

 

 

운영체제 덕분에 개발자는 하드웨어를 조작하는 코드를 직접 작성할 필요가 없다. 

 

개발자는 문제 해결 능력 - 오류 메세지에 대한 깊은 이해를 위해서는 운영체제를 알아야 한다.

 

컴퓨터는 다른 외부 장치들과 어떻게 데이터를 주고받을까?

 

입출력장치는 종류가 너무나도 많다. 장치가 다양하면 장치마다 속도, 데이터 전송 형식 등도 다양하다.

-> 다양한 입출력장치와 정보를 주고받는 방식을 규격화하기 어렵다.

 

일반적으로 CPU와 메모리의 데이터 전송률은 높지만 입출력장치의 데이터 전송률은 낮다.

* 전송률 : 데이터를 얼마나 빨리 교황할 수 있는지를 나타내는 지표

 

이러한 문제점들을 어떻게 해결할 수 있을까?

 

 

 

장치 컨트롤러

입출력 장치는  장치 컨트롤러를 통해 컴퓨터와 연결된다.

 

장치 컨트롤러의 역할에는 다음과 같은 것들이 있다.

  • CPU와 입출력장치 간의 통신중개 (일종의 번역가 역할을 수행)
  • 오류 검출
  • 데이터 버퍼링 (전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법)

 

장치 컨트롤러의 구조

장치 컨트롤러의 구조

 

 

 

장치 드라이버

장치 컨트롤러의 동작을 감지하고 제어하는 프로그램.

 

장치 컨트롤러가 입출력장치를 연결하기 위한 하드웨어적인 통로라면, 장치 드라이버는 입출력장치를 연결하기 위한 소프트웨어적인 통로

이다.

장치 드라이버

 

컴퓨터가 연결된 장치의 드라이버를 인식하고 실행할 수 있다면 컴퓨터 내부와 정보를 주고받을 수 있고, 반대로 컴퓨터가 장치 드라이버를 인식하거나 실행할 수 없다면 그 장치는 컴퓨터 내부와 정보를 주고받을 수 없다.

 

이 말을 다시 하면

 

운영체제가 연결된 장치의 드라이버를 인식하고 실행할 수 있다면 컴퓨터 내부와 정보를 주고받을 수 있고, 반대로 운영체제가 장치 드라이버를 인식하거나 실행할 수 없다면 그 장치는 컴퓨터 내부와 정보를 주고받을 수 없다는 것이다.

'컴퓨터구조와 운영체제' 카테고리의 다른 글

운영체제의 큰 그림  (1) 2024.08.28
운영체제를 알아야 하는 이유  (1) 2024.08.14
RAID 정의와 종류  (0) 2024.08.08
보조기억장치  (0) 2024.07.20
캐시 메모리  (0) 2024.07.12

 

1TB 하드 디스크 네 개로 RAID를 구성하면 4TB 하드 디스크 한 개의 성능과 안전성을 능가할 수 있다.

 

 

RAID의 정의

RAID(Redundant Array of Independent Disks)

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

 

RAID 레벨

  • RAID를 구성하는 기술
  • RAID 0, RAID 1, .....

 

스트라입(stripe) : 마치 줄무늬처럼 분산되어 저장된 데이터

스트라이핑(striping) : 분산하여 저장하는 것

 

장점 : 입출력 속도의 향상

 

단점 : 저장된 정보가 안전하지 않다.

 

 

 

단점 : 하드 디스크 개수가 한정되었을 때 사용 가능한 용량이 적어짐

 

 

 

(RAID 1 처럼 완전한 복사본을 만드는 대신) 패리티 비트를 저장

패리티를 저장한 장치를 이용해 다른 장치즐의 오류를 검출하고, 오류가 있다면 복구한다. (RAID 1 보다 적은 하드 디스크로도 데이터를 안전하게 보관한다.)

 

단점 : 패리티 디스크의 병목

 

 

 

 

두 종류의 패리티(오류를 검출하고 복구할 수 있는 수단)

RAID 5보다 안전, 쓰기는 RAID 5 보다 느림

 

 

RAID

  • 각 RAID 레벨마다 장단점이 있다.
  • 어떤 상황에서 무엇을 최우선으로 원하는지에 따라 최적의 RAID 레벨은 달라질 수 있다.
  • 각 RAID 레벨의 대략적인 구성과 특징을 아는  것이 중요하다.

'컴퓨터구조와 운영체제' 카테고리의 다른 글

운영체제를 알아야 하는 이유  (1) 2024.08.14
장치 컨트롤러와 장치 드라이버  (0) 2024.08.13
보조기억장치  (0) 2024.07.20
캐시 메모리  (0) 2024.07.12
메모리의 주소 공간  (0) 2024.07.07

하드 디스크 

자기적인 방식으로 데이터를 저장한다.

하드 디스크

 

구성 

하드 디스크 구성

 

일반적으로 플래터 양면을 모두 사용하고,  RPM(Revolution Per Minute) : 분당 회전수 단위를 사용한다.

 

플래터를 스핀들이 회전을 시키는데 이렇게 회전시키면서 데이터를 읽고 쓰는 구성요소가 헤드이다. 일반적으로 모든 헤드가 디스크 암에 부착되어 함께 이동한다.

 

헤드와 디스크 암

 

 

저장 단위

기본적으로 트랙(track)과 섹터(sector) 단위로 데이터를 저장한다. 섹터의 크기 : 512바이트 ~ 4096바이트

플래터의 저장 단위

 

여러 겹의 플래터 상에서 같은 트랙이 위치한 곳을 모아 연결한 논리적 단위를 실린더라고 한다.

 

실린더

 

연속된 정보는 한 실린더에 기록된다.

 

 

데이터 접근 과정

하드 디스크가 저장된 데이터에 접근하는 시간

  • 탐색 시간 (seek time) : 접근하려는 데이터가 저장된 트랙까지 헤드를 이동시키는 시간
  • 회전 지연 (rotaional latency) : 헤드가 있는 곳으로 플래터를 회전시키는 시간
  • 전송 시간 (transfer time) : 하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간

탐색 시간

 

회전 지연

 

전송 시간

 

 

 

플래시 메모리

전기적으로 데이터를 읽고 쓰는 반도체 기반 저장 장치 (범용성이 넓어 보조기억장치에만 속한다고 보기는 어렵다)

플래시 메모리

 

플래시 메모리의 종류

  • NAND 플래시 메모리
  • NOR 플래시 메모리

 

구성

 

셀(cell)

  • 플래시 메모리에서 데이터를 저장하는 가장 작은 단위
  • 이 셀이 모이고 모여 MB, GB, TB 저장 장치가 된다.

한 셀에

  • 1비트를 저장할 수 있는 플래시 메모리 : SLC
  • 2비트를 저장할 수 있는 플래시 메모리 : MLC
  • 3비트를 저장할 수 있는 플래시 메모리 : TLC
  • 4비트를 저장할 수 있는 플래시 메모리 : QLC

사람 한 명  == 1비트

셀              == 집

라고 가정해보자 

 

  • SLC == 한 집에 한 명 
  • MLC == 한 집에 두 명
  • TLC == 한 집에 세 명

라고 생각할 수 있다.

 

 

SLC

  • 한 셀로 두 개의 정보 표현
  • 비트의 빠른 입출력
  • 긴 수명
  • 용량 대비 고가격 (속도가 그만큼 빠르기 때문에)

* 플래시 메모리 (USB, SSD, SD 카드), 하드 디스크에는 수명이 존재한다.

 

 

MLC

  • 한 셀로 네 개의 정보 표현 (대용량화 유리)
  • SLC보다 느린 입출력
  • SLC보자 짧은 수명
  • SLC보다 저렴

 

TLC

  • 한 셀로 여덟 개의 정보 표현 (대용량화 유리)
  • MLC보다 느린 입출력
  • MLC보다 짧은 수명
  • MLC보다 저렴

비교

 

저장 단위

  • 셀들이 모여 페이지 (page)
  • 페이지들이 모여 블록 (block)
  • 블록이 모여 플레인 (plane)
  • 플레인이 모여 다이 (die)

저장 단위

 

읽기/쓰기 단위와 삭제 단위는 다르다

  • 읽기와 쓰기는 페이지 단위로 이루어진다
  • 삭제는 (페이지보다 큰) 블록 단위로 이루어딘다

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

장치 컨트롤러와 장치 드라이버  (0) 2024.08.13
RAID 정의와 종류  (0) 2024.08.08
캐시 메모리  (0) 2024.07.12
메모리의 주소 공간  (0) 2024.07.07
RAM의 특성과 종류  (1) 2024.07.03

CPU가 메모리에 접근하는 시간은 CPU 연산 속도보다 현저하게 느리다. 이것을 어떻게 해결할 수 있을까?

CPU 메모리 접근

 

저장 장치 계층 구조

  1. CPU와 가까운 저장 장치는 빠르고, 멀리 있는 저장 장치는 느리다.
  2. 속도가 빠른 저장 장치는 저장 용량이 작고, 가격이 비싸다.

 

저장 장치들은 'CPU에 얼마나 가까운가'를 기준으로 계층적으로 나타낼 수 있다.

저장 장치 계층 구조

 

캐시 메모리

  • CPU와 메모리 사이에 위치한, 레지스터보다 용량이 크고 메모리보다 빠른 SRAM 기반의 저장 장치
  • CPU의 연산 속도와 메모리 접근 속도의 차이를 조금이나마 줄이기 위해 탄생한 저장 장치이다.
  • CPU가 매번 메모리에 왔다 갔다 하는 건 시간이 오래 걸리기 때문에, 메모리에서 CPU가 사용할 일부 데이터를 미리 캐시 메모리로 가지고 와서 사용한다.

캐시 메모리는 편의점에 비유할 수 있다

 

캐시 메모리를 사용하는 경우

 

계층적 캐시 메모리(L1-L2-L3 캐시)

계층적 캐시 메모리

 

 

멀티코어 프로세서의 캐시 메모리

멀티코어 프로세서의 캐시 메모리

 

코어마다 따로 캐시를 가질 수 있고, 공유하는 캐시 메모리를 갖는다.

 

 

분리형 캐시

분리형 캐시

 

조금 더 속도를 빠르게 하기 위해 L1 캐시를 분리한 캐시이다. ex) L1D -> 데이터만 저장, L1l -> 명령어만 저장

 

 

 

참조 지역성의 원리

캐시 메모리는 메모리보다 용량이 작다. 당연하게도 메모리의 모든 내용을 저장할 수 없다.

그렇다면 무엇을 저장해야 할까? 

 

CPU가 자주 사용할 법한 내용을 예측하여 저장한다.

 

예측이 들어맞을 경우 (CPU가 캐시 메모리에 저장된 값을 활용한 경우) = 캐시 히트 라고 한다.

예측이 틀렸을 경우 (CPU가 메모리에 접근해야 하는 경우) = 캐시 미스 라고 한다.

 

 

캐시 적중률 

캐시 적중률

캐시 적중률이 높아야 한다. 

 

참조 지역성의 원리는 CPU가 메모리에 접근할 때의 주된 경향을 바탕으로 만들어진 원리이다. 

  1. CPU는 최근에 접근했던 메모리 공간에 다시 접근하려는 경향이 있다.
  2. CPU는 접근한 메모리 공간 근처를 접근하려는 경향이 있다.

 

공간 지역성 예시

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

RAID 정의와 종류  (0) 2024.08.08
보조기억장치  (0) 2024.07.20
메모리의 주소 공간  (0) 2024.07.07
RAM의 특성과 종류  (1) 2024.07.03
명령어 집합 구조  (0) 2024.07.02

논리 주소와 물리 주소

 

위 그림과 같이 CPU 내부에는 논리 주소와 물리 주소로 주소 공간을 나눠져 있다. 논리 주솔르 물리 주소로 변환하는 방법은 무엇일까?

CPU와 실행 중인 프로그램은 현재 메모리 몇 번지에 무엇이 저장되어 있는지 다 알고 있을까?

 

물리 주소와 논리 주소

메모리에 저장된 값들은 시시각각 변한다. 새롭게 실행되는 프로그램은 새롭게 메모리에 적재되고, 실행이 끝난 프로그램은 메모리에서 삭제된다. 같은 프로그램을 실행하더라도 실행할 때마다 적재되는 주소는 달라진다. 

 

이런 상황에서 어떤 주소에 어떤 명령어가 저장되어 있는지 일일이 다 알 수 있을까? 

 

불가능하다. 그래서 이러한 문제를 극복하기 위해 주소체계를 물리 주소와 논리 주소로 나눈 것이다.

 

물리 주소

  • 메모리 입장에서 바라본 주소
  • 말 그대로 정보가 실제로 저장된 하드웨어상의 주소

논리 주소

  • CPU와 실행 중인 프로그램 입장에서 바라본 주소
  • 실행 중인 프로그램 각각에게 부여된 0번지부터 시작하는 주소

그렇다면 물리 주소와 논리 주소 간의 변환은 어떻게 이루어질까?

물리 주소와 논리 주소의 변환

 

MMU(메모리 관리 장치)라는 하드웨어에 의해 변환된다. MMU는 논리 주소와 베이스 레지스터(프로그램의 기준주소) 값을 더하여 논리 주소를 물리 주소로 변환한다.

MMU에 의한 변환 예시

 

MMU애 의한 변환 예시(2)

 

 

베이스 레지스터 : 프로그램의 가장 작은 물리 주소(프로그램의 첫 물리 주소)를 저장

 

논리 주소 : 프로그램의 시작점으로부터 떨어진 거리

 

메모리 보호

한계 레지스터

  • 프로그램의 영역을 침범할 수 있는 명령어의 실행을 막는다.
  • 베이스 레지스터가 실행 중인 프로그램의 가장 작은 물리 주소를 저장한다면, 한계 레지스터는 논리 주소의 최대 크기를 저장한다.
  • 베이스 레지스터의 값 <= 프로그램의 물리 주소 범위 < 베이스 레지스터 + 한계 레지스터 값

CPU가 접근하려는 논리 주소는 한계 레지스터가 저장한 값보다 커서는 안된다.

논리 주소의 값

 

예를 들어, 베이스 레지스터에 100, 한계 레지스터에 150이 저장되어 있다고 가정해보자.

-> 물리 주소 시작점이 100번지, 프로그램의 크기(논리 주소의 최대 크기)는 150이라는 말이다.

 

위와 같은 그림의 경우 한계 레지스터보다 큰 메모리 주소에 접근하려고 하기 때문에 이를 막아준다.

 

이처럼 CPU는 메모리에 접근하기 전 접근하고자 하는 논리 주소가 한계 레지스터보다 작은지를 항상 검사한다.

이로인해 실행 중인 프로그램의 독립적인 실행 공간을 확보하고, 하나의 프로그램이 다른 프로그램을 침범하지 못하게 보호한다

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

보조기억장치  (0) 2024.07.20
캐시 메모리  (0) 2024.07.12
RAM의 특성과 종류  (1) 2024.07.03
명령어 집합 구조  (0) 2024.07.02
명령어 병렬 처리 기법(CPU)  (3) 2024.07.01

주기억장치의 종류에는 크게 RAM과 ROM 두 가지가 있고, 메모리라는 용어는 그 중 RAM을 지칭하는 경우가 많다.

 

RAM의 특징

RAM은 실행할 대상을 저장한다. 하지만 전원이 꺼지게 되면 데이터가 날아가기 때문에 보조기억장치라는 전원이 꺼져도 데이터를 저장할 수 있는 장치가 필요하다.

RAM

 

RAM(2)

 

RAM이 크면 뭐가 좋을까? RAM의 용량을 컴퓨터 성능에 어떤 영향을 미칠까?

 

RAM의 용량과 성능

RAM의 용량이 작을때

 

위 그림과 같이 RAM이 작아서 프로그램 3개중 하나만 저장가능하다고 가정해보자 CPU가 한번에 여러가지 연산을 할 수 없게된다.

 

반대로 RAM이 크면 어떻게 될까?

RAM의 용량이 클때

 

바로바로 RAM에서 데이터를 사용할 수 있다. 많은 프로그램을 동시에 실행하는 데에 유리하다.

 

RAM의 종류

1. DRAM(Dynamic RAM)

  • Dynamic = "동적의"
  • 저장된 데이터가 동적으로 사라지는 RAM이다.
  • 데이터 소멸을 막기 위해 주기적으로 재활성화 해야 한다. 
  • 일반적으로 메모리로 사용되는 RAM, 상대적으로 소비전력이 낮고 저렴하고 집적도가 높아 대용량으로 설계하기 용이하다.

2. SRAM(Static RAM)

  • Static = "정적의"
  • 저장된 데이터가 정적인 (사라지지 않는) RAM (전원이 연결되어 있을때만)
  • DRAM 보다 일반적으로 더 빠름
  • 일반적으로 캐시 메모리에서 사용되는 RAM, 상대적으로 소비전력이 높고 가격이 높고 집적도가 낮아 대용량으로 설계할 필요는 없으나 빨라야 하는 장치에 사용한다.

DRAM vs SRAM

 

3. SDRAM(Synchronous DRAM)

  • 특별한 (발전된 형태의) DRAM
  • 클럭 신호와 동기화된 DRAM

4. DDR SDRAM(Double Data Rate SDRAM)

  • 특별한 (발전된 형태의) SDRAM
  • 최근 가장 대중적으로 사용하는 RAM
  • 대역폭을 넓혀 속도를 빠르게 만든 SDRAM (주고받는 데이터 양을 많게 한 RAM)
  • 대역폭은 데이터를 주고받는 길의 너비

SDR SDRAM vs DDR SDRAM

 

SDR SDRAM vs DDR2 SDRAM

 

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

캐시 메모리  (0) 2024.07.12
메모리의 주소 공간  (0) 2024.07.07
명령어 집합 구조  (0) 2024.07.02
명령어 병렬 처리 기법(CPU)  (3) 2024.07.01
빠른 CPU를 위한 설계 기법  (0) 2024.06.28

명령어는 어떻게 생겨야 명령어 파이프라이닝에 유리할까?

명령어 집합 

CPU는 명령어를 실행한다. 근데 모든 CPU가 똑같이 생긴 명령어를 처리할까?

명령어의 세세한 생김새, 연산, 주소 지정 방식 등은 CPU마다 다르다.

 

명령어 집합 (구조) : CPU가 이해할 수 있는 명령어들의 모음 (=CPU의 언어)

인텔의 CPU

 

CPU는 명령어 집합에 속해있는 명령어만 이해하고 처리할 수 있다.

명령어 처리

 

위 그림처럼 같은 소스코드를 컴파일해도 CPU에 따라 저급언어가 다르게 생성되는 것을 볼 수 있다.

 

명령어가 달라지면 많은 것들이 달라진다. ex) 명령어 해석 방식, 레지스터의 종류와 개수, 파이프라이닝의 용이성...

 

ISA

 

ISA는 CPU의 언어이자 하드웨어가 소프트웨어를 어떻게 이해할지에 대한 약속이다.

 

 

명령어 집합의 두 축 : CISC & RISC

 

CISC(Complex Instruction Set Computer)

복잡한 명령어 집합을 활용하느 컴퓨터(CPU). x86, x86-64는 CISC 기반 명령어 집합 구조이다.

복잡하고 다양한 명령어를 활용하며 명령어의 크기가 다양한 가변 길이 명령어를 활용한다.

 

 

CISC

 

다양하고 강력한 명령어를 활용하기 때문에 상대적으로 적은 수의 명령어로도 프로그램을 실행할 수 있다.

 

이러한 이유로 메모리를 최대한 아끼며 개발해야 했던 시절에 인기가 높았으나 명령어 파이프라이닝이 불리하다는 치명적인 단점이 존재하여 지금은 인기가 시들해졌다. 

 

명령어가 워낙 복잡하고 다양한 기능을 제공하는 탓에 명령어의 크기와 실행되기까지의 시간이 일정하지 않고 복잡한 명령어 때문에 명령어 하나를 실행하는 데에 여러 클럭 주기가 필요하다.

 

게다가, 대다수의 복잡한 명령어는 사용 빈도가 낮다.

 

 

 

RISC(Reduced Instruction Set Computer)

명령어의 종류가 적고, 짧고 규격화된 명령어를 사용한다.

RISC

 

짧고 규격화된 명령어를 활용하기 때문에 파이프라이닝에 유리하다. 메모리 접근 최소화(load, store), 레지스터를 많이 사용한다.

 

 

정리

 

'컴퓨터구조와 운영체제' 카테고리의 다른 글

메모리의 주소 공간  (0) 2024.07.07
RAM의 특성과 종류  (1) 2024.07.03
명령어 병렬 처리 기법(CPU)  (3) 2024.07.01
빠른 CPU를 위한 설계 기법  (0) 2024.06.28
명령어 사이클과 인터럽트  (0) 2024.06.27

+ Recent posts