CS

CS스터디 2주차 Computer Architecture & Java

SeungbeomKim 2022. 9. 28. 00:17

cs 스터디 2주차 내용

  1. Computer Architecture
    • 고정 소수점 / 부동 소수점
    • 패리티 비트 / 해밍 코드
    • ARM 프로세서
  2. Java
    • 고유 락
    • 문자열 클래스
    • Garbage Collection
    • Primitive type & Reference type

고정 소수점, 부동 소수점 

=> 컴퓨터에서 실수를 표현할 수 있는 방법은 고정 소수점, 부동 소수점 2가지가 있다.

 

고정 소수점(Fixed Point) : 소수점이 찍힐 위치를 정해놓고 소수를 표현하는 방식(정수 + 소수)

-0.1234는 부호(-), 정수부(0), 소수부(0.1234)가 필요하다.

장점 : 실수를 정수부, 소수부로 나타내어 단순하다.

단점 : 표현의 범위가 너무 적어서 활용하기 힘들다.(정수부는 15 bits, 소수부는 16 bits 이여서 각각 2^15, 2^16 까지만 표현 가능)

 

부동 소수점(Floating Point) :  실수를 가수부(유효 숫자)와 지수부(소수점의 위치를 나타냄)로 표현하는 방식

 

32비트 float형
64비트 double형

장점 : 고정 소수점 방식보다 훨씬 더 많은 범위를 표현할 수 있다.

단점 : 실수의 표현 방식에 있어서 항상 오차가 존재한다.(완전히 정확하게는 표현할 수 없다.)

 

패리티비트 & 해밍코드

패리티 비트(Parity Bit) : 정보의 전달 과정에서 오류가 생겼는지 검사하기 위해 추가된 비트이다. 전송하고자 하는 데이터 끝에 

1비트(0(짝수 패리티),1(홀수 패리티))을 더하여 전송하는 방법으로, 짝수 패리티 비트와 홀수 패리티 비트 두 가지가 있다.

Data의 1의 개수 4개 =>  Data + 짝수 패리티 = 1의 개수 : 4개, Data + 홀수 패리티 = 1의 개수 : 5개

짝수 패리티는 데이터의 각 비트의 값 중에서 1의 개수를 짝수개로 맞춰줘야 한다.

(만약 보내고자 하는 데이터 1의 개수가 4개인데 실제 8비트 데이터의 1의 개수가(10000110) 3개이면 마지막 패리티 비트는 1이 된다.)

(1의 개수를 짝수개로 맞춰주기 위함) 

홀수 패리티는 데이터의 각 비트의 값 중에서 1의 개수를 홀수개로 맞춰줘야 한다.

 

실제 전송하고자 하는 데이터의 1의 개수(홀수, 짝수)에 따라서, 패리티 비트가 1이 되는지, 0이 되는지 결정된다.

 

해밍 코드 :데이터 전송 시 1비트의 에러를 검출과 동시에 수정할 수 있는 코드이다. 데이터의 비트 수에 따라 추가적인 패리티 비트의 수가 증가

추가적으로 패리티 규칙이 정해졌다면, n번째 패리티 비트는 n번째 비트에서 시작해, n비트만큼 포함하고 n비트씩 건너뛴 비트들을 대상으로 패리티 비트를 결정할 수 있다.

 

패리티 비트는 (2^n)의 위치에 배치한다. 데이터는 그 2^n 위치 외의 영역에 배치한다.(2^p>= d + p + 1, p는 패리티 비트 수, d : 데이터 비트 수) 

p = 3 => d = 2 ~ 4

p = 4 => d = 5 ~ 11

p = 5 => d = 12 ~ 26

 

해밍 코드 예제1

10110011의 해밍코드를 받았다고 가정하면, 10110011중에서 색칠한 부분은 2^n의 영역에 위치하므로 데이터 비트가 아닌 패리티 비트이다. 즉 데이터 비트는 1001이고, 패리티 비트는 1011이 된다.

 

해밍코드 예제2

데이터비트 1011에 홀수 패리티를 적용하여 해밍 코드로 변환하는 문제(데이터 비트가 정해지고, 패리티 비트는 정해지지 않음)

데이터 비트 + 해밍 코드 ? ? 1 ? 0 1 1 (데이터 수가 4개이므로, 패리티 비트의 개수는 3개이다) 

첫번째 패리티 비트 결정 : 1,3,5,7 번째 비트들을 대상으로 결정

=>? 1 0 1 인데, 홀수 패리티를 적용하기 위해서는 ?는 1이 되어야 한다.

