CS 카테고리의 최신글

CS

[CS 스터디] 6주차 TCP, UDP, 흐름 제어 / 혼잡 제어

[6주차] TCP, UDP, 흐름 제어 / 혼잡 제어 Transport Layer TCP, UDP 특징 TCP의 신뢰성 보장 메커니즘 TCP의 흐름 제어 (Flow Control) TCP의 혼잡 제어 (Congestion Control) TCP 연결 과정: 3-Way Handshake와 관련 이슈 흐름 제어와 혼잡 제어의 차이 UDP가 흐름/혼잡 제어를 하지 않는 이유 DHCP 멀티플렉싱과 디멀티플렉싱(포트 번호와 TCP/UDP 연결) 🔵 Transport Layer 다른 호스트에서 실행되는 application process 사이에 논리적인 통신을 제공한다. Application 관점에서는 서로 다른 호스트의 프로세스들이 직접 연결된 것처럼 동작한다. 데이터 흐름 sender (송신 측): 어플리케이션 메세지를 세그먼트 단위로 쪼개어 Network Layer로 전달한다. receiver (수신 측): 수신한 세그먼트들을 조립하여 Application Layer로 전송한다. network vs transport Network Layer: host 사이의 논리적 통신 Transport Layer: process 사이의 논리적 통신 주요 Transport Layer 프로토콜 TCP (Transmission Control Protocol) UDP (User Datagram Protocol) 🔵 TCP, UDP 특징 | 항목 | TCP | UDP | | ----------- | --------------------- | ------------------- | | 신뢰성 | O (재전송, 확인 응답) | X (손실되어도 무시) | | 순서 보장 | O | X | | 연결 설정 | O (3-way handshake) | X (연결 없이 전송) | | 혼잡 제어 | O | X | | 지연 보장 | X | X | | 대역폭 보장 | X | X | 항목 별 용어 설명 신뢰성 (Reliability) 데이터가 전송 중 손실되거나 손상되더라도, 송신자가 재전송하거나 수신자가 확인 응답(ACK) 을 보내어 정확히 데이터를 수신하는 것을 보장하는 것 TCP는 신뢰성을 제공한다. (손실되면 재전송) UDP는 신뢰성을 제공하지 않는다. (손실돼도 무시) 순서 보장 (In-order Delivery) 여러 개의 데이터 조각이 전송될 때, 수신자가 원래 송신자가 보낸 순서대로 정확하게 데이터를 재조립하여 전달받는 것 TCP는 순서를 보장한다. (순서 엇갈려도 정렬) UDP는 순서를 보장하지 않는다. (순서 무시) 연결 설정 (Connection Setup) 데이터를 보내기 전에 송신자와 수신자가 서로 연결을 확립하는 과정 TCP는 3-way handshake 과정을 통해 연결을 설정한다. UDP는 연결 없이 바로 데이터 전송을 시작한다. 혼잡 제어 (Congestion Control) 네트워크가 혼잡할 때, 송신자가 전송 속도를 조절하여 네트워크 부하를 줄이는 메커니즘 TCP는 혼잡을 감지하고 전송 속도를 줄인다. UDP는 혼잡 상황을 고려하지 않고 계속 전송한다. 지연 보장 (Delay Guarantee) 데이터가 얼마나 빨리 도착하는지를 보장해주는 기능 TCP와 UDP 모두 지연 시간을 보장하지 않는다. 네트워크 상황에 따라 도착 시간이 변동될 수 있다. 대역폭 보장 (Bandwidth Guarantee) 일정한 전송 속도를 지속적으로 확보해주는 기능 TCP와 UDP 모두 특정 대역폭을 보장하지 않는다. 트래픽 상황에 따라 대역폭이 달라질 수 있다. 🔵 TCP의 신뢰성 보장 메커니즘 TCP는 데이터 전송 중 발생할 수 있는 오류, 손실, 중복, 순서 어긋남 문제를 해결하기 위해 다양한 신뢰성 보장 매커니즘을 사용한다. 이 매커니즘들은 rdt (reliable data transfer) 프로토콜 발전 과정을 통해 이해할 수 있다. TCP가 적용한 신뢰성 매커니즘은 다음과 같은 흐름으로 발전해 왔다. [rdt 1.0] 완벽한 채널 가정 처음에는 채널이 완벽하다고 가정하여, 데이터가 손상되거나 손실되지 않는다고 생각했다. 이 경우 송신자는 데이터를 전송하기만 하면 되었고, 별다른 추가 제어가 필요 없었다. [rdt 2.0] 비트 오류 복구 (ACK/NAK) 현실에서는 채널에서 비트 오류가 발생할 수 있으므로, 수신자는 데이터에 오류가 있는 경우 NAK를 보내어 송신자가 재전송하도록 하고, 데이터가 정상적이면 ACK를 보내 확인하는 메커니즘이 도입되었다. [rdt 2.1] ACK/NAK 깨짐 대비 (Sequence Number 추가) ACK/NAK 신호 자체가 깨질 수 있는 문제를 대비해, 시퀀스 번호(Sequence Number) 를 도입했다. 이를 통해 송신자와 수신자는 어떤 데이터가 정상적으로 전송/수신되었는지를 번호를 통해 명확히 확인할 수 있게 되었다. [rdt 2.2] NAK 없이 ACK만 사용 (TCP 스타일) 추가적인 최적화를 위해, NAK 없이 ACK만 사용하는 방식이 제안되었다. 수신자가 정상적으로 수신한 마지막 데이터에 대해 ACK를 보내고, 송신자는 중복된 ACK을 통해 문제를 감지하고 필요 시 재전송한다. TCP는 이 방식(rdt 2.2) 을 기본으로 사용한다. [rdt 3.0] 패킷/ACK 유실까지 대비 (Timeout 추가) 이후, 네트워크에서는 데이터 패킷이나 ACK 자체가 유실(loss) 되는 상황도 고려해야 했다. 이를 해결하기 위해 송신자는 타이머(timeout) 를 설정하여 일정 시간 동안 ACK이 도착하지 않으면 해당 패킷을 재전송하는 방식으로 대응한다. 이로써 유실된 데이터도 복구할 수 있다. [GBN/SR] Stop-and-Wait 한계 극복 (Window 기반) Stop-and-Wait 방식은 한 번에 하나씩만 전송하고 기다리는 방식이기 때문에 전송 효율이 매우 낮았다. 이를 해결하기 위해 Go-Back-N(GBN) 과 Selective Repeat(SR) 같은 윈도우 기반 프로토콜이 도입되었다. TCP도 이와 유사하게 여러 개의 패킷을 동시에 보내고, ACK을 받아가며 윈도우를 조정하는 방식을 사용한다. 항목 별 용어 설명 Sequence Number (시퀀스 넘버) 패킷의 고유 번호로, 데이터의 순서 보장과 중복 감지를 위해 사용 송신자가 전송하는 각 패킷에 고유 번호를 붙인다. 수신자는 시퀀스 번호를 기준으로 정확한 순서로 재조립하거나 중복 패킷을 구별할 수 있다. 번호를 통해 이건 이미 받은 데이터인지 확인할 수 있다. ACK (Acknowledgement, 확인 응답) 데이터가 정상적으로 도착했음을 알리는 신호 수신자가 데이터(패킷)를 정상적으로 받았을 때 송신자에게 보낸다 송신자는 ACK를 받으면 다음 데이터를 전송한다. TCP에서는 일반적으로 “어떤 시퀀스 번호까지 받았는지“를 함께 보낸다 (누적 ACK) NAK (Negative Acknowledgement, 부정 응답) 데이터에 오류가 발생했음을 알리는 신호 수신자가 패킷을 제대로 받지 못했거나 오류가 있으면 송신자에게 보낸다 송신자는 NAK를 받으면 해당 데이터를 즉시 재전송 TCP는 NAK를 명시적으로 사용하지 않고, 중복 ACK로 오류를 감지하고 처리한다 Retransmission (재전송) 데이터가 손실되었거나 손상되었을 때, 송신자가 같은 데이터를 다시 보내는 것 NAK를 받거나 일정 시간 안에 ACK를 받지 못하거나 (timeout) 중복된 ACK를 여러 번 받으면 송신자는 해당 패킷을 다시 전송한다 Timeout (타이머) 송신자가 ACK를 기다리는 최대 시간 데이터 전송 후, 타이머를 시작한다 타이머가 만료되었는데 ACK가 도착하지 않으면 해당 데이터를 재전송한다 타이머의 시간 길이(Timeout Interval)는 네트워크 상황에 따라 동적으로 조정될 수 있다 (ex: RTT 기반) TCP는 패킷마다 번호(Sequence Number)를 붙이고, 도착 확인(ACK)을 받고, 오류나 손실이 발생하면 재전송(Retransmission)하며, 일정 시간(Timeout) 내에 확인이 안 되면 다시 보내는 구조 🔵 TCP의 흐름 제어 (Flow Control) TCP 흐름 제어는 송신자가 수신자의 처리 능력을 초과하지 않도록 데이터 전송 속도를 조절하는 메커니즘이다. Sliding Window란? 송신자가 수신자로부터 받은 수신 윈도우 크기(rwnd)만큼 데이터를 한 번에 전송할 수 있다. 수신자는 매번 ACK를 보낼 때 자신이 추가로 받을 수 있는 버퍼 크기를 알려준다. 송신자는 이 rwnd를 보고 자신의 송신 윈도우 크기를 조절한다. 주요 특징 수신자의 버퍼 오버플로우 방지 연속적인 데이터 전송 가능 (ACK 기다리지 않고 윈도우 내에서 계속 전송) ACK을 받으면 윈도우가 슬라이딩(slide) 되어 다음 전송 준비 흐름 수신자는 현재 가능한 버퍼 크기(rwnd)를 송신자에게 통보 송신자는 rwnd를 초과하지 않도록 데이터 전송 수신자가 버퍼를 비우면 ACK + 새로운 rwnd를 송신자에게 전달 송신자는 윈도우를 슬라이딩하여 전송 지속 🔵 TCP의 혼잡 제어 (Congestion Control) TCP 혼잡 제어는 네트워크 자체가 과부하되지 않도록 송신자가 전송 속도를 동적으로 조절하는 메커니즘이다. Slow Start (느린 시작) 처음 연결이 열리면, TCP는 작은 전송 속도(cwnd = 1 MSS)부터 시작한다. 매 ACK마다 전송 윈도우(cwnd)를 2배씩 지수적으로 증가시킨다. 네트워크 상태를 빠르게 파악하면서 적응해간다. AIMD (Additive Increase Multiplicative Decrease) 혼잡이 감지되기 전까지는 1 RTT마다 cwnd를 선형(+)으로 증가시킨다 (Additive Increase) 혼잡(패킷 손실)이 발생하면 cwnd를 절반(×0.5)로 감소시킨다 (Multiplicative Decrease) 🔵 TCP 연결 과정: 3-Way Handshake와 관련 이슈 3-Way Handshake란? TCP는 연결형 프로토콜로, 통신을 시작하기 전에 반드시 연결 설정 과정을 거친다. 이 연결 설정은 3-Way Handshake라는 절차를 통해 이루어진다. 3-Way Handshake는 TCP 통신을 시작할 때 송신자와 수신자가 양방향 연결을 확립하는 과정이다. [step 1] 클라이언트가 서버에 접속을 요청하는 SYN 패킷을 보낸다. 클라이언트는 SYN을 보내고 SYN/ACK 응답을 기다리는 SYNSENT 상태, 서버는 LISTEN 상태다. [step 2] 서버는 SYN 요청을 받고 클라이언트에게 요청을 수락한다는 ACK와 SYN 패킷을 보낸다. 서버는 ACK을 기다리고 SYN RCVD 상태가 된다. [step 3] 클라이언트는 ACK과 SYN 패킷을 받고 연결이 ESTAB 된다. 클라이언트는 SYN/ACK을 잘 받았으므로 ACK을 보낸다. 서버는 ACK을 받고 연결을 ESTAB 한다. ACK, SYN 정보 전달 방식 TCP 패킷의 헤더에 SYN, ACK, FIN 등의 플래그(flag) 비트가 존재한다. 이 플래그 비트를 설정하여 SYN 요청, ACK 응답, 연결 종료(FIN) 같은 상태 정보를 전달한다. 즉, SYN/ACK은 TCP 헤더 플래그를 통해 표시된다. 3-Way Handshake 시 첫 번째 패킷: SYN 플래그만 켜짐 (S 비트 = 1) 두 번째 패킷: SYN + ACK 플래그 켜짐 (S 비트, A 비트 = 1) 세 번째 패킷: ACK 플래그만 켜짐 (A 비트 = 1) | 비트 | 의미 | 역할 | | ------- | ------------------------- | -------------------------------- | | C (CWR) | Congestion Window Reduced | 혼잡 윈도우 감소 통지 | | E (ECE) | ECN-Echo | 혼잡 경험 알림 | | U (URG) | Urgent | 긴급 데이터 표시 | | A (ACK) | Acknowledgment | 확인 응답 존재 여부 표시 | | P (PSH) | Push | 수신자가 즉시 데이터 처리 요청 | | R (RST) | Reset | 연결 강제 종료 요청 | | S (SYN) | Synchronize | 연결 설정 요청 (초기 SYN 보내기) | | F (FIN) | Finish | 연결 종료 요청 | 2-Way Handshaking을 쓰지 않는 이유 만약 2번만 통신한다면, 서버는 클라이언트의 응답 없이도 연결이 성립됐다고 착각할 수 있다. 중간에 패킷이 유실될 경우 또는 클라이언트가 응답을 못하는 경우 서버는 유령 연결(half-open connection) 을 유지하게 된다. 3-Way Handshake는 송신자와 수신자 모두가 연결 의사를 명확히 확인하게 하여, 연결이 진짜 준비 완료됐는지 검증하는 역할을 한다. 두 호스트가 동시에 연결 시 연결 방법 동시 오픈(Simultaneous Open) 클라이언트와 서버가 동시에 SYN 을 보내고, 서로의 SYN에 대해 ACK를 보내면서 연결이 성립된다. 즉, 양방향으로 SYN, ACK가 교환되면서 정상적으로 3-Way Handshake가 완료된다. SYN Flooding 공격 SYN Flooding은 TCP 3-Way Handshake 과정을 악용한 DoS(Denial of Service) 공격이다. 공격자가 수많은 SYN 패킷을 보내고 서버는 SYN-ACK을 응답했지만 공격자는 최종 ACK를 보내지 않는다 이로 인해 서버는 대량의 미완료 연결(Half-open Connection) 을 계속 유지하게 되고, 결국 서버 자원이 고갈되어 정상 사용자 요청을 처리할 수 없게 된다. 0-RTT 기법 0-RTT(Zero Round Trip Time) 기법은 3-Way Handshake 없이 빠르게 데이터를 전송하려는 최적화 기술이다. 이전에 통신한 적이 있는 서버라면, 과거 세션 정보를 저장해두고, SYN 보내자마자 바로 데이터도 함께 전송한다. 즉, 연결이 완전히 성립되기 전에 미리 데이터를 보내서 시간을 절약하는 방식이다. 4-Way Handshake 🔵 흐름 제어와 혼잡 제어의 차이 | 항목 | 흐름 제어 (Flow Control) | 혼잡 제어 (Congestion Control) | | ---- | ------------------------ | ------------------------------ | | 대상 | 송신자 -> 수신자 간 | 송신자 -> 네트워크 간 | | 목적 | 수신자 과부하 방지 | 네트워크 혼잡 방지 | | 방법 | 수신자가 rwnd로 통제 | 송신자가 cwnd로 조절 | TCP 흐름 제어: 수신자의 버퍼 상황에 맞춰 보내는 양 조절 (Sliding Window, rwnd) TCP 혼잡 제어: 네트워크 상태에 따라 보내는 속도 조절 (Slow Start, AIMD, cwnd) 🔵 UDP가 흐름/혼잡 제어를 하지 않는 이유 UDP(User Datagram Protocol)는 빠른 전송 을 목적으로 설계된 프로토콜이다. 따라서 흐름 제어(Flow Control) 와 혼잡 제어(Congestion Control) 를 일부러 적용하지 않는다. UDP는 비연결형 프로토콜이다. (연결 설정 없이 바로 데이터 전송) 빠른 전송이 목표이기 때문에, 수신자 상태나 네트워크 상황을 고려하지 않는다. 흐름 제어, 혼잡 제어를 하게 되면 오버헤드가 생겨 전송 속도가 느려질 수 있다. 예를 들어, DNS, VoIP(인터넷 전화), 스트리밍 같은 서비스는 약간의 데이터 손실보다 속도가 훨씬 더 중요하다. 즉, UDP는 빠른 전송을 위해 수신자 버퍼 초과, 네트워크 혼잡 여부를 신경 쓰지 않는다. 데이터가 손실되면 상위 Application Layer가 별도로 복구할 수 있도록 한다. 🔵 DHCP DHCP는 IP 주소를 자동으로 할당해주는 프로토콜이다. 클라이언트가 네트워크에 접속할 때, 수동 설정 없이도 자동으로 IP 주소, 서브넷 마스크, 게이트웨이, DNS 등을 할당받을 수 있게 해준다. DHCP 작동 방식: DORA 과정 Discover: 클라이언트가 네트워크에 접속하면, 브로드캐스트로 DHCP 서버를 찾는다. Offer: DHCP 서버가 IP 주소 제안과 함께 설정 정보를 보낸다. Request: 클라이언트가 하나의 Offer를 선택하고 요청을 보낸다. Acknowledge: 서버가 해당 요청을 승인하고, 설정 정보를 최종 전송한다. DHCP의 장점 수동 설정 없이 자동 IP 할당 가능 IP 주소 관리 효율화 (중복 방지, 갱신 가능) 모바일/유동 IP 환경에 적합 🔵 멀티플렉싱과 디멀티플렉싱(포트 번호와 TCP/UDP 연결) 멀티플렉싱과 디멀티플렉싱은 Transport Layer의 핵심 역할 중 하나로, 하나의 호스트에서 여러 애플리케이션 간의 데이터를 구분하고 전달하는 기능을 한다. 멀티플렉싱 (Multiplexing) 송신 측에서 수행 여러 애플리케이션의 데이터(예: HTTP, FTP 등)를 하나의 전송 통로(IP 주소) 로 묶어서 전송 Transport Layer는 각각의 애플리케이션 데이터를 포트 번호로 구분하여 전송 디멀티플렉싱 (Demultiplexing) 수신 측에서 수행 도착한 세그먼트를 포트 번호를 기반으로 해당 애플리케이션에 정확히 전달 포트 번호의 역할 IP 주소는 호스트를 식별 포트 번호는 호스트 내 애플리케이션 프로세스를 식별 TCP, UDP 모두 포트 번호를 통해 각 데이터를 구분

