목록SW사관학교 정글 (51)
세리프 따라잡기
기본적인 파이썬의 for문은 다음과 같다. n = [1,2,3,4,5] for i in range(len(n)): print(i) #0,1,2,3,4 for ? in range가 기본적인 쓰임이다. for in 반복문은 iterable한 객체만 가능하다 == list, dictionary, set, string, tuple, bytes 알고리즘을 풀다보면 for문을 다음과 같이 사용하는 경우를 볼 수 있다. n = [1,2,3,4,5] for i in enumerate(n): print(i) #(0,1)(1,2)(2,3)(3,4)(4,5) for ? in enumerate 문법인데 enumerate는 인덱스 번호와 컬렉션의 원소를 tuple형태로 반환한다. n=[1,2,3,4,5] for i,v in e..
#전체적으로 참고한 사이트 - OSI 7 layer = #이전에 정리했던 포스터 참고! - TCP/IP 4계층 = #참고한 강의 인터넷 프로토콜 스위트(internet protocol suite)는 인터넷에서 컴퓨터들이 서로 정보를 주고받는 데 쓰이는 프로토콜의 집합 → tcp/ip 4계층 모델 혹은 osi 7계층 모델로 설명한다. tcp/ip 4계층 모델 위주로 설명하자면, 네트워크에서 사용되는 통신 프로토콜의 집합으로 계층들은 프로토콜의 네트워킹 범위에 따라 네 개의 추상화 계층으로 구성 tcp/ip 계층은 4개의 계층을 갖고 있으며, osi 계층과 많이 비교한다 두 계층의 다른 점은 그림처럼, TCP/IP 계층과 달리 OSI 계층은 애플리케이션 계층을 세 개로, 링크 계층을 데이터 링크 계층, 물리..
9.9.14 분리 가용 리스트(segregated free list) 단일 연결 블록 리스트를 사용하는 할당기는 한 개의 블록을 할당하는 데 가용 블록의 수에 비례하는 시간이 필요 → 시간을 줄이는 대표적인 방법인 "분리 저장장치(segregated storage)"는 다수의 가용 리스트를 유지하며, 각 리스트는 거의 동일한 크기의 블록들을 저장. 기본 아이디어는 모든 가능한 블록 크기를 크기 클래스(size class)라고 하는 동일 클래스의 집합으로 분리하는 것 ※크기 클래스 정의하는 방법 1. 블록 크기를 2의 제곱으로 나누기 2. 크기가 작은 블록들은 자신의 크기 클래스에 할당, 큰 블록들은 2의 제곱으로 분리 할당기는 가용 리스트의 배열을 관리, 크기 클래스마다 크기가 증가하는 순서로 한 개의 ..
9.9.13 명시적 가용 리스트 블록 할당 시간이 전체 힙 블록의 수에 비례하기 때문에 '묵시적 가용 리스트'는 범용 할당기에는 적합하지 않다. (비록 힙 블록의 수가 사전에 알려져 있고, 작고 특수한 경우에는 좋을 수도 있으나) → 이보다 더 좋은 방법은 가용 블록들을 일종의 명시적 자료구조로 구성하는 것. 가용 블록의 본체는 프로그램에서 필요하지 않기에 이 자료구조를 구현하는 포인터들은 가용 블록의 본체 내에 저장될 수 있음. ex. 힙은 그림처럼 가용 블록 내에 pred(이전)와 succ(다음) 포인터를 포함하는 이중 연결 가용 리스트로 구성될 수 있음. 묵시적 가용 리스트 대신 이중 연결 리스트를 사용하면 first fit 할당 시간을 전체 블록 수에 비례하는 것에서 가용 블록의 수에 비례하는 것..
heap list에서 first word를 unused padding으로 하는 이유(pdf 880) (1 word=4bytes 전제) implicit free list에서 prologue block이 1 word-size header와 1 word-size footer로 총 2 words를 차지한다. 만약 그 다음 블록이 온다면, 1 word-size header가 오게 돼서 실제 payload 앞에 3 words만 존재하게 된다. 그러면 payload를 가리키는 pointer의 주소값 12가 되어 8의 배수가 될 수 없다. 이걸 맞춰주기 위해서 1 word size unused padding이 heap의 맨 앞에 붙게 되는 것이다. #참고한 블로그 즉, 경계가 헤더와 풋터 사이에 있어야 하는데, 헤더와..
9.9 동적 메모리 할당 가상 메모리 영역을 저수준의 mmap & munmap함수를 이용해 생성/삭제할 수 있지만, 추가적인 가상메모리를 런타임에 획득할 필요가 있을 때, "동적 메모리 할당기를 사용하는 것을 좀 더 편리하고 호환성이 좋다고 생각" 동적 메모리 할당기는 힙(heap) 프로세스의 가상메모리 영역을 관리. → 일반화의 오류를 범하지 않는 한도에서 힙이 미초기화된 데이터 영역 직후에 시작해서 위쪽(높은 주소 방향)으로 커지는 무요구 메모리 영역이라고 가정 → 커널은 힙의 꼭대기를 가리키는 변수 brk(break)를 사용 할당기는 두 개의 기본 유형이 가능. 두 유형 모두 응용이 명시적으로 블록을 할당하도록 요구하며, 어떤 엔트리가 할당된 블록을 반환하기 위해 무엇이 사용되어야 하는지에 차이가 ..
류석영 교수님의 코드리뷰 강의 간단 정리 [중요하다고 생각하는 부분만!] 1. 코드 리뷰가 필요한 이유 - 다른 사람이 읽기 쉽게 코드를 개선할 수 있다. - 리뷰어가 남긴 의견으로부터 배울 수 있다. - 결함을 줄일 수 있다. - coding decision에 대한 개발 역사를 보관할 수 있다. 새로 들어온 사람이 커밋을 보고 이해할 수 있게 된다. - 일관적인 코딩 스타일을 유지할 수 있게 되면서 refactoring과 debugging에 큰 도움이 된다. - 협력심을 기를 수 있다. ∴ 제일 좋은 코드 리뷰 "이 코드는 ~한 이유로 ~하게 바꾸는 게 좋습니다." + 참고한 링크 2. 코드 리뷰의 단점 - 거칠고 무례한 의견으로 인해 의지를 떨어뜨릴 수 있다. - 리뷰가 늦어지면 개발 기간이 늦춰진다..
#malloc / free / colloc 함수 참고 #메모리 동적할당 참고 메모리 동적할당이란? = 프로그램이 작동하는 도중에 할당받고자 할 때 사용하는 방법, 동적 할당된 메모리는 힙(heap)영역에 malloc과 free를 사용해 할당되고 해제된다. 각 칸을 4바이트 차이만큼 표시한 이유는 32bit 시스템의 경우엔 포인터의 사이즈가 4byte이기 때문에 64bit인 경우엔 CPU의 메모리 접근을 위한 주소가 64bit 만큼 가능하기 때문에 8byte가 된다. 파란색 부분은 할당된 부분, 흰색 부분은 할당이 해제된 부분. 그림은 차례로 할당과 해제된 부분을 그렸지만, 할당된 부분들은 얼마든지 연속적으로 붙어있거나 떨어져있을 수 있다. but, 할당 해제된 부분은 단편화 문제를 해결하기 위해 연속적으..
struct NODE { // 연결 리스트의 노드 구조체 struct NODE *next; // 다음 노드의 주소를 저장할 포인터 int data; // 데이터를 저장할 멤버 }; 연결리스트는 노드들의 집합이라 실제로는 노드의 구조체만 정의하면 된다. node 구조체에서 가장 중요한 부분은 struct NODE *next이다. 얼핏 보면 구조체 자기 자신의 포인터를 멤버로 가지고 있는데, 전혀 어려운 게 아니다! next에는 NODE구조체로 만든 다른 노드의 메모리 주소를 저장한다. 즉, 자기 자신이 아닌 다른 노드의 메모리 주소를 저장한다는 점!!! 단일 연결 리스트에서 노드 종류 [노드 역할에 따라 두 가지로 나뉨] - 머리노드(head node): 단일 연결 리스트의 기준점, 첫 번째 노드를 가리키..
- 포인터 printf("%p\n", &변수명) >> 변수의 메모리 주소를 구함 자료형 *포인터이름 >> 포인터 변수 선언 포인터 = &변수명; >> 변수의 메모리 주소를 포인터 변수에 저장 printf("%d\n", *포인터) >> 역참조 연산자, 포인터명의 메모리 주소에 접근해 값을 가져옴 *포인터 = 값 >> 역참조 연산자를 사용한 뒤에 갑을 저장하는 것. [값을 가져올수도, 저장할 수도 있음] void *포인터이름 >> 자료형이 정해지지 않은 특성 때문에 어떤 자료형으로 된 포인터든 모두 저장가능 ㄴ> 단, void 포인터로는 역참조를 할 수 없고, 변수를 선언할 수도 없다. 자료형 **포인터이름 >> 포인터의 메모리 주소를 저장하는 포인터의 포인터를 선언 [이중 포인터] ㄴ> 포인터도 실제로는 ..