[04.29/week07]TIL

CHO WanGi·2025년 4월 29일

KRAFTON JUNGLE 8th

목록 보기
41/89

오늘 하루 요약

✏️ 오늘의 한 일

  • Explicit Free List
  • DMA, Ehternet
  • JS 2309 일곱 난쟁이

🌈오늘의 성장!

Explicit Free List


32비트일 때 블록과 도커 환경의 리눅스 환경에서 64비트의 블록 초기화가 달라져서 그림으로 표현해보았다.
나는 가용 가능한 블록을 8바이트로 크게 잡았는데 이걸 4바이트로 줄여 24바이트를 최소 블록 크기로 설정이 가능하다는 이야기를 들었다.

그렇게되면 내부 단편화가 좀 완화가 되어 space utillization 이 나아질듯 싶어서 내일 해볼 생각

DMA

CPU 없이도 입출력이 가능하다면? 시스템 효율을 크게 높이는 핵심 기술, DMA를 알아보자.

개요: DMA란?

DMA(Direct Memory Access)는 CPU의 개입 없이 입출력 장치와 메모리 사이에서 데이터 전송을 직접 수행하는 방식이다. CPU는 디바이스 설정만 담당하고, 데이터 전송 자체는 DMA 컨트롤러가 담당한다.

이 방식은 다음과 같은 구조로 작동한다:

  1. CPU: 디바이스에 읽기 명령 및 메모리 주소 설정
  2. DMA Controller: 디바이스가 메모리로 데이터를 직접 전송
  3. 디바이스: 전송 완료 후 인터럽트를 통해 CPU에 알림

✅ CPU는 명령만 던져주고, 실제 데이터 처리는 DMA가 맡는 구조

Polling vs DMA

방식설명
Polling 방식CPU가 디바이스 상태를 계속 확인하며 전송 완료 여부를 감시함. CPU 리소스 낭비 심함.
DMA 방식CPU는 명령만 전달하고 기다림 없이 다른 작업 수행 가능. 효율적이고 빠름.

DMA 동작 흐름 요약

  1. CPU가 Memory-Mapped I/O를 통해 디스크 컨트롤러에 명령 전달
  2. 디스크 컨트롤러가 데이터를 읽고 DMA로 메모리에 직접 복사
  3. 작업 완료 후, 인터럽트를 통해 CPU에 완료 통지
  4. CPU는 인터럽트 핸들러를 통해 후속 처리 수행

DMA 전송 모드 종류

모드설명
버스트 모드데이터를 한 번에 전송. CPU는 전송 동안 버스를 사용하지 못함.
사이클 스틸링CPU가 메모리에 접근하지 않을 때 잠깐씩 버스를 사용.
투명 모드CPU가 메모리에 접근하지 않을 때만 동작하여 CPU 성능에 거의 영향 없음.

DMA로 인한 캐시 불일치 문제

문제: CPU와 디바이스가 메모리에 동시에 접근

  • CPU는 캐시를 사용, 디바이스는 메모리 원본 직접 수정
  • 결과: CPU는 캐시된 옛날 값, 메모리는 최신 값데이터 불일치

해결 방법

  1. Cache Flush / Invalidate

    • DMA 전: CPU가 캐시 내용을 메모리에 저장 (write-back)
    • DMA 후: CPU는 캐시 무효화 → 메모리에서 다시 읽기
  2. Non-Cacheable Memory 설정

    • DMA 버퍼 영역을 아예 캐시에 올리지 않게 설정
  3. Cache-Coherent DMA

    • 하드웨어가 자동으로 캐시 일관성 관리 (성능 오버헤드 있음)

Ethernet

1. 개요

  • 대표적인 유선 네트워크 기술
  • 전체 유선 통신의 70~80% 차지
  • LAN(Local Area Network) 환경에서 사용됨
  • 초기에는 동축 케이블 기반의 버스형 구조 → 데이터 충돌 문제 발생 → CSMA/CD 기술 등장
  • 현재는 UTP 케이블이나 광케이블을 사용한 구조가 주류
  • 표준: IEEE 802.3 (데이터 링크 계층 중 MAC + 물리 계층 정의)

2. 이더넷 물리 계층

2-1. 이더넷 케이블 종류

  • 동축 케이블: 초기 사용
  • UTP 케이블: 가장 일반적 (Cat 6, Cat 6A 등)
  • 광케이블: 대역폭 크고 전기적 간섭 없음

전송 방식

  • Half Duplex: 한 방향씩 번갈아 전송
  • Full Duplex: 동시에 송수신 가능 (현재 주류)

