일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 알림 우선순위
- 알림 인텐트
- Pending Intent
- 안드로이드 알림 예제
- 버전별 관리
- notification manager
- android notification 예제
- notification channel
- NotificationCompat.Builder
- setContentIntent
- 안드로이드 알림
- setPriority(NotificationCompat.PRIORITY_HIGH)
- notifications
- 안드로이드 알림채널
- setDefaults(NotificationCompat.DEFAULT_ALL)
- 펜딩인텐트
- Today
- Total
공부용 블로그
Web Server 보충 본문
I/O
성능에 결정적인 영향을 미치는 요인으로서의 I/O는 크게 두 가지 I/O가 존재한다. 디스크에서 데이터를 읽어오는 I/O와 네트워크 통신에서 발생하는 I/O이다. 이 두 I/O 작업이 처리되는 속도는 CPU의 작업 처리속도에 비해 매우 느리다. 그렇기 때문에 어플리케이션의 성능은 이 I/O 작업을 어떻게 처리하느냐에 따라 달려있다고 할 수 있다. 그 중 네트워크 통신에서 사용하는 socket을 중심으로 I/O 방식에 대해 알아본다.
Q. CPU안에 I/O가 포함된 개념이 아닌건가? nmonchart에서 CPU use를 확인했을 때 user 사용량과 kernel 사용량이 나눠져 있고 두 부분을 합쳐서 cpu 사용량이라고 하지 않았었나?
Socket
소켓이란 네트워크로 연결되어 있는 서로 다른 두 컴퓨터가 데이터를 주고 받을 수 있도록 하는 네트워크 프로그램이다.
IP 주소와 포트 번호를 가지고 있고, 양방향 네트워크 통신이 가능한 객체라 할 수 있다. 이 소켓에 데이터를 기록하고 읽으려면 소켓에 연결된 소켓채널 혹은 스트림을 통해 기술해야 한다. 소켓의 동작방식은 Blocking mod와 Non-Bloking mod가 있다.
블로킹은 요청한 작업이 성공하거나 에러가 발생하기 전까지는 응답을 돌려주지 않는 것을 말하며 넌블로킹은 요청한 작업의 성공여부와는 상관없이 바로 결과를 돌려주는 것을 말한다.
Q. 넌블로킹 방식에서 작업의 성공여부와 상관없이 결과를 바로 돌려준다면 결과가 아직 없을때는 어떤 내용을 돌려주는걸까?
Bloking I/O
자바에서 블로킹 소켓은 ServerSocket, Socket 두 가지 클래스를 사용한다. 클라이언트가 서버로 연결 요청을 보내면 서버는 연결을 수락(accept)하고 클라이언트와 연결된 소켓을 새로 생성하는데 이 때 해당 메서드의 처리가 완료되기 전까지 스레드에 블로킹이 발생하게 된다. 또 클라이언트가 연결된 소켓을 통해서 서버로 데이터를 전송하면 서버는 클라이언트가 전송한 데이터를 읽기위해 read 메서드를 호출하고 이 메서드의 처리가 완료되기 전까지 스레드가 블로킹된다.
Q. 소켓도 하나의 스레드인가?
병렬 처리의 문제
블로킹 소켓은 데이터 입출력에서 스레드의 블로킹이 발생하기 때문에 동시에 여러 클라이언트에 대한 처리가 불가능하게 된다.
이러한 문제를 해결하기 위한 모델은 클라이언트 별로 각각 스레드를 할당하는 모델이다.
클라이언트가 서버에 연결을 요청하면 서버는 새로운 스레드를 하나 생성하고 그 스레드에게 클라이언트 소켓에 대한 I/O 처리를 넘겨주면 된다. 이로써 서버 소켓이 동작하는 스레드는 다음 클라이언트의 연결을 처리할 수 있게 된다.
Q. 소켓은 I/O 처리 작업을 스레드에게 넘겨줌으로써 I/O 처리 작업에 걸리는 시간만큼 블로킹되는 시간이 줄었지만
클라이언트별로 스레드를 할당하는 시간동안은 여전히 블로킹되지 않을까?
Executors의 구조는 Producer-Consumer 패턴으로 만들어져 있다. 따라서 스레드가 생성하고 나서 같은 작업을 다시 하는 일이 없다면 스레드가 처리하고 나서 바로 종료 처리해도 되지만 반복적으로 어떠한 작업을 어떠한 시점에 해야 한다면 매번 스레드를 생성하고 종료하는 로직보다는 해당 스레드가 계속 대기 중인 상태가 되어 작업할 시점이 왔을 때 처리하는 것이 좋다. Executor에서는 각종 상황에 맞는 스레드 풀을 제공하고 있다.
스레드와 관련된 작업을 특정 시간 이후에 실행되거나 주기적으로 작업을 실행할 수 있는 스레드 풀을 생성한다.
출처 : http://asfirstalways.tistory.com/m/347?category=660807
'설계 > WebServer' 카테고리의 다른 글
Nginx에 관한 이해 (0) | 2018.10.30 |
---|---|
웹서버 벤치마크에서의 user mode와 kernel mode의 의미 (0) | 2018.10.30 |
Jetty 설치 (0) | 2018.10.27 |
ubuntu 16.04 $JAVA_HOME 설정 (0) | 2018.10.25 |
Apache 마인드맵 (0) | 2018.10.23 |