자바 시각 을 통 해 국 지적 원 리 를 간단히 이야기 하 다.

국부 적 원리
프로그램 이 데 이 터 를 방문 할 때 연속 적 인 지역 에 모 이 는 것 을 국 지적 원리 라 고 한다.
시간 과 공간 에 따라 두 가지 유형 으로 나 뉜 다.
  • 시간 부분 성:만약 에 데이터 가 방문 되 고 있다 면 가 까 운 시일 내 에 다시 방문 할 수 있 습 니 다.
  • 공간 국부 성:만약 에 특정한 위치의 데이터 가 방문 된다 면 이 문제 근처 의 데 이 터 는 방문 할 수 있 습 니 다.
  • 국부 적 원리 에 대해 CPU 와 운영 체 제 는 모두 구체 적 으로 실현 되 었 다.
    본 고 는 주로 CPU 와 운영 체제 의 국부 적 원리 가 자바 백 엔 드 에서 의 영향 과 의 미 를 정리 하고 자 한다.
    CPU 공간 국부 성
    아래 그림 은 자바 의 메모리 모델 입 니 다.

    우 리 는 CPU 가 메모리 에서 데 이 터 를 읽 는 성능 을 향상 시 키 기 위해 L1,L2,L3 세 단계 의 캐 시 를 가지 고 있다 는 것 을 안다.
    CPU 는 부분 적 인 원 리 를 이용 하여 메모리 에서 데이터 항목 을 읽 을 때 이 메모리 근처 의 데이터 블록 도 캐 시 에 함께 읽 습 니 다.이 과정 을 미리 읽 는 것 이 라 고 합 니 다.
    즉,연속 공간 을 읽 는 메모리 가 메모리 에 무 작위 로 접근 하 는 것 보다 성능 이 높다 는 점 은 자바 프로그램 으로 증명 할 수 있다.
    
    public static void main(String[] args) {
            int[][] arr = new int[10000][10000];
            int sum = 0;
            long startTime = System.currentTimeMillis();
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[0].length; j++) {
                    sum += arr[i][j];
                }
            }
            System.out.println("        :" + (System.currentTimeMillis() - startTime) + "ms");
            sum = 0;
            startTime = System.currentTimeMillis();
            for (int i = 0; i < arr.length; i++) {
                for (int j = 0; j < arr[0].length; j++) {
                    sum += arr[j][i];
                }
            }
            System.out.println("         :" + (System.currentTimeMillis() - startTime) + "ms");
        }
    
    이것 은 2 차원 배열 을 순환 적 으로 읽 는 코드 입 니 다.
    프로그램의 전반 부 는 배열 의 2 차원 시작 순서에 따라 읽 습 니 다.즉,2 차원 배열 은 메모리 연속 공간 순서에 따라 접근 합 니 다.
    다음 부분 은 배열 의 첫 번 째 열 에 따라 읽 는 것 이지 순서대로 접근 하 는 것 이 아니다.
    각각 10000*10000 번 의 배열 방문 을 거 친 후에 그 운행 결 과 는 다음 과 같다.

    이 를 통 해 알 수 있 듯 이 메모리 의 순서 접근 성능 은 무 작위 접근 보다 우수 하 다.
    디스크 공간 국부 성
    자바 의 일상적인 개발 에서 많은 미들웨어 는 디스크 파일 과 접촉 해 야 한다.이런 디스크 데이터 의 고성능 방문 도 모두 국 지적 원리 에 의존한다.예 를 들 어:
  • MySql 로그 파일
  • MQ 메시지 데이터
  • MySql 의 데 이 터 는 최종 적 으로 디스크 에 저 장 된 것 을 알 고 있 습 니 다.디스크 IO 를 줄 이기 위해 InnoDB 엔진 의 바 텀 은 BufferPoll+redo log 체 제 를 바탕 으로 my Sql 읽 기와 쓰기 성능 을 향상 시 킵 니 다(구체 적 으로 MySql 원리 정 리 를 참고 할 수 있 습 니 다).한편,redo log,undo log,binlog 에 대한 읽 기와 쓰 기 는 디스크 IO 를 피 할 수 없다.그러면 운영 체제 의 PageCache 체 제 를 이용 하여 디스크 데이터 순 서 를 읽 고 쓰 면 디스크 IO 의 성능 이 메모리 성능 에 가깝다.
    우 리 는 항상 kafka 와 rocketMQ 가 고성능 메시지 미들웨어 라 고 말 하 는데,그 중 일 부 는 디스크 파일 의 순서 에 따라 읽 고 쓰 는 것 이다.예 를 들 어 commt log 의 순 서 를 기록 하고 kafka 에서 partition,rockerMQ 에서 consumerQueue 에서 메시지 의 순 서 를 읽 고 씁 니 다.운영 체 제 를 이용 한 PageCache 메커니즘 도 마찬가지다.
    PageCache
    페이지 캐 시(PageCache)는 OS 가 파일 에 대한 캐 시 로 파일 에 대한 읽 기와 쓰 기 를 가속 화 하 는 데 사 용 됩 니 다.일반적으로 프로그램 이 파일 을 순서대로 읽 고 쓰 는 속 도 는 메모리 의 읽 기와 쓰기 속도 에 거의 가깝다.주요 원인 은 OS 가 PageCache 메커니즘 을 사용 하여 읽 기와 쓰기 접근 조작 을 성능 최적화 시 켜 일부 메모 리 를 PageCache 로 사용 하기 때문이다.
    데이터 기록 에 대해 OS 는 먼저 Cache 에 기록 한 다음 에 비동기 방식 으로 pdflush 커 널 스 레 드 를 통 해 Cache 내 데이터 브러시 를 물리 디스크 에 기록 합 니 다.
    데 이 터 를 읽 을 때 한 번 에 파일 을 읽 을 때 PageCache 에 명중 하지 않 은 경우 OS 가 물리 디스크 에서 파일 을 읽 는 데 접근 하 는 동시에 인접 한 블록의 데이터 파일 을 순서대로 미리 읽 습 니 다.
    PageCache 는 국 지적 원리 의 실현 이다.
    시간 국부 성
    시간 국 지성 은 우리 의 일상적인 업무 개발 에서 더욱 뚜렷하게 나타 날 수 있다.
    LRU 캐 시 와 유사 한 것 은 모두 구체 적 으로 이 루어 진다.
    또한 CPU 의 명령 정렬 도 점 변 을 붙 입 니 다.예 를 들 어 한 데이터 에 대한 접근 계산 은 이 데이터 와 관련 된 명령 을 함께 처리 합 니 다.
    레 퍼 런 스
  • 아 는가:어떻게 운영 체제 중의 국부 적 원 리 를 이해 합 니까?
  • gitHub: RocketMQ 디자인 문서
  • 총결산
    자바 의 시각 을 통 해 국 지적 원 리 를 간단하게 이야기 하 는 이 글 은 여기까지 소개 되 었 습 니 다.자바 의 국 지적 원리 에 관 한 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!

    좋은 웹페이지 즐겨찾기