본문 바로가기

Back-end/Basic

(14)
Thread-safe 하다는 의미와 설계하는 법 두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시에 접근해도, 연산결과의 정합성이 보장될 수 있게끔 메모리 가시성이 확보된 상태를 의미합니다. java.util.concurrent 패키지 하위의 클래스를 사용합니다. 인스턴스 변수를 두지 않습니다. Singleton 패턴을 사용합니다. (이 때, 일반적으로 구현한 Singleton Pattern은 Thread-safe 하지 않습니다.) 동기화(syncronized) 블럭에서 연산을 수행합니다. Thread-safe 멀티 스레드 프로그래밍에서 어떤 함수나, 변수, 혹은 객체가 어떤 스레드로부터 동시에 접근이 이루어져도 문제가 생기지 않는다는 것을 의합니다. -> 여러 곳에서 동시에 접근하더라도 그 결과가 올바르다는 것을 의미합..
멀티스레드 프로그래밍 멀티스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 자원의 생성과 관리의 중복을 최소화하는 것입니다. 장점 멀티 프로세스에 비해 메모리 자원소모가 줄어듭니다. 힙 영역을 통해서 스레드 간 통신이 가능해서 프로세스간 통신보다 간단합니다. 스레드의 컨텍스트 스위칭은 프로세스의 컨텍스트 스위칭보다 빠릅니다. (캐시 메모리를 비우기 않아도 되기 때문) 단점 힙 영역에 있는 자원을 사용할 때는 동기화를 해야합니다. 동기화를 위해서 락을 과도하게 사용하면 성능이 저하될 수 있습니다. 하나의 스레드가 비정상적으로 동작하면 다른 스레드도 종료될 수 있습니다.
동기와 비동기의 차이(블로킹, 넌블로킹) / 장단점 동기/비동기는 두 개 이상의 무엇인가가 시간을 맞춘다/안맞춘다로 구분할 수 있습니다. 동기 방식은 메서드 리턴과 결과를 전달받는 시간이 일치하는 명령 실행 방식입니다. 또, 동기 방식은 한 함수가 끝나는 시간과 바로 다음의 함수가 시작하는 시간이 같습니다. 비동기 방식은 여러 개의 처리가 함께 실행되는 방식으로, 동기 방식에 비해 단위시간 당 많은 작업을 처리할 수 있습니다. 단, CPU나 메모리를 많이 사용하는 작업을 비동기로 처리하게 되면 과부하가 걸릴 수 있습니다. 프로그램의 복잡도가 증가하게 됩니다. 블로킹/논블로킹은 동기/비동기와는 다른 관점으로, 내가 직접 제어할 수 없는 대상(IO/멀티스레드)을 상대하는 방법에 대한 분류입니다. 블로킹 방식은 대상의 작업이 끝날 때 까지 제어권을 대상이 가지..
컨텍스트 스위칭 컨텍스트 스위칭(Context Switching)은 한 Task가 끝날 때까지 기다리는 것이 아니라 여러 작업을 번갈아가며 실행해서 거의 동시에 처리되는 것처럼 보이게 하는 방법입니다. 인터럽트가 발생하면 현재 프로세스의 상태를 PCB(Process Control Block)에 저장하고 새로운 프로세스의 상태를 레지스터에 저장하는 방식으로 동작합니다. 이 때, CPU는 아무런 일을 하지 않으므로 잦은 컨텍스트 스위칭은 성능 저하를 일으킬 수 있습니다. 스레드와 프로세스의 동작방식이 약간 상이한데, 스레드는 캐시 메모리나 PCB에 저장해야하는 내용이 적고, 비워야 하는 내용도 적기 때문에 상대적으로 더 빠른 컨텍스트 스위칭이 일어날 수 있습니다.
프로세스와 스레드의 차이 프로세스는 실행중인 프로그램을 의미합니다. 스레드는 실행 제어만 분리한 것을 의미합니다. 프로세스는 운영체제로부터 자원을 할당받지만, 스레드는 프로세스로부터 자원을 할당받고, 프로세스의 코드/데이터/힙영역을 공유하기 때문에 좀 더 효율적으로 통신할 수 있습니다. 또한 컨텍스트 스위칭도 캐시 메모리를 비우지 않아도 되는 스레드쪽이 빠릅니다. 그리고, 스레드는 자원 공유로 인해 문제가 발생할 수 있으니 이를 염두에 둔 프로그래밍을 해야합니다. 한 프로세스 안에 여러 개의 스레드가 생성될 수 있습니다.
OAuth에 대해서 간단히 설명 OAuth는 제3자 인증방식 입니다. 기본적으로 사용자는 서버를 신뢰할 수 없습니다. 그렇기 때문에, 민감정보를 작성하는 것을 꺼립니다. 서버 측에서도 마찬가지 입니다. 사용자의 민감정보를 관리하는 것은 리소스가 필요합니다. 그래서 OAuth를 사용해서 신뢰할 수 있는 서버에게 정보를 맡겨놓고 접근할 수 있는 권한을 주는 것이라고 이해하면 됩니다. 그러면 사용자 측에서는 민감정보를 굳이 입력하지 않고도 서비스를 사용할 수 있고, 서버측에서도 민감정보를 굳이 관리하지 않아도 되기 때문에 이점이라고 볼 수 있습니다.