반응형
컴퓨터 구조 원리, 운영체제 지식 필요해
한식
일식
패밀리 레스토랑
내부 인테리어 하고
직원을 뽑아야 해
한식, 일식 각각 1명씩, 패밀리 레스토랑에서 2명 고용한 상황이라 가정
직원들이 영혼을 주입해서 영혼이 주입된 직원만 움직일 수 있는 상황이라 가정
영혼을 주입해서 빙의 되는 순간 움직이면서 서빙도 하고 주방도 볼 수 있는 상황이 된 거.
근데 그렇게 되면 다른 식당은 움직이지 못해. 한식 직원 영혼을 빼내서 일식직 직원에 빙의 해서 일식집 직원을 움직이게 해.
이런 행동을 짧은 시간에 왔다 갔다 하면서 하게 되면 1개의 영혼이 4개의 직원을 동시에 움직이는 착각이 들게 할 수 있다.
정확히 말하면 특정 시간대에 두명이 동시에 움직일 수는 없지만 얼핏 보면 동시에 움직이게 보인다.
그래서 식당이 굴러가고 있어. 영혼이 하나지만 왔다 갔다 움직이고 있었어.
그런데 이 상황을 컴퓨터에 비교해 보면
레스토랑 : 프로세스(프로그램)
직원 : 쓰레드
영혼 : CPU 코어
프로그램 여러개 켤 수 있어.
그림판, 메모장, 서버
이게 식당 여러 개 운영하는 것과 마찬가지야.
프로그램이 메모리에 올라왔다고 동작하는 건 아니고, 주체가 있어야 해. 쓰레드가 배치가 되어서 그림판, 메모장, MMO 서버의 로직을 실행해야 해.
쓰레드가 무엇인지 검색해보면 Animate Spirit 이란 용어를 많이 사용한다.
실질적으로 프로그램을 움직이는 영혼과 비유를 하는 것. 결국에는 영혼과 같이 프로그램을 움직여주고 실행하는 역할을 하게 된다.
프로그램을 실행하는 주체는 CPU가 맡게 된다.
영혼은 CPU의 코어. 요즘에는 멀티코어지만 옛날에는 CPU하나에 코어 하나라 가정.
코어는 두뇌에 해당하고, 내부에 ALU 라고 해서 덧셈이나 뺄셈과 같은 연산 하는 회로 마련되어 있어.
얘가 그림판에 빙의 해서 실행하면 실행 되는 거다.
짧은 시간 만큼 실행하고 다른 프로그램으로 넘어가고 왔다 갔다 반복적으로 해주게 된다.
눈에는 그림판, 메모장, 서버가 동시에 실행 되는 걸로 보이겠지만
사실은 단일 코어가 실행하는 프로그램은 1개야.
프로그램 내에서도 서버는 쓰레드를 2개 배치했어. 왜 다른 애들은 1개인데 얘는 2개냐?
그림판, 메모장은 단순한 프로그램이지만 서버는 일감이 많아.
그거를 단일 스레드가 하면 벅차서 스레드 여러개 배치한 거
하지만 여러개 배치한다고 성능 항상 좋아지는 건 아냐.
코어 1개면 멀티 스레드 한게 큰 의미가 없긴 해.
같은 직원이라도 중요도 좀 다를 수 있어. 그림판은 하찮고, 서버가 중요하다 가정하면 우선순위 둬서 특정 스레드가 더 많은 실행 시간을 받게끔 할 수가 있어.
이건 기본적인 운영체제론에서 다루는 주제이긴 한데
공평하게 시간을 배분할 것이냐 몰빵할 것이냐 여러 케이스가 있어.
그래서 결국에는 왔다 갔다 하면서 실행하는게 프로그램이 동작하는 원리이다.
설령 직원 여러명이더라도 동시에 움직일 수 없어. 그래서 현실적으로 멀티 코어를 이용해. CPU 안에 코어가 여러 개가 배치된 상황. 실질적으로 코어가 여러 개라서 하나의 코어가 하나의 스레드를 전담 마크해서 얘네들이 진짜로 동시에 실행이 되면 프로그램이 아름답게 동작하는 상황이라고 보면 된다. 물론 이 상황은 아름답지만 스레드 개수 늘어나면 코어가 이 스레드 저 쓰레드 타고타고 가면서 실행하는 건 변함이 없어.
운영체제에서 ctrl+alt+delete 눌러서 작업관리자 보면 실행중인 프로그램 많다는 거 알 수 있어. 실질적으로 운영체제가 실행되는 커널모드도 결국에는 CPU가 실행해야 되는 건 변함 없기 때문에 그림판, 메모장, 서버 3개만 띄었다고 해서 프로그램이 이것만 실행되고 있는게 아니야. 운영체제는 생각보다 복잡하다.
이상적인 상황은 필요한 것만 켜놔서 CPU코어 개수랑 쓰레드 개수가 같아서 전담 마크 하는 상황이 이상적인 상황이다.
쓰레드를 여러개 고용하는 이유는 일감 분배해서 동시 실행하기 위함.
서버는 게임로직, 클라이언트가 보내는 패킷 처리, 데이타 베이스 저장, 일이 많아. 그걸 각각 분배해서 동시 다발적으로 실행하는게 최종 목표
메모장 여러개 키는 것처럼 동일한 프로그램 여러개 키는 거랑, 하나의 프로그램에 쓰레드를 여러개 배치하는 거랑 어떤 차이가 있을가?
멀티스레드에서는 장점이 있는데 Heap, 데이터 영역을 모든 스레드들이 공유할 수 있다. 데이터를 두 번 관리할 필요가 없이 동시 참조할 수 있어. 근데 이거 때문에 발생하는 문제가 있어. 예를 들어 하나의 스레드는 어떤 데이터를 건드리고 있고, 다른 스레드는 읽으려 하는 동시 다발적으로 발생하는 문제들을 해결하지 않으면 장점 활용할 수 없어.
멀티스레드라 함은 스레드를 잘 배치해서 걔네들이 병렬로 잘 동작하게 하는 것도 있지만, 공유된 데이터를 어떻게 관리해서 동시에 접근하게 할 것의 문제도 등장한다.
최종적으로 식당을 잘 운영해야 하는데 생각처럼 안되는 경우가 많아.
앞으로 스레드 생성을 해보고 동기화 기법들을 알아보다 보면 이런 부분들에 대해 깊게 이해하게 될 거야.
반응형
'Server programming' 카테고리의 다른 글
01_02_멀티쓰레드_쓰레드 생성 (0) | 2023.03.12 |
---|---|
01_02_멀티쓰레드_쓰레드 생성(구버전) (0) | 2023.03.12 |
00_03_OT_환경 설정 (0) | 2023.03.12 |
00_02_OT_서버 개론 (0) | 2023.03.12 |
00_01_OT_OT (0) | 2023.03.12 |
댓글