쓰레드

존스노우·2024년 2월 1일
1

독서모임

목록 보기
2/9

어디까지 파고들수 잇을까..

쓰레드

  • 프로세스보다도 작은 실행 흐름의 최소 단위

프로세스 vs 쓰레드 차이점

  • 프로세스는 : 각각 은행 지점

  • 스레드: 하나의 은행지점에 여러개의 창구

  • 프로세스는 서로 완벽히 독립적인 공간 가짐.

스레드

  1. 공유 영역:
  • 코드 영역: 프로세스 내의 모든 스레드는 동일한 코드를 공유합니다.
  • 데이터 영역: 전역 변수와 정적 변수는 프로세스 내의 모든 스레드에 의해 공유됩니다.
  1. 독립적 영역:
  • 스택 영역: 각 스레드는 자신만의 스택을 가집니다. 이 스택에는 해당 스레드의 함수 호출과 관련된 정보(인자, 지역 변수, 반환 주소 등)가 저장됩니다.
  • 코드 영역과 데이터 영역은 하나를 공유한다 ?
  • 같은 은행에 옆창구니 옆에서 하는얘 다 들을 수 있어 (프로세스 내 메모리 공유)
  • 근대 스레드하나 버그등 비정상 종료하면 같은 프로세스 소속된 다른 스레드 까지 모두 강제종료
  • 창구하나에서 폭탄테러 일어나면 나머지 창구도 폭파하는건가?
  • 프로세스 비용이너무크니 (아래 컨텍스트스위칭)

  • 그래서 탄생한게 스레드. 적은 메모리 점유 정보교환 쉽고 그러지만

  • 자원 선점 동기화 문제.

  • 자기만의 스택과 데이터 영역을 가짐, 보호 받기까지함?

  • 프로세스는 시작시 운영체제의 PCB (Process Control Block)

  • 메모리 공간 할당 초기화 과정이필요 어후 만핟.,..

  • 프로세스는 서로 독립되어있어서 공유메모리로 서로 주고받거나등

  • 번거로운 작업을 거침. (은행에 비유)

  • 하나가 불나도 다른점은 괜찮아! , 지점끼리 연락 직접가거나 번거로운 작업!

프로세스

  • 프로세스는 실행 중인 프로그램의 인스턴스
  • 독립된 메모리 공간을 가지며, 이 공간은 크게 다음과 같은 세 부분으로 나뉩니다
  1. 코드영역: 프로그램의 코드가 저장되는 부분입니다. 이 영역에는 실행할 프로그램의 기계어 코드가 저장됩니다.
  1. 데이터 영역: 프로그램의 전역 변수와 정적 변수(클래스 변수)가 저장되는 영역입니다. 프로그램 실행 동안 생성되고 수정될 수 있는 변수들이 위치합니다.
  1. 스택 영역: 함수 호출 시 전달되는 인자, 반환 주소 및 함수 내부의 지역 변수 등이 저장되는 영역입니다. 함수 호출 과정에서 생성되며, 함수가 끝나면 사라집니다.
public class Example {
    public static int globalCounter = 0; // 정적 변수

    public int instanceCounter; // 인스턴스 변수

    public void incrementCounter() {
        globalCounter++; // 정적 변수 증가
        instanceCounter++; // 인스턴스 변수 증가
    }

    public static void main(String[] args) {
        Example ex1 = new Example();
        Example ex2 = new Example();

        ex1.incrementCounter();
        ex2.incrementCounter();

        System.out.println("Global counter: " + globalCounter); // 출력: 2
        System.out.println("Ex1 instance counter: " + ex1.instanceCounter); // 출력: 1
        System.out.println("Ex2 instance counter: " + ex2.instanceCounter); // 출력: 1
    }
}
  • 하나의 실행 중인 프로그램
  • 프로세스는 실행 중인 프로그램의 인스턴스
  • 프로세스는 서로의 메모리가 별도로 관리
  • 필요한 정보를 복사해 줘야 하다보니 생성및 제거가 느림
  • 프로세스간 정보 교환이 어렵고 상당량의 메모리 중복 지녀야 됨
  • Context Switching 부담 상당?
  • 너무 이론적이라 어렵..