2025년 05월 06일 04:41

CS

[CS 스터디] 5주차 OSI 7 계층 & TCP/IP 모델

[5주차] OSI 7 계층 & TCP/IP 모델 OSI 7 계층 (각 계층의 역할과 대표 프로토콜) TCP/IP 4계층 모델 HTTP vs HTTPS HTTP 상태 코드 (2xx, 3xx, 4xx, 5xx) 🔵 OSI 7 계층 (각 계층의 역할과 대표 프로토콜) 네트워크 통신을 7단계로 나눈 참조모델이다. 각 계층은 데이터를 단계별로 처리하며, 계층 간에는 정해진 방식으로만 데이터를 주고받는다. | 계층 | 이름 | 전송 단위 | 주요 역할 | 주요 프로토콜/기술 | | ---- | ------------ | ------------------- | ----------------------------------- | ---------------------------------------------- | | 7 | Application | 데이터 | 사용자와 직접 상호작용 | HTTP, HTTPS, FTP, SMTP, DNS, Telnet, WebSocket | | 6 | Presentation | 데이터 | 데이터 표현, 인코딩/암호화 | SSL, TLS, JPEG, MPEG, ASCII, XML, JSON | | 5 | Session | 데이터 | 세션 관리, 대화 제어 | NetBIOS, PPTP, RPC, SOCKS, OAuth | | 4 | Transport | 세그먼트/데이터그램 | 신뢰성 보장, 흐름 제어 | TCP, UDP | | 3 | Network | 패킷 | 라우팅, IP 기반 | IP, ICMP, ARP, RIP, OSPF, BGP | | 2 | Data Link | 프레임 | 물리적 전송 단계, MAC 기반 | Ethernet, Wi-Fi(802.11), PPP, Frame Relay | | 1 | Physical | 비트 | 신호 전송, 케이블.무선 등 물리 매체 | UTP, 광섬유, RS-232, 모뎀, 허브, 리피터 | Application Layer 역할 사용자가 직접 사용하는 웹 브라우저, 이메일 클라이언트, 메신저 등 응용 프로그램이 네트워크와 상호작용하도록 합니다. 데이터 생성/해석이 이 계층에서 이뤄지며, 사용자와 가장 밀접한 계층입니다. 예시 브라우저에서 URL을 입력 → HTTP 요청 → 웹 서버 응답 → 웹페이지 출력 주요 프로토콜 HTTP/HTTPS: 웹 문서 전송 SMTP, IMAP, POP3: 이메일 DNS: 도메인 → IP 주소 변환 FTP, SFTP: 파일 전송 WebSocket: 실시간 통신 REST API, GraphQL, gRPC: 현대적 서비스 인터페이스 Presentation Layer 역할 데이터의 표현 형식을 처리합니다. 서로 다른 시스템 간 데이터 인코딩, 압축, 암호화/복호화 등을 수행하며, 하위 계층이 이해할 수 있도록 데이터를 변환합니다. 예시 서로 다른 문자 인코딩(UTF-8 ↔ UTF-16) 변환 SSL/TLS를 통한 암호화 처리 JSON 직렬화, MIME 타입 처리 주요 기능 인코딩/디코딩 압축/해제 (예: gzip) 암호화/복호화 (SSL, TLS) 직렬화/역직렬화 (JSON, XML) Session Layer 역할 애플리케이션 간 세션 수립, 유지, 종료를 관리하며, 대화의 시작-종료 시점과 복구 지점을 제어합니다. 동시에 여러 세션이 있더라도 각각을 독립적으로 관리합니다. 예시 온라인 은행 로그인 이후, 각 사용자의 요청은 독립된 세션으로 처리됨. WebSocket 커넥션 유지, OAuth 로그인 처리 등도 포함됩니다. 주요 기능 세션 관리 (connect-disconnect) 상태 유지 (로그인 정보 등) 동기화 및 체크포인트 Transport Layer 역할 양 끝단 간의 신뢰성 있는 데이터 전송을 담당하며, 오류 복구, 흐름 제어, 혼잡 제어 등을 수행합니다. 주요 프로토콜 TCP: 연결 지향, 신뢰성 보장, 3-way handshake UDP: 비연결, 빠른 전송, 실시간 스트리밍 핵심 기능 오류 감지 및 재전송 흐름 제어 (Flow Control) 혼잡 제어 (Congestion Control) 멀티플렉싱 (여러 포트를 공유) Network Layer 역할 송신지에서 목적지까지 데이터 패킷을 전달하며, 라우팅 및 논리 주소(IP) 기반으로 경로를 결정합니다. 전송 단위는 패킷(Packet)입니다. 예시 라우터가 목적지 IP에 따라 패킷을 전달 Ping, TraceRoute 등의 도구가 이 계층을 사용함 주요 프로토콜 및 기능 IP (IPv4, IPv6) ICMP (Ping, 오류 메시지 전달) 라우팅 프로토콜 (OSPF, BGP) NAT, 서브넷팅, 패킷 포워딩 Data Link Layer 역할 같은 네트워크 내의 기기 간 데이터 전송을 담당하며, 오류 감지, 충돌 처리, MAC 주소 기반 통신 등을 수행합니다. 전송 단위는 프레임(Frame)입니다. 예시 스위치가 MAC 주소 기반으로 프레임을 전달함 이더넷, Wi-Fi 등은 이 계층에서 동작 주요 기능 프레임 생성 및 전송 MAC 주소 기반 통신 오류 검출 (CRC) 흐름 제어, 충돌 감지 (CSMA/CD) Physical Layer 역할 비트를 전기/광/무선 신호로 변환하여 전송하며, 전압, 주파수, 케이블 종류 등 하드웨어적 신호 전달 방식 정의합니다. 예시 이더넷 케이블, 광섬유, 무선 주파수, 모뎀, 허브 등 데이터를 신호로 바꿔서 물리적 전송을 담당함 주요 요소 전압/주파수/전송 속도 전송 매체 (UTP, 광섬유, 무선) 변조/복조 (modulation/demodulation) 신호 동기화 🔵 TCP/IP 4계층 모델 실제 인터넷 및 네트워크에서 가장 널리 사용되는 실용 모델입니다. OSI 모델보다 계층 수가 적고 단순하지만 역할은 포괄적입니다. | TCP/IP 계층 | 주요 역할 | OSI 대응 계층 | 주요 프로토콜/기술 | | -------------------- | --------------------------------------- | ------------------ | -------------------------------------- | | Application Layer | 응용 간 통신, 데이터 표현, 세션 관리 | OSI 5 ~ 7계층 통합 | HTTP, FTP, SMTP, DNS, SSH, Telnet | | Transport Layer | 종단 간 신뢰성 보장, 흐름/혼잡 제어 | OSI 4계층 | TCP, UDP | | Internet Layer | IP 주소 기반의 라우팅 및 패킷 전송 | OSI 3계층 | IP, ICMP, ARP, IGMP, RIP, OSPF, BGP | | Network Access Layer | 물리적 네트워크 전송 (LAN, MAC 주소 등) | OSI 1~2계층 통합 | Ethernet, Wi-Fi, ARP, PPP, Frame Relay | 🔵 HTTP vs HTTPS | 항목 | HTTP | HTTPS | | ----------- | ------------------------------- | ------------------------------------- | | 보안성 | 없음 (평문 전송) | SSL/TLS를 통한 암호화 전송 | | 기본 포트 | 80 | 443 | | 인증서 사용 | 없음 | 필요 (인증기관에서 발급된 SSL 인증서) | | 데이터 보호 | 없음 | 도청 및 위변조 방지 | | 사용 사례 | 공개 정보 제공 (테스트 서버 등) | 로그인, 결제, 개인정보 처리 등 | | URL 예시 | http://example.com | https://example.com | HTTP는 클라이언트(브라우저)와 서버 간의 요청-응답을 처리하는 가장 기본적인 웹 통신 프로토콜입니다. 그러나 암호화되지 않은 평문 전송 방식을 사용하기 때문에 중간자가 패킷을 가로채면 내용을 쉽게 확인할 수 있습니다. 따라서 보안이 필요한 서비스에는 적합하지 않습니다. HTTPS는 HTTP 위에 SSL(Secure Socket Layer) 또는 TLS(Transport Layer Security) 계층을 추가한 보안 버전입니다. 통신 데이터를 암호화하여 도청, 위·변조, 피싱 공격 등을 방지할 수 있으며, 서버는 클라이언트에게 디지털 인증서를 제공해 신뢰를 확보합니다. HTTPS를 사용하려면 서버가 CA(Certificate Authority) 로부터 발급받은 인증서를 갖고 있어야 하며, 사용자는 이 인증서를 통해 웹사이트의 진위 여부를 확인할 수 있습니다. 또한, 최신 브라우저는 HTTPS를 사용하지 않는 사이트에 대해 “보안되지 않음” 경고를 표시하고 있으며, SEO(검색엔진 최적화) 측면에서도 HTTPS를 사용하는 사이트가 더 유리합니다. 🔵 HTTP 상태 코드 (2xx, 3xx, 4xx, 5xx) 상태 코드 범주 | 범주 | 코드 범위 | 의미 | 대표 코드 및 설명 | | ---- | --------- | ------------------- | --------------------------------------------------------------------------------- | | 1xx | 100~199 | 처리 중 (정보 제공) | 100 Continue: 요청 계속 진행 가능 | | 2xx | 200~299 | 성공 | 200 OK: 성공201 Created: 리소스 생성됨 | | 3xx | 300~399 | 리다이렉션 | 301 Moved Permanently: 영구 이동302 Found: 임시 이동 | | 4xx | 400~499 | 클라이언트 오류 | 400 Bad Request: 문법 오류401 Unauthorized: 인증 필요404 Not Found | | 5xx | 500~599 | 서버 오류 | 500 Internal Server Error: 서버 내부 오류503 Service Unavailable: 점검 중 | 200 OK: 정상 처리 완료 301/302: 페이지 이동 400: 잘못된 요청 401: 인증 실패 403: 권한 없음 404: 존재하지 않는 리소스 500: 서버 문제

