- 네트워킹 사용법(com.eomcs.net.*)(계속)
- 스레드 사용법(com.eomcs.concurrent.*)
- 멀티 태스킹 기법: 멀티 프로세싱, 멀티 스레딩
- CPU 스케줄링, 컨텍스트 스위칭
Stateless
Connection-Oriented vs. Connectionless
- TCP
- Connection-Oriented
- ServerSocket, Socket 이용
- 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());
System.out.printf("자원경로: %s\n", url.getPath());
System.out.printf("서버에 보내는 파라미터: %s\n", url.getQuery());
URN
URN: Uniform Resource Name
예; example:animal:ferret:nose
정적자원과 동적자원
- 정적 자원(static)
- 요청할 때 마다 결과 콘텐트가 변경되지 않는 자원. 즉 파일을 가리킨다.
- 예) HTML, GIF, JPEG, PNG, CSS, JavaScript, TXT 등의 파일
- 동적 자원(dynamic)
- 요청할 때 마다 결과 콘텐트가 변할 수 있는 자원.
- 메일 조회, 게시물 변경, 주문 등의 웹 프로그램을 가리킨다.
- 예) index.php, index.jsp, /board/list 등
멀티태스킹 - 여러 작업을 동시에 수행
- 한 개의 CPU가 여러 코드를 동시(?)에 실행하는 것.
- 실제는 일정한 시간을 쪼개 이 코드와 저 코드를 왔다갔다 하면서 실행한다.
- 그럼에도 불구하고 외부에서 봤을 때는 명령어가 동시에 실행되는 것 처럼 보인다.
- 왜? CPU 속도 워낙 빠르기 때문이다.
1. 멀티 프로세싱
- 프로세스(실행중인 프로그램)를 복제(fork)해서 멀티태스킹 수행
- 분기하기가 쉽다. (프로그래밍하기 쉽다.)
- 복제된 프로세스는 독립적이기 때문에 실행 종료할 때도 일일이 종료해야한다.
- 메모리가 많이 사용됨
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에 더 많은 시간을 소비하는 문제가 발생한다.
→ 너무 간극을 크게 잡으면 동시 실행 효과가 떨어진다.