2022.08.24/자바 정리/네트워크/스레드/멀티 태스킹 기법

Jimin·2022년 8월 24일
0

비트캠프

목록 보기
28/60
post-thumbnail
  • 네트워킹 사용법(com.eomcs.net.*)(계속)
  • 스레드 사용법(com.eomcs.concurrent.*)
    • 멀티 태스킹 기법: 멀티 프로세싱, 멀티 스레딩
    • CPU 스케줄링, 컨텍스트 스위칭

Stateless


Connection-Oriented vs. Connectionless

  1. TCP
  • Connection-Oriented
    • Stateful
    • Statless
  • ServerSocket, Socket 이용
  1. UDP
  • Connectionless
  • DatagramSocket, DatagramPacket 이용
  • 컴퓨터가 꺼져있으면 중간에 안보내지고,
    컴퓨터가 켜져있더라도 해당 포트의 어플리케이션이 실행이 안되고 있으면 운영체제가 데이터 전송을 막고
    해당 포트의 어플리케이션이 실행되고 있는 상태이어야 그제서야 운영체제가 데이터를 전달한다.

URI → URL, URN

URI: Uniform Resource Identifier

URL

URL: Uniform Resource Locator

웹 상에서 자원의 위치를 표현하는 방법
[프로토콜]://서버주소:포트번호/자원의경로?파라미터명=값&파라미터명=값

https://park:9999@www.naver.com:80/cafe/list?no=20&sort=a

https : 프로토콜, scheme
park : 사용자ID, user (생략)
9999 : 사용자 암호, password (생략 for 보안)
www.naver.com : 서버주소, host
80 : 포트번호, port (생략) http → 80/https → 443
cafe/list? : 자원경로, path
no=20&sort=a : Query String

  • 프로토콜: http(80), https(443), ftp(21/20) 등
  • 서버주소: IP 주소(192.168.0.1), 도메인명(www.bitcamp.co.kr)
  • 포트번호: 80 또는 443(생략할 수 있다), 8080(프록시 서버) 등
  • 자원의경로: /index.html, /board/list.jsp 등
  • 서버에 보내는 파라미터(Query String): 파라미터명=값&파라미터명=값

URL 분석

URL url = new URL("https://blog.naver.com/1229jimin");

System.out.printf("프로토콜: %s\n", url.getProtocol());
System.out.printf("서버주소: %s\n", url.getHost());
System.out.printf("포트번호: %d\n", url.getPort()); // 지정하지 않으면 -1 리턴. 실제 접속할 때는 기본 포트번호 사용.
System.out.printf("자원경로: %s\n", url.getPath());
System.out.printf("서버에 보내는 파라미터: %s\n", url.getQuery());

URN

URN: Uniform Resource Name

예; example:animal:ferret:nose


정적자원과 동적자원

  1. 정적 자원(static)
    • 요청할 때 마다 결과 콘텐트가 변경되지 않는 자원. 즉 파일을 가리킨다.
    • 예) HTML, GIF, JPEG, PNG, CSS, JavaScript, TXT 등의 파일
  2. 동적 자원(dynamic)
    • 요청할 때 마다 결과 콘텐트가 변할 수 있는 자원.
    • 메일 조회, 게시물 변경, 주문 등의 웹 프로그램을 가리킨다.
    • 예) index.php, index.jsp, /board/list 등

멀티태스킹 - 여러 작업을 동시에 수행

  • 한 개의 CPU가 여러 코드를 동시(?)에 실행하는 것.
  • 실제는 일정한 시간을 쪼개 이 코드와 저 코드를 왔다갔다 하면서 실행한다.
  • 그럼에도 불구하고 외부에서 봤을 때는 명령어가 동시에 실행되는 것 처럼 보인다.
  • 왜? CPU 속도 워낙 빠르기 때문이다.

1. 멀티 프로세싱

  • 프로세스(실행중인 프로그램)를 복제(fork)해서 멀티태스킹 수행
  • 분기하기가 쉽다. (프로그래밍하기 쉽다.)
  • 복제된 프로세스는 독립적이기 때문에 실행 종료할 때도 일일이 종료해야한다.
  • 메모리가 많이 사용됨
    • code가 중복 로딩
    • Heap 중복 생성


fork() 이후로는 자신을 복제 시켜서 일을 분배해서 동시에 진행시킨다.

VM(Virtual Machine)

컴퓨터 6대를 동시에 실행
문제점: 가상머신은 실제 컴퓨터처럼 H/W 자원을 사용한다. ⇒ 자원(메모리) 낭비가 심하다. → Docker 등장

Docker

App을 실행하는데 필요한 H/W 자원만 사용
물론, VM 처럼 별도의 컴퓨터에서 실행하는 것처럼 동작

2. 멀티 스레딩

  • 특정 코드만 분리하여 프로세스 실행
  • 프로세스가 사용하는 메모리인, Code와 Heap 메모리를 여러 스레드가 공유 ⇒ 멀티 프로세싱 방식에 비해 메모리 낭비가 적다.
  • 프로세스 종료시, 종속된 스레드도 모두 자동 종료된다.

멀티태스킹의 실체


프로세스, 스레드, 멀티태스킹

P: Process
T: Thread

  • 프로세스와 스레드를 동일하게 간주하여 동시 실행한다. (프로세스와 스레드 구분X)
  • CPU가 프로세스나 스레드의 명령을 실행할 때, CPU 실행을 분배하는 전략?

CPU를 어떤식으로 분배해서 명령을 처리할 것인가?
CPU Scheduling:

CPU의 실행 시간을 쪼개서 배분하는 정책

1. Windows → Round-Robin 방식:

프로세스마다 동일 시간 분배

2. Unix → Priority 방식 + Aging 방식:

우선순위가 높은 프로세스나 스레드를 더 많이 실행 + 우선순위가 낮아 실행이 밀릴 때마다 우선순위를 높여서 다음 번엔 실행될 수 있게 하는 것


Context Switching

CPU의 실행 시간을 쪼개 이 코드 저 코드를 실행할 때 마다 실행 위치 및 정보(context)를 저장하고 로딩하는 과정

→ CPU가 다른 (프로세스나 스레드)를 실행하기 위해 현재 (프로세스나 스레드)의 실행상태(여기까지 실행했다.)를 캐시에 저장하고, 실행할 (프로세스나 스레드)의 실행상태(여기서부터 실행하나?)를 캐시에서 로딩하는 것

  • CPU Scheduling 시간을 너무 짧게 잡으면, 명령을 실행하는 시간보다 Context Switching에 더 많은 시간을 소비하는 문제가 발생한다.
    → 너무 간극을 크게 잡으면 동시 실행 효과가 떨어진다.
profile
https://github.com/Dingadung

0개의 댓글