회고

스프링 스터디 1주차에 공부한 것들

728x90
  • CPU, RAM, DISK의 정의 및 역할
    • CPU : 중앙처리장치. 사용자가 입력한 명령어를 해석하고 자료를 연산하여 그 결과를 제어하는 역할
      • 구성 요소 
      • ALU 산술논리장치 : 연산을 수행
      • CU컨트롤 장치 : 제어 명령을 전달. 레시스터 사이의 데이터 전송을 제어
      • 레지스터 : 값을 일시적으로 기억. 메모리중 저장 속도가 가장 빠름. 내부 버스를 통해 연산장치와 연결되어 있음
      • 하이퍼스레딩 : 한개의 코어를 두개의 쓰레드로 나눔으로서 두가지 작업을 동시에 할 수 있게 만든 기술.
    • RAM : Random Access Momory의 줄임말고 CPU가 빠른 엑세스를 하기 위해 데이터를 단기간에 저장하는 구성 요소
      • 응용프로그램의 로딩 데이터의 일시적 저장 등에 사용
      • *Random Access : 어느 곳에 저장된 데이터든 접근 시간이 동일하다는 의미이다.
      • DRAM : Capacity에 전하를 충전하는 방식으로 데이터를 저장
      • SRAM(Static Ram) :  플립플롭 방식의 기억소자를 이용
  • OS의 쓰레드와 자바에서의 쓰레드의 차이
    • OS의 쓰레드 : 운영체제로부터 시스템 자원을 할당받는 작업의 단위. 
      • 구성요소
        • Code : 코드 자체를 구성하는 메모리 영역
        • Data : 전역변수, 스태틱변수, 배열 등 초기화된 데이터
        • Heap : 동적 할당시 사용
        • Stack : 지역변수, 매개변수 리턴 값 임시 메모리 영역 (고유한 영역을 가지고 있다.)
      • 특징
        • OS의 프로세스상 최소 1개의 쓰레드를 가지고 있음
        • 각 프로세스는 별도의 주소 공간에서 실행, 서로 다른 프로세스에 접근 하려면 프로세스간 통신(IPC)을 해야함
      •  
    • 자바의 쓰레드 : JVM 프로세스에 속하는 스레드
    • 자바 프로세스 : 자바로 만든 프로그램은 개별 JVM프로세스 위에서 돌아간다고 한다. 별도의 프로세스는 스택이나 힙을 공유하지 않는다는 의미로 이해할 수 있음.
  • thread 와 프로세스의 차이는?
    • 가장 본질적인 차이는 공유자원이 있느냐 없느냐의 차이
    • 프로세스는 공유자원없어 비교적 덜 효율적이지만 컨트롤 하기 쉽다. 하지만  쓰레드는 공유자원이 있어 효율적이지만 컨트롤 하기 어렵다
    • 프로세스 : OS에서 할당받는 작업의 단위 
    • 쓰레드 : 프로세스 내에서 연산이 실행되는 여러 흐름의 단위. 코어 안에서 instruction 세부 작업이 실행되는 흐름.  물리적인 코어수와 별개로 논리적인 코어수를 뜻함. 하이퍼쓰레딩 기술을 통해 여러개의 쓰레드를 동시에 돌릴 수 있게 되었음. 
      • 특징
        • 프로세스 내에서 각각 스택만 할당 받고, Code, Data, Heap은 공유한다.
        • 컨텍스트 스위칭 시에는 스택 영역만 처리한다.
  • cpu core 수와의 관계
  • context switching 이란?
    • 멀티프로세스 환경에서 CPU가 어떤 하나의 프로세스를 실행하고 있는 상태에서 인터럽트 요청에 의해 다음 우선 순위의 프로세스가 실행되어야 할 때 기존의 프로세스의 상태 또는 레지스터 값을 저장하고 CPU가 다른 프로세스를 수행하도록 새로운 프로세스의 상태 또는 레지스터 값을 요체하는 작업
    • 컨텍스트 : 해당 프로세스를 실행하기 위한 정보들. PCB(Process Control Bolck)에 저장됨
    • 일어나는 상황
      • I/O Interrupt
      • CPU 사용시간 만료
      • 자식 프로세스 Fork
      • 인터럽트 처리를 기다릴
  • tcp udp 차이
  • 3 hand shaking
  • 4 hand shaking
  • TCP패킷이 누락되었을 때 어떤 일이 일어나는지
  • 해쉬란? : 데이터 관리를 효율적으로 관리하기 위해 고정된 크기의 데이터로 매핑하는 방법론
  • 해시의 시간복잡도. (탐색 삽입 삭제
    • 평균 : O(1)
    • 최악 : O(n)
  • 해시 충돌 : 해시값으로 특정 자료를 분류하는데 해시값이 중복될 수 있는 문제
  • HashMap , HashTable , HashSet 코드 봐보기
    • HashMap
      • 특징
        • 쓰레드 세이프 하지 않음
      • 충돌 해결 방법
        • Seperate Chaning 기반 (자바 2~7 까지는 링크드리스트, 8부터는 트리를 사용)
        • 특정 버킷에 몇개의 데이터가 집중될 수 있다. 트리를 사용하는 것이 성능상 이점이 있다.
      • 해시 버킷의 동적 확장
        • 버킷이 적으면 메모리를 아낄 수 있지만 해시 충돌로 인한 성능상 손실이 발생함. 해시 커빗의 갯수의 0.75가 되면 해시 버킷의 수를 2배로 늘림. 기본값은 16개 최대 갯수는 2^30. 
      • 보조 해시 함수
        • 해시값을 변경해서 해시 충돌 가능성을 줄이는 것. 8부터는 새로운 방식
        • 상위 16비트 값을 XOR 연산하는 매우 단순한 형태. 이유 : 트리를 사용하여 해시 충돌 발생할 수 있는 성능 문제까지 개선하였고, 균등 분포가 잘 되는 경향도 있어 보조 해시함수의 효과가 크지 않기 때문임.
    • HashTable
      • 특징
        • 쓰레드 세이프 함
      • 충돌 해결 방법
        • Java8 기준 Seperate Chaning 링크드 리스트를 통해 해결
      • 쓰레드세이프 구현 방식
        • 함수에 synchronized 통해 구현함
    • HashSet
      • 특징
        • 쓰레드 세이프 하지 않음
        • 중복된 원소를 허용하지 않고 순서 역시 고려되지 않음
      • 충돌 해결 방법
        • Sepertate Chaning(레드 블랙 트리)
          • 해시 버킷이 중복된 경우 링크드 리스트로 관리하여 해결하는 방법
          • 자바 8부터는 레드 블랙 트리(각 노드에 색깔 개념을 도입하여 균형을 맞추려는 이진 트리)로 해결하고 있음
          • 데이터 갯수가 많아질수록 트리가 더 유리하다.(평균 O(logN), 시간 복잡도 O(N))
          • 8개가 쌓이면 트리로 변경, 삭제하여 6개가 리스트로 변경. 2개 차이는 트리 <=> 리스트 구조 변경이 너무 자주 일어나는 비효율을 막기 위함
      • 쓰레드세이프 구현 방식
        • 레드 블랙 트리로 구현
      • 중복 해결 방법
        • 객체를 저장하기 전에 객체의 hashCode() 메서드를 통해 기존 것과 비교한다. 만약 동일한 해시코드가 있다면 다시 equals()로 두 객체를 비교해 일치하면 저장 하지 않는다.
        • 따라서 hashCode(), equals()를 오버라이드해서 중복을 해결할 수 있다.

특징

  • ConcurrentHashmap
    • 특징
      • 쓰레드세이프를 보장하면서도 높은 성능을 보장하는 HashMap이다.
      • 해시테이블과 다르게 map의 일부에만 락을 걸어(이미 버킷이 차있을 때 추가하는 상황) 성능상 유리함
    • 쓰레드세이프 방식
      • Compare And Swap 알고리즘을 통해 원자성을 보장하여 쓰레드세이프를 보장한다.
      • 트리에 새로운 노드를 넣을 때 정말 그 값이 비어있는지 CAS 알고리즘을 통해 원자성을 보장하여 쓰레드 세이프를 보장한다.
      • 여러 쓰레드가 Read, Write를 하면 Synchronized를 쓰면 되지만, 한 쓰레드가 Read, Write를 하고 다른 쓰레드가 Read만 하는 상황이면 volatile 변수를 통해 동기화 하는게 효율적이기 때문에 이 방법을 사용함.ㅣ
      • (volatile : 자바의 변수를 메인메모리에 read/write 하겠다고 명시하는 것. CPU Cache, 메인 메모리의 값이 다른 가시성 문제를 해결하기 위함. 한 쓰레드에서 read만 하는 상황에서 유효함. 그렇지 않으면 synchronized블록으로 감싸서 변수의 원자성을 보장해야함.
      • (원자성 : CPU의 개입이 있을 수 없는 최소 단위의 연산이라고 이해하면 됨. )

 

  • JVM 에 대해서 자세히 공부해오기
    • 정의 : 자바 바이트코드를 실행할 수 있는 주체
    • 가상머신 : 물리적 머신과 유사한 머신을 소프트웨어로 구현한 것 
    • HotspotJVM : 코어가 하나뿐인 사용자를 위해 만들어진 JVM. 앱 시작을 빠르게 하고 적은 메모리를 점유하도록 함.
    • 구성요소
      • Class Loader
        • 컴파일된 자바 바이트 코드를 런타임 데이터 영역으로 로드한다.
        • 컴파일 타임이 아니라 런타임에 클래스를 처음으로 참조할 때 해당 클래스를 로드하고 링크하는 특징
        • 계층구조 : 클래스 로더끼리 부모-자식 관계를 이뤄 계층 구조로 생성
        • 위임모델 : 클래스 로더끼리 위임하는 구조. 무조건 상위 클래스 로더를 사용함
        • 가시성 제한 : 하위 -> 상위 클래스 로더를 찾을 수 있다.
        • 언로드 불가 : 클래스를 로드할 수 있지만 거꾸로는 불가
      • Execute Engine
        • 클래스를 실행시키는 역할. 클래스로더가 JVM내의 런타임 데이터 영역에 바이트 코드를 배치 시키고, 이것을 실행시킴
      • Interpreter
      • Runtime Data Area
        • JVM이 프로그램을 수행하기 위해 OS로부터 할당받은 메모리 영역
        • 구성 요소
          • PC Register
            •  쓰레드 마다 한개씩 존재한다. 쓰레드가 생성될 때마다 생성되고 현재 실행중인 명령을 저장함. 
          • JVM Stack 
            • 쓰레드 마다 한개씩 존재한다. 쓰레드가 시작될 때 생성된다. 스택 프레임이라는 구조체를 저장하는 스택으로 오로지 스택 프레임을 푸쉬하고 팝하는 동작만 수행함.
            • 스택 프레임 : JVM내에서 메소드가 수행될 때 하나의 스택 프레임이 생성되어 해당 쓰레드의 스택이 추가되고 메소드가 종료되면 스택 프레임이 제거됨.
          • Native Method Stack
            • 자바 이외의 코드 JNI(Java Native Interface)가 저장되는 공간
          • 힙 
            • 객체를 저장하는 가상의 메모리 공간. new를 통해 생성된 객체와 배열을 저장함. 
            • GC에 의해 Unreachableg한 객체들은 제거됨
            • 6개의 영역으로나뉨 (Eden Survivor0,1 Old, Permanent)
              • Edne : 객체들이 최초로 생성되는 공간
          • Method Area ( = Class area, Static area)
            • 모든 쓰레드가 공유하는 영역, JVM이 시작될 때 생성됨.JVM이 읽어들인 각각의 클래스와 인터페이스에 대한 런타임 상수풀, 필드 매서드, 스태틱 변수, 메서드의 바이트 코드등을 보관
  • runtime area의 각 영역에 어떤 정보들이 저장되는지 공부
  • GC
    • 가비지 : 참조되는 객체 외에는 모두 가비지로 간주한다.  
      • mark-and-sweep
        • Mark : 살아 있는 객체들을 표시, GC roots로부터 모든 객체 참조를 검토하고 살아있는 객체를 마킹한다.
        • Sweep  : 힙 메모리에서 마킹되지 않은 객체들은 해제한다.
        • GC roots : 모든 객체 트리의 부모.힙 외부에서 접근할 수 있는 변수나 오브젝트
          • 지역변수
          • 실행중인 자바쓰레드
          • 정적변수 (스태틱 변수)
          • JNI 레퍼런스
    • 힙 영역을 
  • 왜 스택에는 GC가 없을까?
  • Thread의 상태에 대해서 공부해오기
    • 상태값 종류(6개)
      • NEW : 쓰레드 객체가 생성되었지만 실행되지 않은 상태
      • RUNNABLE : 언제든지 실행중인 상태로 갈 수 있는 상태
      • BLOCKED : 실행 중지 상태이며, 모니터락이 풀리기를 기다리는 상태
      • WAITING : 쓰레드가 대기중인 상태
      • TIME_WAITING : 쓰레드가 특정 시간만큼 대기중인 상태
      • TERMINATED : 쓰레드가 종료된 상태

 

  • 클래스함수와 인스턴스함수 차이(두개가 가지고 있는 락이 다르고)
    • 클래스 함수 = 스태틱 함수,   인스턴스 함수 = 일반 함수
    • 싱글턴에 synchronized 함수가 많을 수록 병목현상을 겪게 됨.
    • 스태틱 함수는 해당 클래스에 Lock을 검. 따라서 static synchonized 함수간 Lock이 공유되면서 동시에 호출되는 것을 막음
    • 일반 함수는 생성된 객체를 기준으로 Lock을 걸기 때문에 위와 상관없이 동작함.
  • 락 객체란
    • synchronized 블록으로 구현되어 더 정교한 방식의 동기화를 가능하게 함
    • 힙 영역에 객체가 저장될 때 자동으로 생성됨
    • 함수에 synchronized를 걸면 그 함수가 포함된 해당 객체에 lock을 거는 것과 같다
    • 락 객체를 통해 특정 쓰레드 끼리만 동시 접근 안되도록 막을 수 있다.

 

궁금한 점 : 왜 ConcurrentHashmap에서 

왜 쓰레드 세이프 하지 않은 HashMap, HashSet 같은 Collection을 만들었을까?

 

 

  • JSP란? : HTML에 자바 코드를 넣어 동적인 웹페이지를 생성하는 웹어플리케이션 도구이다. JSP가 실행되면 자바 서블릿으로 변환됨.
  • 서블릿 : 웹페이지를 동적으로 생성하기 위한 서버측 프로그램
  • JSP의 구성요소(7가지)
    • 디렉티브 : JSP 페이지에 대한 설정 정보를 저장할 때 또는 다른 문서를 include할 때
    • 스크립트릿(자바 코드 삽입), 표현식(값 출력), 선언부(자바 메서드를 만듦)
    • 표현언어 : 복잡한 자바 코드가 들어가는 표현식을 대체하기 위해 등장한 출력 기능
    • 내장 객체 : 사전 정의된 자바 객체들
    • 표준 액션 태그 : 자바 코드를 사용하지 않고 객체 생성과 속성값 설정을 할 수 있게 해주는 스크립트 기능
    • 커스텀 태그 : 사용자가 별도로 정의하여 사용할 수 있는 태그
  • JSP의 동작방식
    • 클라이언트가 JSP를 호출함
    • JSP 컨테이너가 JSP파일을 읽는다
    • JSP 컨테이너가 변환 작업을 통해 서블릿 파일을 생성한다.
    • 자바 파일은 다시 .class 파일 로 변환되고 (컴파일)
    • 실행을 통해 HTML파일을 생성하여 JSP 컨테이너에게 전달한다.
    • JSP는 HTTP 프로토콜을 통해 HTML 페이지를 클라이언트 에게 전달함
  • 쿠키, 세션이란
    • 쿠키 : 브라우저에 저장되는 작은 텍스트 파일.  웹서버는 쿠키를 통해 접속자의 데이터를 인식한다.
    • 쿠키와 세션이 필요한 이유 : HTTP의 Connectless, Stateless 한 특성을 보완하기 위해서.
    • 제약조건 : 
      • 300개까지 저장가능
      • 하나의 도메인 당 20개 까지 가능
      • 하나의 쿠키값은 4MB
    • 세션 : 일정 시간동안 같은 사용자로부터 들어오는 일련의 요구를 하나의 상태로 보고 그 상태를 유지시키는 기술. 웹서버가 세션 아이디 파일을 만들어 서비스가 돌아가는 서버에 저장함