공유 리소스, 충돌, 공유 액세스 - 1

"안녕하세요, 아미고! 리소스 공유에 대해 말씀드리고 싶습니다. 자연스럽게 다른 스레드에 걸쳐.

"여러 스레드로 작업할 때 발생하는 문제와 해결 방법에 대해 계속 이야기합니다. 스레드를 사용하는 것이 나쁘다는 의미는 아닙니다. 스레드는 매우 강력한 도구입니다. 사실 스레드를 사용하면 프로그램을 더 빠르고 균일하게 만들 수 있습니다. 프로그램이 복잡할수록 더 많은 스레드와 다양한 독립 부분이 있습니다."

"프로그램을 독립적인(느슨하게 결합된) 부분으로 나누는 것은 매우 유익합니다."

"프로그램이 내부적으로 100개의 스레드로 나누어져 있다고 상상해 보십시오. 하지만 듀얼 코어 프로세서만 있습니다. 즉, 각 코어에서 평균 50개의 스레드가 실행됩니다."

"프로그램의 성능을 향상시켜야 하는 경우 듀얼 프로세서 서버와 이를 위한 몇 가지 멋진 프로세서를 구입하면 됩니다. 이렇게 하면 최대 32개의 코어를 얻을 수 있으며 성능이 2-20배 향상될 수 있습니다. 숫자에 따라 다릅니다. 진정으로 독립적인 부분들로 나뉘어져 있습니다."

"이것이 엔터프라이즈 개발에서 Java가 지배하는 이유 중 하나입니다. 회사에 20명의 개발자가 작성한 복잡한 내부 프로그램이 있는 경우 최적화를 통해 프로그램 성능을 두 배로 늘리는 것보다 다른 서버를 구입하는 것이 훨씬 저렴합니다."

"그래서 그게 다야."

"그러나! 개발자가 다른 스레드를 사용하기로 결정할 때마다 그는 하나의 문제를 해결하고 두 개의 문제를 만듭니다. 점점 더 많은 스레드가 프로그램의 성능을 끝없이 향상시키지는 않습니다."

"첫째, 어떤 프로그램이든 분리할 수 없고 서로 다른 스레드에서 병렬로 실행할 수 없는 작업이 있습니다. 둘째, 모든 스레드는 동일한 프로세서에서 실행됩니다. 스레드가 많을수록 각각의 작업 속도는 느려집니다."

"그리고 가장 중요한 것은 스레드가 종종 동일한 개체(일반적으로 '공유 리소스'라고 함)를 사용한다는 것입니다."

"예를 들어 스레드가 완료한 작업에 대한 정보를 파일에 저장하려고 합니다. 이러한 스레드가 여러 개 있고 동일한 파일에 정보를 쓰려는 경우 서로 간섭합니다. 파일이 파일에 대한 액세스가 제한됩니다. 즉, 한 스레드가 파일을 사용하는 동안 다른 스레드는 대기합니다."

"예, 기억합니다. 동기화된 키워드를 사용하여 수행합니다 ."

"맞아요."

"그리고 쓰레드가 다른 파일에 쓰고 있다면?"

"공식적으로 이들은 서로 다른 개체이지만 아마도 동일한 하드 드라이브에 있을 것입니다."

"그래서 프로세서 내부에서 무언가를 병렬화하는 것이 정말로 가능합니까?"

"기술적으로는 그렇습니다. 하지만 스레드가 가지고 있는 데이터 외에 다른 것을 필요로 하는 순간 이미 다른 스레드가 그 무언가를 점유하고 있을 수 있으므로 스레드는 기다려야 합니다."

"그럼 어떻게 해야 할까요? 실을 많이 만들어야 할지 말아야 할지 어떻게 알죠?"

"이것은 프로그램의 아키텍처에 의해 직접 결정됩니다. 모든 프로젝트에는 프로그램에서 사용되는 모든 '리소스'를 알고 그 한계와 병렬화가 얼마나 잘/잘못되었는지를 알고 있는 자체 '아키텍트'가 있습니다."

"그리고 내가 모른다면?"

"두 가지 옵션이 있습니다."

a) 다음을 수행하는 사람의 감독하에 작업

b) 스스로 알아내는 덩어리를 얻으십시오.

"나는 로봇입니다. 덩어리가 생기지 않고 찌그러진 부분만 생깁니다."

"그럼, 좀 치워봐."

"그렇군요. 감사합니다. 이미 궁금했던 부분이 명확해졌습니다."