[MySQL] MySQL 엔진의 잠금
·
Database
MySQL에서 사용되는 잠금은 크게 스토리지 엔진 레벨과 MySQL 엔진 레벨로 나눌 수 있다. MySQL 엔진 레벨의 잠금은 모든 스토리지 엔진에 영향을 미치지만, 스토리지 엔진 레벨의 잠금은 스토리지 엔진 간 상호 영향을 미치지 않는다. MySQL 엔진에서는 테이블 데이터 동기화를 위한 테이블 락 이외에도 테이블의 구조를 잠그는 메타데이터 락,그리고 사용자 필요에 맞게 사용할 수 있는 네임드 락을 제공하는데, 이번에는 MySQL 엔진 레벨의 잠금에 대해 공부해보았다. 글로벌 락글로벌 락은 MySQL이 제공하는 잠금 중에서 가장 범위가 크다.일단 한 세션에서 글로벌 락을 획득하면, 다른 세션에서 실행한 SELECT를 제외한 대부분의 DDL과 DML이 대기 상태로 남는다.글로벌 락이 미치는 범위는 MyS..
[OS] 추첨 스케줄링 (비례배분)
·
OS
이번에는 비례배분 스케줄링에 대해 공부하였다. 비례 배분의 개념은 간단한데, 반환 시간이나 응답 시간을 최적화하는 대신 스케줄러가 각 작업에게 CPU의 일정 비율을 보장하는 것이 목적이다. 비례 배분 스케줄링의 좋은 예가 추첨 스케줄링으로 알려져있다.이 스케줄링의 간단한 아이디어는 다음 실행될 프로세스를 추첨을 통해 결정하고, 더 자주 수행되야하는 프로세스에게 당첨기회를 더 많이 주는 것이다. 여기서의 핵심 질문은, 어떻게 CPU를 정해진 비율로 배분할 수 있는가? 와 그렇게 하기 위한 중요한 기법은 무엇인가? 이다. 기본 개념추첨권이라는 기본적 개념이 추첨 스케줄링의 근간을 이룬다. 추첨권은 받아야할 자원의 몫을 나타내는데 사용되며, 프로세스가 소유한 티켓의 개수와 전체 티켓의 비율이 자신의 몫이 될 ..
[OS] MLFQ
·
OS
스케줄링 기법 중 멀티 레벨 피드백 큐 (MLFQ) 스케줄링 기법에 대해 공부하였다.MLFQ가 해결하고자 하는 기본적인 문제는 다음과 같다.- 짧은 작업을 먼저 실행시켜 반환 시간을 최적화- 응답이 빠른 시스템이라는 느낌을 주기 위한 응답 시간 최적화운영체제가 프로세스에 대한 정보를 가지고 있지 않은데 어떻게 이러한 스케줄러를 만들 수 있을까 ?MLFQ는 여러 개의 큐로 구성되며, 각각 다른 우선순위가 배정된다. 실행 준비가 된 프로세스는 이중 하나의 큐에 존재한다.한 큐에는 둘 이상의 작업이 존재할 수 있으며, 이들은 모두 같은 우선순위를 가진다.이 작업들 사이에는 타임슬라이싱 스케줄링이 사용된다.MLFQ 스케줄링의 핵심은 작업의 우선순위를 정하는 방식이며, 작업의 특성에 따라 동적으로 우선순위를 부여..
[Java] 자바 스레드와 운영체제 스레드의 관계
·
JAVA
최근 교내 대회를 준비하던 중,그저 이론으로만 알던 자바 멀티 스레딩이니 비동기 처리니 하는 방식에 대한 필요성을 실제로 느끼게 되었다. 이 부분에 대해 공부하던중, Java에서의 Parallelism 과 Concurrency(논리적 동시성)에 대해 알아보게 되었고, 자바에서 이를 구현하기 위한 여러 방식들이 있지만,  그 전에 먼저 자바 스레드와 운영체제 스레드의 관계에 대해 서핑해본 내용을 정리해보았다.JVM이 대강 어떤 방식으로 운영체제와 상호작용하고, 스레드들을 스케줄링하는지에 관한 내용이다. 먼저 간단하게 유저 레벨 스레드와 커널 레벨 스레드에 대한 이해가 필요하다. 유저 레벨 스레드는, 사용자 프로그램에서 관리되는 스레드로, 커널은 이를 인식하지 못한다.커널 레벨 스레드는, 운영체제의 커널에서..
[MySQL] InnoDB (2) - 버퍼 풀과 LRU
·
Database
InnoDB 엔진의 버퍼 풀과 LRU에 대해서 공부하였다. InnoDB 버퍼 풀InnoDB 스토리지 엔진에서 가장 핵심적인 부분으로, 디스크의 데이터 파일이나 인덱스 정보를 메모리에 캐시해두는 공간이다.쓰기 작업을 지연시켜 일괄 작업으로 처리해줄 수 있게 해주는 버퍼 역할도 같이 한다. 일반적인 INSERT, UPDATE, DELETE처럼 데이터를 변경하는 쿼리는 디스크 작업을 발생시키기 때문에,버퍼 풀이 이러한 변경된 데이터를 한 번에 모아 디스크 작업의 횟수를 줄일 수 있다. 버퍼 풀의 크기 설정에 대한 내용은 MySQL 5.7부터 inno_buffer_pool_size 시스템변수를 통해 설정할 수 있으며, 동적으로 크기를 확장할 수 있다는 점을 짚고 넘어가겠다. (버퍼 풀의 크기를 동적으로 변경하고..
[MySQL] InnoDB 엔진 (1)
·
Database
MySQL의 스토리지 엔진 중 가장 많이 사용되는 InnoDB 엔진에 대해 공부해보았다. InnoDB는 MySQL에서 사용할 수 있는 스토리지 엔진 중 거의 유일하게 레코드 기반의 잠금을 제공하며,그로인해 높은 동시성 처리가 가능하고, 안정적이며 성능이 뛰어나다. 프라이머리 키에 의한 클러스터링InnoDB의 모든 테이블은 기본적으로 프라이머리 키를 기준으로 클러스터링되어 저장된다.즉 프라이머리 키 값의 순서대로 디스크에 저장된다는 뜻이며, 모든 세컨더리 인덱스는 레코드의 주소 대신 프라이머리 키의 값을 논리적인 주소로 사용한다.(위 내용은 추후 인덱스에서 자세히 다룰 예정) InnoDB와 달리 MyISAM 스토리지 엔진에서는 클러스터링 키를 지원하지 않는다. 따라서 프라이머리 키와 세컨더리 인덱스는 구조..
[MySQL] MyISAM ? InnoDB ?
·
Database
MySQL을 공부하다보니 계속 InnoDB엔진과 MyISAM 엔진이 등장하는데, 궁금해서 간단하게만 정리해보았다.  MySQL 엔진 아키텍처먼저 MySQL 서버는 MySQL 엔진과 스토리지 엔진으로 나뉜다. MySQL엔진은 요청된 SQL 문장을 분석하거나, 최적화하는 등 DBMS의 두뇌 역할을 한다고 보면 되고,스토리지 엔진은, 실제 데이터를 디스크 스토리지에 저장하거나, 디스크 스토리지로부터 읽어오는 역할을 전담한다. InnoDB 엔진이나, MyISAM 엔진은 둘 중 스토리지 엔진에 해당한다.MyISAM엔진과 InnoDB엔진을 간단히 비교하자면,트랜잭션 처리가 필요하고, 대용량의 데이터를 다루기 위해서는 InnoDB트랜잭션 처리가 필요없고, Read only 기능이 많이 필요할수록 MyISAM조회가 많..
[Spring] 동시성 문제 해결
·
Spring
java에서 단일 서버 환경의 동시성 문제를 해결하는 synchronized와 Lock에 대해 학습하였다. Synchronized자바의 synchronized 키워드는 한 개의 쓰레드만 접근이 가능하도록 해준다. 기본적인 이해를 위해 가장 간단한 코드를 보면Thread-safe하지 않은 코드`public class Counter { private int count = 0; public void increment() { count++; } public int getCount() { return count; } } 여러 스레드가 이 코드에 접근하면 문제가 발생할 수 있다. 예를 들어 두 스레드가 동시에 count++ 를 실행하면 두 스레드 모두 ..
2024.02.06 모각코 6회차 결과
·
2023-24 동계 모각코
계획 이번 6회차에서도 spring 기반 프로젝트의 동작원리를 이해하기위해 java의 servlet에 대해 더 학습하였다. ServeltContext Context란? 사전적 의미 - 문맥, 상황, 배경 소프트웨어 개발에서는 Execution Context의 의미로 많이 사용 실행 환경 그 자체 (runtime) 설정 정보 (Configuration) ServletContext란? Servlet Container 실행 환경 Servlet과 Servlet Container 간에 연동을 위해 사용 웹 애플리케이션마다 하나의 ServletContext 생성 하나의 웹 애플리케이션에 포함된 Servlet들은 동일한 ServletContext 공유 Servlet끼리 자원을 공유하는데 활용 Servlet Conta..
2024.02.02 모각코 5회차 결과
·
2023-24 동계 모각코
계획 이번 5회차에서는 spring이 동작하는 원리인 java의 servlet에 대해 알아보았다. CGI Common Gateway interface 웹 서버가 외부 프로그램을 실행할 수 있도록 해주는 인터페이스 명세(specification)이다. 외부 프로그램 = 동적 웹 콘텐츠를 생성하는 역할을 한다. c,c++,java,php,go .... 웹 서버와 GCI 프로그램(Applicaiton)간의 규칙이다. 환경변수나 표준입출력을 다룰 수 있는 프로그램 언어라면 어떤 언어든지 확장하여 이용 가능하다. 실행속도나 텍스트 처리의 용이함 등의 이유로, perl이나 python, ruby 등의 스크립트 언어를 주로 사용한다. CGI 프로그램 컴파일 방식 기계어, 컴파일 된 상태 c++, c 인터프리터 방식 ..