10장 프로세스와 스레드

10-1 프로세스 개요 프로세스(process): 실행중인 프로그램 프로세스 직접 확인하기 ps 명령어를 통해 확인 가능 포그라운드 프로세스(foreground process): 사용자가 보는 앞에서 실행 백그라운드 프로세스(background process): 사용자가 보지 못하는 뒤에서 실행 데몬(daemon): 유닉스 체계의 운영체제의 백그라운드 프로세스 서비스(service): 우니도우 운영체제에서의 백그라운드 프로세스 프로세스 제어 블록 PCB(Process Control Block, 프로세스 제어 블록) 프로세스와 관련된 정보를 저장하는 자료 구조 해당 프로세스를 식별하기 위해 꼭 필요한 정보들이 저장 메모리에 있는 커널 영역에서 생성 프로세스 생성 시에 만들어지고 실행이 끝나면 폐기 PCB에 담기는 정보 PID(프로세스 ID, Process ID) 특정 프로세스를 식별하기 위해 부여되는 고유한 번호 레지스터 값 이전까지 사용했던 레지스터의 중간값 프로그램 카운터 등의 레지스터 값 프로세스 상태 입출력장치를 사용하기 위해 기다리는지, CPU를 기다리는지, CPU를 이용하는지 등 CPU 스케줄링 정보 프로세스가 언제, 어떤 순서로 CPU를 할당받았는지 메모리 관리 정보 프로세스가 어느 주소에 저장되어 있는지 베이스 레지스터, 한계 레지스터 값 등 페이지 테이블 정보 사용한 파일과 입출력장치 목록 실행과정에서 특정 입출력장치나 파일을 사용하는지 문맥 교환 프로세스 실행에 대한 중간 정보를 저장해야, 다음 차례가 왔을 때 이전까찌 실행했던 내용에 이어 다시 실행을 재개할 수 있음 문맥(context) 해당 프로세스의 PCB에 표현 문맥 교환(context switching) 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 복구하여 새로운 프로세스를 실행하는 것 프로세스 A 실행 → A 문맥 저장 → B 문맥 로드 → 프로세스 B 실행 → B 문맥 저장 → … 너무 자주 하면 오버헤드가 발생하여 부정적인 효과 프로세스의 메모리 영역 PCB는 커널 영역에 생성 ...

2026년 2월 10일 · 6 분 · 배준수

9장 운영체제 시작하기

09-1 운영체제를 알아야 하는 이유 운영체제란 자원(시스템 자원): 프로그램 실행에 마땅히 필요한 요소. CPU, 메모리 등 운영체제(operating system): 실행할 프로그램에 필요한 자원을 할당하고, 프로그램이 올바르게 실행되도록 돕는 특별한 프로그램 운영체제는 메모리 내 적당한 공간에 프로그램들을 적제하고, 더 이상 실행되지 않는 프로그램을 삭제 누가 어떤 순서로 얼마나 CPU를 사용하게 할지도 운영체제가 처리 입출력장치나 자원등을 관리 응용 프로그램과 하드웨어 사이에서 필요한 자원을 할당하고, 올바르게 실행되도록 관리하는 역할 커널 영역(kernel space): 운영체제가 메모리 내에서 적재되는 특별한 공간 ...

2026년 1월 14일 · 3 분 · 배준수

우리의 낙원에서 만나자

이기적 유전자 지은이: 하태완 출판사: 북로망스 감상 평소에 책의 내용을 잘 보고 사지 않는다. 제목과 표지가 주는 느낌으로만 산다. 저번 <죽음이 물었다 어떻게 살거냐고>를 읽은 이후에도 느꼈는데 이제 장르나 내부 형식쯤은 알고 사는게 좋지 않을까 싶다. 난 소설인 줄 알고 샀는데… 감성이 필요한 사람에게 생각하고 느낄만한 문구들이 한가득한 책이었다. 내가 조금만 더 감성적인 사람이었다면 이 책에서 많은 것을 느꼈을텐데 그러지 못해 아쉽다. 그럼에도 마음이 느껴지는 글귀들이 참 많으니, 필요에 따라 추천해줄 수 있는 책이었다. ...

2025년 12월 24일 · 1 분 · 배준수

8장 입출력장치

