Computer Science 64

네트워크 아키텍처 | (2) LAN, WAN, 클라이언트-서버 구조

네트워크 노드(= 호스트)와 링크가 무엇인지 한번 살펴봤고, 이제 이를 기반으로 대표적인 네트워크 아키텍처들을 조금 더 이해해보자👍 LAN & WAN (아키텍처 of 범위) 이름 설명 LAN (Local Area Network) 가까운 지역을 서로 연결한 지역 영역 네트워크. 한 건물이나 캠퍼스 등에서 주로 쓰고, 스타크래프트 게임 할 때 많이들 접했을 단어이다. WAN (Wide Area Network) 멀리있는 지역을 서로 연결한 광역 네트워크. 국가, 대륙 급의 넓은 범위를 커버한다. LAN: 이더넷 이더넷은 한 개의 방, 하나의 층 등 매우 국소적으로 사용한다. 이더넷 세그먼트는 다음과 같이 구성되어 있다. 허브들이 호스트들을 연결하고, 이들은 전선들로 연결된다. 만약 A ~ Z 호스트가 있다..

네트워크 아키텍처 | (1) 네트워크 노드, Host, 링크

네트워크 | 네트워크를 이해하는 큰 그림 에서 네트워크를 노드와 링크로 이해할 수 있다고 했는데, 그럼 정보를 주고받는 각 장치나 포인트인 노드, 그리고 노드들을 연결해주는 링크는 현실 세계의 무엇을 가리키는 말일까? 네트워크 노드 vs 호스트(Host) 네트워크 노드는 네트워크에 연결된 모든 장치를 의미한다. 컴퓨터, 스위치 라우터, 프린터, CCTV 등등.. 무수히 많다. 그 중에서도 컴퓨터 혹은 서버는 호스트(Host)라고 부른다. 따라서 호스트를 정의하자면, 컴퓨터이면서 동시에 네트워크에 연결되어 있는 대상을 말한다. 근데 호스트라고 다 같은 놈이 아니다. 네트워크 세계에서 데이터를 받고 보내기 위해 서있는 애들 중에서는 말 그대로 네트워크 기능을 이용하기 위한 친구가 있고, 네트워크가 전송되는 ..

네트워크 | 네트워크를 이해하는 큰 그림

네트워크란? 네트워크는 전자장치들이 서로 정보를 주고 받을 수 있도록 연결한 시스템이다. 하나의 로컬 컴퓨터가 독자적으로만 작동하면, 이 컴퓨터의 활용도는 컴퓨터 자체의 리소스와 직접 input 해주는 데이터에 제한될 것이다. CSAPP 초반에 네트워크 또한 하나의 입출력 장치로 볼 수 있다는 문구가 있다. 로컬 컴퓨터가 네트워크에 연결되면 이는 하드웨어의 제약을 넘어 다른 공간, 다른 객체의 데이터와 리소스까지 활용할 수 있게 되며, 실시간 통신까지 가능하게 된다. 엄청난 확장성을 갖게 해주는 강력한 입출력 장치나 마찬가지인 것이다. 네트워크 시스템은 말 그대로 전자장치 간 정보를 주고받을 수 있는 연결된 시스템을 말한다. 사내 내부망도 네트워크이고, 우리가 잘 아는 internet도 네트워크의 일종이..

가상메모리 | (3) 세그멘테이션, 페이징

메모리를 관리하는 기법에는 대표적으로 1) 세그멘테이션, 2) 페이징이 있다. 그리고 이 둘을 혼합한 Segmented Paging이나 Paged Segmentation이라는 개념도 있다. 이 중, Linux를 포함한 현대 시스템에서는 주로 페이징이 쓰인다고 한다. 세그멘테이션(Segmentation) 세그먼테이션은 논리적 메모리 영역을 기반으로 프로세스의 데이터를 나누고, 이러한 세그먼트들을 물리적 메모리에 저장하는 방식이다. 세그멘테이션을 수행하는 주요 단계는 다음과 같다: 논리적 구조 기반 분할: 세그멘테이션은 프로그램의 논리적 구조(예: 코드 세그먼트, 데이터 세그먼트, 스택 세그먼트 등)를 반영하여 메모리를 나눈다. 각 세그먼트는 프로그램의 특정 논리적 단위(함수, 데이터 구조 등)를 포함한다...

가상메모리 | (2) 가상메모리 개념, 가상 주소공간

가상메모리 정의 가상메모리: 메인 메모리의 추상화. 각 프로세스에 하나의 크고 통합된, private한 가상 주소공간을 제공한다. 도입 배경 초기의 cpu들은 물리 주소 방식을 사용했다. 따라서 프로세스가 메인 메모리에 직접 접근할 수 있었고, 이는 메인 메모리의 용량 한계로 인한 프로그램 확장성 제한, 프로세스 간 메모리 영역 침범, 일관되지 않은 주소 등의 문제로 이어졌다. 일반적으로 한 시스템의 여러 프로세스들은 CPU, 메인 메모리를 공유한다. CPU를 공유하는 부분에 대해서는 일반적으로 순서를 기다리느라 단지 느려질 뿐이고 심각한 오류는 발생하지 않는다. 그러나 프로세스들이 존재하는 메모리가 여유가 없이 지나치게 많은 요구에 의해 오염될 경우, 프로그램의 논리와 무관하게 오류가 난다. 이를 방지..

