sig_atomic_t는 실제로 어떻게 작동합니까?
컴파일러나 OS는 sig_atomic_t형과 normal int형 변수를 어떻게 구별하고 연산이 atomic이 되도록 보장합니까?둘 다 사용하는 프로그램은 어셈블리 코드가 동일합니다.작업을 원자력으로 만들기 위해 추가적인 주의가 필요합니까?
sig_atomic_t
원자성 데이터 형식이 아닙니다.신호 처리기의 컨텍스트에서 사용할 수 있는 데이터 유형입니다.그래서 그 이름을 "신호 처리와 관련된 원자"로 읽는 것이 좋습니다.
신호 처리기와의 통신을 보장하려면 원자 데이터 유형의 속성 중 하나, 즉 읽기 및 업데이트가 항상 일관된 값을 보인다는 사실만 필요합니다.기타 데이터 유형(예: 아마도)long long
는 아래위 부분에 몇 가지 지침으로 될 수 를 들어 ) 래 아 부 과 분 위 어 러 지 작 로 있 수 니 다 습 될 성 으 침 블 는 셈 지 가 몇 한 대 부 분 에 다 니▁)sig_atomic_t
한 번에 읽고 쓸 수 있습니다.
따라서 플랫폼은 다음과 같은 정수 기본 유형을 선택할 수 있습니다.sig_atomic_t
그것은 그것을 보증할 수 있습니다.volatile sig_atomic_t
신호 처리기에서 안전하게 사용할 수 있습니다.이 많은플랫이선다니습택했폼다▁chose▁many를 선택했습니다.int
이를 위해, 그들은 그들을 위해 그것을 알기 때문입니다.int
는 단일 지침으로 작성됩니다.
최신 C 표준인 C11은 원자 유형을 가지고 있지만 완전히 다른 것입니다.그 중 일부("잠금 해제"된 것)는 신호 처리기에서도 사용될 수 있지만, 이는 완전히 다른 이야기입니다.
:sig_atomic_t
스레드 세이프가 아니며 비동기식만 세이프입니다.
원자력은 두 가지 유형의 장벽을 포함합니다.
- 컴파일러 장벽.컴파일러는 다른 변수에 대한 읽기/쓰기와 관련된 원자 변수의 읽기/쓰기 순서를 변경하지 않도록 합니다.이것이 무엇입니까?
volatile
키워드는 그렇습니다. - CPU 장벽 및 가시성.CPU가 읽기 및 쓰기 순서를 변경하지 않도록 합니다.x86에서 정렬된 1,2,4,8바이트 스토리지에 대한 모든 로드 및 저장소는 원자적입니다.가시성을 통해 저장소를 다른 스레드에 표시할 수 있습니다.Intel CPU에서는 캐시 일관성 및 메모리 일관성 프로토콜 MESI로 인해 저장소가 다른 스레드에 즉시 표시됩니다.하지만 그것은 미래에 바뀔지도 모릅니다.자세한 내용은 Intel® 64 및 IA-32 Architectures Software Developer's Manual Volume 3A의 § 8.1 LOCKED ATOMIC Operations를 참조하십시오.
해당 주제에 대한 포괄적인 치료를 위해서는 원자 무기를 시청하십시오. C++ 메모리 모델과 현대 하드웨어.
sig_atomic_t
한 종단순한입니다.typedef
고유의 으로, 일반적으로 (일적으로일시특부적유정로형분으스템반)일,▁type로▁(int
또는long
) 그리고 그것을 사용하는 것은 매우 중요합니다.volatile sig_atomic_t
(뿐만 아니라)sig_atomic_t
혼자).
를 할 때volatile
키워드, 컴파일러는 많은 최적화를 피해야 합니다.
최근 추가된 C11 표준_Atomic
그리고.<stdatomic.h>
지원하려면 최신 GCC(예: 4.9)가 필요합니다.
둘 다 사용하는 프로그램은 어셈블리 코드가 동일합니다.작업을 원자력으로 만들기 위해 추가적인 주의가 필요합니까?
비록 이것은 오래된 질문이지만, 저는 여전히 이 부분을 구체적으로 다룰 가치가 있다고 생각합니다.리눅스의 경우sig_atomic_t
glibc에서 합니다. sig_atomic_t
는 glibc의 입니다.int
그리고 특별한 대우를 받지 않았습니다(본 게시물 기준).glibc 문서는 다음을 처리합니다.
실제로는 int가 원자라고 가정할 수 있습니다.포인터 유형이 원자적이라고 가정할 수도 있습니다. 매우 편리합니다.이러한 가정은 GNU C 라이브러리가 지원하는 모든 컴퓨터와 우리가 알고 있는 모든 POSIX 시스템에서 모두 사실입니다.
다시 말해서, 규칙적으로 일어나는 일이 있습니다.int
이미 의요 충다니합족사의 하고 있습니다.sig_atomic_t
하지 않은 에서 .glibc가 지원합니다.C 및 은 그에도불고하구, C및 POSIX합니다의화를 의무화하고 있습니다.sig_atomic_t
수 입니다.int
의 요구 사항을 하지 않습니다.sig_atomic_t
.
이 데이터 형식은 원자적인 것 같습니다.
여기서:
24.4.7.2 원자 유형 변수에 대한 액세스 중단에 대한 불확실성을 피하기 위해 액세스가 항상 원자인 sig_atomic_t인 특정 데이터 유형을 사용할 수 있습니다.이 데이터 유형을 읽고 쓰는 작업은 단일 명령에서 수행되므로, 핸들러가 액세스의 "중간"에서 실행할 수 없습니다.
sig_atomic_t 유형은 항상 정수 데이터 유형이지만 어떤 유형인지, 포함된 비트 수는 시스템마다 다를 수 있습니다.
데이터 유형: sig_atomic_t 정수 데이터 유형입니다.이 유형의 개체는 항상 원자적으로 액세스됩니다.
실제로는 int가 원자라고 가정할 수 있습니다.포인터 유형이 원자적이라고 가정할 수도 있습니다. 매우 편리합니다.이러한 가정은 GNU C 라이브러리가 지원하는 모든 컴퓨터와 우리가 알고 있는 모든 POSIX 시스템에서 모두 사실입니다.
커널 개발 수준의 메모리 모델을 연구한 것은 큰 성과를 거두었습니다.
어쨌든 sig_atomic_t는 원자입니다.원자성의 일반적인 정의는 동시 쓰기 또는 동시 읽기 및 쓰기로 인해 "부분" 결과를 얻을 수 없다는 것입니다."원자"에 다른 속성을 추가하는 것은 위험하며, 여기에서 볼 수 있는 유형의 혼란을 야기합니다.
따라서 sig_atomic_t 저장소를 사용할 때는 이전 값을 얻거나, 이전 값을 읽을 때 새 값을 얻을 수 있습니다. 즉, 해당 저장소 이전, 도중 또는 이후입니다.
"어떻게 작동하는지"에 대한 직접적인 질문에 대답: 컴파일러는 기본 유형 크기를 사용하고 필요한 경우 추가 기계 명령을 발행하여 CPU에 원자성 저장소 및 원자성 읽기를 수행해야 한다는 신호를 보냅니다.
그렇기 때문에 sig_atomic_t와 같은 원자 변수를 읽으려고 할 때 오래된 값을 얻을 것인지 새로운 값을 얻을 것인지에 대해 정말로 많은 것을 말할 수 없다는 것을 주목하는 것이 중요합니다.여러분이 알고 있는 것은 읽기와 동시에 스토어가 발생하는 동안 서로 경쟁하는 두 개의 서로 다른 스토어를 혼합하거나 기존 가치와 새로운 가치를 혼합할 수 없다는 것입니다.
C에서 변수를 "volatile sig_atomic_t"로 선언해야 합니다. 그렇지 않으면 컴파일러가 캐시하지 않을 이유가 없고 예상보다 오래 이전 값을 사용할 수 있기 때문입니다. 컴파일러가 이전 읽기의 레지스터에 이미 오래된 값을 가지고 있다면 새 메모리 읽기를 강제로 실행할 이유가 없습니다."volatile"은 컴파일러가 변수의 값을 얻어야 할 때 항상 새로운 메모리 읽기를 수행하도록 지시합니다.
"volatile"이나 "sig_atomic_t" 모두 "컴파일러 장벽"이 충분히 강하지 않아서 CPU 자체는 말할 것도 없고 (컴파일러 장벽이 아니라 메모리 장벽이 필요할 것이다) 컴파일러 최적화 프로그램에 의해 순서가 변경되지 않도록 합니다.가시성 제약 조건이 필요한 경우MMIO를 수행할 때는 다른 스레드, 프로세서, 심지어 하드웨어도 "추가적인 것"(컴파일러 장벽 및 메모리 장벽)이 필요합니다.
여기서 C11_Atomic과 C11 메모리 모델이 작동합니다.이들은 "원자적" 읽기 및 저장에 관한 것이 아니라 많은 가시성 규칙과 제약 조건을 포함합니다.기타 엔티티(MMIO 장치, 기타 실행 스레드, 기타 프로세서).
언급URL : https://stackoverflow.com/questions/24931456/how-does-sig-atomic-t-actually-work
'programing' 카테고리의 다른 글
"self.x = x; self"를 피하려면 어떻게 해야 합니까?y = y; __init_의 self.z = z" 패턴? (0) | 2023.07.14 |
---|---|
gitdiff를 사용하여 두 스프레드시트에서 읽을 수 있는 diff를 만들려면 어떻게 해야 합니까? (0) | 2023.07.14 |
Firebase 데이터베이스에서 데이터를 검색하는 방법은 무엇입니까? (0) | 2023.07.14 |
Xcode에 개발팀이 표시되지 않습니다. (0) | 2023.07.14 |
sscanf가 있는 공백이 있는 문자열 읽기 (0) | 2023.07.14 |