본문 바로가기

Etc/Study

(5)
자료구조 [Queue, Stack, Heap] ✅ 2. 큐 / 스택 / 셋 / 맵의 본질적 차이이제 이 네 가지 자료구조의 핵심 철학, 자료 보관 방식, 접근 패턴을 비교해볼게요.항목큐 (Queue)스택 (Stack)셋 (Set)맵 (Map / Dictionary)추상 개념줄 (대기열)쌓기 (접시 더미)집합 (중복 없음)키-값 대응 표저장 순서 유지예: FIFO예: LIFO보통 없음 (순서 중요 X)보통 없음 (Key 중심 접근)중복 허용✅ 가능✅ 가능❌ 허용 안 됨❌ Key 중복 안 됨접근 방식앞에서 제거위에서 제거값의 존재 여부만 확인Key로 접근대표 연산enqueue, dequeuepush, popadd, remove, input, get, in시간 복잡도O(1) 삽입/삭제O(1) 삽입/삭제O(1) 존재 확인 (해시기반)O(1) 조회/삽입 (해..
RAG (Retrieval-Augmented Generation) 🔍 RAG (Retrieval-Augmented Generation)란?**RAG (Retrieval-Augmented Generation)**은 검색 기반 생성 기법으로, **대규모 언어 모델(LLM)**이 외부 데이터베이스에서 정보를 검색한 후, 해당 정보를 바탕으로 응답을 생성하는 방식입니다.즉, 단순한 **문장 생성(Text Generation)**이 아니라, **검색(Retrieval)**을 통해 실시간 정보를 활용하여 더욱 정확하고 신뢰할 수 있는 응답을 제공합니다.🔹 왜 RAG가 중요한가?일반적인 LLM (예: GPT-4, Claude, Gemini)은 사전에 학습된 데이터를 기반으로 응답을 생성하지만, 최신 정보나 학습 데이터에 없는 내용은 잘못된 정보를 제공할 가능성이 있습니다.📌 ..
Thread & Task ✅ CS 관점에서 스레드(Thread)와 태스크(Task)의 차이➡ 스레드(Thread): 운영체제(OS)에서 직접 관리하는 실행 단위➡ 태스크(Task): 일반적으로 "작업 단위"를 의미하며, 특정 환경에 따라 다르게 정의됨🔥 1️⃣ 스레드(Thread)란? (CS 관점)➡ 스레드는 운영체제가 관리하는 실행 단위로, 하나의 프로세스 내에서 실행되는 흐름입니다.➡ 각 스레드는 자신만의 레지스터, 스택을 가지며, 동시에 실행될 수 있음.➡ 멀티스레드 환경에서는 여러 개의 스레드가 동시에 실행되며, CPU에서 병렬적으로 처리될 수도 있음.📌 운영체제에서의 스레드 특징운영체제가 관리✅ OS가 직접 생성, 스케줄링, 컨텍스트 스위칭멀티코어 활용 가능✅ 여러 개의 CPU에서 병렬 실행 가능각 스레드는 독립적인..
Semaphore ✅ Semaphore의 정의 (CS 관점)➡ **Semaphore(세마포어)**는 멀티스레딩 및 병렬 프로그래밍에서 공유 리소스의 접근을 제한하는 동기화 기법입니다.➡ 공유 리소스(예: 네트워크 연결, 데이터베이스, 파일 등)에 대한 동시 접근을 제어하기 위해 사용됩니다.🔥 1️⃣ Semaphore란? (CS 기본 개념)➡ Semaphore는 "허가증"을 관리하는 카운터입니다.➡ N개의 허가증(Tickets)을 가지며, 각 스레드(Task)가 실행되기 위해서는 하나의 허가증을 획득해야 합니다.➡ 허가증이 남아 있으면 스레드(Task)가 실행될 수 있으며, 허가증이 없으면 대기(Blocking) 상태가 됩니다.✅ Semaphore 동작 개념상황Semaphore 동작허가증 있음 (count > 0)✅ 스레..
thread & event loop & task 1event loop 내 n task하나의 스레드에는 하나의 event loop 만 실행가능 cannot schedule new futures after interpreter shutdownRuntimeError: Cannot close a running event loop task.cancel()await task > 무한 대기 없으면 RuntimeError: Cannot close a running event loop 그리고 실행하면 cannot schedule new futures after interpreter shutdown    ✔ 질문 요약:loop1 = create_safe_loop() 실행 후loop2 = create_safe_loop() 실행하면두 번째 create_safe_loop()..