2025/06 5

read/write과 sendfile 방식 비교

Context Switching이란 커널 모드와 사용자 모드 간의 전환을 의미합니다.현재 실행 중인 사용자 프로세스 (user mode) -> 커널 코드 (kernel mode)로 전환하거나 그 반대로 바뀌는 것을 말하는데 이 전환은 OS 레벨에서 이루어집니다. 예를 들어 read 호출 시 사용자 코드가 실행되며 시스템 콜이 발생하고, user mode에서 kernel mode로 전환되게 됩니다. 커널 에서 해당 fd를 확인하고 디스크로부터 실제 데이터를 읽고 커널 내부 버퍼에 복사를 수행합니다. 커널은 내부 함수를 사용하여 사용자 공간 버퍼로 데이터를 복사한뒤 작업이 끝나면 Kernel mode에서 User Mode로 돌아갑니다. 따라서 read, write는 2번의 context switch가 발생하..

C++ 2025.06.20

12. [C++] atomic/ mutex/ spin lock

멀티 코어 환경에서 동기화 자원의 접근을 보장하는 방법은 여러가지가 있습니다. 대표적인 방법으로는 os 가 제공하는 동기화 방법인 mutex와 cpu의 하드웨어 명령어를 직접사용하는 atomic 방법이 있습니다. 추가로, 락이 풀릴 때까지 무한 루프를 돌며(cpu를 계속 점유하며) 대기하는 방식인 스핀락이 있습니다. 오늘은 이 세가지 방식에 대해서 알아보겠습니다. 1. mutexmutex 방식은 스레드가 자원을 사용하려고 할 때 lock을 걸어 (sleep) 대기하여 동기화 자원의 접근을 보장하는 방법입니다. 이는 운영체제 커널이 관리하는 락 메커니즘을 사용하며, 락을 잡지 못한 스레드는 대기 상태(sleep)로 들어가면서 다른 스레드가 CPU를 쓸 수 있도록 해줍니다. 그래서 락이 풀릴 때까지 해당 ..

C++ 2025.06.15

11. [C++] 파티션 메모리 복사 (dd 명령어, 파일 입출력)

개요eMMC와 같은 저장 장치는 하나의 물리적 장치입니다.이 장치를 논리적으로 나누는 것을 파티션이라고 하는데, 저장장치 안에서 영역을 구분해주는 역할을 합니다.리눅스와 같은 운영체제에서는 커널 내부에 VFS(Virtual File System)이라는 추상화 계층이 있어 여러 파일 시스템과 장치 파일을 통합 관리합니다. eMMC와 같은 특정 하드웨어에 유저가 접근하려면, VFS가 유저의 요청을 디바이스 드라이버로 전달하고, 드라이버가 하드웨어와 직접 통신하여 데이터를 읽거나 씁니다. 따라서 유저는 직접 물리 메모리에 접근하지 않고, 커널을 통해 메모리와 하드웨어 자원에 접근할 수 있습니다. 리눅스 커널 내부의 VFS(Virtural File System)는 /proc, /sys, /dev 와 같은 가상 ..

C++ 2025.06.03

10. [C++] 가중치가 없는 그래프에서 사이클 탐지 및 지름 구하기

문제)N개의 정점과 M개의 간선을 가진 가중지가 없는 그래프 G가 주어진다. 그래프 G 에서 사이클을 이루는 노드들이 존재할 경우 사이클에 포함된 노드를 제거한 이후 남은 노드 및 간선에서 가장 먼 두 노드의 거리를 출력한다. 예시 입력)10 111 22 33 13 44 55 62 78 99 10 단계1. 가중치가 없는 양방향 그래프를 구성한다. : 연결 확인 시 어느 방향으로든 이동 가능한 경우 graph[A].push_back(B), graph[B].push_back(A)로 인접리스트 구현#include #include #include using namespace std;const int MAX = 100005;vector graph[MAX];int main() { int N, M; ci..

C++ 2025.06.03

09. [C++] 벡터와 리스트에서의 erase/remove 사용법

벡터와 리스트에서의 erase 사용법에 대해 알아보기 전에 벡터와 리스트를 잠시 비교해보겠습니다.vector와 list는 모두 sequence container로, sequence container에는 forward_list, list, deque, vector, array 등이 있습니다. list의 경우에는 bidirectonal iterator를 사용하는 이중 연결리스트(앞뒤 이동만 가능)이고, vector의 경우에는 contiguous iterator를 사용하는 연속된 배열(Random access 지원)이다. vector는 인덱스 접근이 빠르고 메모리를 효율적으로 사용할 수 있다는 장점이 있지만 연속된 배열이기 때문에 앞이나 중간에 데이터를 삽입하거나 삭제하면 해당 원소의 뒤 원소들을 모두 이동..

C++ 2025.06.01