[NETWORK PROGRAMMING] Stream, Thread

jckim22·2023년 10월 26일

Stream

  • Input Stream -> read
  • Output Stream -> write

Stream의 기본 단위는?

  • Byte(Integer(4Byte)를 사용해도 1Byte만 사용할 것이다.)

어떻게 Byte를 문자로 인식하나?

  • 인코딩을 통해(약속되어 있는 문자를 매핑한다)

  • ASCII CODE

    1Byte는 255까지 표현 가능
    ASCII CODE는 7비트만 사용하기 때문에 127까지 표현한다.

  • UNICODE

    2BYTE를 사용
    -> 알파벳은 1BYTE만 사용하면 되는데 2BYTE를 사용하는 겻은 비효율적

  • UTF-8(거의 표준치에 가까워지고 있다.)

    그래서 나온 것이 UTF-8
    영어는 1BYTE
    한글, 한자 등은 3BYTE를 사용함

  • MS949

    한글 완성형 -> 글자 단위
    한글 조합형 -> 자음, 모음 단위

  • UNICODE

    2바이트로 모든 문자를 표현
    -> 영어는 손해
    -> 그래서 UTF가 나옴

  • UTF-8

    1~4바이트로 가변적임
    한글은 3,4바이트로 표현 가능
    -> 가장 보편적으로 많이 쓰임 (아스키코드와 1바이트로 완벽 호환)

Thread

  • multiple CPUs -> Thread 각각이 일을 할 수 있음(효율적)
  • a single CPU -> 일을 조금씩 나눠서 해야함(동시에 진행하는 것처럼 보임)

    하지만 한번에 하나씩 끝내는 것이 더 효율적이기 때문에 싱글 코어에서는 비효율적
    (Thread를 이동하는 것에도 수행시간이 추가됨)

Thread를 만드는 방법

  1. Thread class를 상속 받은 Thread class를 정의한다.

Thread class에는 무조건적으로 run() 메서드가 존재해야한다.
상속한 class의 run 메서드를 상속 받은 class에서 오버라이딩 한다.
부모 Thread class의 start 메서드는 run을 핸들링 해준다.
다만 start 메서드로 핸들리응 해줘야 우리가 기대하는 스케줄링을 하는 Thread가 실행이 된다.

  1. Runnable 인터페이스를 상속 받는 task class를 정의한다.

인터페이스는 메소드를 추상적으로 선언한 추상 클래스와 비슷하다.
따라서 상속 받은 클래스에서 기능을 구현해줘야한다.
task class에서 run을 재정의한다.
자바에서는 다중 상속이 지원되지 않기 때문에 runnable 인터페이스를 구현하는 방식을 자주 사용한다.
그렇게 만든 인스턴스를 새로운 Thread 인스턴트에 인스턴스로 넣어줘서 생성한다.

Thread의 속성

  • Thread에서 sleep()은 lock이고
  • yield는 일을 양보하고
  • wait은 대기 상태에 들어간다.
  • notify는 wait 된 스레드 중 한 스레드만 깨운다.(지정 불가)
  • notifyAll은 모든 스레드를 깨운다.

    식당이라면 웨이팅하는 손님(wait) notify는 손님이 한 명 나가면 아무나 한 명 불러온다.

  • join은 다른 Thread가 끝날 때까지 기다린 뒤 Join한다.

프로세스와 메모리의 차이점

  • 프로세스는 자기 영역 메모리가 따로 있고 스레드는 그 메모리 안에서 리소스를 공유한다.

blocking

  • 해당 task가 끝날 때가지 막혀있음
    -> 멀티 쓰레드로 blocking task를 수행하면서 다른 작업을 한다.

sha256은 해쉬함수

profile
개발/보안

0개의 댓글