CS - 동기화와 비동기화
여러 프로세스/스레드를 동시에 실행해도 공유데이터의 일관성을 유지하는 것을 말한다.
동기화 (Synchronous)
한 작업이 완료될 때까지 다음 작업이 시작되지 않습니다.
예를 들어 줄을 서는 것과 동일합니다. A작업을 수행하고 이를 바탕으로 B작업을 할때 이를 동기방식 이라고 합니다.
프로세스, 스레드의 관점에서는 공유자원에 접근할 때 서로의 작업의 영향일 미치지 않으면서 공유하는 자원의 접근을 조절해 경쟁상태가 되지 않도록 하는 것을 말합니다.
장단점은 코드 이해가 좋고, 명확하게 제어하며 데이터 손상 위험이 적습니다. 반대로 처리 속도가 느려질 수 있고, 블로킹 현상이 발생해 작업이 중단 될 수 있습니다.
비동기화 (Asynchronous)
한 작업이 완료되기를 기다리지 않고 다른 작업을 수행할 수 있습니다
여러 작업을 동시에 처리하거나, 응답 속도가 중요한 작업을 수행할 때 유용합니다.
예를 들어, 웹사이트에서 버튼을 클릭하면, 서버에 데이터를 요청하고 결과를 기다리는 동안 다른 작업을 수행할 수 있습니다.
장단점은 처리, 응답속도가 빨라지고 여러 작업을 효율적으로 처리할 수 있습니다. 다만 데이터 손상의 위험이 있기 때문에 이를 잘 고려해야 합니다.
결국 여러일이 동시에 발생하는 데 만약 루프문 처럼 긴 실행시간을 가진 함수가 돌아가도 이것이 흐름을 막지않고 프로그램을 계속실행한다는 의미입니다.
따라서 의미있는 비동기화를 구축하기 위해서는 시간 소요가 긴 메서드 외에 다른 작업들도 실행이 되도록 하는 것이 의미를 가집니다.
대표적으로 메일을 보내주는 서비스는 시간이 길게 되겠죠? 그런데 메일이 보내지는 것을 기다린다고 웹사이트 자체가 멈추게 되면 사용자 입장에서는 답답할 것입니다. 만약 처리가 초단위로 끝난다고 해도 메시지를 보낸 smtp 서버가 처리가 늦게 끝나면 계속 기다려야 할 것입니다.
혹은 ai가 어떤 작업을 수행하고 이런 결과를 보여주는 서비스를 하는데 이때, ai가 작업이 종료될 때까지 백엔드 서버가 기다리고 있으면 효율성이 많이 떨어지겠죠. 이런것을 비동기화 방식으로 처리하는 것입니다.
자바에서 구현하는 법
동기화
1
2
3
public synchronized void someMethod() {
// 동기화 처리가 필요한 코드
}
동기화를 처리할 코드를 키워드를 통해 선언하면 됩니다.
비동기화
1
2
3
new Thread(() -> {
// 비동기 작업을 수행하는 코드
}).start();
쓰레드를 새로만드는 방법이 가장 기본적인 방법입니다.
1
2
3
4
5
6
7
8
9
10
11
someAsyncMethod(new Callback() {
@Override
public void onSuccess(Object result) {
// 비동기 작업 결과 처리 코드
}
@Override
public void onFailure(Throwable t) {
// 오류 처리 코드
}
});
콜백함수를 통해 만드는 방법도 있습니다.
그러면 이런 생각이 듭니다. 결국 비동기화라는 게 결국 여러개의 작업단위를 만들어서 따로 따로 실행시키는 쓰레드가 여러개 있는 것과 같은건가?
비동기화 = 멀티쓰레드? 저도 이런식으로 되는 것이라고 이해했는데요
궁금해서 더 찾아본 결과 둘의 차이점이 있었습니다.
비동기 vs 멀티 스레딩
결국 여러 작업을 동시에 처리하는 것은 동일합니다. 하지만 작동 방식과 활용되는 것의 차이가 있습니다.
비동기란 , 결국 다른 작업을 방해하지 않는다. 가 메인이고 작업을 동시에 처리하는 것처럼 보이지만, 실제로는 하나의 CPU 코어를 순차적으로 사용하며, I/O 작업을 기다리는 동안 다른 작업을 처리합니다.
멀티 스레딩이란 , 여러개의 스레드가 생성해 실제로 동시 실행을 하는 방법입니다. CPU 코어가 여러 개 존재하는 경우, 각 코어에 하나씩 스레드를 할당하여 병렬 처리를 수행합니다.
더 쉽게 접근해보면 멀티 스레딩은 작업자 - 스레드의 대한 것이고 비동기화는 작업 - 테스크에 대한 이야기 입니다. 만약 비동기화를 더 큰 범위에서 본다면 프로세스 자체에도 적용 시켜볼 수 있겠죠.