컨텍스트 스위칭?

  • 멀티 프로세스 환경! cpu가 하나의 프로세스 실행하고 있다.

  • 인터럽트 요청! 다음 우선순위 프로세스가 실행 될때?

  • 기존의 프로세스 상태 또는 레지스터 값 (context) 저장

  • 다음 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값(context) 교체하는 작업

  • 뭐 너무 자주 발생하면.. 성능의 영향이 간다.

  • 간단히 말하면 컴퓨터가 여러 작업을 빠르게 번갈아 가면서

  • 처리하는 방법 문서작성했다.. 인터넷 작업했다..

고전적 방법

생성

  • Thtead 상속
  • Runnable 구현

  • 가장 기본적인 부분. 이런식으로 사용을 한다.

장단점

  • 병렬처리 효율성 처리속도 향상

  • I/O 작업 많은 프로그램에서 자원 효율적 사용

    • 실무에서 외부? 커넥션 연결때 몇번사용해봣더니 퍼포먼스가 좋아졌다.
  • 뭐 .. 응답성향상 ,, 복잡한 작업 분할.. 당연한거?

    단점

  • 동기화 문제 같이 달려드니 무결성 문제 디비쪽인가?

  • 교착 상태 위험.

  • 컨텍스트 스위칭으로 인한 오버헤드 .. 전반적인 성능저하

언제사용해?

  • 동기화 필요없는 데이터 접근
    • 이건 맞는듯 데이터쪽보단 내가 주로사용한 외부 통신 이런거는 괜찮은듯.

  • 데드락 예제 .. 정말 간단한예제 그래도 뭔가 와닿는 느낌은 없다..

우아한 테크코스 - 스레드

  • 프로세스와 스레드는 완전히 다른 무언가는 아니다.

프로그램과 프로세스

  • 피자를 주문해보자

  • 피자가 나왔다? 피자 레시피를 줫음 ? 왜 피자를 안주고 레시피를 줘!

  • 레시피는 구현하고 있는 코드파일. 프로그램이라고함

  • 프로그램은 실행시키전 코드가 구현되어있는 파일

  • 실행시키기전 ( 레시피로 피자만들기 전까진) 아무것도아님

  • 실행되어 사용할 수 있는 무언가 되야된다 이게 프로세스 (레시피를 보고 피자를 완성해야 피자가 되지!)

프로세스 지식

  • 프로그램이 프로세스가 되면 뭐가 일어날까?

  • 프로세스가 필요한 재료들이 메모리에 올라가야됨. (메모리 공간 확보)

  • 해당 프로세스 정보를 담고있는 PCB 블록이 올라감

  • 프로세스 상태 중에 뭐 준비 상태나 대기 상태에 큐를 구현하기 위해 필요한 포인터

  • 현재 프로세스의 상태를 담는 프로세스 스테이트

  • 고유 번호를 담는 PID

  • 다음 명령어를 가리키는 프로그램 카운터 등등

멀리서 한번 바라보자

  • 한 프로세스가 실행되기 위해 시피유 점유하고있으면?
  • 다른 프로세스는 실행상태에 있을 수가 없음
  • 노래를 듣다 코딩을 하기위해 인텔리제이를 키면 노래가 꺼지지!
  • 다수의 프로세스를 동시에 실행시키기위해 시분할로 / 즉! 짧은 텀을 반복하면서
  • 전환해서 실행 시키도록 함

  • 동시에 실행하고싶은 프로세스가 2개가 있다
  • 두 개를 동시에 실행 하기위해서 짧은 텀이 반복되어야 함
  • 서로 반복해가면서 점유 컨텍스트 스위칭!