2025년 04월 20일 13:29

CS

[CS 스터디] 4주차 동기화 문제 + 세마포어 & 뮤텍스

[4주차] 동기화 문제 (Race Condition, Deadlock) + 세마포어 & 뮤텍스 동기화 문제 (Race Condition, Deadlock) 세마포어 & 뮤텍스 Race Condition (경쟁 상태) 공유 자원에 대해 여러 프로세스가 동시에 접근을 시도할 때, 타이밍이나 순서 등이 결과값에 영향을 줄 수 있는 상태를 말한다. 발생하는 경우 커널 코드 실행 중 인터럽트 발생할 경우 프로세스가 시스템 콜을 하여 커널모드로 진입해 작업을 수행하는 도중 문맥 교환이 발생할 경우 멀티 프로세서에서 공유메모리 내의 커널 데이터에 접근할 경우 멀티 프로세서에서 공유 메모리 내의 커널 데이터에 접근할 경우 Deadlock (교착 상태) 둘 이상의 프로세스가 자원을 점유한 채, 서로 다른 프로세스가 점유하고 있는 자원을 기다리면서 무한히 대기 상태에 빠지는 현상. Deadlock 발생 조건 (4가지 모두 충족할 때 발생) Mutual Exclusion (상호 배제) 자원은 한 번에 하나의 프로세스만 사용할 수 있어야 한다. Hold and Wait (점유 대기) 최소한 하나의 자원을 보유한 프로세스가 다른 자원을 기다리며 대기한다. No Preemption (비선점) 이미 할당된 자원을 강제로 뺏을 수 없다. Circular Wait (순환 대기) 각 프로세스가 다음 프로세스가 점유하고 있는 자원을 요청하며 원형으로 기다리는 상태. Deadlock 해결 방법 예방 (Prevention): 네 가지 조건 중 하나라도 발생하지 않도록 설계 회피 (Avoidance): 자원의 상태를 고려하여 교착 상태가 발생하지 않도록 스케줄링 (ex. Banker’s algorithm) 탐지 (Detection): 교착 상태 발생 후 이를 감지하고 복구 복구 (Recovery): 프로세스를 강제로 종료하거나 자원을 회수하여 해결. Critical Section (임계 영역) 운영체제에서 여러 프로세스가 데이터를 공유하면서 수행될 때, 각 프로세스에서 공유 자원에 접근하는 프로그램 코드 부분을 의미한다. 프로세스 간 공유 자원을 접근하는 데 있어 문제가 발생하지 않도록 공유 자원의 독점을 보장해야 하는 영역이다. 임계 영역 문제를 해결하기 위해 아래의 3가지 조건을 충족해야한다. Mutual Exclusion (상호 배제) 한 프로세스가 자신의 critical section이면 다른 프로세스들은 critical section에 진입할 수 없다. Progress (진행) 아무도 critical section에 있지 않다면, 진입하고자 하는 프로세스를 진입하게 해줘야 한다. 즉 critical section에 아무도 진입하지 못하면 안되며, 다음에 어떤 프로세스가 critical section에 진입해야 하는지는 유한한 시간 내에 결정되어야 한다. Bounded Waiting (유한 대기) 프로세스가 critical section에 진입하기 위해 무한정으로 기다리는 현상(Starvation)이 발생해서는 안된다. 생산자-소비자 문제 critical section에 관련된 전통적인 문제로 생산자-소비자 문제가 있다. 생산자-소비자 문제에서 생산자 프로세스와 소비자 프로세는 서로 독립적으로 작업한다. 생산자는 물건을 계속 생산해 버퍼에 넣고, 소비자는 계속해서 버퍼에서 물건을 받아온다. 가운데에는 buf라는 원형 큐 자료구조가 존재하고, sum은 큐의 원소 수에 해당한다. producer는 계속해서 값을 넣어주고, consumer는 큐의 원소를 빼낸다. producer는 원소르 맨 뒤부터 넣지만, consumer는 맨 앞부터 빼낸다. 겉보기에는 문제 없어보이지만, producer, consumer 둘이 같이 실행되면 문제가 발생한다. 생산자와 소비자가 전역변수 sum에 접근하는 타이밍을 서로 맞추지 않기 때문이다. 즉, sum이 바로 critical section이며 race condition이 발생한다. 임계 영역 해결 유저모드 동기화 방식 운영체제나 하드웨어 명령 없이 사용자 수준에서 동기화를 구현하는 방법이다. 대표적인 알고리즘은 다음과 같다 플래그 변수(flag variable) 사용 각 프로세스가 진입 여부를 표시하는 Boolean 배열을 사용 단점: 상호 배제는 가능하지만 진행(Progress) 조건을 만족하지 못하는 경우가 있음 피터슨 알고리즘 (Peterson’s Algorithm) 2개의 프로세스 사이의 상호 배제를 보장하는 대표적인 알고리즘 두 가지 공유 변수 사용: - flag[i]: 프로세스 i가 임계 영역에 진입하고자 함을 나타냄 - turn: 누가 우선권을 가지는지를 나타냄 장점: Mutual Exclusion, Progress, Bounded Waiting 세 조건 모두 만족 Dekker’s Algorithm 초기의 소프트웨어 기반 상호 배제 알고리즘 Peterson보다 복잡하며 덜 효율적이지만, 이론적으로 중요한 의미를 가짐 Lamport’s Bakery Algorithm 여러 개의 프로세스에 대한 상호 배제를 지원 각 프로세스가 “번호표”를 받아 순서대로 critical section에 진입 실제 베이커리 대기 방식에서 착안 커널모드 동기화 방식 세마포어 (Semaphore) 프로세스 간 동기화 및 상호 배제를 위한 정수 변수. 공유 자원에 접근할 수 있는 최대 개수를 제한한다. 세마포어의 종류 - Counting Semaphore: 0 이상의 값을 가짐. 자원의 개수를 표현할 때 사용. - Binary Semaphore (Mutex와 유사): 값이 0 또는 1만 가짐. 한 번에 하나의 프로세스만 자원에 접근할 수 있음. 세마포어 연산 - P(S) 또는 wait(S): 세마포어 값을 1 감소시킴. 값이 음수가 되면 해당 프로세스는 블락됨 - V(S) 또는 signal(S): 세마포어 값을 1 증가시킴. 블록된 프로세스가 있으면 하나를 깨움 뮤텍스 (Mutex) Mutual Exclusion의 줄임말로, 오직 하나의 스레드만 공유 자원에 접근할 수 있도록 하는 상호 배제 도구이다. - 일반적으로 lock/unlock 메서드를 사용 - 한 스레드가 뮤텍스를 lock하면, 다른 스레드는 unlock될 때까지 대기 - 세마포어보다 단순하고, 1개의 자원에 대한 배타적 접근을 보장할 때 적합 Binary Semaphore vs Mutex Binary Semaphore는 리소스의 접근 제어를 위해 사용할 수 있지만, 누구나 signal을 호출할 수 있음 Mutex는 lock을 획득한 소유자만 unlock 가능 → 소유 개념이 존재

