[TIL] 자바의 제네릭 및 함수형 프로그래밍 (24.01.17 - 24일차)

배고픈 배극곰·2024년 1월 18일
0

팀스터디

프로세스와 스레드

프로세스

프로그램이 메모리에 적재되어 인스턴스화 된 것. 즉, 실행중인 프로그램.
CPU 스케줄링의 대상이 되는 task와 같은 의미로 쓰인다.

특징

  • 프로세스는 최소 1개의 스레드를 가지고있다.
  • 프로세스들이 동시에 실행되는게 아니라 실제로는 CPU가 context Switching하며 여러 프로세스들을 왔다갔다 하며 처리한다.

e.g. 크롬 브라우저의 각각의 탭은 프로세스로 독립된 메모리를 가지고 있다.

💡 프로세스는 운영체제로부터 CPU, 메모리 등의 자원을 할당받아 CPU가 명령을 실행하도록 한다.

메모리와 PCB

프로세스는 메모리와 PCB로 구성되어 있다.

메모리 구조 내부
- 코드 영역(프로그램 자체)
- 데이터 영역(프로그램 실행 시 필요한 데이터)
  - 정적 데이터 영역
  - 스택 영역
  - 힙 영역

  • 코드 : 실행할 프로그램의 코드나 명령어들이 기계어 형태로 저장된 영역, CPU는 코드영역에 저장된 명령어를 하나씩 처리
  • 데이터: 전역변수, static변수 등 데이터 저장,
  • 스택: 함수안에서 선언된 지역변수, 매개변수, 리턴값 등 저장. 함수 호출시 저장되고 종료후 제거
  • 힙: 동적으로 할당된 메모리 저장.

스택과 힙은 동적영역으로 런타임 단계에서 메모리를 할당받는다!
데이터, 코드 영역은 정적영역으로 컴파일 단계에서 메모리를 할당한다.

프로세스 제어 블록 (PCB: Process Control Block)

각 프로세스마다 존재하는 블록으로 프로세스를 관리하기 위한 필요 정보들이 들어있다.
=> 여러 프로세스가 번갈아 실행되는 겨우 이 PCB에 있는 정보들을 활용한다.

프로세스 제어 블록(PCB) 내에 들어있는 정보
- 프로세스 번호(PID)
- 프로세스 상태
- 프로그램 카운터(PC)
- 레지스터
- 메모리 관리 정보
- 프로세스 우선순위
- 회계정보 등

컨텍스트 스위칭

스레든

★ 최종 프로세스 내부 구조

프로세스의 상태 (5가지 편)

1.New(생성 상태) - 프로세스가 생성된 상태(메모리 할당하여 적재시킨상태)를 의미하며, PCB가 할당된다.
2.Ready

  • CPU 스케줄러로부터 CPU 소유권을 기다리는 상태 (실행 준비가 되어있는 상태)
  • Dispatch(CPU할당)가 일어나면 실행상태로 바뀐다.

3.Running

  • 준비상태에 있는 프로세스 중 하나가 CPU 소유권과 메모리를 할당받고, instruction을 수행중인 상태.
  • CPU burst가 일어났다고도 한다.

4.Waiting

  • CPU를 줘도 당장 명령을 수행할 수 없는 상태
  • 실행 상태에 있는 프로세스가 이벤트(I/O 등)를 요청하면 해당 이벤트 완료까지 기다리는 상태
  • 완료 되면 Ready상태로 간다.

5.Terminated

  • 프로세스 종료 상태
  • 사용하던 모든 데이터 및 PCB 제거
  • 정상종료 exit , 비정상 종료 abort
생성 -> 준비 ---디스패치(CPU 획득)---> 실행 -> 종료
       준비 <---할당시간 만료------- 실행
생성 -> 준비 -------------------디스패치------------------> 실행 -> 종료
       준비 <---해당이벤트 작업완료-- 대기 <---이벤트 대기--- 실행

스레드 (프로세스의 문제점을 해결한 스레드)

정의: 프로세스 내에서의 다중처리를 위해 제안된 개념으로, 하나의 프로그램을 실행시키기 위한 기본적인 단위다.
프로세스 하나의 자원을 공유하면서 일련의 과정 여러개를 동시에 실행시킬 수 잇는 것을 말한다.

전통적인 프로세스에서는 하나의 프로세스 안에 하나의 PC가 코드영역을 가리켰다면,
스레드가 제안된 프로세스에서는 PCB에서 pc가 분리되어, 스레드 내에 pc가 존재하고.
pc가 각각 다른 코드영역을 가리킬 수 있게 되었다.

PC(Program Counter): 다음 수행할 명령어의 주소를 기억하는 레지스터이다.

장점
1. 빠른 컨텍스트 스위치
스케줄링 단위가 프로세스였던 시절, context switch가 일어날 때마다 캐쉬 flush, 그리고 캐쉬 복구등을 해야했다. 하지만, 스케줄링 단위가 Thread로 되면서 같은 프로세스 내의 Thread들을 context switch를 할 때는 TCB만 바꾸면 된다.

  1. 스레드간 통신으로 멀티스레드 구현
    프로세스끼리의 통신은 여전히 문제로 있다. 하지만 같은 프로세스내에서 스레드끼리의 통신을 더욱 쉽게 할 수 있도록 하였다. 그래서 멀티코어 환경에서 멀티 스레드를 이용해 더욱 빠른 실행을 할 수 있도록 한다. 기존 프로세스 단위의 실행은 단일 스레드 환경과 거의 같다.

스레드 장점

  1. 성능 향상
  2. 자원 공유 효율성 향상
    ★3. 동시성 (동시에 실행될수있다. 작업 병렬 처리)
  3. 간결성
    -> 작업 분리할 수 있어서 코드가 간결

스레드 단점

  1. 스레드간 상호간섭
  2. 많이 생성하면 성능저하 (스레드 많으면 컨텍스트 스위칭이 빈번하게 발생하므로)
    ★3. 동기화 이슈
    => 여러 스레드가 공유 자원에 동시에 접근할때, 동기화 문제가 발생할 수 있음.
    => Race Condition (경쟁 상태)
  3. 메모리 사용량 문제


프로세스와 스레드 차이

가장 큰 차이점은 메모리 공유 여부이다.

  • 프로세스는 각각 서로의 메모리를 공유하지 않고 독립적으로 수행된다.
  • 스레드는 프로세스에 할당된 가상메모리 중 Heap 영역, Data 영역, Code 영역(Literals, Instructions)을 공유하지만 Stack 영역, Program Counter(PC), Registers 는 각각의 스레드마다 따로 할당됩니다.

스레드에서 다른 자원은 공유하고 스택만 독립적으로 할당하는 이유

스택은 함수 호출 시 전달되는 인자, 되돌아갈 주소값 및 함수 내에서 선언하는 변수 등을 저장하기 위해 사용되는 메모리 공간이다.
스택 메모리 공간이 독립적이라는 것은 독립적인 함수 호출이 가능하다는 것이고 이는 독립적인 실행 흐름이 추가되는 것이다.
따라서 스레드의 정의에 따라 독립적인 실행 흐름을 추가하기 위한 최소 조건으로 독립된 스택을 할당한다.

profile
마부작침 형설지공

0개의 댓글