두번째 패리티 비트 결정 : 2,3,6,7 번째 비트들을 대상으로 결정

=>? 1 1 1 인데, 홀수 패리티를 적용하기 위해서는 ?는 0이 되어야 한다.

세번째 패리티 비트 결정 : 4,5,6,7 번째 비트들을 대상으로 결정

=>? 0 1 1 인데, 홀수 패리티를 적용하기 위해서는 ?는 1이 되어야 한다.

 

변환된 해밍 코드는 1 0 1 1 0 1 1 이 된다.

 

해밍코드 예제 3(오류 수정)

 

짝수 패리티 비트를 적용한 해밍코드가 0011011일때 오류 수정한다고 가정

1,3,5,7 비트 확인 => 0101 ='0'

2,3,6,7 비트 확인 => 0111 ='1'

4,5,6,7 비트 확인 => 1011 ='1'

패리티 비트는 역순으로 적어줘야 하므로 1 1 0이 된다. 즉 이를 10진수로 변환하면 6이 되므로 6번째 비트를 1로 수정해야 한다.

 

ARM 프로세서 : Advanced RISC Machine(과거명칭), 최초명칭(Acorn RISC Machine)

 

: 스마트폰, 임베디드 시스템에서 가장 많이 이용되는 32비트 RISC 프로세서이다.

RISC(Reduced Instruction Set Computer)

: 축소 명령어 집합 컴퓨터는 CPU 명령어의 개수를 줄여 명령어의 해석 시간을 줄임으로서 명령어 실행 속도를 빠르게 한 방식이으로 마이크로프로세서를 설계하는 방법 가운데 중 하나이다. 신호 처리 및 실시간 제어용으로 설계된다.

https://ko.wikipedia.org/wiki/%EC%B6%95%EC%86%8C_%EB%AA%85%EB%A0%B9%EC%96%B4_%EC%A7%91%ED%95%A9_%EC%BB%B4%ED%93%A8%ED%84%B0

 

ARM은 칩의 기본 설계만 만들고, 기능 추가 및 최적화 영역은 반도체 회사에 맡긴다.

각 ARM마다 명령어의 집합이 모두 다르기 때문에 서로 다른 칩이라고 볼 수 있다.

ARM의 물리적 설계는 같더라도, 명령어의 집합 구조가 다르기 때문에 다양한 제품이 생겨나는 것이다.

 

 

ARM은 RISC 설계 기반으로 효율성을 증대(명령어의 실행 속도 증가)하고 복잡성을 최소화(명령어 수가 적음)하는 구조로 설계가 된다.

명령어 집합이 단순하면, 설계도 간단해지고 ARM의 크기도 작아짐과 더불어 트랜지스터의 개수도 작아진다.

그러므로, ARM은 크기가 작고 전원 소모가 적게 드는 스마트폰이나 전자기기 등에 많이 사용된다. 

 

ARM의 장점

 

ARM 프로세서는 한 사이클만 사용하여 명령을 실행하여 기능을 줄인다. 이러한 기능으로 인하여 ARM 프로세서는 전력 소비에 민감한 장치, 모바일 및 임베디드 장치에 이상적이다. RISC의 핵심 개념은 단순한 하드웨어와 복잡한 소프트웨어이다. 저수준 프로그래밍 언어에서 큰 기능을 구현할 수 있다. (Apple, Android 제조업체 등에서 모두 사용)

 

ARM의 단점

전력 소모가 적기 때문에 Intel 프로세서보다 속도 측면에서 느리다. 더불어, 항상 전원에 엑세스할 수 없는 소규모 기술에 적합하기에, 광범위한 기술을 구현하기에는 어려움이 있다.

 

 

Java 

고유 락(Intrinsic Lock)

자바의 모든 객체는 락(lock)을 갖고 있다. 모든 객체가 갖고 있으니 고유 락이라고 하고 모니터처럼 동작한다고 해서 모니터 락이라고도 한다. 자바의 synchronized 블록은 동시성 문제를 해결하는 가장 간편한 방법으로, 고유 락을 이용하여 여러 스레드에 접근한다.

public class Counter {
  private int count;

  public int increase() {
    return ++count; // 스레드 안전하지 않은 연산.
  }
}

Synchronized 블록은 고유 락을 이용해서 스레드의 접근을 제어한다.

=>값(count 값)을 1. 읽고(read) 2. 수정(modify)하고 3. 저장(wrtie) 하는 과정에서, 여러 스레드가 count에 접근할 수 있으므로 동시성 문제가 발생한다.

public class Counter {
  private Object lock = new Object();
  private int count;

