Computer Science/운영체제

[CS] Process vs Thread

findTheValue 2021. 7. 6. 00:05

우아한 테코톡 코다님의 Process vs Thread를 시청 후 작성하였습니다.

 

Process vs Thread


[이해해야하는 개념]

-실행 단위 : cpu core에서 실행하는 하나의 단위. 프로세스와 스레드를 포괄하는 개념.
-프로세스 : 하나의 스레드만 가지고 있는 단일 스레드 프로세스
-동시성 : 한 순간에 여러가지 일이 아니라, 짧은 전환으로 여러가지 일을 동시에 처리하는 것처럼 보이는 것.



프로그램 프로세스(실행이 되어 실제 사용할 수 있는 무언가)가 되어야 레시피에서 피자가 될 수 있음.

그러기 위해선 두가지 과정이 필요.

1. 프로세스가 필요로 하는 재료들이 메모리로 올라가야함
(실행 명령을 포함하는 code, static 또는 global 변수 등 data, 동적 메모리 영역인 Heap, 지역변수, 매개변수, 반환 값 등 일시적인 데이터를 담는 Stack이 메모리 공간을 확보함)

2. 해당 프로세스에 대한 정보를 담고있는 PCB(process Control Block)이 프로세스 생성시 함께 만들어짐.
(프로세스상태 중 준비, 대기상태의 큐를 구현하기 위한 Pointer, 현재 Process State, Process Number(ID),ProgramCounter(다음 명령어를 가르킴)등을 포함한 다수의 정보를 담음)

 


[동시성에 대한 갈망]


원래 하나의 cpu를 여러 프로세스가 점유할 수 없음. 그러나 여러개를 동시에 쓰고 싶음
=> 시분할로 짧은 텀을 반복하면서 전환실행하게 됨.

 

ex)
PCB1 => CPU
PCB2 준비상태.

PCB2 => CPU
PCB1 준비상태.

이걸 반복함(컨테스트 스위칭)
=> 귀찮음

=> 경량화된 프로세스 버전인 스레드가 등장함.
하나의 프로세스 안에 다수의 스레드가 있을 때 공유되는 자원이 있음.
프로세스 메모리 구조에서 모든 각각의 스레드는(Code, Data, Heap)를공유


각 스레드는 스택 부분만 따로 가지고 있음.
공유되는 자원이 있기 때문에 컨테스트 스위칭 시 캐싱 적중률이 올라감.(모조리 다 빼고 넣고 반복할 필요가 없어짐)

 



[멀티 프로세싱, 멀티 스레드]

 

모두 하나의 어플리케이션에 대한 처리방식의 일종,

ex)여러사용자가 로그인을 요청: 부모 프로세스가 fork()를 해서 자식 프로세스를 여러개 만들어 일을 처리하도록 함.
자식프로세스는 부모와 별개의 메모리 영역을 확보하게됨.

스레드는 한 프로세스 내에서 구분지어진 실행 단위. => 하나의 프로세스 내에서 분리해서 여러 스레드로 나뉘어
실행단위가 나뉘어지면 멀티스레드 

-멀티 프로세스
1. 각 프로세스는 독립적이기 때문에 IPC를 이용한 통신을 해야한다.(두명이 각 방에서 작업하다가 논의할 일이 생기면 방에서 나와 토의 한 후 다시 재진행)
2. 자원이 소모적, 개별 메모리를 차지
3. context Switching 비용이 큼.
4. 독립적이기 때문에 동기화 작업에 신경을 덜 써도 됨(장점)

-멀티 스레드
1. 공유자원이 많으므로 긴밀하게 연결 되어 있음.(두명이 한 방에서 작업. 논의할 일이 생기면 말만 걸면 됨)
2. 공유된 자원으로 통신비용 절감 및 효율적인 메모리 사용.
3. context switching 비용이 적음.
4. 공유 자원관리를 해야함.

그럼 멀티 스레드가 더 좋은가?
=> 익스플로러는 멀티 스레드 이용. 한 스레드, 하나의 탭에 문제가 생기면 전체 프로세스에 영향이 감
=> 구글 크롬은 멀티 프로세스를 이용. 다소 비효율적이지만 멀티탭에 영향을 덜 받음.

안전성 vs 효율성



멀티코어?


-멀티 스레드, 프로세스는 소프트웨어 개념.(처리 방식의 일종)
-멀티 코어는 하드웨어 개념.
-동시성(Concurrency), 병렬처리(Parallelism)
-동시성 : 짧은 순간 cpu시간을 분할해 동시에 하는 것처럼 보이게 하는것.
but 멀티코어는 물리적인 병렬처리를 통해 각 코어에서 처리함.



리눅스커널에서는 프로세스와 스레드를 동일하게 봄.

스레드는 사용자스레드와 커널스레드로 나뉨(하나는 사용자레벨, 커널레벨에서 다룸)

다대일, 일대일, 다대다로 사용자 스레드와 커널 스레드가 매칭됨.


리눅스는 일대일매칭이기 때문에 각각의 스레드를 하나의 프로세스로 봄.
근데 이 프로세스는 각각 다른 메모리를 가지지 않고 메모리를 공유를 함 = light weight process


각각 프로세스는 pid(프로세스 고유 번호)를 가짐
리눅스에서는 pid, tgid(스레드 그룹 id), tid(스레드 id)라는 걸 가짐.
사용자 레벨 입장에서는 tgid가 pid, 커널 입장에서는 tid가 pid로 보여지는 것임.
커널 입장에서는 pid가 같은 프로세스지만 각각 다른 프로세스로 인식함(tid가 다르기 때문)




요약

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