운영체제 윈도우,리녹스
윈도우 = 상당히 신속하다
프로세스 (프로그램)
운영체제 안에서 실행되는 프로그램
실행 파일에 담겨있는 데이터 및 코드가 메모리에 적재되어 동작하는 것
프로세스는 반드시 하나 이상의 스레드로 구성되어집니다
스레드를 여러 개 쓰는 걸 보통 멀티 스레드라 표현한다
프로세스는 윈도우에서 실행되는 모든 프로그램을 프로세스라한다
스레드는 세부정부에 들어가 보면 스레드라 나와 있다
어떤 프로세스든 어떤 프로그램이든 전부다 스레드가 있다
스레드 : 운영체제가 CPU에 시간을 할당하는 기본 단위(운영체제가 명령어를 실행하기 위한 스케줄링 단위)
예를 들어 일정 파일을 복사하는 프로그램을 만들었다 근데 복사하는데 5분이 걸린다 가정하고 싱글스레드라 하면 이 프로그램은 복사하는 동안 아무것도 못한다 취소하지도 못한다 하지만 이프로그램이 멀티 스레드라면 복사하는 걸 하나의 스레드로 잡아 넣고 나머지 스레드에서 취소 기능을 넣어나 여러가지 기능을 넣어 줄 ㅜ수 있다
예를 들어 프로그램1,2 두개가 있다 만약 1프로그램에 있는 프로그램을 옮기고 싶다 그러면 서로 다른 프로그램이니깐 옮기기 위해서는 다른 작업이 필요하다 하지만 멀티 스레드는 두개의 스레드에서 내가 원하는 데이터 공유가 쉽다
결국에는 스레드는 프로세스 안에 있다 하지만 멀티 스레드가 아닌 새로운 프로세스를 실행하면 실행한 만큼 메모리를 사용하지만 하지만 이스레드는 이미 프로세스 안에 생성되기 때문에 새로운 프로세스를 만드는 거보다 훨씬 더 적은 메모리를 사용 할 수 있다
이런 개념들 자체가 구현이 복잡해진다 기본적으로 우리는 순서대로 싱글 스레드에서 구현되는 코드 로직을 쓰다가 멀티 스레드를 해야 된다 하면 생각을 한번 더 해야 하기 때문에 구현 난이도가 올라간다 그리고 멀티 스레드를 씀으로써 여러 문제가 생길 수 있다
프로세스를 껐다고 해서 다른 프로세스에 영향이 있는 건 아니다 하지만 스레드는 좀 다르다
스레드는 프로세스 안에 있기 때문에 만약에 프로세스 안에 스레드에서 문제가 생긴다면 프로세스가 터져 버린다 퍽이 나버린다 우리가 여태 까지 스레드 하나를 쓸 때는 하나만 잘 관리하면 되는데 스레드를 여러 개를 쓰면 하나만 문제가 있어도 프로그램 자체가 죽어버리기 때문에 그래서 소프트웨어 안전성이 떨어진다
왜 떨어지냐 운영체제에는 스케줄러가 있다 스케줄러가 스레드를 골라서 CPU한데 이거 실행하라고 명령을 한다 그러면 CPU는 놀고 있는 게 아니라 실행하고 있는 스레드가 있다 그렇기에 명령을 한다면
CPU1 >> 실행중 >> 멈추고 내가 어디까지 실행 했는지 정보를 운영체제에 저장
운영체제가 실행해 라고 한 것을 실행 >> 멈춘것을 다시 가서 실행
이 된다 이런 식으로 실행하다 멈추고 반복하는 걸 컨텍스트 스위칭이라 한다 결국에는 CPU는 해당 스레드의 어디까지 실행 됐는 지에 대한 정보를 가지고 있어야한다 이 정보를 누구한데 받냐면 운영체제한데 받는다 이런 정보를 받는 것도 메모리를 쓰기 때문에 너무 자주 일어나면 오히려 멀티스레드의 장점들이 퇴색될 수 있다
그럼 유니티하고 차이점은 우리가 공부한 스레드는 프로세스 안에 스레드를 여러 개 만들어서 로직을 병렬적으로 여러 스레드를 실행할 수 있다
유니티는 사실 내부에 접근할 수 있는 스레드는 단 하나 이다 게임 로직에 접근할 수 있는 스레드 딱 하나를 유니티에서 허용해 놨다 그렇기 때문에 우리가 코루틴을 사용한 것이다 메인 로직으로는 하나의 흐름 밖에 못 만들지만 중간 중간 우리가 병렬적으로 게임 로직을 구성해야 할 때 코루틴을 이용해서 사용했다 큰 틀에서 보자면 우리가 여태까지 짯던 코드는 유니티 내부의 게임 로직 메인 스레드 하나의 스레드에서 작동된다는 걸 알고 있으면 된다
예전에는 싱글 스레드로 작업을 했기 떄문에 이런 문제가 생길 여지가 없었다