  public int increase() {
    synchronized(lock) {
      return ++count;
    }
  }
}

lock이라는 Object 객체를 이용해서 여러 스레드가 동시에 count에 접근하는 것을 방지했다. increase() 메서드는 한 번에 한 스레드만 실행할 수 있다. 즉, Synchronized 블록은 고유 락을 이용해서 스레드의 접근을 제어할 수 있게 되었고 한 스레드가 먼저 락을 획득하는 경우에는 다른 스레드는 대기해야 한다. Counter의 객체도 자바 객체이므로 락으로 사용할 수 있다.

public class Counter {
  private int count;

  public int increase() {
    synchronized(this) {
      return ++count;
    }
  }
}

lock 대신에 this를 사용하여 synchronized 블록을 구현

재진입 가능성

자바의 고유 락은 재진입이 가능하다. 락의 획득이 호출 단위가 아닌 스레드 단위로 일어난다는 의미이다. 이미 락을 획득한 스레드는 락을 얻기 위해 대기할 필요가 없다. 이미 락을 갖고 있기 때문에 같은 락에 대한 synchronized 블록을 만났을 때 대기 없이 통과하게 된다.

public class Reentrancy {
  public synchronized void a() {
    System.out.println("a");
    // b가 synchronized로 선언되어 있지만 a진입시 이미 락을 획득하였으므로,
    // b를 호출할 수 있다.
    b();
  }

  public synchronized void b() {
    System.out.println("b");
  }

  public static void main(String[] args) {
    new Reentrancy().a();
  }
}

만약 자바의 고유 락이 재진입을 할 수 없게 된다면, a 메서드에서 b메서드를 호출할 때 데드락이 발생하게 된다.



구조적인 락(structured lock)

A 획득 -> B 획득 -> B 해제 -> A 해제 (o)

A 획득 -> B 획득 -> A 해제 -> B 해제 (x)-> 이것을 가능하기 위해서는 명시적인 락(ReentrantLock)을 걸어줘야 한다.

 

가시성

여러 스레드가 동시에 작동하였을 때, 한 스레드의 값을 다른 스레드가 볼 수 있는지, 없는지에 대한 여부

만약 볼 수 없게 되면 문제가 발생하게 되는데, 락은 이 문제를 해결하기 위한 수단이다.

 

문자열 클래스

String 특징 :

=>new 연산을 통해 생성된 인스턴스의 메모리 공간은 변하지 않게 된다.(Immutable, 변하기 어려움)

=>객체가 불변하므로, 멀티스레스에서 동기화를 신경 쓸 필요가 없음(조회가 많은 멀티스레드 환경에서 유용)

StringBuffer, StringBuilder의 특징

=>new 연산으로 클래스를 한 번만 만듦(mutable, 변하기 쉬움)

=>새로운 객체를 만들지 않고, 크기를 변경시키면 된다.

=>클래스의 메서드는 둘 다 동일

=>StringBuffer : 문자열 연산이 많은 멀티스레드 환경, StringBuilder : 문자열 연산이 많은 단일스레드 환경

 

Garbage Collection 

자바는 명시적으로 객체를 해제할 필요가 없다. 사용하지 않은 객체에 대한 메모리 해제 작업이 GC라고 하며, JVM에서 GC를 수행한다.

JVM의 메모리는 5가지 영역(class, stack, heap, native method, PC)로 나뉘는데 GC는 힙 메모리만 다룬다.

GC의 대상

1. 객체가 null일 경우 

2. 블록 실행 후 종료과정에서 , 블록 안에서 생성된 객체

3. 부모 객체가 null일 때의 포함된 자식 객체

=>Waek Generational Hypothesis에 기반한다.

 

Weak Generational Hypothesis

: 신규로 생성한 객체의 대부분은 일시적인 사용만 하고, 이전 객체에서 새로운 객체로의 참조는 매우 적게 존재한다는 가설이다.

=>Young 영역과 Old 영역으로 메모리를 분할하고, 새로운 객체는 Young에 보관, 이전 객체는 Old에 보관한다.

Young 영역 : 새롭게 생성한 객체=>여기에서 객체가 사라지면 Minor GC가 발생한다고 말한다.

Old 영역 : 이전의 객체 =>여기에서 객체가 사라지면 Major GC가 발생한다고 말한다. 

Permanent 영역 : Method Area라고도 한다. JVM이 클래스들과 메소드들을 설명하기 위한 메타데이터들을 포함한다.

 

