티스토리 뷰

컴퓨터 밑바닥의 비밀

Gobans 2024. 8. 2. 14:30

 

 

 

루 샤오펑 저자(글) 

길벗 · 2024년 03월 11일

 


 

서평

추상화 계층은 프로그래밍을 즐길 수 있는 낙원이다. 하지만 추상화 계층을 넘어서거나 자신만의 낙원을 만들고 싶다면 저수준 계층을 이해해야한다. 그리고 이것이 고급 프로그래머를 구분 짓는 요소이다.

 

 

난 대학교에서 컴퓨터 공학을 전공했었다. 수업으로 CS지식을 배웠었고, 성적도 나쁘지 않게 받았었다. 그러나 내가 CS지식을 잘 이해하고있는가 생각해봤을 때는 아닌 것 같았다. 자신감이 없었다. 여러 CS 키워드들에 대해서 들으면 무엇인지 알고있었지만, 왜 해당 기술이 고안 되었는지, 정확한 동작은 어떻게 이루어지는지, 다른 컴퓨터의 구성요소와 어떻게 결합되어 사용되는지 몰랐다. 이해를 못하고 있었던 것이다.

 

이 책은 아주 친절하게 컴퓨터를 이해할 수 있도록 도와준다. 정말 책 제목대로 컴퓨터의 밑바닥 부터 차례대로. 내가 가져왔던 찝찝함을 시원하게 긁어주는 책이였다. 기계어부터 시작해서 컴파일러, 링커를 다루고 프로세스, 스레드, 메모리, 캐시, 입출력 등 전제척인 내용을 아우르고 있다. 깊이도 얕지 않다고 생각한다. 주제가 되는 부분에 대해서는 히스토리 부터 시작해서 어떻게 동작하는지 까지 확실하게 알려준다.

 

또한 개발을 잘하기 위해선 CS공부를 더 많이 해야하겠다 느끼게 해준 책이다. 나는 iOS개발과 연관지어서 생각하며 책을 읽었는데, iOS개발에 있는 Swift concurrency라는 개념이 기존 CS 개념(코루틴)에서 파생된 것이라는 것을 알게되었다. 그리고 힙 메모리 할당 방식에는 여러가지가 있는데, iOS에서는 어떤 방식을 쓰고 있는지도 알게되었다. 이런 것들을 알고있을수록 다양한 문제상황에 대응하여 문제를 해결할 수 있는 능력이 높아진다고 생각한다.

 

 

결론은 적극x100000 추천한다. 이런책이 네트워크나 다른 여러 CS분야 있으면 좋겠다. 아주 재밌고 유익하게 읽을 수 있을 것 같다.

 

 

책을 읽으며 들었던 의문과 답


Q. iOS에서의 '스택 프레임'은 어떻게 구성되어 있을까?

A. Swift는 struct형태의 'CallFrame'을 만든다. 저장되는 변수가 값 타입이냐 레퍼런스 타입이냐에 따라 CallFrame이 구성되는 매커니즘이 달라진다. 일반적으로 값 타입이라면, 그대로 변수를 복사한다. 반면 레퍼런스 타입이라면 포인터를 가진다.

 

예외)

1. 변수가 값 타입이라도 내부 프로퍼티가 너무 크다면, 포인터를 사용한다.

2. 변수가 값 타입이라도 Dynamically-sized types에 해당된다면 CallFrame에 변수를 복사하지 않고, 포인터를 둔다. (스택 영역 CallFrame 바로 밑에 해당 변수의 메모리 할당)

 

Reference:

WWDC2024 Swift성능 살펴보기

WWDC2016 UnderStanding SwiftPerformance

 

 

Q. iOS는 어떤 메모리 할당 방식을 사용할까?

A. 할당에 대한 정확한 방식 ex) 최초 적합 방식, 다음 적합 방식, 최적 적합 방식.. 은 안나와있다.

반면 메모리 병합에는 지연해서 병합한다는 것을 확인했다. (할당할 메모리가 부족하면 메모리를 병합함. 이를 heap compaction 이라고 부름)

그리고 병합 후에도 메모리가 부족하다면, 힙 영역의 크기를 늘린다.

 

Reference:

Introduction to Memory Management

 

인사이트가 되는 부분

1. 링커: 컴파일 된 소스파일을 연결해서 실행파일로 만들어지는 친구.

  • 여러 집필가가 쓴 챕터를 엮어서 하나의 책으로 만든다.
  • 정적 라이브러리
    • 컴파일된 정적 라이브러리를 그대로 실행 파일에 복제
    • 장점: 프로그램 시작 시간이 빨라짐
    • 단점:
      • 여러 곳에서 라이브러리가 쓰인다면, 중복으로 데이터가 적재.
      • 정적 라이브러리의 코드가 변경되면, 종속된 프로그램 또한 다시 컴파일 해야함
  • 동적 라이브러리
    • 라이브러리가 메모리에 단 하나의 복사본만 존재하고 공유해서 사용.
    • 대상파일에 동적 링크 관련 정보를 두고, 프로그램이 실행될 때 메모리 주소 확정.
    • 장점:
      • 메모리 적재 용량 줄여짐
      • 동적 라이브러리 코드가 변경되어도, 종속된 프로그램은 다시 컴파일 안해도 됨
      • 프로그램 쉽게 확장 가능
    • 단점:
      • 프로그램이 로드되는 시간 또는 실행 시간이 비교적 느림

2. CPU가 입출력을 처리할 때는 비동기식으로 해당작업이 필요한 정보를 입력 장치에게 넘겨준다.

  • 메모리에 장치에서 사용하는 주소공간을 할당한다.
  • 그 후 신경쓰지 않고, 입출력 작업이 완료되면 알림을 받는다.
  • 외부 장치가 메모리 데이터를 복사하는 작업은 직접 메모리 접근(DMA) 방식을 통해 진행된다.
    • 이로인해 CPU는 계속 다른 작업 가능

3. 메모리 관점에서 입출력은 단순한 메모리 복사이다.

  • 파일은 연속된 바이트의 수열이다. (모든것이 파일 이라는 개념으로 추상화. 디스트, 네트워크 데이터, 터미널, Pipe)
  • 파일 서술자를 할당하고, 커널 상태에서 이 파일 서술자를 감시한다. 그 후 변경이 있을 때 응용 프로그램에게 통지한다. (epoll)
  • 이를 통해 입출력 다중화가 이루어진다.

'' 카테고리의 다른 글

숙론  (0) 2024.08.18
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/03   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
글 보관함