2025년 04월 15일 09:45

CS

[CS 스터디] 3주차 CPU 스케줄링 + 인터럽트 & 시스템 콜

[3주차] CPU 스케줄링 + 인터럽트 & 시스템 콜 CPU 스케줄링 알고리즘 인터럽트(Interrupt) 개념 및 종류 시스템 콜(System Call)과 사용자 모드 vs 커널 모드 🔵 CPU 스케줄링 알고리즘 CPU 스케줄링이란? 하나의 CPU 코어는 한 번에 하나의 프로세스만 실행 가능하다. 언제 어떤 프로세스에 CPU를 줄 지 결정하는 것이 CPU 스케줄링이다. 스케줄링의 목적 | 지표 | 설명 | 중요 대상 | | -------------------- | ------------------------------------------ | ------------------ | | Response time | 입력 -> 출력까지 걸리는 시간 | 사용자 입장 | | Throughput | 단위 시간 당 완료된 프로세스의 수 | 시스템 입장 | | Processor efficiency | CPU가 유효한 작업을 수행한 비율 | 운영체제 입장 | | Fairness | 모든 프로세스가 공평하게 CPU 기회를 얻는가 | 전체 프로세스 입장 | CPU 스케줄러가 스케줄링을 결정하는 타이밍 1. Running -> Waiging: I/O 요청 시 2. Running-> Ready: interrupt 발생 시 3. Waiting -> Ready: I/O 완료 시 4. Process 종료 시 1번, 4번만 발생: 비선점형(non-preemptive) 스케줄링 2번, 3번도 포함: 선점형(preemtive) 스케줄링 비선점형 스케줄링 프로세스가 CPU를 점유하면 끝날 때까지 유지하는 스케줄링이다. 필요한 경우에만 문맥 교환이 발생하므로 오버헤드가 적다. 배치 순서에 따라 효율성 차이가 크다. 선점형 스케줄링 운영체제가 CPU를 강제로 회수 가능한 스케줄링이다. 짧은 작업을 먼저 처리하는 것이 가능하므로 효율적이다. 하지만 잦은 문맥교환으로 오버헤드가 커질 가능성이 있다. FCFS (First-Come-First-Served) 프로세스를 도착한 순서대로 처리하는 방식이다. 구현이 간단하고 직관적이지만, 대기 시간이 길어질 수 있는 단점이 있다. 특히 긴 작업이 먼저 도착하면 후속 작업들이 오래 기다리는 문제가 발생한다. RR (Round-Robin) 모든 프로세스에 동일한 시간 할당량(time quantum)을 주고 순차적으로 실행하는 방식이다. 시간이 다 되면 CPU를 다음 프로세스에게 넘긴다. 공정성이 뛰어나며, 대화형 시스템에 적합한 방식이다. 단, 시간 할당량이 너무 크거나 작으면 성능 저하가 발생할 수 있다. 시스템의 response time을 최소화할 수 있는 q값을 찾아야 한다. SJF (Shortest Job First) 처리 시간이 가장 짧은 작업부터 실행하는 방식이다. 평균 대기시간이 짧아 효율적이다. 단, 정확한 실행시간을 예측하기 어렵기 때문에 실제 적용이 까다롭다. -> 예측이 잘못된 경우 response time이 지연된다. -> 긴 작업은 계속 뒤로 밀려, 최악의 경우 starvation 발생 SRT (Shortest Remaining Time) SJF의 선점형 버전이다. 남은 실행 시간이 가장 짧은 작업을 우선 실행한다. 새로운 작업이 도착할 때마다 비교하여 CPU를 선점할 수 있다. 짧은 작업 처리에 유리하지만, 문맥 교환이 자주 일어날 수 있다. 단, 짧은 작업이 계속 들어오면 긴 작업은 계속 밀리면서 -> starvation이 발생할 수 있고, -> 긴 작업의 응답 시간은 매우 나빠진다. HRRN (Highest Response Ratio Next) 우선순위를 (대기시간 + 서비스시간) / 서비스시간으로 계산하여 가장 높은 비율을 선택하는 방식이다. 긴 작업도 우선순위가 점점 높아지기 때문에 starvation을 방지할 수 있다. 비선점형 방식이며, 공정성과 효율성을 함께 고려하는 방식이다. MLQ (Multi-Level Queue) 프로세스를 우선순위나 성격에 따라 여러 개의 큐로 나누고, 각 큐마다 다른 스케줄링 알고리즘을 적용하는 방식이다. 큐 간 이동은 없으며, 큐 간 우선순위는 고정되어 있다. 예: 시스템 프로세스 큐 > 사용자 큐 등. MLFQ (Multi-Level Feedback Queue) MLQ의 확장형으로, 프로세스가 다른 큐로 이동할 수 있도록 피드백을 주는 방식이다. CPU 사용 시간이 길어지면 낮은 우선순위로 이동하며, 짧은 작업은 높은 우선순위를 유지한다. 복잡하지만 다양한 작업 특성에 유연하게 대응 가능하다. 🔵 인터럽트(Interrupt) 개념 및 종류 interrupt: 프로세서의 정상적인 명령 실행 흐름을 중단하고, 예외 상황이나 외부 이벤트를 처리할 수 있도록 해주는 메커니즘이다. 인터럽터의 종류 | 구분 | 설명 | | ---------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | Program | 프로그램 실행 중 발생하는 인터럽트 -> 산술 오버플롱, 0으로 나누기, 잘못된 명령어 실행, 접근 허용되지 않은 메모리 참조 등 | | Timer | 프로세서 내부의 타이머에 의해 발생. 운영체제가 주기적으로 수행해야 하는 작업들을 트리거 함 -> 시분할 스케줄링 | | I/O | 입출력 컨트롤러가 보내는 신호. 입출력 작업이 완료되었거나 에러가 발생했을 때 발생 -> 대부분의 I/O는 CPU보다 속도가 느림 -> 따라서 CPU는 I/O 장치의 완료를 기다려야 할 때가 있음 -> 이 때문에 인터럽트 기반 I/O처리를 사용하여 CPU가 효율적으로 작동하도록 함 | | Hardware Failure | 전원 장애, 메모리 오류 등 하드웨어 문제로 인해 발생하는 인터럽트 -> 전원 이상, 메모리 패러티 에러 등 | 인터럽트 핸들러 interrupt handler는 특정 I/O 장치를 처리하기 위한 프로그램이다. 일반적으로 운영체제 내부에 포함된 코드로, 인터럽트가 발생하면 해당 핸들러로 제어가 넘어가 해당 작업을 처리한다. 명령 주기에서 인터럽트 처리 흐름 CPU는 보통 Fetch -> Execute 순서로 명령을 수행하지만, 이 중간에 인터럽트가 발생할 수 있다. 명령어 수행 흐름 START → Fetch Stage • 다음 명령어를 메모리에서 가져온다. Execute Stage • 가져온 명령어를 실행한다. • 실행 중에는 인터럽트가 비활성화(Interrupts Disabled) 되어 있어 인터럽트를 무시한다. Interrupt Stage • 명령 실행이 끝난 후, 인터럽트 발생 여부를 확인한다. • 인터럽트가 발생했다면: • Interrupt Handler의 주소를 Program Counter(PC) 에 설정한다. • 실제 핸들러 코드는 다음 Fetch 단계에서 실행된다. Fetch Stage (인터럽트 핸들러 코드) • 이제 PC가 가리키는 인터럽트 핸들러의 첫 명령을 가져와 실행함으로써, • 키보드 입력 처리, I/O 완료 처리 등 인터럽트에 따른 적절한 작업이 수행된다. 인터럽트 발생 시 메모리와 레지스터의 변화 인터럽트 발생 흐름 인터럽트 발생 (I/O, Timer, 프로그램 오류 등) 현재 명령어 실행 완료 레지스터(PC, PSW 등) 상태 저장 -> 스택에 PUSH 인터럽트 핸들러 주소를 PC에 로드 인터럽트 핸들러 실행 시작 인터럽트 종료 후 복귀 흐름 인터럽트 처리 완료 저장해 두었던 레지스터 상태 POP + 복구 원래 사용자 프로그램으로 복귀 (PC를 복원하여 재시작) 🔵 시스템 콜(System Call)과 사용자 모드 vs 커널 모드 모드란 무엇인가 운영체제는 보안과 안정성을 위해 CPU 실행 권한을 두 가지로 나눈다. | 구분 | 사용자 모드 (User Mode) | 커널 모드 (Kernel Mode) | | --------- | ------------------------------- | ------------------------------------- | | 실행 주체 | 일반 사용자 프로그램 | 운영체제(커널) | | 권한 | 제한됨 (I/O 접근 불가 등) | 전체 시스템 자원 접근 가능 | | 가능 작업 | 단순 연산, 사용자 앱 로직 등 | 파일 시스템 접근, 메모리 관리, I/O 등 | | 예시 | 계산기 앱, 웹 브라우저 | 시스템 콜 처리, 드라이버, 스케줄러 등 | | 전환 방법 | 시스템 콜 또는 인터럽트 발생 시 | 시스템 콜 종료 후 복귀 | 사용자 모드에서는 커널 기능을 직접 실행할 수 없고, 반드시 시스템 콜을 통해서만 접근 가능하다. 시스템 콜이란? 사용자 프로그램이 운영체제의 기능을 사용하고 싶을 때 호출하는 인터페이스이다. 즉, 사용자 모드 → 커널 모드로 전환하기 위한 공식적인 방법이다. 시스템 콜 동작 흐름

