[{"content":"컴구 강의중에 교수님이 언급하신 swap.\n처음 든 생각은 vim 제대로 못 쓸 때 저장을 안 했었나? 나도 모르게 생긴 swap 파일들과 충돌 해결한 거\u0026hellip;\n같은 swap 개념인지는 모르겠지만, 분명 파일시스템 아래에서 관리되고 있었다. 원래 제목을 파일시스템은 swap을 어떻게 관리하고 있을까? 였는데 뭔가 적다보니 디스크라고 하는 게 정답에 가까워지는 것 같아 디스크로 바꿨다.\n커널이 관리한다고 하는 게 맞는 것 같아 커널로 변경~!\nvim의 swap 파일 대략적인 이해는 이렇다. 일단 vim의 임시파일과는 완전 다른 개념.\n정상적으로 저장되지 않은 vim 에디터 상의 데이터를 저장하는 .swp 확장자를 가진 파일. 바이너리로 저장된다고 하고, vim -r 명령어로 복구가 가능하다.\n생기는 원리 TBD\nSWAP 메모리 / 가상 메모리 그럼 메인 메모리의 용량이 부족해서 디스크를 메모리처럼 활용하는 개념은 뭐라고 불러야 할까?\nSWAP 메모리, 가상 메모리 라고 한다.\n주로 무료티어의 서버 환경을 사용하는 사람들이 자주 활용한다고 한다.\n사용하지 않는 페이지만 SWAP에 저장한다? 그냥 메인 메모리처럼 활용한다? 공식 문서를 찾아봐야겠다.\nCH.11 Swap Management 공식 문서? 인지는 모르겠지만, 위 글에서 정리한 건 다음과 같다.\nSwap 메모리를 생성하는 과정을 Swaping이라 하지 않고, Paging이라 한다.\n페이지를 copy하는 것과 동일하게 구현되어 있다 함 (위치가 디스크겠지?) 용량이 꽉 찼을 때 뿐만 아니라, 사용되지 않지만 초기화 되어 있는 페이지를 디스크로 내려서 관리하기도 한다. (버퍼를 활용하기 위해) 활성화된 Swap 영역에는 swap_info_struct 구조체가 있다. 런타임 중에 swap_info라는 32개 사이즈를 가진 정적 배열에서 관리된다.\n동시에 32개의 swap 영역만 활성화 될 수 있다.\n1 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 64 struct swap_info_struct { // 영역의 활성화 상태를 나타내는 flag : (SWP_USED, SWP_WRITEOK) 65 unsigned int flags; // 영역이 파티션에 위치할 경우 디바이스 정보 저장 ( 파일일 경우 NULL ) 66 kdev_t swap_device; 67 spinlock_t sdev_lock; // 스핀락 // 스왑영역으로 마운트 된 파일, 디바이스의 디렉터리 엔트리 68 struct dentry * swap_file; 69 struct vfsmount *swap_vfsmnt; // 저장 위치의 vfsmount 객체 // 영역에 있는 페이지들의 사용 현황 // ( 0:free, 1:used/cache, MAX:reserved ) 70 unsigned short * swap_map; // 선형 탐색 최적화 용 비트들 71 unsigned int lowest_bit; 72 unsigned int highest_bit; // 파일 i/o용 변수들 73 unsigned int cluster_next; // 다음 블록 offset 74 unsigned int cluster_nr; // 해당 클러스터의 사용가능 페이지 수 75 int prio; // 영역간 우선순위 76 int pages; // 사용가능 슬롯 수 77 unsigned long max; // 전체 슬롯 수 78 int next; // 다음 우선순위를 가진 영역 index 79 }; swap_info에도 저장이 되지만, swap_list라는 배열에도 저장이 된다.\nswap_list는 간단한 구조로, 라이트한 탐색이 가능.\n영역 안의 각 슬롯은 페이지 크기 만큼 할당된다. 첫 번째 슬롯엔 슬롯 영역에 대한 메타데이터가 저장된다.\n1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 25 union swap_header { 26 struct 27 { 28 char reserved[PAGE_SIZE - 10]; 29 char magic[10]; // 스왑 영역 버전 설정 30 } magic; 31 struct 32 { 33 char bootbits[1024]; // 파티션 정보 저장 34 unsigned int version; // 스왑 영역 레이아웃 버전 35 unsigned int last_page; // 영역에 저장된 마지막 페이지 36 unsigned int nr_badpages; // 불량 페이지의 개수 37 unsigned int padding[125]; // 디스크 섹터 크기 맞추기용 패딩 38 unsigned int badpages[1]; // 불량 페이지 수 39 } info; 40 }; 11.2 부터는 PTE → swap 파일로 swap out할 때 어떤 과정을 거치는 지 설명되어 있다. 스왑 캐시나 복구 과정도 나와있다.\n여유로울 때 추가 예정\n어떻게 관리하는지는 위의 구조체를 활용하는구나~ 정도로 이해가 된다. 디스크 섹터나 선형 탐색용 인덱스 필드 같은 최적화 요소들이 많이 있는 게 인상적이다.\n","date":"2026-05-23T00:00:00Z","image":"/p/%EC%BB%A4%EB%84%90%EC%9D%80-swap%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B4%80%EB%A6%AC%ED%95%A0%EA%B9%8C/swap_post.png","permalink":"/p/%EC%BB%A4%EB%84%90%EC%9D%80-swap%EC%9D%84-%EC%96%B4%EB%96%BB%EA%B2%8C-%EA%B4%80%EB%A6%AC%ED%95%A0%EA%B9%8C/","title":"커널은 swap을 어떻게 관리할까?"},{"content":"여기서부터 본문 작성\u0026hellip;\n소제목 내용 내용 내용\n소제목 2 1 2 3 4 5 6 7 8 9 10 11 12 13 --- ### 이미지 추가 **Stack 테마는 글마다 폴더로 관리하는 방식을 권장해요.** content/ └── post/ └── my-first-post/ ├── index.md ← 글 파일 ├── cover.jpg ← 커버 이미지 └── photo1.jpg ← 본문 이미지 ","date":"2026-03-15T00:00:00Z","permalink":"/p/%EC%B2%AB-%EB%B2%88%EC%A7%B8-%EA%B8%80/","title":"첫 번째 글"}]