등장 경량화된 프로세스 버전인 스레드

  • 하나의 프로세스안에 다수의 스레드가 있을때 공유되는 자원이 있기 때문
  • 각 스레드는 스택 부분만을 따로 가지고 있음.
  • 공유 되는 자원이 있기때문에 콘텍스트 스위칭이 일어날 때 캐싱률이 높아짐
  • 회의실로비유

  • 노트북을 공유 모니터에 연결 스피커 리모컨 을 사용해 작동

  • 다음팀이 들어와서 사용할라면? 프로세스 관점에선 리모컨 스피커 모니터 다들고 와서 셋팅

  • 하지만 스레드 관점에선 노트북만들고 서로 다른팀들이 오면 노트북만 모니터에 연결하고

  • 스피커 리모컨등을 사용하면 됨

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

  • 모두 처리 방식의 일종
  • 한 어플리케이션에 대한 처리 방법
  • 여기서 한 어플리케이션에서 두가지 다른 처리 방식에 대해 이야기 하는구나 하고 이해하고 시작

  • 한 어플리케이션이 여러가지 일을 처리 ? 여러 사용자가 로그인 처리
  • 한 프로세스는 매번 하나의 로그인만 처리해서 동시에 처리못함
  • 자식 프로세스를 만들어서처리
  • 이때 자식 프로세스는 부모와 별개의 메모리 영역을 확보

  • 반면 스레드는 한 프로세스 내에서 구분지어진 실행 단위

  • 실행 단위? 프로세스일수도 스레드일수도 있다 여기 이야기에선

  • 만약에 프로세스가 다수의 스레드로 구분되어있지않다? 단일 프로세스로 하나로 실행

  • 이때 실행 단위는 프로세스 그 자체

  • 해당 프로세스의 하나밖에없는 쓰레드가 실행 단위가 되는거.

  • 프로세스 내에서 분리해서 여러 스레드로 나뉘어서 실행단위가 나뉘어 지면

  • 그게 멀티 스레드

  • 인텔리제이를 사용하며 코드를 수정는 동시에

  • 인텔리제이의 추천코드도 보여줘야하고

  • 테스트도 돌리는 동시에 코드를 수정해야 될대도 잇고

  • 이렇게 한 어플리케이션에 대한 작업의 단위가 나눠질때가 많다

  • 이 때 각각 스레드가 그 작업들을 담당한다..

  • 프로세스는 독립적이기 때문에 IPC를 통해서 통신을 해야합니다.

  • 같은 작업을 두명이 두개의 다른 회의실에서 진행하다가 논의 할일이 생기면 밖으로 나와서 얘기하고 다시 회의실에들어감

  • 그리고 자원소모적 메모리 차지 위에 언급 다함.

  • 개별 독립적이기 때문에 동기화 작업 신경 덜 서도 됨.

  • 스레드는 공유 자원이 많아서 긴밀하게 연결되어 있음
  • 그만큼 동기화도 신경을 써야하지만
  • 공유된 자원으로 메모리가 효율적이고 통신비용도 절감
  • 두명이 한 회의실에서 얘기하기 대문에 비용이 적다

멀티 스레드가 더좋아보이는대? 근대왜 멀티프로세서를 사용?

  • 실생활 예시

  • 혹시 잘못될까바 마우스도 안움직이고..

  • 그러다가 창 자체가 저절로 꺼짐

  • 멀티스레드를 이용했기 때문

  • 긴밀하게 연결되어있기 때문에 한 탭에 문제가 생기면 전체 프로세스에 영향이 감

  • 크롬은 멀티 프로세스를 이용하기 때문에 멀티 탭 간에 영향을 받지 않음

  • 다 장단점이있는대 흐음 뭔가 이해가 전체적으로 애매한대

멀티 코어

  • 하드웨어 측면 얘기

동시성 VS 병렬성

  • 싱글코어 CPU가 실행 단위 처리 위해서

  • 동시에 여러가지 진행하기 위해 빠른 텀으로 전환되어 실행된다 그 개념이 동시 성

  • 여러 실행 단위를 번갈아 실행하면서 동시에 일어나는 것 처럼 보임

  • 애니메이션 같다. 동시성은 짧은 순간에 CPU 시간을 분할해서 동시에 하는 것처럼 보이게..

  • 멀티코어는 병렬처리

  • 물리적으로 여러코어를 사용해서 다수의 실행단위를 한순간에 처리할수 있게함

  • 한꺼번에 두 개의 코어에서 각각 실행 단위가 진행 됨

  • 그것이 병렬 처리

  • 다수의 프로세서로 여러가지 일을 각 코어에서 진행하는 것.

번외


profile
어제의 나보다 한걸음 더

0개의 댓글