42Seoul_philosoper (Process, Thread)

devicii·2022년 7월 13일
0

42

목록 보기
6/8
post-thumbnail

프로세스와 쓰레드란 ?

프로세스


OS로부터 자원을 할당받은 작업의 단위

우리가 windonw의 .exe나 mac의 .dmg 확장자를 프로그램이라고 부른다.
프로그램의 특징은 아래와 같다.

  • 메모리에 올라가 있지 않다.
  • 정적이다. 즉 실행되지 않고 가만히 있다.

이제 우리가 위와 같은 특징을 가진 .exe(프로그램)을 클릭해서 실행한다면 실행하는 순간 파일은 컴퓨터 메모리에 올라가고 동적인 상태가 된다.

이 상태의 프로그램을 프로세스라고 한다.

즉 프로그램은 코드 파일이고, 그 코드 파일을 실행한 결과가 프로세스이다.

- 프로그램이 프로세스로 실행되면 일어나는 일들

메모리 공간을 확보한다

위와 같은 상태로 메모리 공간을 확보하게 된다.

  • Code : 우리가 작성한 코드
  • Data : static 변수 및 Global 변수
  • Heap : malloc()과 같은 동적인 메모리 영역
  • Stack : 지역변수, 매개변수, 반환 값 및 일시적인 데이터

PCB(Process Control Block) 생성
해당 프로세스에 대해서 정보를 담은 PCB 블럭이 생성된다.
PCB란?
프로세스 제어 블록(Process Control Block)의 약자로, CPU에 의해 실행 중인 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조이다. 운영 체제 차원에서 관리해주며, 이게 없다면 프로세스를 효율적으로 관리해줄 정보가 없어 사용자가 컴퓨터를 통한 원하는 기능을 제대로 이용할 수 없을 것이다. 작업 제어 블록(Task Control Block) 또는 작업 구조, 영문 이니셜로 TCB라고도 한다.

  • Pointer : 프로세스 상태 중 준비 및 대기중인 상태의 큐를 규현하기 위해 필요한 포인터
  • process state : 현재 프로세스의 상태를 담음
  • pid : 고유번호를 담음
  • program counter : 다음 명령을 가리킨다.

- 롤하면서 유튜브도 같이 보는 상황에서 프로세스의 동작방법

우리는 컴퓨터를 사용할 때 한 개의 작업을 하기보다는 여러 개의 작업을 주로 하게된다.
즉 롤을 하면서 노래도 듣거나 옆에 유튜브도 같이 띄우고 싶어한다.
그러나 원래 한 개의 프로세스가 실행되기 위해서 cpu를 점유하고 있다면, 다른 프로세스는 실행상태에 있을 수가 없다.
그래서 롤만 하거나, 유튜브만 보거나 둘 중에 한 개만 해야한다.
그렇기 때문에 여러 개의 프로세스를 짧은 텀(시분할)을 반복하며 전환시켜 실행한다. 그게 우리 눈에는 동시에 일어나는 것처럼 보인다.
아래에서 그 예시를 보자.

- Context Switching

하나의 프로세스가 CPU를 사용 중인 상태에서 다른 프로세스가 CPU를 사용하도록 하기 위해서, 이전 프로세스의 상태(문맥)을 보관하고 새로운 프로세스의 상태를 적재하는 작업이다.
또한 한 프로세스의 문맥은 그 프로세스의 PCB에 기록되어 있다.

1. 실행 상태의 PCB1과 준비 상태의 PCB2가 있다.

2. 실행 상태에 있던 PCB1이 cpu에 올라간다.

3. cpu에 있던 PCB1가 준비상태로 내려가고 이번엔 프로세스2가 cpu에 올라간다.

위와 같은 것이 컨텍스트 스위칭이다. 매우 번거롭고 힘들다. 그래서 경량화된 버전이 쓰레드이다.

컨텍스트 스위칭은 ms의 짧은 시간 단위로 일어나지만 과도하게 일어나면 오버헤드가 발생하게 된다.

그래서 컨텍스트 스위칭 코드는 어셈블리어로 작성되어있는 경우가 많다.

초기 컴퓨터 프로그램들은 모두 어셈블리어로 작성되었는데 서로 다른 CPU 아키텍처가 등장할 때마다 매번 똑같은 프로그램을 새로 작성해야하고, 작성 속도가 떨어지는 단점때문에 C와 같은 언어로 코드를 작성하고 컴파일러를 이용해 어셈블리어로 변환하는 과정을 거치는 방법을 많이 채택했다.

어셈블리어보다 속도가 떨어진다는 단점이 있었으나 이 역시 컴파일러의 발전으로 많이 극복되었다고 한다

- 쓰레드

쓰레드를 한 단어로 정리하면 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위


쓰레드의 특징은?

쓰레드는 위 사진과 같이 프로세스와 다르게 스레드 간 메모리를 공유하며 작동한다.
쓰레드끼리 프로세스의 자원을 공유하며 프로세스 실행 흐름의 일부가 된다. (stack영역을 제외하고 그외의 영역을 공통된 자원으로 사용한다.)

각 쓰레드는 stack 영역만 따로 가지고 있어서 효율적이다. 나머지 Code, Data, Heap영역의 공유되는 자원이 있기에 이전처럼 Context switching이 일어나면 캐시 적중률이 높다.
(이전 프로세스처럼 모조리 다 넣고 빼고 할 필요가 없어졌다. 프로세스는 서로 통신을 할 수 없기 때문에)

멀티 프로세스와 멀티 쓰레드

- 멀티 프로세스

예를 들어 한 개의 이벤트가 발생하면 한 개의 프로세스는 한 개의 처리밖에 못하기 때문에 부모 프로세스가 fork()를 한다.
그래서 여러 개의 자식 프로세를 만들어 일을 처리한다. 이때 자식은 부모와 별개의 메모리 영역을 확보함.

fork() 이전

fork() 이후

프로세스는 서로 통신을 할 수 없다.
통신이 필요하다면 IPC를 통해서 통신을 제한적으로 할 수 있다.
그렇기에 프로세스와는 다르게 각각의 메모리 영역이 생긴다.

멀티 프로세스 특징

- 멀티 쓰레드

쓰레드는 한 프로세스 내에서 구분된 실행 단위이다.

프로세스 내의 쓰레드는 기본적으로 한 개이다. 프로세스 내에서 분리해서 여러 개의 쓰레드로 나누어 실행단위가 커진다면 그것이 멀티 쓰레드이다.

(vscode로 코딩도 하면서, 추천함수도 받고, 테스트를 돌리며 수정도 하는 것처럼 작업 단위가 나누어질 때 쓰레드가 각각의 작업을 담당한다.)

- 멀티 쓰레드 특징

profile
Life is a long journey. But code Should be short :)

0개의 댓글