728x90

동기식과 비동기식, 블럭킹과 논블러킹

synchronous/Asynchronous, Blocking/Non-Blocking

 

대충 동기와 블럭, 비동기와 논블럭... 대충 이렇게 짝지어서 생각해 왔었다. 

그런데 뭐가 어떻게 다르고 어떤 경우에 쓰이는지 궁금했다.

글에 앞서, 호출한 함수를 Client, 호출된 함수를 Server(API) 대입하여 생각하고 글을 작성 하였음.[각주:1] 

노드와 노드 사이의 커뮤니케이션

Node에 관한 포스팅으로 가기

 

무엇(What)이 다른가? 

Client와 Server의 관심사

 

Synchronous / Asynchronous

Client의 관심사

 

Server의 작업완료를 

1. Client가 신경쓰냐? synchronous

2. Server가 신경쓰냐? Asynchronous

 

Blocking / Non-Blocking

Server의 관심사

 

Server의 작업완료 체크를

1. Client에게 바로응답 하느냐(Non-Blocking)

2. 작업이 끝나고 응답 하느냐(Blocking)

 

어떻게(How) 다른가?

Example CASE

1. Synchronous & Non-Blocking

클라이언트는 작업완료까지 대기하면서 다른 일 못함.

서버에게 작업 완료 됐는지 계속 푸시(?)함

 

이것을 폴링이라 한다.

더보기

폴링 : 폴링이란 하나의 장치가 충돌 회피 또는 동기화 처리 등을 목적으로 다른 장치의 상태를 주기적으로 검사하여 일정한 조건을 만족할 때 송수신 등의 자료처리를 하는 방식을 말한다. 이 방식은 버스, 멀티포인트 형태와 같이 여러 개의 장치가 동일 회선을 사용하는 상황에서 주로 사용된다

 

Client : (옆에서 대기하면서...) 작업 끝났어요?

Server : 아직요...

Client : 작업끝났어요?

Server : 아직요...

Client : 작업끝났어요?

Server : 네 끝났어요

Client : (다른일 시작)

 

2. Asynchronous & Non-Blocking

Client는 작업완료가 안되어도 다른 작업 가능

Server가 작업완료 되면 알려줌

 

Client : 작업끝나면 알려주세요, 다른작업 하고 있을게요.

Server : Yes, Sir!

Client : ( 열심히 일하는 중... )

... If few moments later ... 

Server : Job finished. Sir!

Client : Good Job! 😍

 

3. Synchronous & Blocking

아직 필자가 케이스를 이해를 못했습니다...-_-;; 이해하면 업데이트 합니다

 

4. Asynchronous & Blocking

아직 필자가 케이스를 이해를못했습니다...-_-;; 이해하면 업데이트 합니다.

 

 

 

 

 

 

 

Reference

https://homoefficio.github.io/2017/02/19/Blocking-NonBlocking-Synchronous-Asynchronous/

https://musma.github.io/2019/04/17/blocking-and-synchronous.html

https://private.tistory.com/24

 

 

  1. 노드(Node)와 노드의 커뮤니케이션이 더 근본적인 개념인것 같다 [본문으로]
728x90

뉴럴링크(Neuralink)

뉴럴링크 코퍼레이션은 일론 머스크 등이 설립한 미국의 뉴로테크놀로지 기업으로, 이식 가능한 뇌-컴퓨터 인터페이스를 개발한다



나의 생각 ->

  인공지능(AI)에게 인간(Human)의 감정을 이식할 수 있다?


최초작성 : 2020-07-29

728x90

728x90

본 포스팅은 개인적 필요에 의해 기재되었습니다.


원노트에서 서식 복사하여 그대로 기재되었으므로

보시기에 불편할 수 있습니다.

필요하신 부분이 있다면 발췌하여 자유롭게 쓰시면 됩니다.


참고 출처와 댓글은 달아주세요~





생각해야 할 부분


카카오톡 친구 목록은 283명이다.

 

보통의 경우 200명을 넘기며 사업을 하는 사람의 경우 1000명도 넘길것이다.

 

친구목록이 10만명이라고 상상해보자.

이렇게 되면 한번에 많은 데이터를 서버로 요청해야 한다.

 

