그때그때 CS 정리 19

thisown 속성: Python과 C++ 객체 메모리 관리의 이해

thisown이란?thisown은 Python과 C++ 간 객체 메모리 소유권을 관리하기 위해 사용되는 속성입니다. SWIG(Simplified Wrapper and Interface Generator)를 통해 Python과 C++를 연결할 때 생성된 객체의 소유권(즉, 메모리 관리 책임)이 Python에 있는지 C++에 있는지를 명시적으로 제어할 수 있습니다.thisown의 동작 원리Python과 C++ 메모리 관리 차이:Python: 가비지 컬렉터로 메모리를 자동 관리.C++: 수동 메모리 관리를 사용하며, 명시적으로 객체 생성 및 삭제 필요.소유권 플래그:thisown = True: Python이 객체의 소유권을 가짐.Python에서 객체가 삭제될 때 C++ 메모리도 해제됨.thisown = Fal..

ProcessPoolExecutor의 코드 및 동작원리

1. 전반적인 동작 방식1.1. 초기화초기화 시, 다음과 같은 중요한 속성들이 설정됩니다:max_workers: 사용할 최대 워커 프로세스 수를 결정. 기본값은 CPU 코어 수를 기반으로 설정.mp_context: 멀티프로세싱 컨텍스트(spawn, fork 등) 설정. 플랫폼 및 옵션에 따라 안전한 방식을 사용.max_tasks_per_child: 각 워커가 처리할 최대 작업 수 설정. 초과 시 프로세스는 종료되고 새로운 프로세스가 생성됨.1.2. 작업 제출 (submit)사용자로부터 작업이 제출되면 다음 과정이 진행됩니다:Future 객체 생성: 작업의 결과를 비동기적으로 관리하기 위한 객체.작업 항목 생성 및 저장: _WorkItem으로 작업 정의 후 대기 목록(_pending_work_items)에..

GIL이 뭐고, 어떻게 해결할 수 있는지

GIL(Global Interpreter Lock)을 파이썬에 도입한 이유GIL(Global Interpreter Lock)은 CPython(파이썬의 가장 널리 사용되는 구현체)에서 도입된 메커니즘으로, 여러 스레드가 동시에 실행될 때, 한 번에 하나의 스레드만 Python 바이트코드를 실행할 수 있도록 제한합니다. 이는 다중 스레드 환경에서 데이터 안정성과 성능을 유지하기 위해 고안된 것입니다.1. GIL의 도입 이유(1) 메모리 관리의 간단화CPython의 메모리 관리 구조:CPython은 참조 카운트(reference counting) 기반으로 객체의 메모리를 관리합니다.참조 카운트는 각 객체가 몇 개의 변수에서 참조되는지 기록하고, 참조 카운트가 0이 되면 메모리를 해제합니다.문제:여러 스레드가 ..

멀티스레드(ThreadPoolExecutor), 멀티프로세서(ProcessPoolExecutor) 비교

배경다층구조 json 데이터를 3가지 테이블로, 분리하는 작업이 오래걸림(25초)일반실행, 멀티스레드, 멀티프로세서 각각 방식에서 어떤 방식이 빠른지 관찰하려 한다.일반 실행시간병렬 처리 없이 단일 스레드에서 모든 데이터 처리를 수행하니, 25초가 걸렸다.멀티스레드 실행 시간 분석스레드 수총 소요 시간총 함수 호출 수wait 호출 수acquire 호출 수as_completed 호출 누적 시간113.69 초3,79621513.54 초215.50 초5,207102815.35 초515.23 초7,494106715.07 초1016.33 초11,3342013216.18 초2016.11 초19,0003925815.72 초주요 관찰 사항스레드 수 1일 때 최단 시간(13.69초)이 소요되었습니다.스레드 수 증가에 따..

ThreadPoolExecutor 내부 구조 분석(큐를 활용한 멀티스레딩)