Generational Garbage Collection 과정

  1. 새로운 객체가 들어오면 Eden Space에 할당
  2. Eden space에 가득 차게 되면, minor garbage collection 시작
  3. 참조되는 객체들은 첫번째 survivor(S0)로 이동, 비 참조 객체는 Eden space가 clear될 때 반환
  4. 다음 minor GC때, Eden space에서는 같은 일이 일어난다. 참조되는 객체들은 두번째 survivor(S1)으로 이동, 비참조 객체는 clear될때 반환
  5. 다시 같은 과정이 반복되지만, 참조되는 객체들은 (S0)로 이동되고 비참조 객체들은 전부 clear된다.
  6. promotion을 보여주게 되는데, 일정한 문지방(age threshold)를 넘게 되면 young -> old로 promotion된다.
  7. old promotion에서는 major GC가 발생하게 된다.

Primitive type(기본형 타입) & Reference type(참조형 타입)

기본형 타입 : boolean(1byte), char(2byte), byte(1byte), short(2byte), int(4byte), long(8byte), float(4byte), double(8byte)

참조형 타입 : Primitive type을 제외한 모든 것. 

                     클래스 타입(class type), 인터페이스 타입(interface type), 배열 타입(array type), 열거 타입(enum type)

+String 클래스는 참조형이지만, 기본적인 사용은 기본형처럼 사용한다. 또한 불변하는 성질을 지닌다.

  기본형 비교는 ==연산자를 사용하지만, String 객체간의 비교는 .equals() 메소드를 사용하는 것이 좋다.

 

<참고 자료>

http://www.tcpschool.com/cpp/cpp_datatype_floatingPointNumber

 

코딩교육 티씨피스쿨

4차산업혁명, 코딩교육, 소프트웨어교육, 코딩기초, SW코딩, 기초코딩부터 자바 파이썬 등

tcpschool.com

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=ansdbtls4067&logNo=220886661657

 

패리티 비트(Parity Bit)란 무엇인가?

안녕하세요? 땜쓰 입니다. 이번 포스팅에서는 패리티 비트(Parity Bit)에 대해서 알아보는 시간을 갖도록...

blog.naver.com

https://wooono.tistory.com/400

 

[Network] 패리티 비트와 해밍 코드

패리티 비트란? 송신 컴퓨터에서 수신 컴퓨터로 데이터를 전송할 때, 데이터는, 컴퓨터에 연결된 전선을 타고, 이진수의 전기 신호로 전달됩니다. 하지만, 전달하는 과정에서 데이터에 오류가

wooono.tistory.com

https://geekgeeky.com/ko/arm-%EB%8C%80-%EC%9D%B8%ED%85%94-%ED%94%84%EB%A1%9C%EC%84%B8%EC%84%9C-%EC%B0%A8%EC%9D%B4%EC%A0%90%EC%9D%80-%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C

 

ARM 대 인텔 프로세서: 차이점은 무엇입니까? - Geek Geeky

원래 발행: 2021년 10월 16일, Darien Graham-Smith2022년 1월 16일 업데이트, Steve Larner 작성 스마트폰이나 태블릿을 선택할 때 일부 모델은 Intel 프로세서를 사용하고 다른 모델은 경쟁 ARM 아키텍처를 기반

geekgeeky.com

http://happinessoncode.com/2017/10/04/java-intrinsic-lock/

 

Java의 고유 락(intrinsic lock)에 대해

고유 락과 synchronized 블록자바의 모든 객체는 락(lock)을 갖고 있다. 모든 객체가 갖고 있으니 고유 락(intrinsic lock)이라고도 하고, 모니터처럼 동작한다고 하여 모니터 락(monitor lock) 혹은 그냥 모니

happinessoncode.com

https://gyoogle.dev/blog/computer-language/Java/String%20&%20StringBuilder%20&%20StringBuffer.html

 

[Java] 문자열 클래스 | 👨🏻‍💻 Tech Interview

[Java] 문자열 클래스 분류 String StringBuffer StringBuilder 변경 Immutable Mutable Mutable 동기화 Synchronized 가능 (Thread-safe) Synchronized 불가능. 1. String 특징 new 연산을 통해 생성된 인스턴스의 메모리 공간은 변

gyoogle.dev

https://gyoogle.dev/blog/computer-language/Java/Garbage%20Collection.html

 

Garbage Collection | 👨🏻‍💻 Tech Interview

Garbage Collection Goal Garbage Collection의 역할에 대해 설명할 수 있다. Garbage Collection의 메모리 해제 과정을 3단계로 설명할 수 있다. Generational Gabage Collection에 대해 설명할 수 있다. Generational Garbage Colle

gyoogle.dev