프로세스와 스레드의 차이: 메모리 공유와 Race Condition, Go 고루틴까지

프로세스와 스레드의 차이: 메모리 공유와 Race Condition, Go 고루틴까지

핵심 답변: 프로세스와 스레드의 가장 중요한 차이는 메모리를 누가 소유하고 누구와 공유하느냐입니다. 서로 다른 프로세스는 일반적으로 각자 독립된 가상 주소 공간을 가지므로 서로의 메모리를 직접 읽거나 쓸 수 없습니다. 반면 같은 프로세스에 속한 스레드들은 하나의 주소 공간(코드, 전역 변수, Heap 등)을 함께 쓰고, 스레드마다 자기 Stack과 레지스터 상태만 따로 가집니다. 그래서 스레드끼리는 데이터를 쉽게 주고받을 수 있지만, 같은 데이터를 동시에 수정하면 Race Condition이 생길 수 있습니다. Go의 고루틴은 OS 스레드와 같은 것이 아니라, Go 런타임이 적은 수의 OS 스레드 위에서 번갈아 실행하는 별도의 실행 단위입니다.이 글은 프로세스와 스레드의 차이를 메모리 공유 관점에서 정리..

Linux 프로세스 확인 방법: ps, top, 메모리 사용량 분석

Linux 프로세스 확인 방법: ps, top, 메모리 사용량 분석

핵심 답변: Linux에서 프로세스의 CPU·메모리 사용량을 조사할 때는 ps -ef로 대상 프로세스와 PID를 찾고, top -p 로 %CPU와 RES 변화를 관찰한 뒤, /proc//status에서 VmRSS·VmData·Threads 같은 상세 값을 확인합니다. 이때 VIRT(가상 메모리 크기)는 실제 RAM 사용량이 아니고, RES(실제 RAM에 올라와 있는 양)가 높거나 줄지 않는다는 사실만으로는 메모리 누수라고 단정할 수 없습니다. 누수 여부는 작업량과 시간에 따른 추세를 함께 비교해야 판단할 수 있습니다.이 글의 명령어 출력은 아래 환경에서 직접 실행한 결과입니다. 다른 배포판이나 도구 버전에서는 열 이름, 기본 단위, 표시 형식이 다를 수 있습니다.항목실행 환경OSUbuntu 24.04.5..

프로세스 메모리 구조, Stack, Heap

프로세스 메모리 구조, Stack, Heap

프로세스 메모리 구조는 운영체제가 실행 중인 프로그램에 나눠 주는 가상 주소 공간을 용도별로 나눈 그림입니다. 보통 실행 코드가 놓이는 Code, 전역 변수가 놓이는 Data, 실행 중에 크기가 정해지는 객체가 놓이는 Heap, 함수 호출 정보와 지역 변수가 놓이는 Stack으로 나눠 설명합니다.핵심 답부터 정리하면 이렇습니다. C에서는 개발자가 malloc으로 Heap 메모리를 받고 free로 직접 돌려줘야 하며, 빠뜨리면 C 메모리 누수가 생깁니다. Go에서는 Go GC(가비지 컬렉터)가 더 이상 도달할 수 없는 Heap 객체를 회수하고, 변수가 Stack에 놓일지 Heap에 놓일지는 컴파일러의 Escape Analysis가 결정합니다. 그래서 Go에는 free가 없지만, 필요 없는 객체를 계속 참조..

프로그램과 프로세스 차이부터 가상 메모리·MMU까지: 운영체제 기초 정리

프로그램과 프로세스 차이부터 가상 메모리·MMU까지: 운영체제 기초 정리

프로그램과 프로세스의 차이를 한 문장으로 정리하면 이렇습니다. 프로그램은 디스크에 저장된 실행 가능한 명령어와 데이터의 묶음이고, 프로세스는 그 프로그램이 실행될 때 운영체제가 만들고 관리하는 실행 단위입니다. 프로세스는 자기만의 가상 주소 공간을 사용하며, 이 가상 주소는 CPU 안의 MMU가 운영체제가 만든 페이지 테이블을 참고해 실제 RAM의 물리 주소로 변환합니다.이 글은 운영체제 기초를 처음 정리하는 개발자를 위해 프로그램 실행부터 메모리 접근까지의 흐름을 한 줄로 이어서 설명합니다. 프로그램과 프로세스 차이, CPU와 RAM의 역할, 운영체제란 무엇인지, 가상 메모리란 무엇인지, 가상 주소와 물리 주소가 어떻게 연결되는지 차례로 다룹니다. 마지막에는 이 개념이 Linux 프로세스 분석과 KVM..

Planet - 캘린더에 Orbit Layer를 붙이기까지

Planet - 캘린더에 Orbit Layer를 붙이기까지

블록은 티스토리 스킨에 따라 제거될 수 있어 — 붙여넣은 뒤 "페이지 소스 보기"로 남아있는지 꼭 확인해줘.============================================================ --> TL;DRPlanet 캘린더에 My Schedule과 Orbit Schedule을 독립된 Layer로 분리했다Orbit Schedule은 내가 Orbit(구독)한 사람들의 공개(Public) 일정만 켜고 끌 수 있는 두 번째 Layer로 표시한다비공개 일정은 서버 쿼리 단계에서부터 걸러져 응답에 아예 포함되지 않는다왜 이 기능이 필요했나Planet은 흔한 SNS처럼 사람을 팔로우하는 서비스가 아니다. 사람과 시간을 연결한다는 게 핵심 컨셉이라, 누군가를 Orbit한다는 건 그 사람의..

Go 클로저(Closure) 완벽 정리 — 개념부터 트랜잭션 패턴까지

Go 클로저(Closure) 완벽 정리 — 개념부터 트랜잭션 패턴까지

Go 클로저(Closure) 완벽 정리 — 개념부터 트랜잭션 패턴까지Go로 백엔드를 짜다 보면 func(tx *gorm.DB) error { ... } 같은 코드를 자주 마주치게 됩니다. 이게 바로 클로저(Closure)입니다. 이 글에서는 Go 클로저가 정확히 무엇인지, 어떤 상황에서 쓰는지, 장단점과 주의할 점까지 실제 코드 예제로 정리합니다.1. 클로저(Closure)란 무엇인가?클로저는 자신을 둘러싼 스코프(주변 환경)의 변수를 "기억"해서, 그 함수가 밖으로 전달되거나 나중에 실행되어도 해당 변수에 계속 접근하고 값을 바꿀 수 있는 함수를 말합니다.말로만 보면 어려우니 코드로 보겠습니다.func makeCounter() func() int { count := 0 return func(..