[Java] 스레드와 프로세스

YounDitt·2020년 9월 27일
0

멀티프로그래밍

목록 보기
2/2

1. 프로세스

  • 운영체제로부터 자원을 할당받는 작업의 단위
  • 실행되는 프로그램 자체와 프로그램이 실행되는 주변 환경을 포함하는 개념
    (실행되는 주변 환경이란 사용중인 파일, 데이터, 메모리 영역 주소 공간등을 뜻한다.)
  • 실행될때 프로세서, 필요한 주소공간, 데이터, 메모리영역등 자원을 할당받는다.
  • Stack, Heap, Data, Text의 구조로 되어있는 독립된 메모리 영역

참고 : 안드로이드의 프로세스

2. 스레드

  • 프로세스가 할당받은 자원을 이용한 실행의 단위
  • 한 프로세스 내에서 동작되는 여러 실행의 흐름으로 프로세스 내의 주소공간이나 자원들을 같은 프로세스내의 다른 스레드랑 공유하면서 실행
  • Stack(임시변수저장메모리)를 제외하고 나머지 메모리영역은 프로세스내의 다른스레드와 공유

🙋‍♀️ 멀티스레드의 장/단점

  • 멀티스레드의 장점
  1. Context-Switching할 때 공유하고 있는 메모리만큼의 메모리 자원을 아낄 수 있다.
  2. 스레드는 프로세스 내의 Stack 영역을 제외한 모든 메모리를 공유하기 때문에 통신의 부담이 적어서 응답 시간이 빠르다.
  • 멀티스레드의 단점
  1. 스레드 하나가 프로세스 내 자원을 망쳐버린다면 모든 프로세스가 종료될 수 있다.
  2. 자원을 공유하기 때문에 필연적으로 동기화 문제가 발생할 수밖에 없다.

🙋‍♀️ Why 멀티스레드?

  • 멀티프로세스는 context switching에 비용이 더 크다.
  • 시스템 자원을 효율적으로 관리하기 위해.
  • 프로세스를 생성하여 자원을 할당하는 시스템 콜이 줄어들어 보다 효율적으로 관리할 수 있다.
  • 프로세스간 통신보다 스레드간 통신의 비용이 적다.(스레드는 캐쉬메모리 초기화 할 필요가 없는.. 등 컨텍스트 스위칭시에 공유메모리만큼 시간(자원)손실이 줄어듬)
  • 스택을 제외한 모든 메모리를 공유하기 때문에 global static new등 모든 자료를 공유할 수 있다.

하지만 스레드간 자원공유는 전역변수를 이용하므로 항상 원하는 순서로 동작한다는 보장이 없기 때문에 같은 메모리를 참조할 때 원하는 결과가 나오지 않을 수 있어 동기화 문제에 신경써야한다.

스레드 우선순위

1. 동시성

하나의 코어에서 멀티스레드가 번갈아 가며 실행하는 성질

2. 병렬성

멀티코어에서 개별스레드를 동시에 실행하는 성질

3. 스레드 스케줄링

스레드의 개수가 코어(cpu)의 수보다 많을 때 어떤 순서에 의해 동시성으로 실행할 것인지 결정해야 하는데 이것을 스레드 스케줄링이라고 한다.

자바의 스레드 스케줄링

  1. 우선순위 방식(Priority)
    • 코드로 제어 가능
    • 우선순위가 높은 스레드가 실행상태를 더 많이 갖도록 스케줄링
  2. 순환할당(Round-Robin)
    • 코드로 제어 불가
    • 시간할당량(Time Slice)를 정해서 하나의 스레들르 정해진 시간만큼 실행

🙋‍♀️ 10개의 네트워크 작업을 할 때 어떻게 동작하는게 가장 빠를까?

코어의 개수만큼 스레드를 생성하여 처리한다.

4코어일때 10개의 스레드를 생성하게 되면, 코어는 4개이기 때문에 4개가 끝날때마다 스레드가 변경되는(?) 컨텍스트 스위칭이 발생한다. 때문에 코어의 개수만큼 실행하는게 가장 빠르다.

thread-safe하다?

  • 멀티스레드 환경에서 syncronized등 스레드를 처리할때 다른 동작을 못하도록 멈춘다.
  • 클래스에 여러개의 스레드가 접근할때, 순서에 상관없이 같은 결과가 나오면 thread-safe하다.(ArrayList는 스레드에 안전하지 않다.)

참고 1
참고 2
참고 3

profile
Hello, Android

0개의 댓글