shopkeeper/korean_wiki_content_only_120125 huggingface dataset:
아셀리나의 테르모폴리움은 폼페이 유적에서 확인된 가장 완벽한 형태를 보전하고 있는 테르모폴리움 가운데 하나이다. 카운터 위에는 거의 손상되지 않은 온전한 형태의 주전자와 식기가 발견되었고, 주전자 안에는 당시 사람들이 채 마시지도 못한 물이 채워져 있었다. 아셀리나의 테르모폴리움의 1층은 사람들이 식사하고 음료를 마시는 공간으로 사용되었으며, 몇몇 계단을 통해 2층의 객실로 이동할 수 있었다.
이곳은 길거리 쪽으로 낸 넓은 출입구, 음식이나 와인을 담을 수 있는 4개의 항아리(돌리아)를 박아 놓는 구멍이 있는 카운터로 구성된 전형적인 테르모폴리움의 구조를 갖추고 있다. 이곳에는 로마 신화의 라레스(가정의 신), 메르쿠리(상업의 신), 바커스(포도주의 신)를 모시는 작은 신전이 마련되어 있었는데, 이들이 이 직종에서 가장 중요한 신이었기 때문이다. 윗층에는 객실도 있었던 것으로 보아 여관으로도 사용되었을 가능성이 있다. 그러나 일부에서는 테르모폴리움의 외벽 한쪽에 선거 공고판처럼 쓰여 있는 수많은 여성의 이름들을 들어 이곳이 단순한 객실이 아닌 성매매 용도의 매음굴이었을 것으로 해석하기도 한다. 또 다른 주장으로는 여기에 쓰인 이름의 여성들이 테르모폴리움에서 종업원으로 일하던 노예들이었다는 것이다. 카운터 뒤에는 천장에 걸어 매달았던 나무 선반의 잔해가 남아 있었는데, 그 선반은 암포라를 쌓아 올리는 데 사용되었다.
제5구역 테르모폴리움.
2020년 폼페이 제5구역(Regio V)에서 여덟 개의 돌리아를 보존하고 있는 완전한 형태의 또 다른 테르모폴리움이 발굴되었다. 이곳에서 판매하던 음식으로 보이는 닭과 뒤집힌 오리 두 마리를 그린 프레스코화 외에도, 한 프레스코화에는 목줄을 맨 개가 묘사되어 있는데 이는 아마도 고객에게 반려동물 동반 출입시 꼭 목줄을 매어 두도록 요청하는 안내문 역할을 했던 것으로 보인다. 동시에 매우 작은 성견의 완전한 골격도 발견되었는데, 이는 이미 로마 시대에 반려동물 목적의 선택적 번식이 이루어졌음을 증명하고 있다. 고고학자들은 또한 깊은 테라코타 항아리 가운데 일부에서 그 안에 담겨 보관되던 음식의 잔해를 발견했다. 화구와 벽화와 함께 청동 술 그릇, 스튜와 수프에 사용되는 항아리, 와인잔 등의 식기가 발견됐다. 이 식기들에는 돼지고기, 생선, 달팽이, 소고기, 콩을 갈아 넣은 와인 등의 흔적이 발견됐다. 일부 재료는 파에야처럼 함께 조리되어 있었으며, 와인 용기 바닥에서는 와인의 맛과 색을 좋게 하기 위해 넣은 누에콩(horse bean)도 발견했다. 그밖에 음료수 판매대, 파테라(patera)로 알려진 표면이 장식된 청동제 잔, 와인 플라스크, 암포라, 스튜와 수프를 요리하는 데 쓰였던 도자기 항아리도 수습되었다.
《세월의 너울》은 1987년 1월 25일에 MBC TV에서 방영된 베스트셀러극장이다.
가나-인도 관계는 가나와 인도 간의 양자 관계를 의미한다. 양국은 영연방 회원국으로서, 인도는 아크라에 고등판무관부를 두고 있으며, 가나는 뉴델리에 고등판무관부를 두고 있다.
1817년, 토머스 에드워드 보우디치는 아샨티 제국과 영국 간의 관계 개선을 위해 쿠마시로 영국 대표단을 이끌고 방문하였다. 당시 아샨티의 한 왕자는 인도에서의 영국의 존재를 언급하며 영국의 아샨티 내 동기에 대해 회의적인 태도를 보였다. 역사학자 에저턴에 따르면, "다음 날, 한 아샨티 왕자가 보우디치에게 '영국이 그렇게 이타적인 나라라면, 왜 인도에서는 그렇게 다르게 행동했느냐'고 물었다"고 한다.
인도는 1953년 아크라에 영사관을 개설하였으며, 1957년 가나의 독립 직후 전면적인 외교 관계를 수립하였다. 인도 고등판무관부는 아크라에 위치해 있으며, 부르키나파소, 토고, 시에라리온에도 겸임 관할권을 두고 있다. 가나는 독립 이후 뉴델리에 고등판무관부를 설치하였다.
가나 초대 대통령 콰메 은크루마와 인도 초대 총리 자와할랄 네루는 깊은 우정을 나눈 것으로 알려져 있다. 은크루마 대통령을 비롯하여 힐라 리만, 제리 롤링스, 존 쿠푸오르 대통령이 인도를 국빈 방문하였으며, 인도 측에서는 P. V. 나라심하 라오가 1995년 가나를 방문하였다. 인도와 가나는 비동맹 운동의 창립 회원국이며, 인도 정부의 팀-9 구상에 참여하고 있으며, 또한 영연방 회원국이기도 하다.
《갯마을》은 1982년 7월 31일에 방영된 TV문학관이다.
어느 조그만 갯마을이 있다. 이 갯마을에는 유난히 과부가 많이 살고 있다. 젊은 해순이(조옥희)의 남편도 결혼 후 얼마 지나지 않아서 고기를 잡으로 바다로 나갔다가 결국 돌아오지 못했다. 그 마을에 사는 과부들은 모이기만 하면 사내 이야기 꽃을 피우는데...
《마》(馬)는 1982년 8월 7일에 방영된 TV문학관이다.
길중(장항선)은 옷과 화장품을 주로 판매하는 판매상으로 전국을 떠돌아 다닌다. 그는 전국을 돌며 장사하는 자신의 신세를 이제는 즐기게 되었다. 어쩌다가 만나서 같이 살게 된 춘자(차화연)마저 귀찮다는 이유로 내버려 두고 혼자 길을 떠날 정도로 길중의 방랑벽은 강하다. 이같은 길중의 방랑벽에 화가 난 춘자는 전국 장터를 돌며 길중을 찾는데...
《겨울 잠행》은 1987년 2월 1일에 MBC TV에서 방영된 베스트셀러극장이다.
출감한 후 거리를 헤매던 청년 무애(박은수)는 과거 그를 담당했던 전직 형사 창대(국정환)와의 인연으로 그가 운영하는 목욕탕에서 카운터 겸 때밀이로 일하게 된다. 무애는 일자리를 얻기 위해 목욕탕을 찾아온 청년 영상(이원용), 호텔 웨이터로 일하다가 해고된 영재(김광배), 갈 곳 없는 소년 '그냥'(신혜수)과 만나 함께 살면서 겨울을 나게 되는데...
파벨 니콜라예비치 도브갈(, , 1975년 12월 22일~)은 벨라루스의 전직 근대5종 선수이다. 2004년 하계 올림픽에서 남자 개인전 동메달을 획득했으며 세계 선수권 대회에서 은메달 1개, 동메달 1개, 유럽 선수권 대회에서 은메달 3개, 동메달 2개를 획득했다.
《First Step》은 영국의 록 밴드 페이시스의 데뷔 스튜디오 음반으로, 1970년 3월 27일, 워너 브라더스 레코드를 통해 발매되었다. 이 음반은 페이시스가 결성된 지 불과 몇 개월 만에 발매되었으며, 스몰 페이시스 (로니 레인, 케니 존스, 이언 맥라건이 속했던 밴드)와 제프 벡 그룹 (로드 스튜어트와 로니 우드가 속했던 밴드)의 해체 이후 구성된 새로운 밴드의 출발을 알리는 작품이다. 북미 지역에서 발매된 모든 판본과 재발매본에는 밴드명이 스몰 페이시스로 기재되어 있으며, 최초 바이닐 음반의 레코드 라벨에는 제목이 《The First Step》으로 표기되어 있다.
음반 커버에는 로니 우드가 제프리 시슬리의 기념비적인 기타 교본 《First Step: How to Play the Guitar Plectrum Style》을 들고 있는 모습이 담겨 있다.
음반은 1969년 가을, 페이시스가 공식적으로 결성되어 워너 브라더스 레코드와 계약을 맺은 이후에 녹음되었지만, 밴드 멤버들은 그해 5월부터 다양한 조합으로 함께 리허설, 공연, 녹음을 해오고 있었다.
총 러닝타임 46분 22초에 달하는 《First Step》은 페이시스의 스튜디오 음반 중 가장 길며, 현대의 평론가들 사이에서는 유망하지만 산만하고 방향성이 부족한 작품으로 평가받기도 한다. 밴드의 음반 가운데 가장 일관성이 떨어지고 가장 규율이 느슨한 작품으로 여겨지지만, 한편으로는 멤버 각각에게 적어도 한 곡 이상의 작곡 크레디트를 부여하며, 밴드 전체의 재능을 고루 조명한 가장 민주적인 음반으로 평가되기도 한다. 이는 이후 로드 스튜어트와 로니 우드의 작곡 파트너십이 점차 주도권을 잡게 되는 페이시스의 경력 후반과는 대조적인 부분이다. 2015년 8월 28일, 《First Step》은 리마스터 및 확장판 형태로 재발매되었으며, 두 곡의 보너스 트랙이 추가되었다.
《First Step》의 사진 촬영은 아티스트 마이크 맥이너니와 그의 아내 케이트의 자택 윌러비 하우스에서 진행되었다. 이들 부부는 로니 레인과 마찬가지로 메헤르 바바의 신봉자였다. 촬영 당시 케이트는 밴드 멤버들에게 메탄올이 섞인 펀치를 대접했으며, 이언 맥라건은 이를 두고 "우린 완전히 취해버렸다... 낮은 탁자 위에서 뛰어다니다가 산산조각을 내고 말았다"고 회상했다.
앞면 커버 아트는 사진가이자 바바의 추종자였던 마틴 쿡이 촬영한 것으로, 로니 우드가 《First Step: How to Play the Guitar Plectrum Style》이라는 책을 들고 있는 모습이 담겨 있다. 전기 작가 테리 롤링스는 이 책이 대중이 제프 벡 그룹 활동을 통해 우드를 단지 베이시스트로 인식했던 점을 상징한다고 해석한다.
맥라건과 레인은 미키 마우스 인형을 들고 있는 모습으로 등장하는데, 맥라건은 "그 인형을 우리가 가져간 건 기억이 나지 않는다... 아마도 그 인형은 마이크와 케이트의 집에 원래 있었던 것 같다. 하지만 로니 레인이 미키 마우스 티셔츠를 입고 있는 걸 보면 어쩌면 그 인형들이 그의 것이었을지도 모른다"고 말했다.
흑백으로 구성된 음반의 게이트폴드 사진은 정원에서 촬영된 것으로, 밴드 멤버들이 각자의 악기를 연주하는 척하고 있는 모습이 담겨 있다. 단, 로니 레인만은 연주에 참여하지 않고 손을 주머니에 넣은 채 멍하니 서 있는 모습으로 나타난다.
컴퓨터 공학에서 레지스터 윈도(Register window)는 내부 레지스터의 하위 집합을 고정된, 프로그래머에게 보이는 레지스터로 동적으로 별칭을 지정하여 서브루틴에 레지스터를 전용하는 기능이다. 레지스터 윈도는 함수 호출 및 반환에 필요한 스택 작업 수를 줄여 프로세서의 성능을 향상시키기 위해 구현된다. 버클리 RISC 설계에서 가장 영향력 있는 기능 중 하나인 이 기능은 나중에 AMD Am29000, 인텔 i960, 썬 마이크로시스템즈 SPARC, 인텔 아이태니엄과 같은 명령어 집합 구조에 구현되었다.
일반적인 작동.
프로그램의 여러 부분에 대해 여러 세트의 레지스터가 제공된다. 레지스터는 여러 서브루틴이 프로세서 자원을 공유하도록 강제하기 위해 프로그래머에게 의도적으로 숨겨진다.
레지스터를 보이지 않게 만드는 것은 효율적으로 구현할 수 있다. CPU는 프로시저 호출 중 프로그램의 한 부분에서 다른 부분으로 이동하는 것을 인식한다. 이것은 소수의 명령어(프롤로그) 중 하나로 완료되며 비슷하게 작은 세트(에필로그) 중 하나로 끝난다. 버클리 설계에서 이러한 호출은 새로운 레지스터 세트가 그 시점에 "스왑 인"되거나 호출이 끝날 때 "죽음" (또는 "재사용 가능")으로 표시되도록 한다.
CPU에서의 적용.
버클리 RISC 설계에서는 총 64개의 레지스터 중 8개만 프로그램에 보인다. 완전한 레지스터 세트를 레지스터 파일이라고 하며, 특정 8개 세트를 윈도라고 한다. 파일은 최대 8개의 프로시저 호출이 자체 레지스터 세트를 가질 수 있도록 허용한다. 프로그램이 8개 이상의 호출 체인을 호출하지 않는 한 레지스터는 절대 스필될 필요가 없다. 즉, 레지스터 접근에 비해 느린 메인 메모리 또는 캐시로 저장할 필요가 없다.
이에 비해 썬 마이크로시스템즈 SPARC 아키텍처는 각 8개 레지스터 중 4개 세트에 대한 동시 가시성을 제공한다. 각 8개 레지스터 중 세 세트가 "윈도"되어 있다. 8개 레지스터(i0 ~ i7)는 현재 프로시저 레벨의 입력 레지스터를 형성한다. 8개 레지스터(L0 ~ L7)는 현재 프로시저 레벨에 로컬이며, 8개 레지스터(o0 ~ o7)는 현재 프로시저 레벨에서 다음에 호출되는 레벨로의 출력을 형성한다. 프로시저가 호출되면 레지스터 창이 16개 레지스터만큼 이동하여 이전 입력 레지스터와 이전 로컬 레지스터를 숨기고 이전 출력 레지스터를 새 입력 레지스터로 만든다.
공통 레지스터(이전 출력 레지스터 및 새 입력 레지스터)는 매개변수 전달에 사용된다. 마지막으로 8개 레지스터(g0 ~ g7)는 모든 프로시저 레벨에 전역적으로 보인다.
AMD 29000은 창 크기를 가변적으로 허용하여 설계를 개선했으며, 이는 호출에 8개 미만의 레지스터가 필요한 일반적인 경우에 활용도를 높이는 데 도움이 된다. 또한 레지스터를 64개의 전역 세트와 창을 위한 추가 128개로 분리했다. 마찬가지로 IA-64(아이태니엄) 아키텍처는 32개의 전역 레지스터와 창을 위한 96개의 레지스터로 가변 크기 창을 사용했다.
인피니언 C166 아키텍처에서는 대부분의 레지스터가 내부 RAM의 위치일 뿐이며 레지스터로 접근할 수 있는 추가 속성이 있다. 이 중 16개 범용 레지스터(R0-R15)의 주소는 고정되어 있지 않다. 대신 R0 레지스터는 "컨텍스트 포인터"(CP) 레지스터가 가리키는 주소에 위치하며, 나머지 15개 레지스터는 그 뒤를 순차적으로 따른다.
레지스터 창은 또한 쉬운 업그레이드 경로를 제공한다. 추가 레지스터는 프로그램에 보이지 않으므로 언제든지 추가 창을 추가할 수 있다. 예를 들어 객체 지향 프로그래밍을 사용하면 더 많은 "작은" 호출이 발생하며, 이는 창을 8개에서 16개로 늘리는 등으로 수용할 수 있다. 이는 SPARC에서 사용된 접근 방식이며, 새로운 세대의 아키텍처에 더 많은 레지스터 창을 포함했다. 최종 결과는 레지스터 창 오버플로가 덜 자주 발생하여 느린 레지스터 창 스필 및 채우기 작업이 줄어든다는 것이다.
레지스터 창의 단점은 컨텍스트 스위치가 많은 수의 레지스터를 메모리에 저장해야 한다는 것이다. SPARC 구현은 레지스터 창을 항상 16개 레지스터씩 전진시키는데, 이는 이럴 때 저장된 레지스터 중 상당수가 유용한 데이터를 포함하지 않을 것임을 의미한다. 일부는 레지스터 창 구현으로 이어진 원래 연구가 프로그램을 격리하여 고려하고 멀티태스킹 워크로드를 무시했다고 비판했다.
레지스터 창만이 레지스터 성능을 개선하는 유일한 방법은 아니다. 스탠퍼드 대학교에서 MIPS를 설계하는 그룹은 버클리 연구를 보고 문제는 레지스터 부족이 아니라 기존 레지스터 활용 부족이라고 판단했다. 대신 컴파일러의 레지스터 할당에 더 많은 시간을 투자하여 MIPS에서 사용할 수 있는 더 큰 세트를 현명하게 사용하도록 했다. 이로 인해 칩의 복잡성이 줄어들고 총 레지스터 수가 절반으로 줄었으며, 단일 프로시저가 더 큰 보이는 레지스터 공간을 사용할 수 있는 경우 잠재적으로 더 높은 성능을 제공했다. 결국 최신 컴파일러를 사용하면 MIPS는 프로시저 호출 중에도 레지스터 공간을 더 잘 활용한다.
양막초등학교는 충청남도 예산군 오가면 내양막길 233-8 (양막리)에 있었던 초등학교이다.
주소 생성 장치(Address generation unit, AGU) 또는 주소 계산 장치(address computation unit, ACU)는 중앙 처리 장치 (CPU) 내부의 실행 장치로, CPU가 주 기억 장치에 접근하는 데 사용하는 메모리 주소를 계산한다. 주소 계산을 CPU의 나머지 부분과 병렬로 작동하는 별도의 회로가 처리하도록 함으로써, 다양한 기계어 명령을 실행하는 데 필요한 CPU 주기 수를 줄여 성능 향상을 가져올 수 있다.
다양한 연산을 수행하는 동안 CPU는 메모리에서 데이터를 가져오는 데 필요한 메모리 주소를 계산해야 한다. 예를 들어, CPU가 실제 메모리 위치에서 데이터를 가져오기 전에 배열 요소의 메모리 내 위치를 계산해야 한다. 이러한 주소 생성 계산에는 덧셈, 뺄셈, 모듈러 연산, 비트 시프트와 같은 다양한 정수 연산이 포함된다. 종종 메모리 주소를 계산하는 데는 하나 이상의 범용 기계어 명령이 필요하며, 이는 빠르게 디코딩하고 실행되지 않을 수 있다. CPU 설계에 AGU를 통합하고 AGU를 사용하는 특수 명령을 도입함으로써 다양한 주소 생성 계산을 CPU의 나머지 부분에서 분담할 수 있으며 종종 단일 CPU 주기 내에 빠르게 실행할 수 있다.
AGU의 기능은 특정 CPU 및 아키텍처에 따라 달라진다. 따라서 일부 AGU는 더 많은 주소 계산 연산을 구현하고 노출하는 반면, 일부는 한 번에 여러 피연산자에 대해 작동할 수 있는 더 발전된 특수 명령도 포함한다. 또한 일부 CPU 아키텍처는 여러 AGU를 포함하여 둘 이상의 주소 계산 연산이 동시에 실행될 수 있도록 하여 고급 CPU 설계의 슈퍼스칼라 특성을 활용하여 성능을 더욱 향상시킨다. 예를 들어, 인텔은 샌디브리지 및 하스웰 마이크로아키텍처에 여러 AGU를 통합하여 여러 메모리 액세스 명령이 병렬로 실행될 수 있도록 함으로써 CPU 메모리 하위 시스템의 대역폭을 증가시킨다.
키리츠보 ()는 『겐지모노가타리』 54첩 중 제 1첩이다.어느 천황의 시절이었던가. 수많은 뇨고와 코이가 궁에서 섬기는 가운데, 그다지 고귀한 신분은 아니었으나, 각별하게 천황의 깊은 총애를 받는 분이 있었습니다.
"いづれの御時にか　女御・更衣あまたさぶらひ給ひけるなかに　いとやむごとなき際にはあらぬが　すぐれて時めき給ふありけり。"
키리츠보노미카도와 키리츠보노코이의 부부의 연부터 히카루 겐지의 12살 때까지를 묘사했다.
어느 황제의 대였는지는 모르지만, 그리 높은 신분은 아니었던 황제(키리츠보노미카도)에게 매우 총애를 받고있는 여성 (키리츠보노코이)가 있었다. 두 사람 사이에는 빛날 정도로 아름다운 황자가 태어났는데, 키리츠보노미카도의 동궁 시절부터 입궁하였던 제 1황자의 생모나 다른 비들의 질투와 괴롭힘을 받아, 코이는 세살배기 황자를 남기고 병사하고, 화장되었다. 이를 깊히 탄식하는 황제를 위로하기 위해 죽은 코이를 똑닮은 선제의 제4황녀 (후지츠보)가 입궁하여, 총애를 받았다. 한편, 조모 (코이의 어머니)까지 잃은 황자는 황제 밑에서 길러져, 죽은 어머니 키리츠보노코이를 닮았다고 하는 후지츠보를 특히 흠모한다. 정권에 말려들지 않도록, 키리츠보노미카도는 사랑하는 제 2황자를 친왕으로 삼지 않았고, 황제는 미나모토 성을 주어, 신적강하시켰다. 원복과 동시에 좌대신의 딸 아오이노우에와 결혼시켰다. 고려의 관상가가 명명한 것을 세상 사람들이 칭찬하는 히카루 키미(光君)나 히카루 겐지라고 칭해졌다.
사가 천황 (재위 809년 - 823년)은 많은 황자를 얻었다. 경비를 삭감하고 황실을 안정시키기 위해, 천황은 황자 대부분을 신적강하 시켰다 (신적강하시 사성했다). 천황의 비로는 황후(중궁), 뇨고, 코이, 미야슨도코로 등이 있는데, 황후와 뇨고 등 비교적 신분이 높은 비보다, 코이, 미야슨도코로 등 비교적 신분이 낮은 비가 낳은 황자부터 우선적으로 신적강하 시켰다.
사가 천황의 황자 미나모토노 토오루가 히카루 겐지의 모델 중 한명으로 알려져있다.
또, 천황의 황자이자 신적강하 때, 겐지를 사성받은 이른바 "1세 겐지(一世源氏)"로 불리는 사람들 중에는, 아버지 천황의 뜻으로 다이리에서 원복하고, 연회, 답례품 등도 천황 주도로 행함으로써, 다른 신하들과는 다른 존재임이 강조된 사례를 바탕으로, 신하가 된 히카루 겐지의 원복을 아버지 키리츠보노미카도가 담당하고 있는 내용이 기록된 확률이 높다.
히카루 겐지가 탄생했을 때 점을 본 "스쿠요의 카시코키도의 사람(宿曜のかしこき道の人)"것은 스쿠요도(宿曜道)의 점쟁이(스쿠요시)였다.
후삽입설ㆍ후기설.
본기에는 겐지모노가타리의 제1권이며, 연립 상에서 제일 빠른 시간축 부분이 쓰여져있는데, 이어지는 책인 「하하키기」와의 연결이 좋지 않은 것 등을 이유로, 옛날에는 무로마치 시대의 주석서인 『겐지모노가타리 문서(源氏物語聞書)』, 근대에 들어와서는 요사노 아키코에 의해, 나아가 이케다 키칸이나 아베 아키오 등에 의해 후삽입설ㆍ후기설이 주창되고 있다. 본기와 「하하키기」사이의 부정합에 대해서는 두 권 사이에 「빛나는 날의 궁」권의 존재를 상정하여 해결하고자 하는 카자마키 케이지로의 설도 있다.
더티 비트(dirty bit) 또는 수정 비트(modified bit)는 컴퓨터 메모리 블록과 연결된 비트이며, 해당 메모리 블록이 수정되었는지 여부를 나타낸다. 이 더티 비트는 프로세서가 이 메모리에 쓰기(수정)할 때 설정된다. 이 비트는 관련 메모리 블록이 수정되었으며 아직 저장소에 저장되지 않았음을 나타낸다. 메모리 블록이 교체될 때, 해당 더티 비트가 확인되어 블록이 교체되기 전에 보조 기억 장치에 다시 기록되어야 하는지 또는 단순히 제거될 수 있는지 확인한다. 더티 비트는 CPU 캐시와 운영체제의 페이지 교체 알고리즘에서 사용된다.
더티 비트는 처리해야 하거나 아직 처리되지 않은 데이터 세그먼트를 표시하여 증분 컴퓨팅에서도 사용할 수 있다. 이 기술은 변경되지 않은 객체 또는 상태의 불필요한 처리를 피하기 위해 지연된 컴퓨팅과 함께 사용할 수 있다. 모델이 업데이트될 때(일반적으로 여러 소스에 의해), 다시 처리해야 하는 세그먼트만 더티로 표시된다. 그런 다음 알고리즘은 더티 세그먼트를 스캔하고 처리하여 클린으로 표시한다. 이렇게 하면 변경되지 않은 세그먼트가 다시 계산되지 않고 프로세서 시간을 절약할 수 있다.
페이지 교체.
페이지 교체에 대해 말할 때, 각 페이지에는 하드웨어에 연결된 수정 비트가 있을 수 있다. 페이지의 더티 비트는 페이지의 어떤 단어 또는 바이트가 기록될 때마다 하드웨어에 의해 설정되어 페이지가 수정되었음을 나타낸다. 페이지가 교체 대상으로 선택될 때 수정 비트가 검사된다. 비트가 설정되어 있으면 페이지가 디스크에서 읽어온 이후 수정되었다. 이 경우 페이지를 디스크에 기록해야 한다. 그러나 더티 비트가 설정되어 있지 않으면 페이지가 메모리로 읽어온 이후 수정되지 않았다. 따라서 디스크의 페이지 복사본이 덮어쓰여지지 않았다면(예를 들어 다른 페이지에 의해), 메모리 페이지를 디스크에 기록할 필요가 없다: 이미 거기에 있기 때문이다.
메모리 보호 장치(Memory protection unit, MPU)는 메모리 보호를 제공하는 컴퓨터 하드웨어 장치이다. 보통 중앙 처리 장치(CPU)의 일부로 구현된다. MPU는 메모리 관리 장치(MMU)의 축소 버전으로, 메모리 보호 기능만 제공한다. 일반적으로 메모리 보호만 필요하고 가상 메모리 관리와 같은 MMU의 완전한 기능이 필요하지 않은 저전력 프로세서에 구현된다.
MPU는 권한 있는 소프트웨어가 메모리 영역을 정의하고 각 영역에 메모리 접근 권한 및 메모리 속성을 할당할 수 있도록 한다. 프로세서의 구현에 따라 지원되는 메모리 영역의 수는 달라진다. ARMv8-M 프로세서의 MPU는 최대 16개의 영역을 지원한다. 메모리 속성은 이러한 영역의 순서 및 병합 동작뿐만 아니라 캐싱 및 버퍼링 속성을 정의한다. 캐시 속성은 내부 캐시가 있는 경우 사용할 수 있으며, 시스템 캐시에서 사용할 수 있도록 내보낼 수 있다.
MPU는 프로세서에서 발생하는 명령어 패치 및 데이터 접근을 포함한 트랜잭션을 모니터링하며, 접근 위반이 감지되면 결함 예외를 트리거할 수 있다. 메모리 보호의 주요 목적은 프로세스가 자신에게 할당되지 않은 메모리에 접근하는 것을 방지하는 것이다. 이는 버그나 프로세스 내의 악성 소프트웨어가 다른 프로세스 또는 운영체제 자체에 영향을 미치는 것을 방지한다.
인도의 컴퓨터 구조 및 엔지니어링에서 시퀀서(sequencer) 또는 마이크로시퀀서(microsequencer)는 컨트롤 스토어의 마이크로프로그램을 단계별로 수행하는 데 사용되는 주소를 생성한다. 이것은 CPU의 제어 장치의 일부로 사용되거나 주소 범위에 대한 독립적인 생성기로 사용된다.
일반적으로 주소는 카운터, 마이크로 명령의 필드 및 명령 레지스터의 일부 하위 집합의 조합으로 생성된다. 카운터는 다음 마이크로 명령이 실행될 명령인 일반적인 경우에 사용된다. 점프 또는 다른 논리에는 마이크로 명령의 필드가 사용된다.
CPU는 명령어 집합을 구현하므로 명령어의 비트를 시퀀서로 직접 디코딩하여 CPU의 명령을 수행하기 위한 마이크로 명령 집합을 선택할 수 있는 것이 매우 유용하다.
대부분의 최신 CISC 프로세서는 하나의 클럭 사이클에서 완료할 수 있는 낮은 복잡성의 오퍼레이션 코드를 처리하기 위해 파이프라인 방식의 논리를 사용하고, 완료하는 데 여러 클럭 사이클이 걸리는 오퍼레이션 코드를 구현하기 위해 마이크로코드를 사용한다.
최초의 통합 마이크로코드 프로세서 중 하나는 IBM PALM 프로세서로, 마이크로코드에서 프로세서의 모든 명령을 에뮬레이트했으며 최초의 개인용 컴퓨터 중 하나인 IBM 5100에서 사용되었다.
유사한 오픈 소스 마이크로시퀀서 기반 프로세서의 최근 예로는 인텔 8086/8088, 8051 및 MOS 6502 명령어 세트를 마이크로코드에서 완전히 에뮬레이트하는 MicroCore Labs의 MCL86, MCL51 및 MCL65 코어가 있다.
단순한 예.
Digital Scientific Corp. Meta 4 Series 16 컴퓨터 시스템은 1970년에 처음 출시된 사용자 마이크로프로그래밍 가능한 시스템이었다. 마이크로코드 시퀀스의 분기는 세 가지 방식으로 발생한다.
분기 명령에서 허용되는 또 다른 시퀀싱 옵션은 실행(XQ) 옵션이다. 이 옵션을 지정하면 분기 주소에 있는 단일 명령이 실행되지만, 원래 분기 명령 이후에 실행이 계속된다. IX 옵션은 XQ 옵션과 함께 사용할 수 있다.
IBM 시스템/360은 1964년에 도입된 호환 가능한 컴퓨터 시리즈로, 그 중 많은 수가 마이크로프로그래밍되었다. 시스템/360 모델 40은 복잡한 마이크로 시퀀싱 기능을 갖춘 마이크로프로그래밍된 기계의 좋은 예이다.
마이크로 스토어는 수평 마이크로 프로그래밍 방식으로 작동하는 4,096개의 56비트 마이크로 명령으로 구성된다. 스토어는 12비트 읽기 전용 주소 레지스터(ROAR)로 주소 지정된다. S/360 아키텍처의 대부분의 레지스터와 달리 ROAR의 비트는 오른쪽의 비트 0에서 왼쪽의 비트 11까지 번호가 매겨져 있다.
모델 40은 마이크로 명령의 순차적 실행을 수행하지 않으므로 마이크로 시퀀서는 기존 의미에서 실제로 분기하지 않는다. 대신 각 마이크로 명령은 실행될 다음 명령의 주소를 지정한다. 마이크로 명령의 4개 필드는 새 주소에 기여한다.
본질적으로 이러한 필드의 세 가지 조합 또는 형식이 있다.
기능적 분기 형식.
CB 필드가 15를 포함할 때 기능적 분기가 발생한다. ROAR의 새 마이크로 스토어 주소의 비트는 다음과 같이 결정된다.
CC 필드는 기계 상태의 다양한 테스트를 지정할 수 있다. 또한 무조건 비트의 경우 상수 0 또는 1을 지정할 수도 있다.
이 형식은 마이크로 스토어의 64 워드 블록 중 하위 32 워드 내의 16개 명령 쌍 중 1개로 제어 흐름을 변경한다(비트 5는 항상 0이므로). 그런 다음 CC 필드는 쌍의 어떤 명령이 제어를 받을지 결정한다.
CD = 0, 1, 3 형식.
CD 필드가 0, 1, 또는 3일 때 제어 흐름은 현재 64워드 블록 내의 명령으로 향한다. 새 마이크로 스토어 주소의 비트는 다음과 같이 결정된다.
CA 필드는 현재 64워드 블록 내에서 16개의 4워드 그룹 중 1개를 선택한다. 그런 다음 CB 및 CC 필드는 4개 중 어떤 명령이 제어를 받을지 결정한다.
CD = 2 형식.
CD 필드가 2일 때 제어 흐름은 명확하지 않은 방식으로 향한다. 새 마이크로 스토어 주소의 비트는 다음과 같이 결정된다.
다음 명령은 현재 명령과 동일한 1K 워드 영역에 있다(비트 11-10이 동일하게 유지되기 때문). CA 필드는 영역 내에서 64 워드 블록을 결정한다. 이 명령은 새 블록 내에서 현재 명령이 현재 블록 내에서와 동일한 4 워드 그룹에 있다(비트 5-2가 동일하게 유지되기 때문).
그런 다음 CB 및 CC 필드는 4개 중 어떤 명령이 제어를 받을지 결정한다.
이 설명은 단순화되었다. 다음 기능은 무시되었다.
버스 스누핑(bus snooping) 또는 버스 스니핑(bus sniffing)은 캐시(스누피 캐시)의 코히런시 컨트롤러(스누퍼)가 버스 트랜잭션을 감시하거나 스누핑하는 방식이며, 그 목적은 분산 공유 메모리 시스템에서 캐시 일관성을 유지하는 것이다. 이 방식은 1983년 라비샹카르와 굿맨이 "쓰기-한 번" 캐시 일관성이라는 이름으로 도입했다. 코히런시 컨트롤러(스누퍼)를 포함하는 캐시를 스누피 캐시라고 한다.
특정 데이터가 여러 캐시에서 공유되고 프로세서가 공유 데이터의 값을 수정할 때, 변경 사항은 데이터 복사본을 가진 다른 모든 캐시로 전파되어야 한다. 이러한 변경 전파는 시스템이 캐시 일관성을 위반하는 것을 방지한다. 데이터 변경 알림은 버스 스누핑을 통해 수행될 수 있다. 모든 스누퍼는 버스의 모든 트랜잭션을 모니터링한다. 공유 캐시 블록을 수정하는 트랜잭션이 버스에 나타나면, 모든 스누퍼는 자신의 캐시에 공유 블록의 동일한 복사본이 있는지 확인한다. 캐시에 공유 블록의 복사본이 있는 경우 해당 스누퍼는 캐시 일관성을 보장하기 위한 작업을 수행한다. 이 작업은 캐시 블록의 플러시 또는 캐시 무효화일 수 있다. 또한 캐시 일관성 프로토콜에 따라 캐시 블록 상태의 변경이 포함된다.
스누핑 프로토콜 유형.
쓰기 작업의 로컬 복사본을 관리하는 방식에 따라 두 가지 종류의 스누핑 프로토콜이 있다.
쓰기-무효화.
프로세서가 공유 캐시 블록에 쓸 때, 다른 캐시에 있는 모든 공유 복사본은 버스 스누핑을 통해 캐시 무효화된다. 이 방법은 데이터의 하나의 복사본만 프로세서가 독점적으로 읽고 쓸 수 있도록 보장한다. 다른 캐시에 있는 다른 모든 복사본은 무효화된다. 이것은 가장 일반적으로 사용되는 스누핑 프로토콜이다. MSI, MESI, MOSI, MOESI, MESIF 프로토콜이 이 범주에 속한다.
쓰기-업데이트.
프로세서가 공유 캐시 블록에 쓸 때, 다른 캐시에 있는 모든 공유 복사본은 버스 스누핑을 통해 업데이트된다. 이 방법은 쓰기 데이터를 버스를 통해 모든 캐시로 브로드캐스트한다. 쓰기-무효화 프로토콜보다 더 많은 버스 트래픽을 유발한다. 이것이 이 방법이 일반적이지 않은 이유이다. 드래곤 및 파이어플라이 프로토콜이 이 범주에 속한다.
가능한 구현 중 하나는 다음과 같다.
캐시는 세 개의 추가 비트를 가질 수 있다.
각 캐시 라인은 "더티"(로컬 프로세서에 의해 업데이트됨), "유효", "무효", 또는 "공유" 상태 중 하나에 있다. 캐시 라인은 값을 포함하며, 읽거나 쓸 수 있다. 캐시 라인에 쓰는 것은 값을 변경한다. 각 값은 메인 메모리(접근이 매우 느림)에 있거나 하나 이상의 로컬 캐시(빠름)에 있다. 블록이 처음 캐시에 로드될 때 "유효"로 표시된다.
로컬 캐시의 읽기 미스 발생 시, 읽기 요청은 버스로 브로드캐스트된다. 모든 캐시 컨트롤러는 버스를 모니터링한다. 만약 그 주소를 캐시하고 있고 상태가 "더티"인 경우, 상태를 "유효"로 변경하고 요청 노드에 복사본을 보낸다. "유효" 상태는 캐시 라인이 현재 상태임을 의미한다. 로컬 쓰기 미스 발생 시(그 값을 쓰려고 시도했지만 캐시에 없음), 버스 스누핑은 다른 캐시에 있는 복사본이 "무효"로 설정되도록 보장한다. "무효"는 캐시에 복사본이 있었지만 더 이상 현재 상태가 아니라는 것을 의미한다.
예를 들어, 초기 상태는 다음과 같을 수 있다.
Tag | ID | V | D | S
주소 1111 00에 쓴 후에는 다음과 같이 변경된다.
캐싱 로직은 버스를 모니터링하고 캐시된 메모리가 요청되는지 감지한다. 캐시가 더티하고 공유된 상태이며 그 메모리에 대한 요청이 버스에 있는 경우, 더티 스누핑 요소는 요청자에게 데이터를 제공한다. 그 시점에서 요청자는 데이터에 대한 책임을 지거나(데이터를 더티로 표시하거나), 메모리가 복사본을 가져와서("스나프드"되었다고 함) 두 요소는 공유 상태로 전환될 수 있다.
더티로 표시된 주소를 무효화할 때(즉, 한 캐시는 더티 주소를 가지고 있고 다른 캐시는 쓰고 있는 경우) 캐시는 그 요청을 무시한다. 새 캐시는 더티, 유효, 배타적으로 표시되며 그 캐시가 이제 그 주소에 대한 책임을 진다.
버스 스누핑의 장점은 디렉터리 기반 코히런시 메커니즘보다 빠르다는 것이다. 디렉터리 기반 시스템에서는 공유되는 데이터가 캐시 간의 일관성을 유지하는 공통 디렉터리에 배치된다. 버스 스누핑은 일반적으로 대역폭이 충분하면 모든 트랜잭션이 모든 프로세서에서 볼 수 있는 요청/응답이므로 더 빠르다.
버스 스누핑의 단점은 제한된 확장성이다. 캐시에 빈번한 스누핑은 프로세서로부터의 접근과 경합을 일으켜 캐시 접근 시간을 증가시키고 전력 소비를 늘릴 수 있다. 각 요청은 시스템의 모든 노드로 브로드캐스트되어야 한다. 이것은 시스템이 커질수록 (물리적 또는 논리적) 버스의 크기와 그것이 제공하는 대역폭이 커져야 함을 의미한다. 버스 스누핑은 잘 확장되지 않으므로 더 큰 캐시 일관성 NUMA (ccNUMA) 시스템은 디렉터리 기반 일관성 프로토콜을 사용하는 경향이 있다.
스눕 필터.
특정 캐시 블록에 대해 버스 트랜잭션이 발생하면 모든 스누퍼는 버스 트랜잭션을 스누핑해야 한다. 그런 다음 스누퍼는 해당 캐시 태그를 찾아 동일한 캐시 블록이 있는지 확인한다. 대부분의 경우 잘 최적화된 병렬 프로그램은 스레드 간에 데이터를 많이 공유하지 않으므로 캐시에는 캐시 블록이 없다. 따라서 캐시 블록을 가지고 있지 않은 캐시에 대한 스누퍼에 의한 캐시 태그 조회가 일반적으로 불필요한 작업이다. 그러나 태그 조회는 프로세서에 의한 캐시 접근을 방해하고 추가적인 전력 소비를 유발한다.
불필요한 스누핑을 줄이는 한 가지 방법은 스눕 필터를 사용하는 것이다. 스눕 필터는 스누퍼가 캐시 태그를 확인해야 하는지 여부를 결정한다. 스눕 필터는 디렉터리 기반 구조이며 모든 일관성 트래픽을 모니터링하여 캐시 블록의 일관성 상태를 추적한다. 이는 스눕 필터가 캐시 블록의 복사본을 가지고 있는 캐시를 알고 있음을 의미한다. 따라서 캐시 블록의 복사본을 가지고 있지 않은 캐시가 불필요한 스누핑을 하는 것을 방지할 수 있다. 스눕 필터의 위치에 따라 세 가지 유형의 필터가 있다. 하나는 캐시 측면에 위치하며 일관성 트래픽이 공유 버스에 도달하기 전에 필터링을 수행하는 소스 필터이다. 다른 하나는 수신자 캐시에 위치하며 수신자 코어에서 불필요한 캐시 태그 조회를 방지하지만, 이 유형의 필터링은 소스에서 오는 초기 일관성 메시지를 방지하지 못한다. 마지막으로 네트워크 내 필터는 공유 버스 내부에서 동적으로 일관성 트래픽을 가지치기한다. 스눕 필터는 또한 포괄적(inclusive) 및 배타적(exclusive)으로 분류된다. 포괄적 스눕 필터는 캐시에서 캐시 블록의 존재를 추적한다. 그러나 배타적 스눕 필터는 캐시에서 캐시 블록의 부재를 모니터링한다. 즉, 포괄적 스눕 필터에서의 히트는 해당 캐시 블록이 캐시에 의해 보유되고 있음을 의미한다. 반면에 배타적 스눕 필터에서의 히트는 어떤 캐시도 요청된 캐시 블록을 가지고 있지 않음을 의미한다.
캐시 무효화(Cache invalidation)는 컴퓨터 시스템에서 캐시의 항목을 교체하거나 제거하는 프로세스이다.
이는 캐시 일관성 프로토콜의 일부로 명시적으로 수행될 수 있다. 이러한 경우, 프로세서는 메모리 위치를 변경한 다음 컴퓨터 시스템의 나머지 부분에서 해당 메모리 위치에 대한 캐시된 값을 무효화한다.
명시적 무효화.
캐시 무효화는 새로운 콘텐츠를 클라이언트로 푸시하는 데 사용할 수 있다. 이 방법은 연결된 클라이언트에게 새로운 콘텐츠를 표시하는 다른 방법에 대한 대안으로 기능한다. 무효화는 애플리케이션 데이터를 변경하여 수행되며, 이는 클라이언트가 받은 정보가 오래되었음을 표시한다. 캐시가 무효화된 후, 클라이언트가 캐시를 요청하면 새로운 버전이 제공된다.
캐시를 무효화하는 세 가지 특정 방법이 있지만, 모든 캐싱 프록시가 이러한 방법을 지원하는 것은 아니다.
퍼지.
캐싱 프록시에서 콘텐츠를 즉시 제거한다. 클라이언트가 데이터를 다시 요청하면 애플리케이션에서 가져와 캐싱 프록시에 저장된다. 이 방법은 캐시된 콘텐츠의 모든 변형을 제거한다.
새로 고침.
캐시된 콘텐츠를 사용할 수 있는 경우에도 애플리케이션에서 요청된 콘텐츠를 가져온다. 이전에 캐시에 저장된 콘텐츠는 애플리케이션에서 가져온 새 버전으로 대체된다. 이 방법은 캐시된 콘텐츠의 한 가지 변형만 영향을 미친다.
캐시된 콘텐츠에 대한 참조는 블랙리스트 (또는 차단 목록)에 추가된다. 클라이언트 요청은 이 블랙리스트와 대조하여 확인되며, 요청이 일치하면 애플리케이션에서 새 콘텐츠를 가져와 클라이언트에 반환하고 캐시에 추가한다.
이 방법은 퍼지와 달리 캐싱 프록시에서 캐시된 콘텐츠를 즉시 제거하지 않는다. 대신, 클라이언트가 해당 특정 정보를 요청한 후에 캐시된 콘텐츠가 업데이트된다.
업데이트된 콘텐츠를 클라이언트에 제공하는 캐시 무효화의 몇 가지 대안이 있다. 한 가지 대안은 TTL(time-to-live)을 매우 낮은 값으로 줄여 캐시된 콘텐츠를 빠르게 만료시키는 것이다. 또 다른 대안은 각 요청에서 캐시된 콘텐츠의 유효성을 검사하는 것이다. 세 번째 옵션은 클라이언트가 요청하는 휘발성 콘텐츠를 캐시하지 않는 것이다. 이러한 대안은 정보를 더 자주 요청하기 때문에 애플리케이션에 높은 부하를 발생시켜 문제를 일으킬 수 있다.
여러 객체를 무효화할 때 무효화를 사용하여 새로운 콘텐츠를 전송하는 것은 어려울 수 있다. 여러 표현을 무효화하면 애플리케이션에 복잡성이 추가된다. 캐시 무효화는 캐싱 프록시를 통해 수행되어야 하며, 이러한 요청은 캐싱 프록시의 성능에 영향을 미쳐 클라이언트에 정보가 더 느리게 전송되도록 할 수 있다.
드래곤 프로토콜()은 멀티프로세서 시스템에서 사용되는 업데이트 기반 캐시 일관성 프로토콜이다. 쓰기 전파는 여러 프로세서에 걸쳐 모든 캐시된 값을 직접 업데이트함으로써 수행된다. 드래곤 프로토콜과 같은 업데이트 기반 프로토콜은 캐시 블록에 대한 쓰기 이후에 다른 프로세서에 의한 여러 읽기가 뒤따를 때 효율적으로 작동하는데, 이는 업데이트된 캐시 블록이 모든 프로세서와 관련된 캐시에서 즉시 사용 가능하기 때문이다.
각 캐시 블록은 다음 네 가지 상태 중 하나에 있다: 독점-청결, 공유-청결, 공유-수정, 수정.
어떤 캐시 쌍에 대해 주어지는 캐시 블록의 허용되는 상태는 다른 캐시의 상태와 함께 다음과 같다 (위에서 약어된 상태 순서):
4개의 프로세서 트랜잭션과 2개의 버스 트랜잭션이 있다.
프로세서 읽기 (PrRd): 프로세서가 캐시에 있는 특정 캐시 블록에 대한 읽기를 성공적으로 완료할 때 발생한다.
프로세서 쓰기 (PrWr): 프로세서가 캐시에 있는 특정 캐시 블록에 대한 쓰기를 성공적으로 완료할 때 발생한다. 이는 프로세서가 해당 캐시 블록을 마지막으로 업데이트하게 만든다.
프로세서 읽기 미스 (PrRdMiss): 프로세서가 캐시에서 캐시 블록을 읽는 데 실패하고 메모리나 다른 캐시에서 블록을 가져와야 할 때 발생한다.
프로세서 쓰기 미스 (PrWrMiss): 프로세서가 캐시에서 캐시 블록에 쓰기를 실패하고 메모리나 다른 캐시에서 블록을 가져온 다음 쓰기를 수행해야 할 때 발생한다. 이는 다시 프로세서가 해당 캐시 블록을 마지막으로 업데이트하게 만든다.
버스 읽기 (BusRd): 프로세서가 캐시 블록의 최신 값을 가져오기 위해 버스를 요청할 때 발생하며, 이는 메인 메모리 또는 다른 프로세서의 캐시에서 가져올 수 있다.
플러시 (Flush): 프로세서가 전체 캐시 블록을 버스에 배치할 때 발생한다. 이는 프로세서가 캐시된 블록에 대해 메인 메모리에서 수행한 변경 사항을 반영하기 위한 것이다.
버스 업데이트 (BusUpd): 프로세서가 캐시 블록을 수정하고 다른 프로세서가 해당 캐시 블록을 업데이트해야 할 때 발생한다. 이는 쓰기 업데이트 프로토콜에만 고유한 특징이다. BusUpd는 캐시에 대한 쓰기가 메모리에 대한 쓰기보다 빠르기 때문에 Flush 작업보다 짧은 시간이 소요된다. 또 다른 주목할 점은 캐시가 캐시 블록의 로컬 복사본을 업데이트한 다음 버스 업데이트를 보내기 위해 버스를 요청할 수 없다는 것이다. 만약 이런 일이 발생하면 두 캐시가 독립적으로 로컬 복사본을 업데이트한 다음 버스를 요청할 가능성이 있다. 그런 다음 두 쓰기를 동시에 보게 되며, 이는 순차적 일관성을 따르지 않는다.
또한 공유 라인은 특정 캐시 블록이 여러 캐시에서 사용 가능한지 여부를 나타내는 데 필요하다. 이는 캐시 중 하나가 다른 블록을 업데이트할 필요 없이 블록을 퇴거할 수 있기 때문에 필요하다. 공유 라인은 블록이 하나의 캐시에만 사용 가능하고 버스 업데이트가 따라서 필요하지 않은 경우 메모리 및 버스 트랜잭션을 줄이는 데 도움이 된다. 공유를 감지하기 위한 이러한 전용 라인은 파이어플라이 프로토콜과 같은 쓰기 업데이트 프로토콜 전반에 걸쳐 볼 수 있으며 퓨처버스(IEEE 표준 P896.1)와 같은 버스 표준을 기반으로 구현된다.
프로세서 시작 전이.
블록의 현재 상태와 프로세서에 의해 시작된 트랜잭션에 따라 캐시 블록은 다음 상태 전이 중 하나를 거친다.
버스 시작 전이.
블록의 현재 상태와 버스에 의해 시작된 트랜잭션에 따라 캐시 블록은 다음 상태 전이 중 하나를 거친다.
하위 수준 설계 선택.
공유-수정 상태 제거.
Sm 상태에서 캐시 블록을 가진 프로세서는 캐시 블록이 교체될 때 메인 메모리를 업데이트할 책임이 있다. 하지만 버스 업데이트 트랜잭션이 발생할 때마다 메인 메모리가 업데이트된다면 별도의 Sm 및 Sc 상태가 필요 없으며, 프로토콜은 단일 공유 상태로 충분하다. 그러나 이로 인해 훨씬 더 많은 메모리 트랜잭션이 발생하며 특히 여러 프로세서가 동일한 캐시 블록에 쓰기를 수행할 때 시스템 속도를 늦출 수 있다.
Sc 블록 교체 브로드캐스팅.
이 프로토콜은 Sc 상태의 캐시 블록이 버스 활동 없이 조용히 교체될 수 있도록 허용한다. 다른 캐시에 Sc 블록이 교체되고 있음을 알리기 위해 브로드캐스트가 이루어진다면 다른 공유자가 없다면 공유 라인을 테스트하고 E 상태로 이동할 수 있다. 블록을 E 상태로 두는 장점은 블록이 나중에 쓰여지면 M 상태가 되고 버스 업데이트 트랜잭션을 생성할 필요가 없다는 것이다. 따라서 Sc 블록의 교체를 브로드캐스팅하는 비용으로 버스 업데이트 트랜잭션을 피할 수 있다. 그리고 교체 브로드캐스팅은 시간에 중요하지 않으므로 캐시가 즉시 교체를 처리할 필요가 없다면 단점은 없다. 반면에 캐시가 즉시 업데이트를 처리하지 않으면 순서가 뒤바뀐 업데이트가 발생할 수 있다. 이러한 경우 파이어플라이 프로토콜과 같은 세 가지 상태 업데이트 프로토콜이 성능 이점을 가질 수 있다.
드래곤 vs 쓰기 무효화 프로토콜.
쓰기 무효화는 다른 캐시 일관성 프로토콜 집합으로, 캐시 블록이 수정되면 다른 캐시에 있는 동일한 블록의 다른 값은 업데이트되지 않고 무효화된다. 쓰기 무효화 프로토콜은 동일한 캐시 블록에 대한 후속 쓰기가 많은 경우에 더 효율적인데, 무효화가 한 번 발생하고 다른 프로세서에 의한 추가 버스 트랜잭션이 방지되기 때문이다. 그러나 쓰기 업데이트 프로토콜은 블록에 대한 쓰기 뒤에 동일한 블록에 대한 여러 읽기가 뒤따르는 경우에 더 효율적이다. 다른 캐시된 값에 쓰자마자 업데이트하기 때문에 즉시 데이터에 접근할 수 있다. 이러한 경우 쓰기 무효화 프로토콜은 다른 캐시에서 캐시 블록이 수정될 때마다 나머지 캐시가 일관성 미스에 부딪히고 새 값을 읽기 위해 버스 트랜잭션을 시작해야 하므로 매우 불리하다. 대조적으로 쓰기 업데이트 프로토콜은 때때로 필요 이상으로 블록 값을 최신 상태로 유지하는 경향이 있어 다른 유형의 미스, 즉 충돌 및 용량 미스를 증가시킨다.
드래곤 vs 파이어플라이 프로토콜.
파이어플라이의 경우, 수정된 블록의 캐시 간 전송은 동시에 메인 메모리로도 쓰여진다. 하지만 메인 메모리에 대한 접근은 캐시에 비해 수십 배 느리므로 별도의 버스 작업으로 쓰기 백을 수행하는 복잡성이 추가된다. 어떠한 경우에도 성능이 저하된다. 드래곤 프로토콜의 경우 공유된 블록은 메모리로 전혀 쓰여지지 않으므로 이 문제는 완전히 피할 수 있다. 그러나 이는 하나의 상태 (공유-수정) 추가 비용을 수반한다.
컴퓨터 과학에서 거짓 공유(False sharing)는 분산된 일관성 있는 캐시를 가진 시스템에서 캐싱 메커니즘에 의해 관리되는 가장 작은 리소스 블록 크기에서 발생할 수 있는 성능 저하 사용 패턴이다. 시스템 참여자가 다른 파티에 의해 변경되지 않는 데이터에 주기적으로 액세스하려고 하지만, 해당 데이터가 변경되는 데이터와 캐시 블록을 공유하는 경우 캐싱 프로토콜은 논리적 필요성 부족에도 불구하고 첫 번째 참여자가 전체 캐시 블록을 다시 로드하도록 강제할 수 있다. 캐싱 시스템은 이 블록 내 활동을 인지하지 못하고 첫 번째 참여자가 리소스의 진정한 공유 액세스에 필요한 캐싱 시스템 오버헤드를 부담하도록 강제한다.
다중 프로세서 CPU 캐시.
이 용어의 가장 일반적인 사용은 최신 다중 프로세서 CPU 캐시에서 발생하며, 여기서 메모리는 일부 작은 2의 거듭제곱 워드 크기(정렬된, 연속된 바이트 64개 등)의 라인으로 캐시된다. 두 프로세서가 단일 라인에 저장될 수 있는 동일한 메모리 주소 영역의 독립적인 데이터에서 작동하는 경우, 시스템의 캐시 일관성 메커니즘은 모든 데이터 쓰기에서 전체 라인을 버스 또는 인터커넥트를 통해 강제 전송하여 시스템 대역폭을 낭비하는 것 외에도 메모리 지연을 유발할 수 있다. 일부 경우, 거짓 공유를 제거하면 성능이 몇 배 향상될 수 있다. 거짓 공유는 자동 동기화 캐시 프로토콜의 본질적인 특징이며 분산 파일 시스템 또는 데이터베이스와 같은 환경에서도 존재할 수 있지만, 현재는 RAM 캐시로 한정된다.
using namespace chrono;
// default cacheline size from runtime
constexpr size_t CL_SIZE = hardware_constructive_interference_size;
// most common cacheline size otherwise
constexpr size_t CL_SIZE = 64;
vector&lt;jthread&gt; threads;
int hc = jthread::hardware_concurrency();
hc = hc &lt;= CL_SIZE ? hc : CL_SIZE;
for( int nThreads = 1; nThreads &lt;= hc; ++nThreads )
// synchronize beginning of threads coarse on kernel level
latch coarseSync( nThreads );
// fine synch via atomic in userspace
atomic_uint fineSync( nThreads );
// as much chars as would fit into a cacheline
struct alignas(CL_SIZE) { char shareds[CL_SIZE]; } cacheLine;
// sum of all threads execution times
atomic_int64_t nsSum( 0 );
for( int t = 0; t != nThreads; ++t )
threads.emplace_back(
[&amp;]( char volatile &amp;c )
coarseSync.arrive_and_wait(); // synch beginning of thread execution on kernel-level
if( fineSync.fetch_sub( 1, memory_order::relaxed ) != 1 ) // fine-synch on user-level
while( fineSync.load( memory_order::relaxed ) );
auto start = high_resolution_clock::now();
for( size_t r = 10'000'000; r--; )
c = c + 1;
nsSum += duration_cast&lt;nanoseconds&gt;( high_resolution_clock::now() - start ).count();
}, ref( cacheLine.shareds[t] ) );
threads.resize( 0 ); // join all threads
cout « nThreads « ": " « (int)(nsSum / (1.0e7 * nThreads) + 0.5) « endl;
이 코드는 거짓 공유의 효과를 보여준다. 이 코드는 시스템의 물리적 스레드 수까지 한 스레드부터 시작하여 스레드 수를 증가시킨다. 각 스레드는 캐시 라인의 한 바이트를 순차적으로 증가시키는데, 이 캐시 라인은 전체적으로 모든 스레드에서 공유된다. 스레드 간 충돌 수준이 높을수록 각 증분 작업에 더 오랜 시간이 걸린다. 다음은 16코어 32스레드를 가진 Zen4 시스템에서의 결과이다.
위에서 볼 수 있듯이, 해당 시스템에서 공유 캐시 라인에 대한 증분 작업을 완료하는 데 최대 100나노초가 걸릴 수 있으며, 이는 이 CPU에서 약 420클럭 사이클에 해당한다.
거짓 공유의 효과를 완화하는 방법이 있다. 예를 들어, CPU 캐시에서의 거짓 공유는 변수를 재배열하거나 변수 사이에 패딩(사용되지 않는 바이트)을 추가하여 방지할 수 있다. 그러나 이러한 프로그램 변경 중 일부는 객체의 크기를 증가시켜 메모리 사용량이 높아질 수 있다. 컴파일 시 데이터 변환 또한 거짓 공유를 완화할 수 있다. 하지만 이러한 변환 중 일부는 항상 허용되지 않을 수 있다. 예를 들어, C++23 C++ 프로그래밍 언어 표준 초안은 데이터 멤버가 이후 멤버가 더 높은 주소를 갖도록 배치되어야 한다고 규정한다.
거짓 공유를 탐지하는 도구가 있다. 또한 실행 중인 프로그램에서 거짓 공유를 탐지하고 복구하는 시스템도 있다. 그러나 이러한 시스템은 일부 실행 오버헤드를 발생시킨다.
LVCMOS(저전압 상보성 금속 산화물 반도체, Low voltage complementary metal oxide semiconductor)는 CMOS 기술 디지털 집적 회로의 저전압 등급이다.