[OS] 스레드, 멀티코어와 멀티스레드

먼지감자·2021년 8월 20일
0

CS 스터디

목록 보기
4/4

스레드란? (thread)

쓰레드는 프로그램 내부의 흐름(맥)이다.

int main(void)
{
  int n = 0;
  int m = 10;
  printf("%d\n", n * m);
  while(n < m)
    n++;
  printf("END\n");
}

위와 같은 코드는 하나의 흐름을 가지고 있고 이를 쓰레드라고 부른다. 일반적으로 하나의 프로그램은 하나의 쓰레드를 갖는다.

멀티 프로세스 / 멀티스레드

멀티 프로세스

하나의 프로그램을 여러개의 프로세스로 구성하여 각 프로세스가 병렬적으로 작업을 수행하는 것

장점

  • 메모리 침범 문제를 OS 차원에서 해결
  • 여러 자식 프로세스 중 하나에 문제가 발생하여도 그 프로세스만 타격, 확산되지 X

    메모리 침범 문제
    운영체제는 프로그램의 코드 부분에 메모리를 읽기 전용으로만 사용하고, 프로세스간에는 메모리 영역을 침범하지 못하도록 한다. 따라서, 프로그램의 코드로 되어 있는 메모리 영역을 침범해 기록하면 버스 에러나 세그먼트 결함이 일어나서 프로그램이 종료된다.

단점

  • 각 프로세스가 독립된 메모리 영역 (Code, Data, Heap, Stack)을 가지고 있기 때문에 작업량이 많아지면 오버헤드가 발생함 (context switching)
  • 프로세스 간의 복잡한 통신 (IPC) 가 필요함

IPC(Inter-Process Communication)

프로세스들은 서로 통신이 필요하면, 커널이 제공하는 IPC 설비를 이용해 통신을 진행한다.

1. 익명 PIPE

: 파이프는 두 프로세스를 연결, 한 쪽은 쏘기만 하고 한 쪽은 읽기만 하는 반이중통신 (한방향) -> 양방향 통신을 위해서는 2개의 파이프가 필요하다!

장점
매우 간간한 사용, 단순한 데이터 흐름에서는 효율적
단점
양방향 통신을 위해서는 파이프 두개를 만들어야 하기 때문에 구현이 복잡해짐

2. Named PIPE

: 익명 파이프와 유사하게 동시에 읽기와 쓰기가 불가능한 반이중 통신이지만, 전혀 모르는 관계의 프로세스 간의 통신 -> 이름이 있는 파일 사용

장단점은 익명 파이프와 동일하다!

3. Message Queue

입출력 방식은 Named PIPE와 동일하지만 데이터의 흐름이 아닌 메모리 공간(-> 뮤텍스, 세마포어와 같은 동기화가 필요!)
사용할 데이터에 번호를 붙이면서 여러 프로세스가 동시에 데이터를 쉽게 다룰 수 있다

4. Shared Memory

파이프, 메세지 큐가 통신을 이용한 설비라면, 공유 메모리는 데이터 자체를 공유하도록 지원하는 설비
프로세스간 메모리 영역을 공유해서 사용할 수 있도록 허용한다
프로세스가 공유 메모리 할당을 커널에 요청 -> 커널은 해당 프로세스에 다른 프로세스들이 접근 가능한 메모리 공간을 할당한다
장점
중개자 없이 곧바로 메모리에 접근하기 때문에 가장 빠른 IPC 설비이다!

5. 메모리 맵

공유 메모리 처럼 메모리를 공유하지만!
열린 파일을 메모리에 매핑시켜 공유하는 방식
즉, 공유 매개체가 파일 & 메모리 인 형식
주로 대용량 데이터를 공유해야 할 때 사용함

6. 소켓

네트워크 소켓 통신을 통한 데이터 공유
client - server 가 소켓을 통해 통신하는 구조
원격의 프로세스 간의 통신에 사용됨

멀티 스레드