유저가 어플리케이션을 사용하는 흐름 , User Flow( 이하 플로우 ) 생각해 보자.

 

  1. 어플리케이션을 설치한다.
  2. 이전에 가입하였던 아이디가 있는가?
    1. 있다. 이전사용자
      1. 만약 어플리케이션이 기존에 설치되어 있고 데이터가 존재한다면
         SharedPreFerence ( 이하 SPF )에서 친구 목록 데이터를 불러온다.
      2. 클라이언트는 이전에 친구 추가했던 db ( server ) 요청( Request )한다.
        1. 해당 아이디(userID) USER 테이블에서 검색하자( SELECT ).
        2. userID 검색되면, Friends 테이블에서 해당 userID friendsID SELECT 하자.
        3. 이렇게 나온 friendsID 클라이언트로 전달( Response )한다.
    1. 없다. 처음사용자
      1. USER테이블에 userID 추가( INSERT) 된다.
      2. regDate ( 등록일 ) 칼럼에 년월시분초 ( ms 이하 단위 생략 ) 입력된다.
        ( MySQL date 기능을 사용 or PHP에서 UTC시간을 이용 등등.. )

+@ regLocation( 등록 지역) 입력하자. 클라이언트의 Network 정보 ( IP ) 기준으로.

  1. 서버에서 Response friendsID ArrayList 담는다.
  2. 이후 친구추가가 이루어 질때
    1. ( 어플 메모리상에서 ) ArrayList 추가한다.
    2. 서버 DB 등록 한다.
    3. SPF에도 추가 등록 한다. ( 생명주기를 신경써서 작업한다. )

 

 

플로우를 정리하면

 

1. 신규 유저일 경우 -> 회원가입 -> 아이디를 DB 추가한다

-> 친구 추가를 하면 DB friends테이블에 userId, friendId 칼럼에 각각 등록한다.

userId

friendId

userA

userB

userA

userC

userB

userA

userB

userC

userC

userA

userC

userB

"userA" 친구 목록 => userB, userC

"userB" 친구목록 => userA, userC

"userC" 친구목록 => userA, userB

 2. 기존 유저일 경우

-> 로그인한 유저 아이디를 기준으로한 key값으로 SPF에서 친구목록을 가져온다.

-> SPF 데이터가 존재하지 않을경우 ( 어플리케이션 재설치등 )

Server DataBase ( RDBMS. ex: MySQL )에서 데이터를 가져온다.

-> 가져온 데이터는 SPF 저장하고 어플리케이션이 완전히 종료되고 다시 시작될 우선적으로 SPF에서 불러오도록 한다. ( ,     우선순위를 로컬로 후순위를 서버로 )


728x90

SearchView 밑줄 ( queryBackground ) 없애는법




<Layout.XML>

android:queryBackground="@null" <--- 추가



적용 전


적용 후



728x90

아두이노 우노 + ESP01(eps8266) 모듈 기준으로 작성되었습니다.


1. RFID카드를 태그하면 wifi를 이용해 웹서버로 RFID의 uid(고유식별자)를 보내는 개발을 하던중...시스템 Setup시 와이파이가 간헐적으로 연결되지 않는 문제가 발생하였다. 

원인은 배선의 접촉불량 또는 esp8266모듈의 와이파이 수신 자체문제로 추정되었다.



2. 해결 방안으로 connectFlag변수를 만들어 esp8266이 와이파이를 잡지못하였을때 false, 연결되었을 때 true가 되도록 하였다.

while(!connectFlag) 으로 connectFlag가 false일때, 

