리눅스 커널 파일시스템 기본 [1]

이미지
파일시스템이란 하드디스크, SSD, 플래시 메모리와 같은 저장장치 위에 파일과 디렉터리를 체계적으로 정리(organize)하는 방법을 말합니다. 파일시스템의 종류는 매우 다양합니다 (FAT, ext4, btrfs, NTFS 등). 그리고 한 대의 컴퓨터에서 같은 파일시스템 종류가 여러 개 동시에 사용될 수도 있습니다. 파일시스템마다 파일과 디렉터리, 사용자 데이터, 그리고 내부적으로 사용하는 메타데이터를 관리하는 방식이 서로 다르긴 하지만, 거의 모든 파일시스템에 공통적으로 사용되는 몇 가지 기본 개념들이 있습니다 (이 중 일부 개념은 저장장치(storage)와 메모리 양쪽에 존재하고, 일부는 메모리에만 존재합니다.): 슈퍼블록(superblock) : 해당 파일시스템의 기본 정보를 담고 있습니다. 예를 들어 블록 크기, 루트 아이노드, 파일시스템 전체 크기 같은 정보죠. 슈퍼블록은 저장장치와 메모리 모두에 존재하는데, 메모리에는 속도 향상을 위한 캐싱 용도로 복사되어 있습니다. 파일(file) :현재 열려있는 파일에 관한 정보(예: 현재 읽기 위치 등)를 담고 있는데, 이 정보는 메모리에만 존재합니다. 아이노드(inode) : 아이노드는 디스크에 저장된 파일을 고유하게 식별하는 역할을 합니다. 아이노드는 파일 크기, 접근 권한, 파일 종류 등 다양한 속성도 함께 가지고 있죠. 이 아이노드는 저장장치와 메모리 양쪽에 존재하며, 메모리에는 캐시 목적 등으로 복사되어 있습니다. 덴트리(dentry) : 덴트리(dentry)는 파일 이름과 아이노드(inode)를 연결하는 역할을 합니다. 덴트리 역시 저장장치와 메모리 양쪽에 존재하며, 메모리에는 캐싱 목적으로 복사되어 있습니다. struct ext4_inode 내부의 i_block에서 스토리지의 각 block들을 가리킨다. EXT4_N_BLOCKS 크기는 15로 ext4가 지원하는 데이터 블록 주소 지정 방식의 표준 크기이며, 이를 통해 작은 파일부터 아주 큰 파일까지 효율적으로 저장 위치를 관리할 수 있습니...

[C++ 20] Study 003 - switch statement, enum class 범위 지정, 3방향 비교 연산자

이 글 부터는 html로 작성하지 않고 코드를 대충 쓸 예정이다. 속도가 안 나온다.

                                                                                    
The code will be writeen by courier style
                                                                                    

일단 작성하고 나서 마지막에 코드형식을 바꾸도록 하자.

switch 문에 지정할 수 있는 표현식은 결괏값이 정수 타입이거나, 정수 타입으로 변환할 수 있는 타입이거나, 열거 타입이거나, 강타입 열거타입이어야 한다.

enum class mode { a, b, c };

mode md { a };
switch (md) {
    using enum mode;
    case a:
        // do something;
        [[fallthrough]]
        /* 컴파일러가 경고문을 띄우지 않게 함. 의도적인 fallthrough 임을 컴파일러에게 알린다. 어트리뷰트 중 하나임. */
    case b:
    case c:
        // do something;
        break;
}

위와 같이 using enum을 switch 문 안에서만 사용하도록 할 수 있다. 또한 switch 문에서도 초기자를 사용할 수 있다.

다음으로 3방향 비교 연산자(three-way comparison operator)에 대해 알아보자. <=> 로 표현되는 이 연산자는 표현식의 평가 결과가 같은지, 큰지, 작은지 알려준다. 정수 타입의 경우 strong_ordering, 부동소수점 타입의 경우 partial_ordering, 직접 정의한 타입에 대해 weak_ordering이 있다. 예시는 다음과 같다.

int i { 1 };
strong_ordering result { i <=> 0 };
if (result == strong_ordering::equal) { cout << "equal" << endl; };
if (result == strong_ordering::greater) { cout << "greater" << endl; };
if (result == strong_ordering::less) { cout << "less" << endl; };

named comparison function으로 비교결과를 알 수도 있다.

int i { 1 };
strong_ordering result { i <=> 0 };
if (is_eq(result)) { cout << "equal" << endl; };
if (is_gt(result)) { cout << "greater" << endl; };
if (is_lt(result)) { cout << "less" << endl; };



댓글

이 블로그의 인기 게시물

[FPGA] Rocket Chip Generator

리눅스 커널 파일 시스템 [2] 코드 분석 - generic_file_read_iter()