CPU와 스레드

Cjw.dev·2023년 3월 2일

CPU(Central Processing Unit) : 중앙처리장치

컴퓨터의 연산을 실행하고 제어하는 일을 하는 컴퓨터의 중앙처리장치
(사람의 뇌와 같은 역할)

※ 연산 : 일반적으로는 수학식 계산이라 생각할 수 있지만 컴퓨터에서는 명령어들을 실행하는 것도 연산이라 한다.

CPU는 일반적으로 한개이나 특수한 목적이 있다면 2개 이상 존재할 수도 있다.
여러개의 CPU가 존재하는 경우를 멀티 프로세서, 다수의 프로세서가 협력적으로 일을 처리하는 것을 멀티 프로세싱이라고 한다.

Core(코어)

CPU의 실질적인 뇌와 같은 역할
CPU에는 뇌의 개수가 꼭 1개만 있는 것은 아니다.

CORE는 개수에 따라

1개 Single-core / 2개 Dual-core / 4개 : Quad-core / 6개 Hexa-core / 8개 Octa-core

Clock(클럭)

CPU의 Core가 동작하기 위해서는 '0' or '1' 이라는 전기적 진동의 생성이 필요하다.
전기적 진동을 클럭이라 부른다. 진동수는 Hz(헤르츠)라는 단위로 표기한다.

※ 클럭이 높다고 무조건 시간대비 연산량이 많지는 않다.

Core와 Process와의 관계

운영체제는 프로그램(프로세스)이 실행되면 한정된 자원인 CPU와 기타자원들을 사용할 수 있도록 할당하고 관리한다.

루피가 a,b,c라는 일을 처리하는데 걸리는 시간

a : 8시간
b : 1시간
c : 3시간

처리하는 방법

1) 순차적 처리 방식 : 총 12시간
단점 :
한 작업이 끝날 때까지 다른 작업 불가
어떤 작업에 대한 우선순위의 기준 불명확

2) 다중처리방식/균등분할처리방식(멀티플레이) : 총 8시간
단점 :
중요한 작업 처리속도가 늦어진다.
처리 시간을 균등하게 나누는 기준 불명확

컴퓨터의 뇌를 Core, 작업을 Process라고 한다면 core의 사용에 따라 프로세스 처리가 더 효율적으로 진행
운영체제가 프로세스의 처리를 관리하고 있으며 이것을 CPU 스케줄링이라고 부른다.

스레드
: 작업의 실행 흐름의 단위

  1. 하드웨어 스레드
    CPU코어 내의 스레드

  2. 소프트웨어 스레드
    커널 레벨 스레드
    유저 레벨 스레드

<커널 레벨 스레드>


<자바 스레드>

스레드와 메모리

임계구역(critical section)

멀티스레드 환경에서 여러 스레드가 접근할 수 있는 공유 자원에 대한 구역

임계구역문제

package thread;

public class Critical {
	
	private long sum = 0;
	
	public void cal() {
		for(long i=0; i<1000000; i++) {
			++sum;
		}
	}

	public long getSum() {
		return sum;
	}
	
	
	public static void main(String[] args) {
		
		try {
			Critical cri = new Critical();
			//스레드 생성. (람다식 이용하여)
			
			Thread threadA = new Thread(() -> {
				cri.cal(); // 특정한 시점에 두 스레드가 변경되지 않은 동일한 값을 읽을 수 있음 = 계산이 엉망이 됨.
			});
			Thread threadB = new Thread(() -> {
				cri.cal();
			});
			
			threadA.start();
			threadB.start();
			threadA.join();
			threadB.join();
			System.out.println(cri.getSum());
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		//결과값 : 1020954 (1~100만까지 합인데 제대로 결과값이 출력안됨)
		//실행할 때마다 특징 : 결과값이 다르다. 
		//왜? 
		//멀티스레드로 작업을 할 때 스레드A와 스레드B가 같은 인스턴스의 필드를 사용하기 때문에 문제가 발생한 것이다. 
		//이를 임계구역문제라 한다!
	}

}

동기화

여러개의 스레드가 변경되지 않은 정적변수나 인스턴스에 접근할 때 문제가 되어서 임계구역에 접근하는 방법을 동기화하여 하나의 스레드만 접근할 수 있도록 하는 방법
(synchronized를 사용하여 동기화처리 가능)

1.Object Key
스레드 접근을 제한하기 위해 (임계구역에 대한 접근 곧 동기화)
Object Key를 소유한 스레드만 접근하도록 처리하는 기법

  1. Mornitor
    기본적인 동기화 방식 key를 이용하여 임계구역에 출입할 수 있으며 동기화된 임계구역에는 key를 가진 스레드만 접근가능

  2. Lock-Free 동기화 기법
    LoickSuppor 클래스를 이용하여 만들어진 Semaphore라는 객체를 사용하여 진행하는 동기화 기법
    (교대근무방식)

  3. 스레드 생명주기(Life Cycle)

synchronized statment vs synchronized method 방식의 차이

1.JVM이 실행하는 방식 자체가 다르다
2.statment는 동기화의 범위를 중괄호를 통해 지정할 수 있음

profile
백엔드 개발 공부 기록 22.11.07 ~ ing

0개의 댓글