Memory model
C 추상 머신의 목적을 위한 컴퓨터 메모리 저장소의 의미론을 정의합니다.
C 프로그램에서 사용 가능한 데이터 저장소(메모리)는 하나 이상의 연속적인 바이트 시퀀스입니다. 메모리의 각 바이트는 고유한 주소 를 가집니다.
목차 |
바이트
byte 는 메모리의 가장 작은 주소 지정 가능 단위입니다. 이것은 연속적인 비트 시퀀스로 정의되며, basic execution character set 의 모든 구성원을 담을 수 있을 만큼 충분히 큽니다( 단일 바이트여야 하는 96개 문자 ). C 언어는 8비트 이상의 바이트 크기를 지원합니다.
타입 char , unsigned char , 그리고 signed char 는 저장과 값 표현 모두에 1바이트를 사용합니다. 한 바이트의 비트 수는 CHAR_BIT 로 접근할 수 있습니다.
다른 기본 타입들의 값을 표현하기 위한 바이트 사용(빅 엔디안 및 리틀 엔디안 메모리 레이아웃 포함)에 대해서는 object representation 을 참조하십시오.
메모리 위치
메모리 위치 는
struct S { char a; // 메모리 위치 #1 int b : 5; // 메모리 위치 #2 int c : 11, // 메모리 위치 #2 (계속) : 0, d : 8; // 메모리 위치 #3 struct { int ee : 8; // 메모리 위치 #4 } e; } obj; // 객체 'obj'는 4개의 별도 메모리 위치로 구성됨
스레드와 데이터 레이스실행 스레드는 프로그램 내의 제어 흐름으로, thrd_create 또는 다른 방법으로 최상위 함수를 호출하면서 시작됩니다. 모든 스레드는 프로그램 내의 어떤 객체든 접근할 가능성이 있습니다 (자동 저장 기간과 스레드 지역 저장 기간을 가진 객체도 다른 스레드가 포인터를 통해 접근할 수 있습니다). 서로 다른 실행 스레드는 항상 서로 다른 메모리 위치 를 동시에 접근(읽기 및 수정)하는 것이 허용되며, 간섭이나 동기화 요구 사항이 없습니다. (참고: 동일한 구조체 내에서 두 개의 비-원자적 비트 필드를 동시에 업데이트하는 것은, 그 사이에 선언된 모든 멤버들이 (비-제로 길이) 비트 필드인 경우 안전하지 않으며, 그 사이에 있는 비트 필드들의 크기가 어떠한지는 중요하지 않습니다) 표현식의 평가 가 메모리 위치에 쓰기를 수행하고 다른 평가가 동일한 메모리 위치를 읽거나 수정할 때, 그 표현식들은 충돌 한다고 말합니다. 두 개의 충돌하는 평가를 가진 프로그램은 다음 중 하나가 아닌 경우 데이터 레이스 를 가집니다:
데이터 레이스가 발생하면 프로그램의 동작은 정의되지 않습니다. (특히, mtx_unlock 은 synchronized-with 관계이며, 따라서 동일한 뮤텍스에 대한 다른 스레드의 mtx_lock 에 happens-before 관계를 가져, 뮤텍스 잠금을 사용하여 데이터 레이스를 방지할 수 있습니다)
메모리 순서스레드가 메모리 위치에서 값을 읽을 때, 초기값, 동일 스레드에서 쓴 값, 또는 다른 스레드에서 쓴 값을 볼 수 있습니다. 스레드에서 수행된 쓰기 작업이 다른 스레드에 보이는 순서에 대한 자세한 내용은 memory_order 를 참조하십시오. |
(C11부터) |
참고문헌
- C23 표준 (ISO/IEC 9899:2024):
-
- 3.6 바이트 (p: TBD)
-
- 3.14 메모리 위치 (p: TBD)
-
- 5.1.2.4 다중 스레드 실행 및 데이터 경쟁 (p: TBD)
- C17 표준 (ISO/IEC 9899:2018):
-
- 3.6 바이트 (p: TBD)
-
- 3.14 메모리 위치 (p: TBD)
-
- 5.1.2.4 다중 스레드 실행 및 데이터 경쟁 (p: TBD)
- C11 표준 (ISO/IEC 9899:2011):
-
- 3.6 byte (p: 4)
-
- 3.14 memory location (p: 5)
-
- 5.1.2.4 Multi-threaded executions and data races (p: 17-21)
- C99 표준 (ISO/IEC 9899:1999):
-
- 3.6 바이트 (p: 4)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- 1.6 용어 정의
참고 항목
|
C++ 문서
참조:
Memory model
|