하나의 응용 프로그램에서 여러 스레드를 구성해 각 스레드가 하나의 작업을 처리하는 것
장점

  • 메모리 공간, 시스템 자원의 효율성 증가
  • Data, Heap 영역을 이용해 데이터를 주고 받으므로 스레드간 통신이 간단함
  • context switching시 비용이 적음 (교환해야 할게 적으니까!) -> 시스템 처리량 향상, 프로그램 응답 시간 단축됨
    단점
  • 서로 다른 스레드가 Stack을 제외한 메모리 공간을 공유하기 때문에 동기화 문제가 발생할 수 있음
  • 하나의 스레드에 문제가 생기면 전체 프로세스가 영향을 받음
  • 주의 깊은 설계가 필요하며 디버깅이 까다로움

TCB (Thread Control Block)
스레드의 메타데이터를 저장하는 블록, 스레드 별로 존재하는 자료 구조

PCB 와 TCB 가 사용될 때
같은 프로세스 내에서, 스레드간의 context switching -> TCB만!
다른 프로세스의 스레드로 context switching -> PCB & TCB!
(TCB가 context switching의 기본 단위이다)

하나의 프로그램에 쓰레드가 2개 이상 존재하는 것을 다중 쓰레드라고 한다. 이렇게 한 프로그램에 여러 개의 쓰레드 즉, 흐름이 있을 수 있는 이유는 쓰레드가 빠른 시간 간격으로 스위칭되기 때문이다. 이러한 동작으로 사용자는 여러 쓰레드가 동시에 실행되는 것처럼 보인다.

이처럼 CPU가 하나인 환경에서 여러 쓰레드가 스위칭에 의해 동시에 수행되는 효과를 concurrent라 한다. 반면에 여러 CPU 환경에서 여러 쓰레드가 실제로 동시에 수행되는 것은 simultaneous라고 한다.

현재 운영체제에서는 대부분 다중 쓰레드를 지원하기 때문에 하나의 프로세스 안에서 여러 쓰레드를 수행하다가 다른 프로세스로 넘어가서 그 프로세스의 쓰레드를 수행한다. 그러므로 현대 운영체제의 context switching 단위는 프로세스가 아닌 쓰레드 단위이다.

Thread VS Precess

한 프로세스에는 기본적으로 하나의 쓰레드가 존재한다. 프로세스는 code, data 메모리 공간이 존재하는데, 이는 여러 쓰레드가 공유한다. 이외에도 프로세스의 자원인 file, I/O 등은 여러 쓰레드가 공유하지만, 각 쓰레드가 고유하게 가지고 있는 것은 PC(Program Counter), SP(Stack Pointer), registers, stack 등이 있다.

멀티 프로세싱 / 멀티 코어 / 멀티 태스킹 / 멀티 프로그래밍

1. 멀티 프로세싱
CPU가 1개가 아닌 여러개인 것을 말함
register와 cache를 독립적으로 가진 여러개의 CPU가 1개의 메모리에 연결된 구조
2. 멀티 코어
CPU 칩 내부에 register와 cache를 갖고 있는 core 만 따로 회로를 구성한 구조
3. 멀티 프로그래밍
초기의 컴퓨터에서는 하나의 프로그램이 메모리에 올라가면 하나의 프로그램만 CPU가 처리를 진행할 수 있었다. 이 과정에서 프로세서의 처리 속도와 입출력 속도 간의 차이로 인해, 입출력이 완료될 때까지 프로세서는 idle한 상태가 된다. 따라서 이는 프로세서의 자원 낭비로 이루어진다.

프로세서가 입출력 작업의 종료를 대기할 동안 하나의 프로세서에서 다른 프로그램을 수행할 수 있도록 하는 것이 멀티프로그래밍이다.
4. 멀티 태스킹
Task란 운영체제에서 처리하는 작업의 단위 또는 정해진 일을 수행하기 위한 명령어 집합을 뜻하는데 (process 보다 확장된 개념), 멀티 태스킹은 task를 OS의 스케쥴링에 의해 task를 번갈아가며 수행하는 것을 의미한다.
여러개의 task를 자주 번갈아가며 수행하다보니 사용자는 동시에 여러 task가 수행되고 있다고 느끼게 된다.


Ref
https://velog.io/@codemcd/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9COS-7.-%EC%93%B0%EB%A0%88%EB%93%9CThread
[OS] 멀티프로세스, 멀티스레드, 멀티 프로그래밍, 멀티프로세스 멀티스레드에서의 데이터 통신
멀티프로세싱, 멀티프로그래밍

profile
ML/AI Engineer

0개의 댓글