반응형

1. 동기화와 비동기화의 차이는 무엇인가?

 

 

Synchronous

 System Call이 끝날때 까지 기다리고 결과물을 가져온다

작업을 요청한 후 해당 작업의 결과가 나올 때까지 기다린 후 처리하는 것으로 I/O작업에 대한 처리를 기다린다. 특정 I/O작업을 하기위한 준비가 되었는지에 기다린 후 작업하는 것. I/O작업 준비에 대한 이벤트의 발생을 기다렸다가 해당 이벤트가 발생하면 그에 따른 적합한 처리를 해야한다.

 

ㅇI

 

 

blocking

I/O가 끝날 때까지 CPU가 대기해야 한다. 끝나기 전에는 함수가 반환되지 않기 떄문.

커널이 작업을 완료하기 전까지 유저 프로세스는 작업을 중단 한채 대기해야한다. IO작업이 CPU작업을 거의 쓰지 않기 때문에 blocking방법은 cpu자원 낭비가 심하다.

 

즉 동기화 하기 위해 blocking을 해야한다

 

 

 

 

Sync vs Async

일반적으로 동기와 비동기의 차이는 메소드를 실행시킴과 동시에 반환 값이 기대되는 경우를 동기 라고 표현하고 그렇지 않은 경우에 대해서 비동기 라고 표현한다. 동시에라는 말은 실행되었을 때 값이 반환되기 전까지는 blocking되어 있다는 것을 의미한다. 비동기의 경우, blocking되지 않고 이벤트 큐에 넣거나 백그라운드 스레드에게 해당 task 를 위임하고 바로 다음 코드를 실행하기 때문에 기대되는 값이 바로 반환되지 않는다.

글로만 설명하기가 어려운 것 같아 그림과 함께 설명된 링크를 첨부합니다.

 

 

 

 

Asynchronous

System Call이 완료되지 않아도 나중에 완료가 되면 그때 결과물을 가져온다.

먼저 실행하고 작업이 완료되면 Callback함수를 통해 결과물을 가져온다.

작업을 요청해놓고 작업을 하다가 해당 작업이 완료되면 그 때 완료되었음 통지받고

그에 따른 작업을 처리하는 것을 말한다. I/O 작업의 completion을 기다고

I/O 작업이 완료되면 그에 적합한 Handler를 이용해 처리한다.

 

요청 -> 하던일 계속하고 -> 완료되면 Handler를 이용해 완료된것 처리

 

 

 

Synchronous VS Asynchronous 차이점

결과물을 가져오는 시점이 다르다.

system call의 완료를 기다리면 synchronous

system call의 완료를 기다리지 않으면 asynchoronous

 

 

2. Reflection이 무엇인가?

투영이라는 의미로

클래스의 이름만 알고 객체의 형에 대해서는 모를 때 그 객체를 쓰고 싶을 때 사용한다.

런타임 중에 사용될 클래스가 아직 어떤 타입인지는 모를 때 실행 시점에서 확인해서

해당 클래스를 사용할 수 있도록 하는 매커니즘

 

 

 2.1. Reflection이 어디에 쓰이고 있는가?

스프링 프레임워크의 어노테이션과 같은 기능과 같이 사용될 클래스가 어떤 타입인지 모를 때 사용

 

 

 

 

< 메소드 추출 >

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.lang.reflect.Method;
 
public class Reflection {
    public static void main(String args[]) {
        try {
            Class c = Class.forName("java.util.Stack");
            Method m[] = c.getDeclaredMethods();
            
            for (int i = 0; i < m.length; i++)
                System.out.println(m[i].toString());
        } catch (Throwable e) {
            System.err.println(e);
        }
    } // end of main
// end of class
 
 

 

 

 

1

 

 

 

< 메소드 사용 >

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
31
32
33
34
import java.lang.reflect.*;
 
public class Reflection02 {
    public int add(int a, int b) {
        return a + b;
    }
 
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("Reflection02");
            Class partypes[] = new Class[2];
            partypes[0= Integer.TYPE;
            partypes[1= Integer.TYPE;
            Method meth = cls.getMethod("add", partypes);
            Reflection02 methobj = new Reflection02();
            
            // 인자 2개 담기
            Object arglist[] = new Object[2];
            arglist[0= new Integer(37);
            arglist[1= new Integer(47);
            
            // 메서드 실행
            Object retobj = meth.invoke(methobj, arglist);
            Integer retval = (Integer) retobj;
            System.out.println(retval.intValue());
 
        } catch (Throwable e) {
            System.err.println(e);
        }
 
    }
}
 
 

 

 

2

 

 

 

< 필드값 변경>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.lang.reflect.*;
 
public class reflect_field {
    public double num;
 
    public static void main(String args[]) {
        try {
            Class cls = Class.forName("reflect_field");
            Field fld = cls.getField("num");
            
            reflect_field fobj = new reflect_field();
            System.out.println("num = " + fobj.num);
            fld.setDouble(fobj, 20.30);
            System.out.println("num = " + fobj.num);
        } catch (Throwable e) {
            System.err.println(e);
        }
    }
}

 

 

 

3

 

 

반응형