프로세스의 사용자 모드에서 사용되는 스택 영역.
스택은 함수 호출, 로컬 변수 저장, 함수 호출 간의 컨텍스트
를 유지
하는 데 사용되는 메모리 구조. 유저 스택은 프로세스의 주소 공간에 할당되며, 운영체제의 커널 모드에서 사용하는 커널 스택과 구분된다.
호출
관리로컬
변수 저장재귀
함수 지원공간
가상 주소
공간의 일부유저 스택은 LIFO
구조를 따른다.
함수 호출이 완료되면 돌아가야 할 주소를 저장.
함수 호출 시 전달된 인수들이 저장.
이전 스택 프레임의 시작 주소를 가리킨다.
함수 내에서 선언된 변수들이 저장.
운영체제가 파일 or 입출력 자원(파이프, 소켓, 터미널 등)을 추적하기 위해 사용되는 추상적 식별자.
파일 디스크립터는 프로세스가 열어놓은 모든 파일에 대해 고유한 비정수(정수형) 값을 반환하여 이를 통해 파일에 대한 읽기, 쓰기, 닫기 등의 작업을 수행할 수 있다.
정수형
식별자0, 1, 2
부터 시작하여 순차적 할당입력
을 읽습니다.결과
를 화면에 출력.오류 메시지
를 출력합니다.파일 디스크립터는 ‘open()’, ‘read()’, ‘write()’, ‘close()’ 등의 시스템 콜을 통해 사용된다.
이를 통해 프로세스는 파일 및 다른 입출력 자원과 상호 작용o
데이터의 임시 저장소. 주로 데이터 접근 속도를 향상 시키기 위해 사용. 메모리 계층 구조에서 CPU와 메인 메모리(RAM) 사이에 위치 하여, 자주 사용되는 데이터를 보다 빠르게 접근할 수 있도록 한다.
CPU가 데이터를 처리하는 속도를 최대
로 끌어올리는 것입니다.
속도 - 매우 빠른 속도로 동작하며, 일반적으로 SRAM 기술 사용
크기 - 용량이 작지만 매우 빠른 메모리
계층 구조
CPU 캐시
:디스크 캐시
:웹 캐시
:중단되지 않고 완전하게 실행되는 연산. 즉, 다른 연산이 개입 하거나 중간에 상태를 볼 수 없도록 보장된 연산. 원자적 연산은 주로 다중 스레드 환경에서 동기화 문제를 해결하기 위해 사용된다.
단일 연산의 예
increment
):x++
연산이 원자적으로 수행되면, 다른 스레드가 x
의 값을 읽거나 변경하지 못하도록 보장됩니다.lock inc [address]
(x86 아키텍처)bitwise operation
):복합 연산의 예
Compare-and-Swap (CAS):
교체
합니다.bool compare_and_swap(int* ptr, int old_value, int new_value) {
if (*ptr == old_value) {
*ptr = new_value;
return true;
}
return false;
}
int fetch_and_add(int* ptr, int value) {
int old_value = *ptr;
*ptr += value;
return old_value;
}
xchg
, lock cmpxchg
(x86 아키텍처), ldrex
/strex
(ARM 아키텍처)<atomic>
헤더x86-64 아키텍처에서 64비트 명령어 확장을 위해 도입된 특별한 접두사입니다. REX는 "Register Extension"의 약자로, 추가적인 레지스터와 64비트 연산을 지원하기 위해 사용됩니다.
REX 접두사는 2003년에 AMD에 의해 처음 도입되었으며, 인텔의 EM64T(현재의 Intel 64) 아키텍처에서도 채택되었습니다.
주소 공간 및 메모리 관리: 32비트는 최대 4GB 메모리, 64비트는 매우 큰 주소 공간과 더 많은 메모리를 지원합니다.
성능: 64비트 운영체제가 더 많은 레지스터와 64비트 데이터 단위를 사용하여 성능이 향상됩니다.
소프트웨어 호환성: 64비트 운영체제는 대부분의 32비트 애플리케이션을 실행할 수 있지만, 반대의 경우는 불가능합니다.
하드웨어 요구 사항: 64비트 운영체제는 64비트 CPU가 필요하며, 더 많은 RAM을 지원합니다.
보안: 64비트 운영체제는 더 강력한 보안 기능을 제공합니다.
컴퓨터 시스템에서 CPU가 현재 작업을 중단하고, 발생한 특정 이벤트를 처리하도록 하는 메커니즘.
인터럽트는 HW, SW의해 발생하며, 이벤트를 처리한 후 CPU 는 중단된 작업을 재개한다.
인터럽트는 CPU가 현재 작업을 중단하고 중요한 이벤트를 처리할 수 있게 하는 메커니즘입니다.
유형
하드웨어 인터럽트, 소프트웨어 인터럽트, 예외.
인터럽트 발생 -> 인터럽트 요청 확인 -> 작업 상태 저장 -> ISR 실행 -> 작업 상태 복원.
효율적인 시스템 운영, 실시간 처리, 다중 작업 지원.
프로그램이 허용되지 않은 메모리 영역에 접근하려고 할 때 발생하는 오류. 이는 주로 프로세스가 자신의 메모리 주소 공간 외부를 참조하려고 할 때 운영체제가 이를 감지하고 해당 프로세를 중단시킴으로 발생
#include <stdio.h>
int main() {
int *ptr = NULL; // 널 포인터 초기화
*ptr = 10; // 널 포인터에 값 할당 시도
return 0;
}
int *ptr; *ptr = 10;
#include <stdio.h>
int main() {
char buffer[10];
for (int i = 0; i <= 10; i++) {
buffer[i] = 'a'; // 버퍼 오버플로우
}
return 0;
}
void func() { func(); }
free(ptr); *ptr = 10;
세그멘테이션 폴트는 프로그램이 허용되지 않은 메모리 영역에 접근하려 할 때 발생하는 오류입니다.
주요 원인으로는 널 포인터 접근, 잘못된 포인터 사용, 버퍼 오버플로우, 스택 오버플로우, 잘못된 메모리 해제 후 접근 등이 있습니다.
세그멘테이션 폴트는 런타임 오류로, 프로그램 실행 중 발생합니다.
GDB와 Valgrind 같은 디버깅 도구를 사용하여 세그멘테이션 폴트를 진단하고 수정할 수 있습니다.
포인터 초기화, 메모리 할당 검증, 경계 검사 등 예방 방법을 통해 세그멘테이션 폴트를 방지할 수 있습니다.