배경멀티 스레딩에 이해가 부족해서, ThreadPoolExecutor의 내부 구조를 알아보고자함분석요약 : ThreadPoolExecutor`는 Python의 표준 라이브러리에서 제공하는 멀티스레딩 도구로, 여러 스레드가 동시에 작업을 실행할 수 있도록 관리하는 역할을 함. 각 스레드가 작업 큐에서 작업을 가져와 수행하고, 스레드 풀이 종료될 때까지 작업을 처리하는게 기본적인 흐름초기화 단계ThreadPoolExecutor가 생성될 때, 최대 스레드 수, 작업 큐, 세마포어 등이 설정됩니다.max_workers 인자로 최대 스레드 수를 설정하며, 지정하지 않으면 시스템 CPU 코어 수 + 4 또는 최대 32로 기본 설정됩니다.초기화 함수(initializer)와 초기화 인자(initargs)가 제공되면,..

json 평활화 작업을 통한, 멀티스레드 속도 비교(ThreadPoolExecutor)

배경다층구조 json 데이터를 3가지 테이블로, 분리하는 작업 필요.예전 프로젝트 당시 glue를 통한 분산처리를 했었음.그게 최선이었냐는 질문을 받음.로컬에서 빠르게 할 수 있는 방법을 찾아서, 멀티스레드를 적용하기로함.해결과정ThreadPoolExecutor를 적용해 코드 작성for문을 10000번 실행 하는데, 한번에 배치실행수(스레드수)를 조절하며 비교오히려 스레드 수가 작을때, 빠른 현상... 왜지..스레드 수총 소요 시간총 함수 호출 수wait 호출 수acquire 호출 수as_completed 호출 누적 시간113.69 초3,79621513.54 초215.50 초5,207102815.35 초515.23 초7,494106715.07 초1016.33 초11,3342013216.18 초2016.1..

코드에서 배치 처리가 효율성을 가져오는 이유

배경pdf-rag를 제작할때, 많은 장수의 pdf를 처리하고 저장해야 했는데 for문으로 한장씩 처리해 속도가 느렸다.더 빠른 방법이 없을까 고민하다 batch 처리에 대해 알게 됐고, 무지하게 빨라져 그 이유가 궁금해 찾아봤다.내 코드에서 배치 처리가 빨랐던 이유1. I/O 효율성 - 디스크 접근 및 파일 처리 최적화파일을 한 번에 작은 단위로 나누어 처리하는 대신, 여러 페이지를 한꺼번에 배치로 처리함으로써 디스크 I/O 작업을 최적화할 수 있습니다. 디스크 접근은 일반적으로 매우 비용이 많이 드는 작업입니다. 파일을 여러 번 나누어 읽고 쓰면, 각 I/O 작업마다 디스크의 시작 및 탐색(Seek) 시간과 파일 시스템 오버헤드가 발생합니다.디스크 접근 시간: 디스크에서 데이터를 읽고 쓰는 시간은 랜덤..

병렬 처리 몇 가지와 사용처

조사하게된 배경https://makenow90.tistory.com/66병렬 처리의 세 가지 주요 개념: 비동기 처리, 멀티스레드, 멀티코어병렬 처리는 작업의 특성에 따라 적합한 방식이 다릅니다. I/O 병렬 처리는 주로 입출력 대기 시간이 많은 작업에서, 멀티스레드는 경량 작업이나 I/O 바운드 작업에서, 그리고 멀티코어는 CPU 집약적인 작업에서 각각 효율적입니다. 여기에서는 각 방식의 특징과, 적절한 코드 예시를 설명하겠습니다.1. 비동기 처리 비동기 처리란, 작업이 완료될 때까지 기다리지 않고 다른 작업을 계속 진행하는 방식을 의미합니다.이는 I/O 작업, 네트워크 요청, 파일 읽기/쓰기 등 대기 시간이 발생하는 작업에서 효율적으로 사용됩니다.Python에서는 asyncio, aiohttp, **..

GPU 작동원리

작업 순서작업 분할 및 할당데이터 로드 및 준비병렬 연산 수행캐시 시스템 활용특화 유닛 활용결과 통합 및 출력상호작용과 피드백 루프각 작업 설명1. 작업 분할 및 할당명령 디코딩:CPU는 복잡한 고수준 명령어를 해석하고, 이를 GPU가 처리할 수 있는 작은 작업 단위로 분할하는 과정을 수행합니다. 이 과정은 CPU가 전체 작업을 여러 개의 간단한 연산으로 나누어, 병렬 처리가 가능한 형태로 만드는 것입니다. 이렇게 분할된 작업 단위는 GPU의 대규모 병렬 처리 능력을 최대한 활용할 수 있도록 설계됩니다.커널 런칭:분할된 작은 작업 단위들은 "커널(Kernel)"이라고 불립니다. 커널은 GPU에서 실행될 수 있는 프로그램의 가장 작은 단위로, 특정 연산을 수행하도록 설계됩니다. CPU는 이러한 커널들을 G..

CPU와 GPU의 차이점

CPUCPU의 구성연산 논리 장치 (ALU, Arithmetic Logic Unit):ALU는 CPU에서 기본적인 산술 및 논리 연산을 수행하는 핵심 구성 요소입니다. 이 장치는 덧셈, 뺄셈, 곱셈 등의 사칙연산 뿐만 아니라, AND, OR, NOT 등의 논리 연산도 처리합니다. ALU는 컴퓨터가 명령을 실행할 때 필요한 계산을 담당하며, 모든 연산 작업의 중심에 위치합니다.제어 장치 (CU, Control Unit):제어 장치는 CPU의 "뇌" 역할을 하며, 프로그램 명령어를 해석하고 실행을 지시하는 역할을 합니다. CU는 CPU의 다른 구성 요소와 시스템 메모리 간의 데이터 흐름을 관리하며, 특정 작업을 수행하기 위해 필요한 데이터와 명령어를 올바르게 조정하고 전달합니다. 이는 CPU가 명령어를 순차..