2025년 04월 06일 00:08

CS

[CS 스터디] 2주차 메모리 관리 + 가상 메모리

[2주차] 메모리 관리 (페이징 & 세그멘테이션) + 가상 메모리 주소 공간, 물리적 주소, 논리적 주소, 주소 바인딩 메모리 관리 기법 (페이징, 세그멘테이션) 가상 메모리 (Demand Paging, Page Fault) 캐시 메모리, TLB(Translation Lookaside Buffer) 메모리 할당 전략 (First Fit, Best Fit, Worst Fit) 🔵 주소 공간, 물리적 주소, 논리적 주소, 주소 바인딩 주소 공간(Address Space) 컴퓨팅에서 주소 공간은 물리 메모리나 가상 메모리 등 다른 논리적 실체나 물리적 실체에 대응되는 주소의 범위를 정의한 공간을 말한다. 메모리 주소는 컴퓨터 메모리의 물리 위치를 파악하며, 데이터가 저장되는 위치를 가리킨다. 프로세스와 주소 공간 일반적으로 운영체제는 하나의 프로세스에 대하여 하나의 주소 공간을 제공하며, 프로세스 내의 사용자 스레드들은 주소공간을 공유한다. 물리적 주소(Physical Space) 메모리는 배열이기 때문에 인덱스 값을 가지는데, 이 인덱스 값을 '물리적 주소'라고 한다. 물리적 주소는 메모리 자체의 인덱스다. 논리적 주소(Logical Space) 논리적 주소는 CPU 입장에서의 메모리 주소, 또는 프로그램 실행 중에 CPU가 생성하는 주소이다. 따라서 가상 주소라고도 한다. CPU가 명령어를 실행하면서 생성하는 주소이다. 사용자 프로세스가 접근하는 주소는 모두 논리적 주소 변환 작업은 MMU(Memory Management Unit)에서 이루어진다. 논리적 주소와 물리적 주소의 관계 | 종류 | 의미 | 생성 주체 | 접근 방식 | | ----------- | -------------------------- | ---------- | ----------------------------- | | 논리적 주소 | CPU가 생성하는 가상의 주소 | CPU | 사용자 프로세스에서 직접 사용 | | 물리적 주소 | 실제 메모리 주소 | MMU가 계산 | 운영체제나 하드웨어에서 접근 | 논리적 주소가 필요한 이유 메모리 보호: 각 프로세스는 자신의 주소 공간만 보게 하여 다른 프로세스의 메모리를 침범하지 못하도록 한다. 멀티프로그래밍 지원: 서로 다른 프로세스들이 각자 독립된 주소 공간을 갖도록 함 프로그램의 이식성: 논리 주소를 사용하면 프로그램을 어느 메모리의 어느 위치에서든 실행할 수 있다. 주소 바인딩(Address Binding) 프로세스가 논리적 주소를 참조하기 때문에 실제 메모리에 데이터를 읽고 쓰기 위해서는 해당 논리적 주소를 물리적 주소로 매핑하는 과정이 필요하다. 이를 주소 바인딩이라고 한다. 주소 바인딩은 프로세스가 메모리에 접근할 수 있도록 하는 중요한 단계 MMU MMU 는 CPU와 메모리 사이에 존재하는 하드웨어 장치로, 논리적 주소 -> 물리적 주소 변환을 수행한다. 주요 역할 주소 변환: CPU가 생성하는 논리 주소에 Base Register 값을 더해 실제 물리 주소 계산 메모리 보호: Bounds Register를 통해 접근 가능한 메모리 범위 제한 🔵 메모리 관리 기법 (페이징, 세그멘테이션) 페이징(Paging) 이란 페이징은 가상 주소 공간과 물리적 주소 공간을 동일한 크기의 고정 블록으로 나누어 매핑하는 메모리 관리 기법이다. 가상 주소 공간을 나눈 고정 크기 블록 -> 페이지(Page) 물리 주소 공간을 나눈 고정 크기 블록 -> 프레임(Frame) 페이징은 내부 단편화 발생 가능 세그멘테이션(Segmentation) 이란 세그멘테이션은 프로그램의 논리적 구조에 따라 주소 공간을 여러개의 세그먼트로 나누어 메모리를 관리하는 방식이다. 세그먼트는 코드(Code), 데이터(Data), 스택(Stack)과 같이 의미 있는 논리 단위로 나뉜다. 각 세그먼트는 서로 다른 크기를 가질 수 있으며, 연속적인 메모리 공간을 할당받는다. 주소는 (세그먼트 번호, 오프셋) 형태로 표현한다. 세그멘테이션은 외부 단편화 발생 가능 🔵 가상 메모리 (Demand Paging, Page Fault) 가상 메모리(Virtual Memory) 실제 메모리 크기보다 요구 메모리가 큰 프로그램을 실행하기 위해 사용하는 메모리 관리 기법이다. 모든 데이터를 주 기억장치에 올리지 않고, 필요한 것들만 올려서 사용한다. 나머지는 디스크(보조 기억 장치)에 보관되며, 필요할 때만 메모리로 가져온다. CPU는 모든 주소를 가상 주소로 인식하고, 실제 주소는 MMU가 변환해서 사용한다. 요구 페이징(Demand Paging) 요구 페이징은 프로세스의 페이지 중 실제로 필요한 페이지만 메모리에 올리고, 나머지는 요청이 있을 때 디스크에서 가져오는 방식이다. 처음엔 메모리에 아무것도 올리지 않음 CPU가 요청한 주소가 없는 경우(Page Fault) 발생 이때 해당 페이지를 디스크에서 RAM으로 로드 페이지 폴트(Page Fault) 페이지 폴트(Page Fault)는 프로세스가 접근하려는 메모리 페이지가 물리적 메모리(RAM)에 존재하지 않을 때 발생하는 이벤트이다. 페이지 폴트 발생: 프로세스가 메모리에 접근하려 할 때, 해당 가상 주소에 대응하는 페이지가 물리적 메모리에 없으면 페이지 폴트가 발생, 인터럽트 처리: 페이지 폴트는 운영 체제에 의해 처리되는 인터럽트. 운영 체제는 이 인터럽트를 받고 현재 CPU의 상태를 저장한 후 페이지 폴트 처리 루틴을 실행. 페이지 로딩: 운영 체제는 필요한 페이지를 찾아 물리적 메모리로 로드함. 이 페이지는 디스크의 스왑 영역이나 해당 파일 시스템에서 가져올 수 있음. 페이지 테이블 업데이트: 페이지가 메모리에 로드된 후, 페이지 테이블이 업데이트되어 새로운 매핑 정보를 반영. 프로세스 재개: 페이지 로딩이 완료되면, CPU는 원래의 프로세스를 재개. 🔵 캐시 메모리, TLB(Translation Lookaside Buffer) 캐시 메모리 (Cache Memory) 캐시 메모리(Cache Memory) 는 CPU와 주기억장치(RAM) 사이에 위치한 고속의 임시 저장장치로, 자주 사용하는 데이터를 빠르게 접근하기 위해 사용된다. • CPU가 자주 접근하는 데이터를 임시로 저장하여 속도 향상 • 작지만 빠름, 용량은 작고, 가격은 비쌈 | 계층 | 설명 | | ------- | --------------------------------------------------- | | L1 캐시 | 가장 빠르고 CPU 내부에 위치. 용량 작음 | | L2 캐시 | CPU 와 메모리 사이에 위치. L1 보다 느리지만 용량 큼 | | L3 캐시 | 일부 고성능 CPU에서 제공. L2 보다 크고 느림 | TLB (Translation Lookaside Buffer) TLB(Translation Lookaside Buffer) 는 가상 주소 → 물리 주소 변환 시 사용되는 페이지 테이블 캐시이다. • MMU 내부에 존재하며, 최근 참조한 페이지 테이블 항목을 저장 • 페이지 테이블 접근 시간을 줄여주는 역할 작동 과정 1. CPU가 가상 주소 접근 2. MMU가 TLB에서 먼저 검색 3. 있다면 → 바로 물리 주소 반환 (TLB hit) 4. 없다면 → 페이지 테이블 접근 (TLB miss) 후 TLB에 등록 효과 • TLB hit → 주소 변환 속도 빠름 • TLB miss → 페이지 테이블 접근 → 속도 저하 🔵 메모리 할당 전략 (First Fit, Best Fit, Worst Fit) 메모리 공간을 요청된 크기에 따라 어떻게 효율적으로 배분할 것인가에 대한 전략 First Fit (최초 적합) • 가장 먼저 발견한 충분한 공간에 할당 • 빠르지만, 할당된 공간 이후에 작은 공간들이 남아 외부 단편화 발생 가능 Best Fit (최적 적합) • 가장 크기가 딱 맞는 공간에 할당 (남는 공간이 가장 적은 곳) • 공간 낭비가 적지만, 탐색 시간이 길 수 있음 • 외부 단편화가 많이 발생 Worst Fit (최악 적합) • 가장 큰 공간에 할당하여 남은 공간이 충분히 크도록 함 • 큰 공간을 계속 쪼개므로 큰 프로세스가 들어갈 공간이 사라질 수 있음

2025년 03월 31일 09:11