[OS] Multi-process / Multi-thread / Multi-core

Doodung·2022년 1월 11일
0

OS - 운영체제

목록 보기
2/15
post-thumbnail

Multi-process / Multi-thread

Multi-process

  • 각 프로세스는 독립적
  • IPC를 사용한 통신
  • 자원 소모적, 개별 메모리 차지
  • context switching 비용이 큼
  • 동기화 작업이 필요하지 않음

Multi-thread

  • 스레드끼리 긴밀하게 연결되어 있음
  • 공유된 자원으로 통신 비용 절감
  • 공유된 자원으로 메모리가 효율적임
  • context switching 비용이 적음
  • 공유 자원 관리를 해야함

두가지 개념 모두 처리 방식의 일종. (한 어플리케이션에 대한 처리 방식이라고 생각)
한 어플리케이션이 여러가지 일을 처리할 때가 있다.

EX) 여러 사용자가 로그인을 요청하는 상황
-> 한 프로세스는 매번 하나의 로그인만 처리할 수 있기 때문에 동시에 처리할 수 없다. 그래서 부모 프로세스가 fork()를 해서 자식 프로세스를 여러개 만들어서 이를 처리하게 한다. 이때 자식 프로세스는 부모와 별개의 메모리 영역을 확보하게 된다.

반면, 스레드는 한 프로세스 내에서 구분이 지어진 실행 단위이다. 만약 프로세스가 다수의 스레드로 구분되어있지 않으면 단일 스레드 하나로 프로세스가 실행이 된다. 이때 실행 단위는 프로세스 그 자체가 되는 것이다. 자세히 말하면 해당 프로세스의 하나밖에 없는 스레드가 실행 단위가 되는 것이다.

프로세스 내에서 분리해서 여러 스레드로 나눠서 실행 단위가 나누어지면 그게 멀티 스레드가 되는 것이다. 테스트를 돌리는 동시에 소스코드를 수정할 때 or 한 어플리케이션에 대한 작업의 단위가 나누어질 때 각각의 스레드가 그 작업들을 담당하는 것이다.

  • 프로세스는 독립적이기 때문에 IPC를 사용해서 통신을 해야한다. 같은 작업을 두명이 두개의 다른 회의실에서 진행을 하다가 논의할 일이 생기면 밖에서 이야길 하고 다시 들어가야 한다.

  • 반면, 스레드는 공유자원이 많아서 긴밀하게 연결되어 있다. 두명이 한 회의실에 앉아서 일을 처리하기 때문에 논의할 일이 생기면 말만 걸면 되는것.


그렇다면 왜 멀티 프로세스를 이용할까?

익스플로러 사용하다가 작동 중지 되는 것 -> 여러개 탭 사용하고 있을 때.
이건 멀티스레드를 이용했기 때문이다. 긴밀하게 연결되어 있기 때문에 한 스레드, 한 탭에 문제가 생기면 전체 프로세스에 영향이 간다. 반면, 크롬을 생각해보면 비효율적인 부분이 있을 수 있지만 멀티 프로세스를 이용하기 때문에 멀티탭간의 영향을 덜 받는다.


Multi-core

Concurrency 동시성

  • 하나의 코어에서 하나 이상의 프로세스(혹은 스레드)가 번갈아가면서 진행되지만 동시에 진행되는 것처럼 보이는 것

Parallelism 병렬처리

  • 둘 이상의 코어에서 동시에 하나 이상의 프로세스(혹은 스레드)가 한꺼번에 진행되는 것

멀티 코어가 아니면 멀티 프로세스, 멀티 스레드가 안돼?

멀티 코어는 하드웨어 측면에 가깝다. 멀티 코어와 관련된 키워드는 동시성과 병렬처리이다. 싱글 코어를 가진 CPU가 실행 단위를 처리할 때는 동시에 여러가지가 진행되기 위해서 빠른텀으로 전환이 되면서 실행이 된다.
그 개념이 동시성이다. 여러 실행 단위를 번갈아 실행하면서 동시에 일어나는 것처럼 보인다.

동시성은 이렇게 짧은 순간에 CPU의 시간을 분할해서 동시에 하는 것처럼 보이게 한다. 하지만 멀티 코어는 병렬처리, 물리적으로 여러 코어를 사용해서 다수의 실행 단위를 한 순간에 동시에 처리할 수 있게 한것이다. 한꺼번에 두개의 코어에서 각각 실행단위가 진행될 수 있는 것. 이것이 병렬처리이다.


리눅스 커널에서의 프로세스와 스레드?

리눅스 커널에서는 프로세스와 스레드를 동일하게 본다.
스레드는 사용자 스레드커널 스레드로 나뉜다.
각 스레드를 담당하는 레벨이 하나는 사용자 레벨이고, 하나는 커널 레벨이다. 이 때 사용자 스레드와 커널 스레드 간에 어떤 연간 관계가 존재하는데, 여기서 다대일, 일대일, 다대다 등의 모델이 있다. 리눅스는 일대일이다. 그래서 리눅스 커널 입장에서 보면 각각의 스레드가 하나의 프로세스다 라고 표현하는 것이다.

그런데 이 프로세스는 위에 말했던 프로세스와 다르게 메모리를 공유한다. 그래서 이것들을 light weight process라고 구분해서 부른다.

각각의 프로세스는 프로세스 고유 번호를 가지는데, 그럼 리눅스에서 스레드가 각각 다른 이름을 가질까?
정답은 아니다. -> 리눅스에서는 한 프로세스에 생성된 스레드는 모두 같은 pid를 갖고 있다. 근데 더 자세히 들여다보면 tgid라고 스레드 그룹 아이디를 가지고 있고 tid라는 스레드 id도 있다. 그래서 사용자 레벨 입장에서 보면 이 스레드 그룹 아이디가 pid로 보여지고, 커널 입장에서 보면 tid가 pid로 인식이 된다.

그래서 관점을 다르게 이해해야 한다. 커널 입장에서는 각각 다른 프로세스로 보게되는 것이다.


정리

  1. 프로세스는 프로그램이 실행된 것이다.
  2. 스레드는 한 프로세스 내에서 나뉘어진 하나 이상의 실행 단위이다.
  3. 한 어플리케이션에 대한 작업을 동시에 하기 위해서는 2가지 처리 방식(멀티 프로세스, 멀티 스레드)이 있다.
  4. 동시에 실행이 되는 것처럼 보이기 위해서 실행 단위는 시분할로 cpu를 점유하며 context switching을 한다.
  5. 멀티 프로세스는 독립적인 메모리를 가지고 있지만 멀티 스레드는 자원을 공유한다. 그것에 따른 각각의 장단점이 있다.
  6. 멀티 코어는 하드웨어 측면에서 실행 단위를 병렬적으로 처리할 수 있도록 여러 프로세스가 있는 것이다.

출처 - https://youtu.be/1grtWKqTn50

profile
반가워요!

0개의 댓글