08-1 장치 컨트롤러와 장치 드라이버 키보드, 마우스 등 입출력장치에 보조기억장치도 포함 장치 컨트롤러 입출력장치는 CPU, 메모리보다 다루기 더 까다롭다. 많은 종류 키보드, 모니터, USB 메모리, SSD 등 다양하며 장치마다 속도, 데이터 전송 형식도 다양하여 규격화하기 어렵다. 낮은 데이터 전송률 전송률(transfer rate): 데이터를 얼마나 빨리 교환할 수 있는지를 나타내는 지표 전송률이 낮은 데이터는 같은 시간 동안 상대적으로 적은 데이터를 주고 받을 수 있음 장치 컨트롤러(device controller) 입출력 제어기(I/O controller), 입출력 모듈(I/O module) 입출력장치가 연결되는 하드웨어 모든 입출력장치는 장치 컨트롤러를 통해 컴퓨터 내부와 정보를 주고 받음 CPU와 입출력장치 간의 통신 중개, 오류 검출, 데이터 버퍼링 버퍼링(buffering): 전송률이 높은 장치와 낮은 장치 사이에 주고받는 데이터를 버퍼라는 임시 저장 공간에 저장하여 전송률을 비슷하게 맞추는 방법 버퍼(buffer): 임시 저장 공간 내부 구조 데이터 레지스터(data register) CPU와 입출력장치 사이에 주고받을 데이터가 담기는 레지스터. 버퍼링을 위한 버퍼 역할 상태 레지스터(status register) 입출력장치가 입출력 작업 상태, 오류 여부 등의 상태 정보 저장 제어 레지스터(control register) 입출력장치가 수행할 내용에 대한 제어 정보와 명령 저장 장치 드라이버 장치 드라이버(device driver) ...

2025년 12월 22일 · 4 분 · 배준수

LocalStack을 이용해 로컬에서 AWS 구동시키기

로컬 웹훅 테스트 환경 로컬 개발 환경에서 AWS를 이용하는 전체 웹훅 플로우를 테스트할 수 있는 환경을 구축함 개요 배경 운영 환경의 웹훅 처리 플로우: 1 Cafe24 → Django → SQS → EventBridge Pipes → Step Functions → Lambda → ElastiCache 이 플로우를 로컬에서 테스트하기 어려웠던 이유: Lambda 함수가 ElastiCache(AWS)에만 접근 가능 LocalStack Free에서 EventBridge Pipes 미지원 해결 방법 LocalStack을 활용한 하이브리드 아키텍처: 웹훅 처리 → LocalStack (Step Functions + Lambda) 기타 AWS 서비스 (SQS, S3) → 실제 AWS 유지 💡 핵심 개념: LocalStack과 Endpoint URL 이 프로젝트는 하이브리드 클라우드 환경을 구성하기 위해 LocalStack과 endpoint_url 개념을 적극적으로 사용합니다. ...

2025년 12월 19일 · 5 분 · 배준수

Redis Connection closed by server 오류

