[SW사관학교 정글 6기] Week05~07 : 탐험 준비 회고

etc-image-0

다시 만난 C언어... 못할 건 없다

탐험 준비 🧭 생각해볼 것 & 암기할 것

  • C에서는 배열과 스택과 같은 소수의 자료구조만 사용 가능
  • 어셈블리어를 기계어로 돌려보기
  • malloc을 사용하지 않는 방법은 무엇이 있을까?
  • 메모리를 할당하는 영역 3가지는?
    → 코드(Code) 영역: 프로그램 코드가 저장되는 영역으로 실행할 수 있는 기계어 코드가 저장된다. 이 영역은 읽기 전용이며, 코드를 실행하는 데 필요한 명령어와 데이터가 저장된다.
    → 데이터(Data) 영역: 전역 변수와 정적(static) 변수가 저장되는 영역이다. 이 영역은 초기화된 데이터와 초기화되지 않은 데이터로 구성된다.
    → 스택(Stack) 영역: 지역 변수, 함수의 매개 변수, 반환 값 및 함수 호출 정보가 저장되는 영역이다. 이 영역은 후입선출(LIFO) 구조로 관리된다.
  • 왜 SENTINEL을 사용하는가?
    → insert, delete에서 더 간편하게 찾기 위해서
  • 메모리 할당을 최적화할 수 있는 방법
    → 1) 메모리를 빈틈없이 할당하기 2) 메모리를 빠르게 할당하기
  • 데이터 세그먼트(data segment)란?
    etc-image-1

    <출처: 위키피디아>
    논리적인 블록인 세그먼트(Segment)로 나누는 방법. 데이터 세그먼트는 프로그램에서 사용하는 초기화된 정적 변수를 저장하는 세그먼트이며, 코드 세그먼트는 프로그램의 실행 코드를 저장하는 세그먼트이다. 스택 세그먼트는 함수 호출과 관련된 정보를 저장하는 세그먼트이다. 이렇게 세그먼트는 프로그램의 메모리를 기능별로 나누어 저장함으로써, 메모리를 효율적으로 사용할 수 있다.
  • 스택(stack)
    stack pointer는 스택의 가장 아래로, 함수가 호출될 때(call) 포인터가 아래로 간다. 스택을 건드리는 방법에는 call, return, push, pop이 있다.
  • 메모리 단편화
    : 메모리를 요청 받은 크기가 다 합치면 가능한 크기이지만 사용할 수 없는 현상으로 해결하기 위해서는 가용블록을 합치면 된다.
    예를 들면 디스크 조각 모음이 있는데 말록에서는 조각 모음을 할 수가 없다. 그래서 배치를 잘해야 단편화를 줄일 수 있다.
  • 클라이언트로 서버를 테스트하는 방법: 1) 브라우저 2) curl 3) telnet
  • HTTP 프로토콜(request): method, path(query-string), uri, version + header(content-type, content-length)
  • MINE(Multipurpose Internet Mail Extensions) 타입: 인터넷에서 전송되는 컨텐츠 타입을 지정하는 데 사용되는 표준 인터넷 미디어 타입. major / minor. major로는 text, image, audio, video, application이 있다.
  • cache eviction 알고리즘: 캐시 메모리의 크기는 한정되어 있으므로, 새로운 데이터가 캐시에 추가될 때 이전에 저장된 데이터를 대체해야 할 수 있다. 이 과정을 cache eviction이라 한다. 알고리즘 1) LRU(Least Recently Used) 2) FIFO(First In, First Out), LFU(Least Frequently Used)

# C언어

대학교 2학년 때 C언어를 계절로 2주동안 들었다. 강의가 끝날 때까지 포인터와 동적할당을 이해 못했던 기억이 있다. 그 이후로 C가 붙은 모든 것들을 피하면서 살았다. 하지만 정글의 과정 중 9주가 C언어로 진행이 된다. ㅎ 더이상 피할 수 없다. C언어 주차를 시작하고 3일동안 <씹어먹는 C언어> 책을 봤다. 그런데 신기하게도 도저히 이해가 되지 않던 포인터가 어떤 건지 대충은 느낌이 오기 시작했다. 너무 기뻐서 주말에 집에 가서 자랑을 엄청 했다. 여전히 포인터를 자유자재로 쓸 수는 없지만 감은 온다. 정글에 와서 느낀 가장 큰 것 중 하나는 새로운 언어(프레임워크 등)를 사용하는 것을 두려워 하지 않는 것이다. 0주차에도 새로운 프레임워크를 사용해서 처음 만들어 보는 기능을 만들었고, 지금도 그렇게 두려워하던 언어로 자료구조를 만들었다. (이제 드디어 다시 자바를 공부해볼 때가 된 걸까..?)

# 망가진 생활 패턴

물론 얻는 것도 있으면 잃는 것도 있는 법. 정글을 시작한 후 아침형으로 바뀌었다고 즐거워하던 나는 다시 취침 시간이 2시 이후로 밀렸다. 나는 새벽에 공부가 잘 되는데 그걸 다시 깨닫게 되면서 패턴도 돌아왔다. 그리고 캠퍼스 주변에 특별히 자유시간에 할만한 것들이 없어서 그런지 사람들이랑 종종 술을 마시곤 하는데, 내가 1년동안 마신 횟수랑 여기 와서 마신 횟수가 비슷한 것 같다. (평소에 술을 거의 안 마신다.) 그것 때문인지 공부에 지장이 조금씩 가는 것 같아 자제하려 한다.

# 달라진 생각

이전에는 무조건 나는 프론트엔드가 좋아! 프론트엔드를 하고 싶어!라고 생각했는데, 여기 와서 이전에 해보지 않았던 것들을 해보니까 내 생각만큼 잘 안 맞거나 끔찍하게 느껴지지 않았다. 그래서 이때까지 내가 너무 편견을 갖고 있었나 싶어, 다른 포지션도 고려를 해보기로 했다. (정말로 다시 자바를 공부해볼 때가 된 건가..?)


😝 좋았던 점

  • 예전엔 엄두도 못 냈던 C언어가 더이상 예전만큼 무섭지 않다.
  • 이전보다 컴퓨터 시스템에 대한 관심이 생겼다.
  • 꾸준히(거의 매일) 알고리즘 문제를 풀었다.

🥹 아쉬운 점

  • 오히려 마지막 서버 부분에서 네트워크의 동작을 이해하기 어려웠다. 이때까지 웹 프로그래밍을 하면서 이 부분을 깊게 생각하지 않았던 것 같다.

🧠 WIL

  • 동적 메모리 할당, 포인터, 메모리 누수, 균형 이진 탐색 트리
  • 시스템 콜, 데이터 세그먼트, 메모리 단편화
  • BSD소켓, IP, TCP, HTTP, file descriptor, DNS

👊🏻 목표

  • 알고리즘 문제 꾸준히 풀기
  • PintOS 이해하기를, 구현하기를 포기하지 말기
  • 최대한 공부에 집중하기
  • 생활 패턴 다시 당기기