분류 전체보기 37

[OS] 가상 메모리 & 요구 페이징

가상 메모리(Virtual Memory)란?가상 메모리는 물리 메모리와 논리 메모리를 분리함으로써, 작은 메모리를 가지고도 얼마든지 큰 가상 주소 공간을 프로그래머에게 제공할 수 있는 기술이다.가상 메모리를 사용하면 프로세스 전체를 메모리에 온전히 올리지 않아도 실행할 수 있다. 즉, 물리 메모리의 크기보다 큰 프로그램을 실행할 수 있다.요구 페이징 (Demand Paging)요구 페이징은 필요한 페이지만 메인 메모리에 로드하는 페이징 방식이다.HDD, SDD와 같은 보조 저장장치에 저장된 실행 파일을 실행하려면 메인 메모리로 로딩하는 작업이 필요한데, 요구 페이징을 사용하면 실행 파일 전체를 메모리에 올리지 않고 실행 중에 요청된(demanded) 페이지만 메모리에 로드한다.이때 메모리에 로드되지 않은..

운영체제 2024.06.12

[OS] 경쟁 상태(Race Condition)

경쟁 상태(Race Condition)여러 프로세스(또는 스레드)가 병행(concurrent) 또는 병렬(parallel)하게 실행되며 공유 자원에 동시에 접근할 때 실행 순서에 따라 결과가 달라질 수 있는 현상이다.하나의 예시로 경쟁 상태가 발생하여 공유 데이터의 무결성이 보장되지 않는 경우를 살펴보자. 다음은 두개의 스레드가 동시에 공유 데이터(counter) 값을 변경시키는 프로그램을 파이썬 코드로 작성한 것이다.import threading# 공유 자원counter = 0def increment(): global counter for _ in range(1000000): counter += 1def decrement(): global counter for _ in..

운영체제 2024.05.14

[OS] 새로운 프로세스는 어떻게 만들어질까? fork(), exec(), wait()

일반적으로 새로운 프로세스를 만들기 위해서는 부모 프로세스로부터 자식 프로세스를 만들어야한다.zsh, bash 같은 쉘 프로세스에서 쉘 명령어를 실행시키는 동작을 예시로 들어서 살펴보자.쉘은 다양한 쉘 명령어를 실행시킬 수 있다. 예를 들어 ls 명령어를 사용하면 현재 디렉토리의 파일 목록을 출력할 수 있다.명령을 입력 받은 쉘 프로세스는 ls 명령어를 실행시키기 위한 자식 프로세스를 만든다. 이는 다음과 같은 과정을 거쳐서 만들어진다.ls 명령어가 실행되면 쉘은 fork() 시스템 콜을 통해 자식 프로세스를 만든다.자식 프로세스의 프로그램 코드는 exec() 시스템 콜을 통해 /bin/ls 위치에 있는 프로그램 코드로 교체된다.자식 프로세스는 ls 프로그램에 있는 명령어들을 실행하여 할일을 마치고 종료..

운영체제 2024.05.02

[JS] 얕은 복사 & 깊은 복사

지난 시간에는 변수에 객체가 저장된 주소를 할당하는 참조에 대해 알아보았다. 이 경우 여러 변수가 같은 객체를 가리키므로 어느 한 변수에서 객체를 수정하면 이를 참조하는 다른 변수에도 영향을 미친다.let a = {'id': 1};let b = a; // 참조 복사console.log(a === b); // truea.id = 2;console.log(b.id); // 2이번 시간에는 객체의 주소를 복사하는 것이 아닌 새로운 객체를 만드는 두가지 복사 방법에 대해 알아보도록 한다.얕은 복사(Shallow copy)얕은 복사를 하면 참조 복사와 달리 원본 객체와 다른 주소에 할당된 객체를 가리키게 된다. 다만 객체 내부의 속성들은 원본 객체와 같은 속성을 참조한다.let original = {list: [..

[JS] 복제, 참조 그리고 함수의 매개변수

복제변수 a, b가 정수(원시 데이터 타입)인 경우를 살펴보자. 아래는 변수 b에 변수 a의 값을 복제한다. 즉 a와 b가 가리키는 주소가 다르므로, b의 값을 변경해도 a의 값은 그대로이다. 원시 데이터 타입과 참조 데이터 타입let a = 1; // a는 원시 타입let b = a; // b에 a의 값 복제 (원시 타입)b = 2; // b의 값 변경console.log(a); // 1 (a의 값은 그대로)참조이번에는 변수 a, b가 객체 (참조 데이터 타입)인 경우를 살펴보자. b에 a를 할당하게 되면 b는 a와 동일한 객체를 참조한다. 즉 b의 값을 바꾸면 a의 값도 바뀐다.let a = {'id': 1}; // a는 객체(참조 타입)let b = a; ..

[JS] 자바스크립트의 데이터 타입