연결을 재시도하는 코드를 작성해 보았다.


 /*
Wifi 연결 함수
*/
void connectWifi(){
  String cmd = "AT+CWMODE=3";
  mySerial.println(cmd);
  delay(5000);
  cmd ="AT+CWJAP=\""+SSID+"\",\""+PASSWORD+"\"";
  mySerial.print(cmd);
  delay(1000);

  bool connectFlag = false;
  while(!connectFlag){
    //connectFlag가 false일때, 와이파이 연결을 반복합니다.
    delay(1000);
    String cmd = "AT+CWMODE=3";
    mySerial.println(cmd);
    delay(5000);
    cmd ="AT+CWJAP=\""+SSID+"\",\""+PASSWORD+"\"";
    mySerial.print(cmd);

    
    if(mySerial.find("OK")){
      //만약 mySerial에서 OK리턴을 find 했다면 연결에 성공한것 입니다.
      Serial.println("Wifi connected");
      //lcd에 결과값 출력
      lcd.clear();
      lcd.print("Wifi connected");
      lcd.setCursor(4,1);
      lcd.print("Let's TAG!");

      connectFlag = true; //와이파이 연결이 되었으니 Flag -> true 로 바꿔 반복문을 빠져나옵니다.
    }else {
      /*
      mySerial.find("OK") -> false 일때, 
      시리얼에서 Ok를 찾지못하였을때,

      즉, (AT+CWJAP="SSID","PASSWORD") 에 대한 OK 리턴을 찾지 못하였을때.
      와이파이 연결이 실패하였을때 LCD에 "Cannot connect to Wifi"를 출력하고 
      반복문을 통해 연결을 재시도합니다.      
      */
      connectFlag = false;
      Serial.println("Cannot connect to Wifi");
      //lcd에 결과값 출력
      lcd.clear();
      lcd.print("Cannot connect");
      lcd.setCursor(8,1);
      lcd.print("to Wifi");
      delay(1000);
      lcd.clear();
      delay(500);
      lcd.print(".");
      delay(500);
      lcd.print(".");
      delay(500);
      lcd.print(".");
      delay(500);
      lcd.print(".");
      delay(500);
      lcd.print(".");
    }
  }
}

3. 성공 영상



728x90

자바 기준으로 작성되었습니다.



String Constant Pool이란?

    1. String str1 = "TeamNova";

    2. String str2 = new String("TeamNova");



어떤차이일까? 

1번은 String Constant Pool* 을 참조한다.

2번은 새로운 객체를 생성하여 문자열을 담는다.

String Constant Pool이라는 객체가 만들어져 있고 이곳에 있는 문자조각*을 재사용한다.

-> 마치 방하나에 LEGO조각(?)이 엄청나게 많아서 이걸로 여러가지 형태를 만들수 있다고 상상해 보자.

-> 매번 새로운 LEGO를 살필요가 없을 것이다. ( 진지하게 따지지 말긔 )


문자열을 생성할때마다 새로운 객체를 매번 생성하면 메모리를 비효율적으로 사용하므로 낭비이다.

하지만 이미 만들어진 문자를 재사용 한다면? 새로 객체를 생성하지 않아도 된다. 따라서 메모리를 효율적으로 사용할 수 있다.

필자는 이것이 String Constant Pool ...이라고 이해했다.

아래는 직접 코드로 테스트한 결과이다.

public class test1 {
	
	public static void main(String[] args) {
		
	   	String str1 = "TeamNova";
        String str2 = "TeamNova";
        String str3 = new String("TeamNova");
        String str4 = new String("TeamNova");
        //str1과 str2 비교 ( 둘다 String Constant Pool에 위치함 )
        System.out.println("str1 == str2 :"+(str1==str2));
        //str1과 str3 비교 ( 각각 String Constant Pool, Java Heap 영역에 위치함 )
        System.out.println("str1 == str3 :"+(str1==str3));
        //str3과 str4 비교 ( 각각 Java Heap 영역에 위치함 ( 각각 객체 생성 ) )
        System.out.println("str3 == str4 :"+(str3==str4));
        
       /*
        * 결과 정리
        * 
        * Heap 영역으로 배정되면 각각 메모리 영역이 따로 배정됨 ( 방으로 예를 들면 각각 새로운 방 생성 )
        * 따라서 메모리 주소가 다름.
        * 
        * String Pool은 문자열을 담당하는 방을 하나 만들어 둠.
        * 그곳에 문자들을 모두 모아 두어서 메모리 주소가 같음.
        * 
        * ※ 중요 : String Constant Pool은 Heap 영역에 존재한다.
        *        이곳에 있는 문자열을 재사용한다. 리터널하게...
        *        따라서 새로운 객체를 생성하지 않아 메모리 효율이 좋다.
        * */
	}
}


※ 위 코드에서 처럼...

str1과 str2는 같은 객체이다.  

str3과 str4는 다른 객체이다. 


따라서 총 3개의 객체가 만들어 졌다.



PS. 자바에서 객체의 메모리주소를 알아내는 ( 포인터 ) 방법을 아시는 분은 댓글 남겨주시면 감사합니다...!

잘못 기술된 부분 있다면 메일(inma06@naver.com) or 댓글 남겨주세요

'컴퓨터 프로그래밍 > JAVA' 카테고리의 다른 글

[연습]게임 - 무기강화  (2) 2018.10.03

+ Recent posts