2023의 게시물 표시

리눅스 커널 파일시스템 기본 [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 004 - 새로 알게된 것, 생소한 개념

본 Study 문서들은 '전문가를 위한 C++, Marc Gregoire 저' 책을 보고 작성하였다. 생소한 개념에 대해서 페이지 번호를 적도록 하겠다. 하나 하나 자세히 작성하면서 보니 너무 느리게 보게 된다. C++은 C와 달리 (C의 특정 컴파일러는 매개변수를 받지 않는 경우 void를 적어야 할 수 있다.) 매개변수를 받지 않는 경우 void를 적지 않아도 된다. auto 리턴 타입 - 90p __func__: 현재 함수의 이름 attribute - 91p [[nodiscard]] - 92p [[maybe_unused]] - 93p [[noreturn]] - 93p [[deprecated]] - 95p [[likely]], [[unlikely]] - 95p 배열 크기 구하기 - size_t arraySize { std::size(myArray) }; - 97p C++에서 배열 사용 - std::array나 std::vector 사용 추천 - 98p 템플릿 - 12장 optional - 101p 구조적 바인딩 - 102p 제네릭 프로그래밍 - 재사용 가능한 코드 작성 - 6장 -->  이를 지원하기 위한 핵심 요소가 템플릿 - 12장 design principle of generality 객체: 데이터와 동작을 하나로 묶은 것 value에 대한 매개변수화를 확장 --> type에 대한 매개변수화가 템플릿이다 - 622p --> 나중에 볼 것

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

이 글 부터는 html로 작성하지 않고 코드를 대충 쓸 예정이다. 속도가 안 나온다.                                                                                         The code will be writeen by courier style                                                                                      일단 작성하고 나서 마지막에 코드형식을 바꾸도록 하자. switch 문에 지정할 수 있는 표현식은 결괏값이 정수 타입이거나, 정수 타입으로 변환할 수 있는 타입이거나, 열거 타입이거나, 강타입 ...

[C++ 20] Study 002 - enum 대신 enum class 사용, 모듈 만들어서 export, import 하기. 초기자(initializer)

enum 대신 enum class를 사용하라. enum class는 strongly typed enumeration type으로서 값이 정수로 변환되지 않고, 열거 타입 값의 scope가 자동으로 확장되지 않아 상위 스코프의 이름과 같은 이름을 사용하더라도 충돌이 생기지 않는다. enum class PieceType {King, Queen, Rook}; PieceType piece { PieceType::King }; 다음으로 모듈을 만들어보자. 모듈을 만들기 위해 모듈 파일을 만든다. 확장자는 cpp나 ixx로 하면 된다 (둘의 차이는 아직 모르겠음. MSVC 기준). 솔루션 탐색기에서 모듈 파일 우클릭 --> 속성 클릭 --> C/C++ --> 고급 --> 컴파일 옵션을 C++모듈 코드로 컴파일(/interface)로 변경한다. 모듈 파일의 내용은 다음과 같다. // newModule.ixx export module newModule; 메인 파일에서 해당 모듈을 import 한다. 메인 파일의 속성에서 컴파일 옵션은 C++ 모듈 내부 파티션으로 컴파일(/internalPartition) 이다. // main.cpp import newModule; C++ 17에서는 초기자(initializer)가 소개되었다. if statement 안에서만 쓰이는 변수를 만들 수 있다 (붙어있는 else if 와 else 문에서도 쓸 수 있다.). 다음과 같이 사용한다. if (int i{ 1 }; i > 0) cout

[C++ 20] Study 001 - visual C++에서 모듈 임포트 (module import), 균일 초기화 (uniform initialization), std::numeric_limits 클래스 템플릿 기초

C++20부터 추가된 모듈 기능을 이용하기. visual C++를 사용한다. 모듈 import를 사용하기 위해 다음을 수행해야한다. 1. main.cpp 파일을 만들고 속성 페이지에 들어간다. Alt + p, p 2. "C/C++ --> 언어"에서 "C++ 언어 표준"을 "ISO C++ 20 표준(/std:c++20)"으로 바꾼다. 3. "실험용 C++ 표준 라이브러리 모듈 사용"을 "예(/experimental:module)"로 바꾼다. 4. "C/C++ --> 고급"으로 들어간다. 5. "컴파일 옵션"을 "C++ 모듈 내부 파티션으로 컴파일(/internalPartition)"으로 변경한다. import <iostream>; // 기존에는 include <iostream> // 세미콜론을 끝에 붙여야 한다. 어떤 모듈을 사용하고 싶다면 import 문으로 불러온다. C++ 표준 라이브러리에서 제공하는 모든 기능은 모듈로 제공된다. 직접 모듈을 정의하는 것도 가능하다. C 표준 라이브러리 헤더는 import로 불러오지 못할 수 있음. #include <abc.h>와 같이 작성한다. 용어정리 directive: 전처리기에 전달할 사항 표현. # 문자로 시작함. 초기화 시 기존 대입 문법 대신 균일 초기화(unifrom initalization)를 사용하는 것이 바람직하다. // 기존 대입 문법 초기화 int initialized = 1; // 균일 초기화 사용 int initialized_by_ui { 1 }; // long long 형의 경우 LL을 붙인다. long long longlong_var { 135LL }; // unsigned 의 경우 U를 붙인다. ULL unsigned long long ulonglong_var { 135ULL };...

[C++] Study - namespace, reference 기본

이름공간(namespace) std: C++ 표준 라이브러리의 모든 함수, 객체 등이 정의된 namespace 중복된 이름을 가진 객체를 구분하기 위해 쓰임. 참조자(reference) : 변수나 상수를 가리키는 포인터 이외의 방식 int a1 = 2; int& a2 = a1; a2 = 4; // a1 값과 a2의 값은 4로 똑같다. 포인터와의 차이점: 정의 시에 누구의 참조인지 명시해야 함. 참조 대상은 변할 수 없음. 레퍼런스는 메모리 상에 존재하지 않을 수 있음. int x; int& y = x; int& z = y; // int& z = x; 와 동일 // y와 z는 모두 x의 참조자임. 예를 들어 cin은 레퍼런스로 값을 받아들인다. 상수도 레퍼런스를 가질 수 있지만 상수는 변하는 값이 아니기 때문에 const로 선언 시에만 레퍼런스를 가질 수 있다. const int& ref = 5; 레퍼런스 배열은 존재할 수 없지만 배열의 레퍼런스는 가능하다. // 다음은 불가능 // int& ref[2] = {arr1, arr2}; // 다음은 가능 int arr[2] = {1, 2}; int(&ref)[2] = arr; ref[1] = 5;

생리학 공부(001)

취미로 생리학 공부를 시작하려한다. 용어가 워낙 익숙치 않아서 용어 정리를 하면서 글을 작성할 예정이다. physiology at a galnce 를 보고 공부하려 한다. 1. Homeostasis (항상성) and the physiology of proteins The internal environment of body remained remarkably constant homeostasis (is Greek for 'staying the same'): the ability of physiological systems to maintain conditions within the body in a relatively constant state of equilibrium. Examples maintains H+ ion concentrations of body fluids within narrow limits blood glucose by the release of insulin body temperature heart rate and blood pressure Organ 내부에서 operate 하기도 하고 organ 간에 interaction 하여 이루어지기도 한다. 각 세포들이 항상성으로부터 이득을 얻으며, 각 세포들은 항상성 유지를 위해 공헌한다. 하나 이상의 functional systems이 lose their ability 하게 되기 전까지 continuity of life를 제공한다. 읽을 차례 15p Negative feedback control hydrophobic 소수성의 hydrophilic  친수성의, 물을 잘 흡수하는 membrane  세포막 lipid 지질, 지방질 intricate 복잡한 reciprocal 상호간의 interplay 상호 작용 intracellular 세포 내의, 세포 간의 extracellular 세포 밖의 dysfunction 기능 장애

[코딩테스트] DFS, BFS 중 탐색 알고리즘 고르는 팁

아래 팁이 절대적인 기준은 아니다. 많은 문제를 풀어보면서 스스로 익히는 것이 최고이지만 시간이 부족하다면 팁이 필요할 것이다. 1. 탐색의 깊이(depth)가 깊다면 BFS일 가능성이 높다. 2. 위와 같은 이유로 2차원 맵이 크다면 BFS일 가능성이 높다. 3. 마찬가지로 탐색 가지(자식)수가 많아도 BFS일 가능성이 있다. 4. 반대로 깊이가 그리 깊지 않다면 DFS일 가능성이 있다 (대략 30이하 정도이려나요). 5. 이동이 제한적인 경우 DFS일 가능성이 있다. 예를 들어 sparse 한 2D array인 경우. 혹은 탐색 가지수(자식수)가 적은 경우. 6. 가지치기할 여지가 많다면 DFS일 가능성이 있다. 7. 2차원 배열에서 단순히 최소거리를 재는 것이라면 BFS로 하면 된다 (최소를 저장할 필요도 없다.). 8. 중복해서 visit해야하는 문제인 경우 DFS일 가능성이 있다. 본인은 PS 고수가 아니기 때문에 잘못된 내용일 수 있지만... 3개월 동안 전력을 다해 깨달은 결과입니다. 문제에서 탐색의 depth와 width를 고려하여 DFS와 BFS를 신중히 선택해야 합니다. 예를 들어, 경험상 2D array에서 단순 최소거리를 구하는 경우 BFS를 사용해야 합니다. 추가팁: DFS 문제 풀 시에 상태 원상복구를 항상 신경써야 합니다. 변하는 상태는 파라미터로 넘겨주는 것이 상책일 때가 있습니다.

[코딩테스트] 2차원 격자 DFS, BFS 문제 팁 (C++)

3개월 정도 코딩테스트를 준비하면서 얻은 팁을 공유하고자 한다. 2차원 격자(배열)에 대해 DFS, BFS로 문제를 풀 때 사용할 수 있는 팁을 써보겠다. 먼저 격자의 좌표를 나타낼 때에는 변수명으로 x,y 혹은 y,x 보다 r, c를 사용하는 것이 낫다. 개인차가 있을 것 같지만 y, x를 사용하면 직관적으로 행,열을 구분하는게 뇌에서 한 번 걸리는 느낌이 들었다. 하지만 row(행), column(열)의 앞문자인 r, c를 사용하니 한 번도 헷갈린 적이 없다. 특히 선형대수학을 이수했다면 r, c 표현이 익숙할 것이다. // c == 0 c == 1 c == 2 c == 3 ... // r == 0 // r == 1 // r == 2 // r == 3 // ... #include <iostream> using namespace std; int MAP[100][100]; int N; int main() { cin >> N; for (int r = 0; r > MAP[r][c]; } } } 또 2차원 배열에서 상하좌우 이동 시에 다음 테크닉을 사용하면 코드가 간결해진다 (간결해질뿐 아니라 가독성도 올라간다.). dr과 dc 배열을 사용하여 상하좌우를 나타냈다. DFS() 내에서 for 문으로 4가지 경우를 순회하여 상하좌우를 나타낼 수 있다. 이렇게 dr, dc 배열을 사용하면 상하좌우 이동 뿐만아니라 대각선 이동이나 체스에서 knight의 이동 등의 더 복잡한 이동도 표현할 수 있다. #include <iostream> using namespace std; int MAP[100][100]; bool visit[100][100]; int N; bool arrival; // dr, dc 배열을 이용하여 상하좌우 표현. 이 경우 정확히는 좌우상하이다. // 문제에 따라 특정 방향으로 먼저 향해야 이득인 경우가 있다 // (pruning을 통해 DFS 탐색 ...