2-2. 이더넷 장비

  • 스위치, 라우터: 네트워크 장비 연결 및 데이터 경로 설정
  • 브릿지, 게이트웨이
    • 브릿지: 유사한 네트워크 연결
    • 게이트웨이: 이질적인 네트워크 연결

3. 이더넷의 장점

  1. 속도: 유선 연결로 무선 대비 빠른 속도 (최대 10Gbps 이상)
  2. 보안: 무선보다 안정적인 보안 환경
  3. 신뢰성: 전파 간섭 없음, 고정된 대역폭
  4. 전력 효율: Wi-Fi보다 낮은 전력 소비

4. 이더넷의 단점

  1. 이동성 제한: 물리적 연결 필요
  2. 확장성: 장치 추가 시 케이블, 스위치 등 추가 비용 발생
  3. 설치 복잡성: 일반적으로 전문가가 설치 수행
  4. 단일 연결: 장치당 하나의 케이블 필요

5. 이더넷 표준 발전

연도표준속도설명
1985802.310Mbps동축 케이블 기반
1990802.3i10MbpsUTP 케이블 기반
1995802.3u100MbpsFast Ethernet
1998802.3z1GbpsGigabit Ethernet
2002802.3ae10Gbps10G Ethernet
2010 이후-40, 100, 200, 400Gbps고속 통신 시대 진입

6. 이더넷의 프로토콜 구조

  • 물리 계층 (PHY): 어떤 케이블을 사용할지, 신호를 어떻게 변환할지
  • 데이터링크 계층의 MAC: 매체 접근 제어, 주소 설정 (MAC 주소), 충돌 감지

7. 이더넷 MAC: CSMA/CD

Carrier Sense Multiple Access with Collision Detection

  1. Carrier Sense: 케이블이 비었는지 확인
  2. Multiple Access: 여러 장치가 접근 가능
  3. Collision Detection: 충돌 발생 시 재전송
  • 최소 프레임 크기: 64Byte (18+46)
  • 이유: 충돌 탐지 가능 시간 확보

8. MAC 주소란?

  • 48비트 (6Byte)의 고유 주소
  • 앞 3Byte: 제조사 코드 (IEEE 할당)
  • 뒤 3Byte: 제조사가 설정한 고유값
  • 이더넷 장비 출고 시 할당, 변경 불가

9. 이더넷 전송 방식

방식설명CSMA/CD 사용
Half Duplex공유 케이블, 송·수신 번갈아 수행사용함
Full Duplex송·수신 동시 가능, 전용 케이블사용 안함 (비공유 매체)

※ 표준 호환을 위해 여전히 CSMA/CD 기능은 내장되어 있음


10. 이더넷의 주요 응용

  • LAN: 사무실, 가정, 캠퍼스 내부
  • MAN: ISP의 지역망, 아파트 LAN
  • WAN: 광케이블을 활용한 장거리 네트워크

11. 이더넷 스위치(Switch)

유선 네트워크에서 핵심적인 역할 수행

  • 각 포트마다 통신 장치(PC, 공유기 등) 연결
  • 이더넷 프레임 내부의 MAC 주소 기반으로 데이터 전송
  • MAC 주소 테이블(MAC Address Table) 기반의 포트 식별 및 전송

JS. 2309, 일곱 난쟁이(완전탐색)

  • 정답
const fs = require("fs");
const input = fs.readFileSync('input.txt').toString().split('\n');

// 일곱 난쟁이의 합이 100
// 완전탐색 -> 2명을 고르는 픽을 완전탐색으로

let N = 9;
let smalls = [];
for (let i = 0; i < N; i++) {
  smalls.push(parseInt(input[i]));
}

let total_sum = smalls.reduce((acc, num) => acc + num);
let found = false;

for (let i = 0; i < N; i++) {
  for (let j = i + 1; j < N; j++) {
    let two_sum = smalls[i] + smalls[j];
    if (total_sum - two_sum == 100) {
      smalls.splice(j, 1);
      smalls.splice(i, 1);
      break;
    }
  }
  if (smalls.length == 7) break;
}

smalls.sort((a, b) => a - b)
console.log(smalls.join('\n'));

일단 파이썬의 Pop 처럼 인자를 전달한다고 해서 해당 인덱스를 배열에서 없앨 수 없다.
따라서 splice를 통해서 배열을 잘라내는 내장함수를 활용해야함.

⛏ 오늘의 삽질

문제 조건을 꼭 읽자
정렬조건 모르고.... 그냥 냅다 답을 제출했다.

profile
제 Velog에 오신 모든 분들이 작더라도 인사이트를 얻어가셨으면 좋겠습니다 :)

0개의 댓글