상세 컨텐츠

본문 제목

230103 기초cs공부(db인덱스 , 프로세스&스레드, call by reference)

카테고리 없음

by hunss 2023. 1. 4. 00:04

본문

잘 모르겠던 것만 정리하도록 하겠음.

 

데이터베이스 인덱스 개념

데이터 베이스에서 검색 성능의 속도를 높여주는 자료구조.

지금 헷갈리는 건 여기서 말하는 인덱스가 django에서 모델 만들 때 생성되는 Index인가? 다른건가?

 

django에서는 ORM을 사용해서 아직 SQL에 익숙하지 않아서 직접적으로 다가오는 느낌은 아니지만

내가 이해한 바로는 자주 사용하는 데이터들? 자주 검색되는 데이터들을 인덱스로( 책의 색인처럼) 설정해서 검색 속도를 높여주는 것 같다.

검색을 할 때 인덱스가 없으면 Full Scan하게 되서 모든 데이터들을 쭉 보게 되는데 인덱스가 있으면 원하는 정보를 인형뽑듯 찾을 수 있는 것이다.

또한 인덱스를 사용하면 ORDER BY로 정렬을 안해도 된다. 이미 인덱스를 쓰면서 정렬이 되기 때문에.

 

좋은점이 있는 만큼 단점도 있다.

DML에 취약하다. insert delete update가 발생하면 인덱스 테이블 내에 있는 값들을 다시 정렬해야하고 인덱스를 삭제했을 때 인덱스 값들이 업데이트 되는게 아니라 '사용하지 않음' 처리 되기 때문에 DML이 빈번히 일어나면 인덱스테이블 크기가 비대해진다.

때문에 인덱스 사용도 좋은 방법이지만, 인덱스 이전에 SQL을 더 효율적으로 짜는 방향으로 개선방향을 잡는게 우선인 것 같다.

 

인덱스 생성에도 기준이 있는데, 조건절에 자주 등장하는 컬럼, 항상 = 으로 비교되는 컬럼, ORDER BY에 자주 등장하는 컬럼, JOIN 조건으로 자주 사용되는 컬럼 등이 있다.

 

그럼 인덱스는 한 컬럼으로만 사용하냐? 아니다.

두개 이상의 컬럼을 묶어서 인덱스로 사용하는 걸 결합인덱스라고 한다.

이건 AND조건으로 자주 묶이는 컬럼들을 묶어서 사용하게 되는데 사용이 빈번하지 않을 것 같다. 이 때 막 묶는게 아니라 결합인덱스를 생성할 때 컬럼 순서가 중요하다. 

100row 에서 male조건 -> 50row -> 이름이 smith -> 2row  이런식인데

100row 에서 이름이 smith -> 2row -> male조건-> 2row 이렇게 되버린다.

처음 조건으로 걸러지기 때문에 순서가 중요한 것.


프로세스와 스레드

최종프로젝스 리펙토링 때 사용했던 스레드 개념이 나와서 반가워서 더 찾아본 것 같다.

프로세스 = 프로그램이 메모리에 올라와 CPU를 할당받고 프로그램이 실행되고 있는 상태

(프로그램 = 어떤 작업을 위해 실행할 수 있는 파일)

스레드 = 프로세스 내에서 실행되는 흐름의 단위

# 하나의 프로세스가 생성되면 하나의 메인스레드가 생성됨

# 하나의 프로세스는 여러개의 스레드를 가질 수 있음

# Process[ Code Data Heap Tread1[stack] Thread[stack2] ] 

 

멀티프로세스 = 하나의 프로그램을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것

# 여러 개의 프로세스 중 하나의 문제가 발생해도 다른 프로세스에 영향안줌

# 멀티스레드 보다 많은 메모리공간과 CPU시간을 차지

 

멀티스레드 = 하나의 응용 프로그램을 여러 개의 스레드로 구성하여 각 스레드가 하나의 작업을 처리하도록

# 스레드 개별로 유기적으로 움직이기 때문에 프로그램 테스트, 디버깅이 어려움

# 하나의 스레드의 오류가 전체 프로세스에 문제 발생

# 스레드 간의 자원(code, data heap)을 공유하기 때문에 통신부담이 적어 속도 빠름

# 동기화 문제는 전역변수를 통해 해결 가능

# 멀티프로세스는 context switching 시 cpu레지스터, ram, 캐시메모리가 초기화되서 오버헤드가 큰 반면, 스레드는 stack영역만 처리하면되서 교환속도가 빠름. 프로세스 간의 통신은 IPC를 통해선만 통신이 가능하지만, 스레드는 자원공유가 간단함.


Call by reference란?

이 개념을 찾아보는데 c++의 pointer개념이 나오길래 팀원 중 c++ 공부를 하셨던 분이 계셔서 대충 개념을 들어봤는데 어려웠다.

내가 이해한 바로는

1. 함수가 실행되면 메모리 안에 함수 실행을 위한 임시저장공간을 만듬

2. 임시저장공간안에 주소가 있음.

3. 주소 안에 값이 있음

4-1. call by reference인 경우 -> 함수 호출 시 변수의 레퍼런스를 전달해서 변수들도 변경됨.

4-2. call by value인 경우 -> 선언 한 원본 변수를 복사해서 지역변수 처럼 함수 안에서 씀. 따라서 원본은 안바뀜

 

근데 나는 python을 공부하고 있기 때문에 python에 접목시킨 개념도 찾아봤다.python은 모든 것이 객체이기 때문에 passed by assignment 이라고 볼 수 있다고 한다.어떤 값을 전달하느냐에 따라 달라진다는 것.파이썬은 불변과 가변 자료형으로 나눠지는데 불변타입(int, str -- )을 객체에 넘기면 call by value가 되고가변타입(list, dict --)을 객체에 넘기면 새로운 값을 만들 필요가 없기 때문에 call by reference가 된다.근데 좀 찾아보면 완전히 call by reference 나 call by value 개념이 적용되는 건 아닌 것 같고 그런 느낌이다? 인 것 같다.