Search
Duplicate
🥕

1년간의 공부 과정

간단소개
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
회고
태그
Scrap
9 more properties
지난 1년간의 공부 과정을 담아봤습니다.
2022.01 ~
할 줄 아는게 아무것도 없는 것 같아 제대로 C를 공부해보기 시작함. 이전에도 for나 함수, 재귀 정도는 짤 수 있었지만 제대로 이해하고 사용하는게 아니였음. 포인터, 함수 개념을 다시 제대로 공부하기 시작
2022. 03 ~
C를 배우며 맨날 들었던 말이 기본기가 탄탄해야 한다. 내부 동작을 알아야 한다. 였다.
어셈블리 코드를 보며 C의 스택메모리와 함수 호출이 어떻게 이루어지는지 이해했고, 이때부터 각종 코드가 어떻게 어셈블리로 바뀌는지 직접 확인해보고 내가 코드를 짰을 때 어떻게 컴파일러가 어셈블리 코드로 바꾸어줄지 대충 보이기 시작함.
왜 지역변수보다 동적할당이 느린지 많은 이유가 있지만 그 중 어셈단에서 느리다 + 운영체제가 남는 메모리를 뒤져야한다. 까지 이땐 이해했음.
내부 동작을 알아가는게 즐거웠다.
함수 호출 + 지역변수 동작 원리
2022.05 ~
이전 c언어 과목의 조교를 시작함. 동시에 교육청에 개인과외교습자 신청하고 과외도 시작. 말하고 설명하는 능력을 이때부터 키우기 시작함
동시에 객체지향과 c++을 공부하기 시작. c 에서 어떤 기능들이 왜 추가되었고 어떻게 동작하는지를 배움. vftable등이 어떻게 동작하는지 배움.
2022.07 ~
어셈블리들을 뜯어보니 컴구조에 흥미가 생김. 나무위키에서 cpu/구조와 원리 페이지의 글들을 읽음. (맨 위 동영상은 지워야 한다고 생각) pipeline, cache, branch prediction, out-of-order, superscalar 등을 자세히는 아니지만 대충 이해했음. 여러가지 테스트를 해가며 배운 내용에 따라 성능 가설을 세우고 입증하는 것을 해봄. 컴파일러가 최적화해주는 비트연산을 보고 따라해봄
strlen 최적화를 glibc 보고 따라해봄 (영어를 잘 못한다)
이건 xor swap을 분기 없이 진행하는 코드 간단한 어셈블리 배워서 적어봄
2022.09 ~
배우다 보니 os까지 내가 알아야 할 영역이 넓어짐. 학습 방법은 문서를 보다가 모르는 키워드가 있으면 그걸 또 보고 보고 하는 식이였는데, 그렇게 C언어→어셈블리→컴구조→OS까지 이어지게 된 것.
가상메모리-MMU-TLB, 커널-유저모드, cpu 스케줄링, context switching 등을 나무위키와 블로그 들로 공부함. 대충 이해했고, 이전에 어셈블리 등에서 배운 내용이 계속 나왔고, 비슷한 기법을 쓰는(look-up) 내용도 많아서 이렇게 응용 가능성이 넓구나를 배움.
2022.11 ~
컴구조가 아직 제대로 이해가 안가서 좀 더 봤음. i/o system, simd, mesi protocol, WCmemory 등을 봤지만 아직 이해가 잘 안감. os에서 가상메모리나 드라이버 같은 내용이 이해가 되기 시작함.
2023.01 ~
네트워크를 보기 시작함. (궁금해서) winsock tcp로 간단한 채팅서버를 만들 수 있었음. 이것저것 영상들을 보고 다녔고 내가 게임 서버를 만들면 어떻게 해야겠다 생각하기 시작.
커널이 네트워크 소켓을 담당해주는 걸 보고 syscall을 대충 이해하기 시작. nat mapping과 os의 네트워크 제어에 대해 대충 이해하기 시작. i/o system, simd, Cache Coherence(MESI) 에 대해 이해가 되기 시작. (NIC 까지 데이터를 들고가려면 i/o bus를 써야겠네??? dma도 쓰겠네??? 그럼 NIC가 버스 쓰는동안 cpu는 버스를 못 쓰고 그럼 대기하는동안 cpu는 노나? 아니지 캐시에 든거 쓰면서 write buffer에 채워놓고 그냥 진행하고 있으면 되지)
tcp 채팅서버
2023.03.
race condition이 하드웨어에서 왜 일어나는지 완벽히 이해하게 됨. MESI protocol을 이해하고, 캐시 잠금을 이해하고, Write-combined memory를 i/o system에서 배운 지식을 바탕으로 제대로 이해함. skylake 아키텍쳐를 보고 CPU가 어떻게 흘러가는지 머릿속에서 돌아가기 시작함. (i_L1-fetch-decode-rename-scheduler-execution-commit) 이제 어떤게 느리고 빠를지 예측이 됨
메모리 누수를 잡는 테크닉을 몇 개 배움, (_CrtDumpMemoryLeak, page heap + virtifier) (malloc실패하면 빨리 죽이고 덤프를 봐야한다!!!!! 그냥 프로그램 돌리지 마라!!!!)
유저레벨 어셈블리와 하드웨어를 알게되니 OS가 중간에서 어떤 역할을 맡을지 감이 잡힘. 이전에 공부햇던 OS지식들이 제대로 이해되기 시작. malloc이 이제 대충 이해가 됨. malloc→_crtmalloc→heapAlloc→virtualAlloc→virtualMemoryManager 였던 것. 윈도우에서 게임 깔 때 c++재배포를 깔라는게 CRT 였다.
파이프라인 잘 이해가 안가서 시뮬 찾아서 직접 해보며 이해
skylake architecture full overview
어디까지 왔나
“배열 vs 리스트” 라고 질문하면 10분 넘게 떠들 수 있다.
이제 C언어 코드를 짜면, 그게 어떻게 어셈블리로 바뀌어서 OS부터 하드웨어 레벨까지 어떻게 돌아갈지 보임. (물론 대강이고 OS부분은 특히 빈약)
공부 이외에도 많은걸 해냈기에 나쁘지 않은 1년간의 발전이였고, 하루 평균 1시간도 안되는 공부량인데 그게 방향성을 가지고 쌓이니 이게 되는구나 라는걸 깨달아서 기쁨. 전체 개요를 잡아주는 나무위키와 방향성을 알려주는 여러 우상들이 정말 많은 도움이 되었다.
올해는 이제 상위 레이어인 OS, 그래픽, 네트워크, DB를 공부할 것