가상메모리 | (1) 개발자 코드가 물리 메모리에 닿는 과정

우리가 사용하는 언어는 대개 인간이 읽고 쓰기 쉽도록 설계된 고급언어이다. 고급언어를 통해 소스파일을 작성하고, 큰 프로그램을 설계한다. 고급언어로 짠 코드는 우리의 언어와 비슷하게 생겼다. 근데 이게 어떻게 0과 1뿐인 메모리를 조작할 수 있는 걸까? (방대한 내용을 공부하면서 큰 그림을 이해해보고자 작성한 글이라, 틀린 내용이 있을 수도 있습니다 !! 혹시 발견하신다면 편하게 댓글로 남겨주세요. 공부에 큰 도움이 될 것 같습니다. 🙇🏻) 개발자의 코드가 물리 메모리까지 닿는 과정 우리가 작성한 소스코드는 전처리를 거친 후에 컴파일러가 이를 어셈블리어 코드로 바꾸고, 어셈블러가 이 코드를 다시 기계어로 바꾼다(C언어 기준). 기계어로 된 소스파일은 최종적으로 링킹을 거친다. 이렇게 되면 개발자가 작성..

동적 메모리 할당 | Malloc Lab | (4) 할당기 배치 전략 개선 (next fit)

동적 메모리 할당 | Malloc Lab | (1) Malloc은 어떻게 구현되는가?에서, 동적 할당기의 배치 전략에는 대표적으로 세 가지가 있음을 살펴보았다. first fit: 처음부터 탐색하며, 먼저 발견된 충분한 용량의 가용 블록에 할당 next fit: 이전 탐색 지점부터 탐색하며, 먼저 발견된 충분한 용량의 가용 블록에 할당 (-> 빠른 검색) best fit: 모든 블록을 탐색하여, 요청 메모리에 가장 가까운 가용 블록에 할당 (-> 꼼꼼한 검색) 그리고 동적 메모리 할당 | Malloc Lab | (3) 기초적인 할당기 작동 원리, 구현에서, implicit free list의 블록 포맷을 가지고, first fit의 배치전략을 사용하는 기초적인 할당기를 이해해보았다. malloc-lab..

동적 메모리 할당 | Malloc Lab | (3) 기초적인 할당기 작동 원리, 구현

컴퓨터 시스템 책의 9.9장에 설명되어 있는 기초적인 버전의 할당기는 다음과 같은 방식을 채택하고 있다. 블록 포맷: 묵시적 가용 리스트 배치 전략: first-fit 전략 연결 전략 즉시 연결: 블록이 반환될 때마다 인접 블록을 통합 인접 블록의 가용여부 확인: 경계 태그(Footer) 활용 해당 버전의 작동 원리, 코드를 이해해보자. 기초적 할당기: overview 우리가 흔히 보는 가상 메모리 그림에서 힙 공간에 돋보기를 대본다고 생각해보자. 그럼 힙 공간은 메모리 블록들의 배열로 표현할 수 있다. (이 '블록들'은 앞 포스팅에서 얘기한 묵시적 가용 리스트 등의 자료구조이다.) 힙 공간을 처음 생성할 때(init)는 최초의 힙 공간을 할당받고, 정렬 패딩, 프롤로그 헤더와 푸터, 에필로그 헤더를 ..

동적 메모리 할당 | Malloc Lab | (2) 과제 소개

Malloc Lab 과제 Malloc Lab은 CSAPP의 공식 과제 중의 하나이다. 두 저자가 교수로 재직 중인 카네기 멜론 대학은 물론, 세계 곳곳의 컴공과에서 진행 중인 과제이다. malloc을 통해 메모리를 매니징 하는 것을 넘어서, 명시적 할당기 자체를 구현해봄으로써 이해도를 한층 더 높이자는 것이 주 요지이다. 주요 파일 설명 mm.c 학생이 할당기를 구현하는 파일이다. 학생은 mm.c 파일만 수정할 수 있다. (디버깅을 위한 목적 제외) memlib.c 테스트 환경이 돌아갈 힙 공간을 추상화해놓은 파일이다. 학생들은 과제에서 지정해놓은, 제약된 리소스 하에서 힙을 할당받고 활용해야 한다. 힙 공간을 요청하는 함수들(sbrk() 등)이 포함되어 있다. mdriver.c 테스트를 담당하는 파일이..

동적 메모리 할당 | Malloc Lab | (1) Malloc은 어떻게 구현되는가?

명시적 할당기, 묵시적 할당기 메모리 할당기는 명시적 할당기(explicit allocator), 묵시적 할당기(implicit allocator)로 나뉜다. 명시적 할당기는 malloc, free 묵시적 할당기는 가비지 컬렉터 명시적 할당기 (malloc) malloc은 힙으로부터 메모리를 할당받는다. 만일 sbrk를 사용한다면, 커널의 brk 포인터에 incr을 더해서 힙 공간을 늘리거나 줄인다. 힙은 블록들로 구성되어 있고, 블록은 워드 단위로 표시된다. (1 워드 = 4byte, 더블 워드 = 8byte) 예를 들어서 '4 워드 블록을 요청한다, 6 워드 블록을 요청한다.' 이런 식으로 표현한다. malloc을 활용한 프로그래밍을 할 시에 주의 사항이 있다. 메모리 블록을 반환 해주고 난 다음엔 ..