Open longlivedrgn opened 5 months ago
음... 이건 질문의 의도를 잘 모르겠네요. 저는 iOS 디바이스의 메모리 제약이라 함은, RAM의 크기를 물어보는 것 같은데요. 이게 맞다면 기기마다 상이하나 요즘 나오는 건 최소 4GB는 넘어갔던 걸로 기억합니다. 앱의 메모리 제한에 대해서는 정확히는 잘 모르겠네요. UIKit에서는 메모리가 부족하면 UIApplceationDelegate에서 applicaitonDidReceiveMemoryWarning, UIViewController에서 didReceiveMemoryWarning을 호출시켜주는 걸로 알고 있는데, 언제 호출해주는지는 모르겠습니다. 어쨌거나 해당 메소드에서 메모리 공간을 적절히 비워줄 필요가 있습니다.
메모리 워드는 짧게 이야기하면 CPU가 이해할 수 있는 비트의 단위입니다. 부연설명을 조금 하면 CPU는 메인메모리와 이야기를 나누는데, 이때 버스라고 하는 물리적 통로를 이용해 이야기를 나눕니다. 이 통로의 사이즈가 CPU가 이해할 수 있는 비트의 단위이며, 또 곧 CPU가 나타낼 수 있는 메모리 주소 갯수의 기준이며, 워드입니다.
데이터 정렬과 메모리 엑세스는 잘 모르겠네요~
이것도 잘 모르겠네요. Swift를 사용하면서 포인터까지 고려하면서 앱을 만드는 게 맞나 싶기도 하고요. 질문에 대한 대답은 아니라서, 일단 고민을 좀 해보면... 단순하게 생각하면 32비트가 사이즈가 작고, 32비트와 64비트 운영체제 모두에서 동작할 수 있기 때문에 동작환경이나 메모리를 효율적으로 쓰는데에 적합할 것 같고요. 다만 그만큼 메모리를 효율적으로 쓰는 코드를 개발자가 작성해야하기 때문에 상대적으로 개발시간이 많이 들 것 같습니다. 실제로 만들어보지는 않아서 가정만 해보면, 사람이 만들고자 한다면 방법이 뭔들 없겠냐만은, 아무래도 표현할 수 있는 메모리 주소에 제한이 있기 때문에 기능이나 표현에 제약이 있을 거라 짐작됩니다.
먼저 이야기가 되는 대용량의 기준이 굉장히 중요할 것 같은데요. 데이터가 메인메모리보다 큰 경우인지 작은 경우인지에 따라 보조기억장치의 사용유무가 결정되기 때문입니다. 메인메모리보다 큰 데이터를 한번에 메인메모리에 올려서 동작시키는 건 사실상 불가능하기 때문에, 필요한 부분만 메모리에 적재하고 불필요한 부분은 내리는 걸 반복하면서 프로그램을 돌려야하겠는데요. 실제로 일반 소프트웨어 개발자가 이런 것까지 고려해가며 개발할 일은 없을 것 같고, 어렴풋한 기억이지만 iOS에서 이러한 일이 애초에 발생하지 않도록 막아놓았던 걸로 기억합니다. 일반적으로는 아무리 대용량이라고 해도 렘에는 올라가는 데이터를 다루게 될 텐데요. 일단 언어레벨에서는 되도록 힙을 많이 사용하도록 해야 많은 데이터를 운용할 수 있을 것 같고요. 구조적으로는, 디자인 패턴 중에 flyweight design pattern이라는 게 있는데요. 같은 값이 무수히 많이 반복되어 사용되는 경우, 이를 반복해서 생성하거나 메모리에 저장하는 게 아니라, 한번만 생성하고 공유하도록 유도하는 기법입니다. 이런 걸 써볼 수 있을 것 같고요. 위에서 말씀드렸던 필요한 것만 메모리에 적재하고 불필요한 건 보조기억장치에 저장을 시키고 메모리에서 내리는 기법을 또 여기서 사용해도 될 것 같네요.
메모리 alignment 는 개념을 처음 접해서 이번에 학습했습니다.
iOS에서의 메모리 제약에 영향을 주는 요인은 RAM과 관련이 있다.
RAM
iOS에서 특정 앱이 너무 많은 메모리를 활용하고 있을 경우 워닝을 던진다.
iOS는 기본적으로 Pagination
을 활용하여 메모리를 관리한다.
이러한 메모리를 과도하게 활용할 경우 아래와 같이 앱에게 메모리 워닝을 띄어준다.
앱에서 쉽게 다시 생성할 수 있는 데이터를 로드하는 경우 NSPurgeableData를 사용하는 것이 좋습니다. NSPurgeableData의 콘텐츠가 startContentAccess()를 통해 사용 중으로 표시되지 않으면 메모리가 부족한 상황에서 시스템이 자동으로 콘텐츠를 삭제합니다.
참고자료: https://developer.apple.com/documentation/xcode/responding-to-low-memory-warnings
CPU의 포인터
32비트
64비트