상세 컨텐츠

본문 제목

230104 db index 적용 , 프로그램-프로세스-스레드 구체적으로

카테고리 없음

by hunss 2023. 1. 5. 01:01

본문

어제 공부한 db index를 최종 프로젝트에 적용해보면 결과가 궁금해서 적용시켜봤는데,

내가 했던 프로젝트에서는 db에서 탐색하는데 시간이 오래걸리는 함수가 없어서 눈에 보이는 효과를 보지 못했다.

 

이런 식으로 index를 적용시킬 수 있을 것 같은데, 탐색에 오래걸리는 함수가 없는게 아쉽다.


어제 공부한 프로그램-프로세스-스레드를 좀 깊게 고민해보는 중이다.

가장 포괄적으로 이해해보면

어떤 작업을 위해 실행할 수 있는 파일이 프로그램이고, 그 안에서 프로그램을 실행 시키는 실행 주체가 프로세스, 이 프로세스 안에서 실행되는 흐름의 단위? 가 스레드.

그니까 프로세스는 작업 단위이고 이 작업 단위 내에서 흐름의 단위가 스레드.

크롬 < 프로그램 // 크롬창 < 프로세스

그 작업관리자 열어서 작업끝내기로 강제로 닫을 때 닫는 걔네가 프로세스인 것.

 

프로세스와 스레드의 특징을 살펴보면

 

1. 프로세스는 그림에서처럼 code / heap / stack / data 라는 독립적인 메모리 영역을 할당받음.

code  = 사용자가 작성한 프로그램 함수들의 코드가 CPU에서 수행할 수 있는 기계어(Binary code) 명령 형태로 변환되어 저장 되어 있는 공간. 중간에 코드를 바꿀 수 없도록 read-only 설정 되어있음.

heap = 프로그래머가 필요할 때마다 사용하는 메모리 영역 -> 런타임에 따라 결정된다.

stack = 호출된 함수의 수행을 마치고 복귀할 주소 및 데이터를 임시로 저장하는 공간 -> 함수 호출 시 기록하고 함수의 수행이 끝나면 사라진다. 자료구조에서 뜻하는 stack과 같이 LIFO 방법을 따름. 컴파일 시 stack의 크기가 결정되기 때문에 무한정 할당되진 않음. 여기서 재귀함수가 반복해서 호출되거나 변수가 메모리를 초과할 경우에 stack overflow가 발생

data = 전역변수 또는 static변수 등 프로그램이 사용하는 데이터를 저장하는 공간 -> 전역변수 또는 static 값을 참조한 코드는 컴파일이 완료되면 data영역의 주소값을 가리키도록 바뀜. 전역변수는 바뀔 수도 있으니 read-write 설정되어 있음.

 

2. 프로세스는 별도의 주소 공간에서 실행되므로, 다른 프로세스의 주소 공간에 접근 불가

3. 프로세스 간의 데이터 통신은 IPC을 통해 데이터를 주고 받을 수 있음.

프로세스 간에 데이터를 통신하려면? 프로세스 간에 공유하는 메모리가 필요하지 않을까?

이를 위해 커널(Kernel)영역에서 IPC라는 내부 프로세스간 통신을 제공하고, 프로세스는 커널이 제공하는 IPC설비를 이용해서 통신한다. --> 프로세스는 서로 통신하기 위해 별로의 메모리가 필요한 만큼 스레드간의 통신보다 어렵다.

IPC의 종류에도 엄청 많은 것 같은데 아직 여기까지는 공부하지 않고 넘어가도록 하겠음.. 개념부터 잡고!

 

이제 스레드의 특징에 대해 알아보자.

1. 프로세스 하나당 기본적으로 1개의 스레드를 가짐.

2. 스레드는 프로세스 내에서 stack만 따로 할당받고, code, data, heap영역은 공유한다.


이제 멀티로 넘어가게 되는데, 멀티 프로세스와 멀티 스레드

멀티프로세스는 위에서 살펴본 프로세스를 병렬처리 하는 것이다.

각 프로세스 간 메모리 구분이 필요하거나 독립된 주소 공간을 가져야 할 때 사용한다. 

장점

1. 안정성이 높음

2. 하나의 프로세스가 죽어도 다른 프로세스에 영향이 없다.

단점

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

2. 독립된 메모리 영역이기 때문에 Context Switching이 자주일어나서 주소 공간의 공유가 잦을 경우 오버헤드가 발생하여 성능 저하. (context switching = CPU는 한 번에 하나의 프로세스만 실행가능한데, CPU에서 여러 프로세스를 돌아가면서 작업을 처리하는 과정을 context switching이라고 부름. 동작 중인 프로세스가 대기하면서 해당 프로세스의 상태를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업)

 

멀티스레드는 하나의 작업을 위해 프로세스에서 여러 스레드를 생성해서 사용.

장점

1. 스레드 간 데이터 주고받는 것이 간단하고 시스템 자원 소모가 줄어듬

2. 통신비용이 적다.

3. 스레드 사이 작업량이 적어 context switching이 빠름.

단점

1. 자원을 공유하기 때문에 동기화 문제가 발생할 수 있다.

2. 하나의 스레드에 문제가 발생하면 전체 프로세스에 영향을 끼친다.

 

그럼 마지막으로 멀티프로세스 vs 멀티스레드를 비교해봄

두 방법 모두 동시에 여러 작업을 수행하는 점에서 동일하지만, 각 각의 장단이 확실함.

예를 들면 메모리공간이 충분하고 CPU시간이 넉넉하면 멀티프로세스를 사용해서 안정성도 가져갈 수 있으면 좋겠다고 생각함.


번외) 위에서 몇 번 언급된 개념, 커널(kernel)이다.

커널은 Linux 운영체제 의 주요 구성요소이며 컴퓨터 하드웨어와 프로세스를 잇는 핵심 인터페이스이다.

쉽게 말하면 모든 글들에서 공통적으로 말하는 것이, 커널은 운영체제의 핵심 서비스를 담당한다. 운영체제가 설치된 모든 기기에는 커널이 있다고 한다.

커널까지 알아보기엔 좀 벅차다....

 

프로세스와 다르게 커널은 heap메모리가 없다는 특징이 눈에 띄인다.