소개
김정인 강사님은 오픈소스가 중요하다며
리눅스 커널 및 딥러닝의 구현 소스를 취미 삼아 매일 분석 하는 오픈 소스 매니아 입니다.
소스를 통해 이해 한다며 무작정 소스 분석으로 모든 원리를 이해하려 하므로
수강 시 소스 폭탄에 주의 해야 합니다.
강의문의 : jikim@imguru.co.kr
강의
전체 9수강평
- 오픈소스 자료구조 및 알고리즘 in C
- 리눅스 시스템 디버깅
게시글
질문&답변
2024.09.21
강사님 후속 강의
아직 계획하지 않고 있습니다.
- 0
- 1
- 28
질문&답변
2024.07.02
Insert_data에서 prev_tmp를 지웠을 때, 성능향을 기대할 수 있을까요?
안녕하세요.tree 의 insert_data 함수의 개선 과정을 문의 하신 것 같습니다. 해당 소스를 보면 if( root == 0 ) { root = temp; return; } while(p) { prev = p; if( p->data > data ) p=p->left; else if( p->data right; else return; } if( prev->data > data ) prev->left = temp; else prev->right = temp;위 부분이 아래와 같이 바뀐 것이므로 while(*p) { if( (*p)->data > data ) p=&(*p)->left; else if( (*p)->data right; else return; } *p = temp;while 루프 안의 prev = p 가 사라진 것과 while 아래 쪽의 if ~ else 구문이 사라진 것이 주요 합니다. while 루프 안의 코드 삭제는 log N 번 이라 하더라도 데이터가 많은 경우 성능 향상을 기대할 수 있습니다. 또한 While 아래쪽의 if ~ else 또한 while 안쪽은 아니지만 insert_data 함수가 여러 번 호출 되었을 때 성능상 이점이 되리라 생각 됩니다.
- 0
- 1
- 82
질문&답변
2024.06.17
tail노드의 이유 & 메모리 풀링 관련
질문 내용에 항목 별로 답변 드리겠습니다. 메모리 풀링은 그렇다면 주로 어느정도의 사이즈를 가정할 수 있을때나 시스템상 핸들링 할 수 있는 최대치를 넣어 구현한다는 말씀이신가요?그렇다면 내부적으로 너무 많은 메모리를 사용하지않고 낭비되어 효율성이 떨어지지 않나요? 어느 시점에 써야 하는지에 대한 부분이 좀 명확하지않아, 어떤 상황에 써야 되는 기법인지 묻고 싶습니다.답변 : 대부분 시스템에서는 메모리 풀링의 최대치를 관리 하고 있습니다. 예를 들어 운영체제의 프로세스의 최대수 1024, 한 프로세스에서 오픈 가능한 파일수 1024등 너무 메모리를 낭비 하지 않는 선에서 시스템에 필요한 최대수를 메모리 풀링 하면 됩니다. 2번째는 현 tail 노드를 추가하는 부분에 있어서 .... 왜 마지막 노드의 next가 NULL인것에서 문제가 생기는 지 이해가 잘 되지 않습니다.for문이나 while문으로 loop하여 display하는것으로 가정했을때 마지막 노드 next가 0이게 되면 더이상 반복문이 실행되지않고 끝나게 되면서, NULL이 프린트 되지않고 나오지않나요?답변 : 포인터 변수 temp에 NULL이 들어온 경우 그대로 역참조 하게 되면 프로세스가 런타임 상에서 죽게 됩니다. NULL은 0번지를 의미하고 0번지를 접근하면 운영체제가 해당 프로세스를 죽게 만듭니다. 예) temp->data ==> (*temp).data => (*0).data 0 번지를 참조함 예시로 for문 중간에 왜 아무것도 기입하지 않는 부분도 어떻게 컴파일은 진행이되고 세크먼트로폴트 결과가 나오는걸까요? 답변 : for문 중간은 조건문 이므로 조건이 필요하지 않은 경우 생략할 수 있습니다. 컴파일러는 이를 에러 처리 하지 않습니다. 하지만 for문의 조건을 통과하게되면 위에 답변 처럼 temp가 NULL 인 경우temp->data 문법에서 세크먼트 폴트 예외가 발생 하여 죽게 됩니다. 혹시 선생님 말씀은 null로 마지막 node가 설정되지 않은 쓰레기값이 설정되었을때를 방지하기위해 tail노드를 추가적으로 안전하게 설치하자는 말씀이실까요?답변 : tail을 사용하여 종료 조건을 판단 하면 NULL을 만나지 않게 되어 프로세스가 죽는 문제를 해결할 수 있습니다. tail의 next는 NULL로 되어 있지 않고 자신을 가리키기 때문 입니다.
- 0
- 2
- 143
질문&답변
2024.06.04
eval(repr(p)) 가 진짜 Pair 객체로 만들어지는 이유?
eval() 함수는 string을 이자로 받습니다. 이때 string "Pair(3,4)" 가 입력되면 객체를 생성합니다. repr(p)는 "Pair(3,4)"를 출력 하게 됩니다. 따라서, 해당 클래스에 repr이 재정의 되어 있으면 자신과 같은 객체를 생성할 수 있게 됩니다.
- 0
- 1
- 111
질문&답변
2024.06.03
커널 버전
안녕하세요. 오픈소스 자료구조 동영상은 linux kernel 3.10에서 제작 되었습니다. 그동안 kernel은 5.0을 지나 지금은 6 version을 사용하고 있습니다. 자료구조/알고리즘도 많이 추가 되고 발전 되었습니다. 계속 발전하는 소스를 분석 중에 있으며 추후 두번째 강의로 제작할 예정입니다. 감사합니다.
- 0
- 1
- 118