원시 데이터 타입객체가 아닌 데이터 타입을 원시 데이터 타입(primitive type)이라고 한다. 다음 데이터 타입들이 원시 데이터 타입이다.숫자문자열불리언(true/false)nullundefinedSymbol참조 데이터 타입 (객체)자바스크립트에서 참조 데이터 타입은 객체(Object)를 의미한다.변수에 직접 값을 저장하는 것이 아니라, 메모리에서 객체가 저장된 위치를 가리키는(reference) 값으로 할당되기 때문에 "참조(reference) 데이터 타입"이라고 한다.배열(array), 함수(function)도 객체의 일종이다.Wrapper 객체원시 데이터 타입이지만 데이터를 사용할때 편리한 기능을 객체지향적으로 제공하기 위해, 원시 데이터 타입을 객체처럼 다룰 수 있도록 하는 레퍼 객체(Wr..

Real MySQL 8.0 스터디 회고

13주 동안 진행한 Real MySQL 8.0 스터디에 대해 회고하는 글입니다. 스터디 방식은 1) 매주 정해진 학습 범위에 대해 Real MySQL 8.0 교재를 읽고, 2) 해당 범위와 관련된 나만의 주제를 정해 블로그 글을 작성하고, 3) 스터디 미팅 시간에 각자의 주제에 대해 발표 및 질의응답 시간을 가졌습니다. 추가적으로 4) 논의할만한 주제를 각자 가져와서 서로 질문하고 답변하는 시간도 가졌습니다. 스터디를 시작할 때 세웠던 목표를 돌아보고, 잘한 점과 개선할 점을 생각해보았습니다. 처음에 세웠던 목표는 다음과 같습니다. MySQL 동작 원리 이해하기 MySQL의 다양한 기능 써보기 나의 생각과 고민이 들어간 글을 꾸준히 작성하기 발표, 토론 스킬 향상시키기 각각의 목표를 얼마나 달성하였는지에..

회고 2024.04.11

[MySQL] 쿼리 성능 확인하기 - Performance 스키마 & Sys 스키마

MySQL에서 제공하는 Performance 스키마와 Sys 스키마를 활용하면 현재 데이터베이스의 상태를 확인하고, 성능을 향상시킬 수 있는 튜닝 요소들을 찾을 수 있다. 마침 진행중인 프로젝트에서 E2E 테스트를 위해 실행 중인 MySQL 서버가 있어서 쿼리 성능을 확인해보기로 했다. 이번 시간에는 서버에서 자주 실행되는 쿼리 목록과 실행 시간이 긴 쿼리 목록을 확인해 볼 것이다. 자주 실행되는 쿼리 목록 확인 Sys 스키마의 statement_analysis 뷰를 통해 확인할 수 있다. 어느 데이터베이스에서 실행된 쿼리인지(db), 실행 횟수(exec_count), 그리고 쿼리문(query)을 실행 횟수 내림차순으로 정렬하여 출력하도록 쿼리를 작성했다. 프로젝트 관련한 쿼리만 조회하기 위해 WHERE..

[MySQL] InnoDB 클러스터

InnoDB 클러스터란? MySQL에서 제공하는 고가용성(High Availability) 솔루션이다. 즉 MySQL의 가용성을 높이기 위한 기능이다. 어떻게 가용성을 높이는 걸까? MySQL의 일반 복제(Replication) 기능을 통해 소스-레플리카 구조로 형성하는 것도 가용성을 높이기 위한 하나의 방법이다. 다만 이러한 일반 복제는 소스 서버에서 장애 발생시 레플리카 서버가 자동으로 기존의 소스 서버를 대체하는 기능(Failover)을 제공하지는 않는다. 이를 자동화하기 위해 InnoDB 클러스터를 사용할 수 있다. ❓ Failover란? 장애 극복 기능을 의미하며, 시스템에 이상이 생겼을 때 대체 시스템으로 자동 전환하는 기능이다. 어떻게 장애 극복을 자동화하는 걸까? InnoDB 클러스터는 다..

[MySQL] 데이터베이스 복제(Replication)

복제(Replication)란? 한 서버에서 다른 서버로 데이터가 동기화 되는 것을 의미 원본 데이터를 가진 서버를 소스 서버(Source), 복제된 데이터를 가진 서버를 레플리카 서버(Replica)라고 한다. 데이터베이스 복제 과정 소스 서버의 바이너리 로그를 기반으로 복제한다. 바이너리 로그란? MySQL 서버에서 발생하는 모든 변경사항(이벤트)이 순서대로 기록되는 로그 파일. 데이터베이스 변경 내역, 데이터베이스나 테이블의 구조 변경, 계정이나 권한 변경 등이 기록된다. 복제 순서 소스 서버의 바이너리 로그 덤프 스레드는 바이너리 로그를 레플리카 서버로 전송한다. 레플리카 서버의 레플리케이션 I/O 스레드는 소스 서버의 바이너리 로그 덤프 스레드로부터 바이너리 로그 이벤트를 가져와 로컬 서버의 파..