분류 전체보기
-
[메모리 풀링] 중앙 풀 + 스레드 로컬 슬랩(下편)개발/C·C++ 2025. 7. 3. 17:47
[메모리 풀링] 중앙 풀 + 스레드 로컬 슬랩(上편)에서 이어집니다. 전역 메모리 풀링의 문제점메모리 요청이 들어올 때마다 풀링 시스템에서 할당받고 반환하는 것은 효율적이지 않다고 했다. 락 프리이든 락이든 메모리 블록을 할당하고 반환할 때마다 경합이 발생할 수 있고, 그 요청과 반환 때마다 특정 로직이 실행되는 것이기 때문이다. 또한 메모리 블록이 파편화돼서 관리되기 때문에 캐시 혜택을 보기 어려운 상황이 된다는 것이 단점으로 지적된다. 스레드가 매번 새로운 메모리 블록을 사용하는 상황에서는, 기존 캐시 라인이 계속 무효화되기 때문에 새 캐시를 올리는 사이클이 추가된다. 메모리 풀링을 굳이 사용하지 않아도 되는 환경에서는 무시해도 되는 오버헤드일 수 있지만, 메모리 풀링을 적용해야 하는 환경이라면 고려..
-
[백준] 2573번 빙산알고리즘/백준 2025. 7. 3. 11:17
문제 링크https://www.acmicpc.net/problem/2573 문제 해설코드에 중복 로직이 있다. 실무였으면 함수로 뺐을 테지만 여기선 그냥 놔뒀다. 더 고민해보면 최적화를 할 수 있을 것 같지만, 지금 코드가 그렇다고 성능이 나쁜 건 아니다. 대충 보니까 상위 15% 정도는 된다. 다른 엄청나게 최적화된 코드보다 가독성이 좋다. 읽기 쉬운 글은 덜 전문적으로 보일 수 있으나 이해가 쉬운 것처럼. 전체 코드 #include #include using namespace std;int map[300][300]{};bool visited[300][300]{};int adjacent_row[] = {1, 0, -1, 0};int adjacent_col[] = {0, 1, 0, -1};int N, M..
-
[메모리 풀링] 중앙 풀 + 스레드 로컬 슬랩(上편)개발/C·C++ 2025. 7. 2. 16:01
요새는 정리할 모든 내용들을 노션에 남겼고 블로그는 사용을 잘 안 하게 됐다. 내 공부가 목적이기도 하고 노션이 아무래도 문서를 구조화하기에 특화되어 사용하기 편한 것도 있었다. 여기에서는 고민했던 과정을 남겨본다. 메모리 풀링의 필요성현대적인 OS에서는 힙 관리자가 성능이 좋아서 필요할 때마다 new/delete를 해줘도 된다는 말이 있다. 하지만 힙 관리자는 여전히 use-after-free 문제에서 자유롭지 못하고, 메모리 풀링을 하는 것보다 빠를 수는 없을 것 같다. 메모리 풀링이 필요한 환경이 여전히 존재한다. 메모리 풀링을 직접 구현해보고 싶을 때 전반적인 흐름이나 컨셉이 중요하므로 설명은 컨셉과 흐름에 중점을 두겠다. 메모리 풀링의 기본 흐름프로젝트에 적용한 기존 메모리 풀링 구조는 전역 락..
-
[백준] 2468번 안전 영역알고리즘/백준 2025. 6. 18. 13:56
문제 링크https://www.acmicpc.net/problem/2468 문제 해설단지 번호 붙이기와 많이 비슷하다. 3차 반복문으로 해서 가장 바깥 반복문은 강수량이 0부터 최대값까지 해서 경우의 수를 구한다. 최대값은 100으로 해도 될 수 있는데 굳이 불필요하게 순회하기 싫어서 max_height를 구해 거기까지만 순회하도록 했다. 전체 코드 #include #include using namespace std;array, 100> map;array, 100> visited;int N;void dfs(int row, int col, int height);void init_visited();int adj_row[] = { 1, 0, -1, 0 };int adj_col[] = { 0, 1, 0, -1 ..
-
[백준] 13913 숨바꼭질4알고리즘/백준 2025. 6. 17. 23:55
문제 링크https://www.acmicpc.net/problem/13913 문제 해설쉽게 생각하면 쉽고 어렵게 생각하면 어려운 것 같다. 이게 출력이 모든 경우의 수를 검사하는 게 아니고 하나만 출력하면 되는 거라 어렵지는 않을 거다. 인덱스 경계를 늘 조심하도록 하자! 전체 코드#include #include #include #include #include using namespace std;int N, K;const int MAX_SIZE = 200000;array seconds;int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); seconds.fill(-1); queue q; cin >> N >> K; seco..
-
[백준] 5014 스타트 링크알고리즘/백준 2025. 6. 17. 23:50
문제 링크https://www.acmicpc.net/problem/5014 문제 해설숨바꼭질을 풀었다면 어렵지 않다. 기본 원리가 동일하다. 전체 코드#include #include #include using namespace std;int F, S, G, U, D;const int MAX = 1000000;array building;int main(){ ios::sync_with_stdio(false); cin.tie(nullptr); building.fill(-1); queue q; cin >> F >> S >> G >> U >> D; building[S] = 0; q.push(S); while (q.empty() == false) { int current = q.front(); q.pop(); ..
-
[백준] 1697번 숨바꼭질알고리즘/백준 2025. 6. 13. 18:13
문제링크https://www.acmicpc.net/problem/1697 해설seconds 배열 요소가 갱신됐으면 새로운 값으로 갱신되면 안 된다. 새로 갱신되는 값은 기존 값보다 무조건 클 것이기 때문이다. 우리는 최소 값을 구해야 하니까 방문한 요소는 건너뛰어 값을 보호하고 비효율도 예방한다. 그전에는 이런 최소 값을 구할 때 queue를 pair로 선언해 위치값과 거리 값을 같이 관리하는는 걸 선호했지만 이번에는 (x, y) 형태의 좌표에 관한 문제가 아니라 값을 갱신해나가면서 최소 값을 찾는 것이기 때문에 별도의 visited 배열을 두지 않고 하나의 정수형 배열에서 방문/미방문을 구분할 수 있다. 전체 코드#include #include #include using namespace std;in..
-
[백준] 7569번 토마토알고리즘/백준 2025. 6. 13. 12:37
문제 링크https://www.acmicpc.net/problem/7569 해설3차원 배열로 풀어도 되고 2차원 배열로 풀어도 된다. 나는 2차원 배열로 풀었다. 2차원 배열로 풀 때는 행 인덱스 처리를 잘해줘야 하는 케이스는 행이 바뀔 때 층이 바뀌는 때다. 3차원 배열로는 안 풀어봤지만 층 인덱스가 별도로 있으니 실수할 가능성이 적지만 2차원으로 할 때는 층이 바뀌는 경우를 그냥 지나칠 수 있다(내 얘기). 인접 토마토를 검사에서 가로 세로를 검사할 때 같은 층인 경우에만 탐색을 해야 한다. 코드가 최적화 여지가 있어 보이긴 한데..일단 넘어간다. while (q.empty() == false) { auto [pos, day] = q.front(); auto [n,..