Redis 연결오류 해결기 사건 배경 심기가 불편한 일요일 오후 서버는 울기 시작했다. “응애! 응애! Connection closed by server! 응애!” 서버의 웹훅 관련 캐시서버와의 연결이 끊어졌다는 오류들이었다. 웹훅을 수신하면 웹훅 캐시서버에 횟수를 기록하기 위한 작업이 이뤄지는데 이떄 서버로부터 연결이 끊겼다는 에러였다. Traceback 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 Traceback (most recent call last): File "/code/core/webhook/utils/webhook.py", line 156, in record_webhook_event redis_client.zadd(key, {member: score}) File "/usr/local/lib/python3.11/site-packages/redis/commands/core.py", line 4187, in zadd return self.execute_command("ZADD", name, *pieces, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/ddtrace/contrib/redis/patch.py", line 148, in _traced_execute_command return _run_redis_command(span=span, func=func, args=args, kwargs=kwargs) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/ddtrace/contrib/redis/patch.py", line 128, in _run_redis_command result = func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 559, in execute_command return self._execute_command(*args, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 567, in _execute_command return conn.retry.call_with_retry( ^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/retry.py", line 65, in call_with_retry fail(error) File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 571, in <lambda> lambda error: self._disconnect_raise(conn, error), ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 555, in _disconnect_raise raise error File "/usr/local/lib/python3.11/site-packages/redis/retry.py", line 62, in call_with_retry return do() ^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 568, in <lambda> lambda: self._send_command_parse_response( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 542, in _send_command_parse_response return self.parse_response(conn, command_name, **options) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/client.py", line 584, in parse_response response = connection.read_response() ^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/connection.py", line 592, in read_response response = self._parser.read_response(disable_decoding=disable_decoding) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 15, in read_response result = self._read_response(disable_decoding=disable_decoding) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/_parsers/resp2.py", line 25, in _read_response raw = self._buffer.readline() ^^^^^^^^^^^^^^^^^^^^^^^ File "/usr/local/lib/python3.11/site-packages/redis/_parsers/socket.py", line 115, in readline self._read_from_socket() File "/usr/local/lib/python3.11/site-packages/redis/_parsers/socket.py", line 68, in _read_from_socket raise ConnectionError(SERVER_CLOSED_CONNECTION_ERROR) redis.exceptions.ConnectionError: Connection closed by server. 웹훅 오류에 발작버튼이 달려있는 나는 황급히 웹훅 캐시 지표를 확인했다. ...

2025년 12월 18일 · 11 분 · 배준수

7장 보조기억장치

07-1 다양한 보조 기억 장치 하드 디스크 하드 디스크(Hard Disk Drive) 자기 디스크(magnetic disk) 자기적인 방식으로 데이터를 저장하는 보조 기억 장치 구성요소 플래터(platter): 하드 디스크에서 실질적으로 데이터가 저장되는 곳 트랙(track): 플래터를 여러 동심원으로 나누었을 때 그중 하나의 원 섹터(sector): 트랙을 나눈 한 조각 블록(block): 다수의 섹터 묶음 실린더(cylinder): 여러 겹의 플래터 상에서 같은 트랙이 위치한 곳을 모아 연결한 논리적 단위 연속된 정보는 보통 한 실린더에 기록 스핀들(spindle): 플래터를 회전시키는 구성 요소 RPM(Revolution Per Minute): 플래터가 돌아가는 분당 회전수 헤드(head): 플래터를 대상으로 데이터를 읽고 쓰는 구성 요소 디스크 암(disk arm): 헤드를 원하는 위치로 이동시키는 부품 접근 과정 탐색 시간(seek time): 접근하려는 데이터가 저장된 트랙까지 헤드를 이동시키는 시간 **다중 헤드 디스크(multiple-head disk)**에선 소요되지 않는 시간 다중 헤드 디스크 = 고정 헤드 디스크(fixed-head disk) 회전 지연(rotational latency): 헤드가 있는 곳으로 플래터를 회전시키는 시간 전송 시간(transfer time): 하드 디스크와 컴퓨터 간에 데이터를 전송하는 시간 하드 디스크가 데이터에 접근하는 시간 = 탐색 시간 + 회전 지연 + 전송 시간 컴퓨터 내 소요 시간(ns = 10^-9) 내용 소요 시간 L1 캐시 참조 시간 0.5ns L2 캐시 참조 시간 5ns 메모리 참조 시간 7ns 메모리에서 1MB를 순차적으로 읽는 시간 250,000ns 하드 디스크 탐색 시간 10,000,000ns 하드 디스크에서 1MB를 순차적으로 읽는 시간 30,000,000ns 한 패킷이 캘리포니아에서 네덜란드까지 왕복하는 시간 150,000,000ns 플래시 메모리 플래시 메모리(flash memory): 전기적으로 데이터를 읽고 쓸 수 있는 반도체 기반의 저장 장치 ...

2025년 12월 9일 · 4 분 · 배준수

이기적 유전자

이기적 유전자 지은이: 리처드 도킨스 옮긴이: 양억관 출판사: 민음사 감상 오래전부터 들어온 과학 교양 서적이라 읽어 보았다. 나름 일반 생물학까지는 공부해본 사람으로서 교양서적이 얼마나 어렵겠냐 싶었지만 상당히 어려웠다. 우리가 흔히 ‘유전자는 인간의 몸에 대한 설계서다’라는 생각을 돌려서, 유전자가 본체이고 각 생명(개체)는 유전자를 전파하기 위한 생체 기계일 뿐이라는 이야기들의 반복이다. 이를 뒷받침하기 위한 저자의 설명들이 계속 된다. 어떤 생물이 본능적으로 하는 그 행동이 왜 유전자를 전파하기 위한 행동인가에 대한 내용. 너무 어렵고, 너무 방대하다. 추천하지는 않는 책 ...

2025년 11월 27일 · 2 분 · 배준수

6장 메모리와 캐시 메모리

06-1 RAM의 특징과 종류 RAM의 특징 실행할 프로그램의 명령어와 데이터가 저장 휘발성 저장 장치(volatile memory) 전원을 끄면 저장된 명령어와 데이터가 사라짐 CPU가 실행할 대상을 저장 비휘발성 저장 장치(non-volatile memory) 전원을 꺼도 저장된 내용을 유지. 하드 디스크, USB 같은 보조기억장치 CPU는 보조기억장치에 접근하지 못함 RAM의 용량과 성능 RAM 용량이 크면 실행할 프로그램을 많이 저장할 수 있음. 따라서 동시에 여러 프로그램을 빠르게 처리할 수 있음 RAM의 종류 DRAM Dynamic RAM 시간이 지나면 저장된 데이터가 점차 사라짐 따라서 일정 주기로 데이터를 재활성화(다시 저장)해야 함 소비 전력이 낮고, 저렴하고, 집적도가 높아 대용량으로 설계하기 용이함 SRAM Static RAM 시간이 지나도 데이터가 사라지지 않음 소비 전력이 높고, 비싸고, 집적도가 낮음 캐시 메모리등에 사용 정확히는 CPU 내부의 캐시 메모리에서 사용한다. SRAM은 데이터 재활성화가 필요없어 액세스 속도가 매우 빠르다. CPU의 캐시 용량은 메인 메모리(16GB, 32GB, …)에 비해선 여전히 작음(수십 MB) SDRAM Synchronous Dynamic RAM 또는 SDR SDRAM(Single Data Rate SDRAM) 클럭 신호와 동기화된, 발전도니 형태의 DRAM 클럭 타이밍에 맞춰 CPU와 정보를 주고 받을 수 있음 클럭 타이밍을 맞추는게 중요한 이유 정확히는 데이터 전송의 타이밍을 CPU의 동작 속도(시스템 쿨럭)과 맞춘다는 의미임 DRAM등 에서는 데이터를 언제 줄지 몰라 유휴시간이 존재하는 등 비효율성이 발생했음 SDRAM은 클럭에 맞춰 오기떄문에 정확한 타이밍을 위해 준비할 수 있음 클럭속도? 클럭속도는 시스템 전체가 공유하는 기본 타이밍 신호임 여러 종류가 있으나 CPU와 RAM은 주로 시스템 클럭(System Clock) 기반의 신호들을 공유 시스템 클럭은 메인보드에 있는 클럭 제너레이터(Clock Generator)에서 생성됨 이게 CPU, RAM, 칩셋에게 공유 오버클럭등을 이용해 클럭신호는 바뀔수 있음 CPU와 SDRAM은 클럭 제너레이터가 만드는 클럭 신호를 기반으로 같은 타이밍에 통신함 DDR SDRAM Double Date Rate SDRAM **대역폭(data rate)**을 넓혀 속도를 빠르게 만든 SDRAM 대역폭: 데이터를 주고 받는 길의 너비 DDR2(2배), DDR3(4배), … 질문 SDRAM이 클럭 을 따지는게 뭔상관이지 어차피 CPU랑 주고받는데? 정확히는 데이터 전송의 타이밍을 CPU의 동작 속도(시스템 쿨럭)과 맞춘다. 기존에는 데이터를 언제 줄지 몰라 유휴시간이 존재하는 등 비효율성 발생했음 SDRAM은 클럭에 맞춰 오기떄문에 정확한 타이밍을 위해 준비할 수 있음 클럭속도는 시스템전체가 공유하나? SDRAM이 어떻게알지? 이건 안변하나? 클럭속도는 시스템 전체가 공유하는 기본 타이밍 신호 여러 종류가 있으나 CPU와 RAM은 주로 시스템 클럭(System Clock) 기반의 신호들을 공유 시스템 클럭은 메인보드에 있는 클럭 제너레이터(Clock Generator)에서 생성됨. 이게 CPU, RAM, 칩셋에게 공유 오버클럭등을 이용해 클럭신호는 바뀔수 있음 캐시도 이제 용량이 커서 몇기가씩 되는데 그래도 SRAM을 쓰나? 정확히는 CPU 내부의 캐시 메모리에서 사용한다. SRAM은 데이터 재활성화가 필요없어 액세스 속도가 매우 빠르다. CPU의 캐시 용량은 메인 메모리(16GB, 32GB, …)에 비해선 여전히 작음(수십 MB) 06-2 메모리의 주소 공간 물리 주소: 메모리 하드웨어가 사용하는 주소 ...

2025년 11월 25일 · 5 분 · 배준수

업스트림(Upstream)과 다운스트림(Downstream)

업스트림(Upstream)과 다운스트림(Downstream) 1. 기본 정의 : 흐르는 강물(Stream) 이 용어는 데이터와 요청의 흐름을 강물에 비유한 것 업스트림 (Upstream, 상류): 데이터(물)의 원천이 되는 곳 다운스트림 (Downstream, 하류): 데이터(물)를 받아서 소비하는 곳 흐름의 법칙 데이터(응답): 상류 → 하류 (위에서 아래로 흐름) 요청(Request): 하류 → 상류 (거슬러 올라감) 2. 핵심 개념 : “위치는 상대적이다” 업스트림과 다운스트림은 절대적인 역할이 고정된 것이 아님 “누구를 기준(주체)으로 보느냐"에 따라 달라지는 상대적인 개념 전체 흐름이 다음과 같을 때를 가정 ...

2025년 11월 21일 · 2 분 · 배준수