컴퓨터 시스템 : CSAPP 8장 정리 - 8.6 ~ 마지막 까지
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름
8.6 Nonlocal Jumps (비지역 점프)C 언어에서 제공하는 비지역 점프(nonlocal jump)라는 고급 제어 흐름 기능을 설명한다.이는 함수 호출과 반환의 일반적인 흐름을 무시하고, 한 함수에서 다른 함수의 실행 지점으로 직접 점프하는 기능이다.핵심 함수: setjmp와 longjmp#include int setjmp(jmp_buf env);void longjmp(jmp_buf env, int val); setjmp는 현재 호출 환경(PC, SP, 레지스터 등)을 저장하고 0을 반환longjmp는 setjmp로 저장된 위치로 되돌아감. 이때 setjmp는 val 값을 반환하게 됨즉, setjmp는 한 번 호출되지만 여러 번 반환될 수 있음주요 활용: 에러 복구함수 호출이 깊이 중첩된 상황에..
컴퓨터 시스템 : CSAPP 8장 정리 - 8.5 Signals Part.2 8.5.7 까지
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름
8.5.5 Writing Signal Handlers (시그널 핸들러 작성)시그널 핸들러를 올바르게 작성하는 방법에 대해 설명한다. 시그널 핸들러는 예외적으로 실행되며, 메인 프로그램과 동시에 실행될 수 있기 때문에 작성이 까다롭다.시그널 핸들러 작성의 어려움시그널 핸들러는 메인 프로그램과 동시에 실행되며, 전역 변수를 공유함.언제 시그널이 수신되는지는 예측이 어려움 → 비순차적 실행시스템마다 동작 방식이 다를 수 있어 이식성 문제도 있음​.안전한 시그널 핸들러 작성 지침G0. 핸들러를 최대한 단순하게 유지가능한 한 간단한 동작만 수행해야 함예: 전역 변수에 플래그를 설정하고 바로 반환 → 메인 루프가 주기적으로 플래그를 검사하여 처리G1. async-signal-safe 함수만 호출시그널 핸들러 내에서..
컴퓨터 시스템 : CSAPP 8장 정리 - 8.5 Signals Part.1 8.5.4 까지
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름
8.5 Signals이 절에서는 시그널(Signal)이라는 고수준 예외적 제어 흐름(high-level exceptional control flow) 메커니즘을 소개한다.시그널은 커널 또는 다른 프로세스가 특정 프로세스에 이벤트 발생을 알려주는 작은 메시지다.시그널의 개요시그널은 하드웨어 예외처럼 비동기적으로 발생할 수 있으며, 사용자 수준 프로세스에 도달할 수 있는 예외다.예: 사용자가 Ctrl+C를 누르면 커널이 SIGINT 시그널을 해당 프로세스에 보냄시그널은 총 30여 개 종류가 있으며, 각 시그널은 특정 이벤트에 대응한다:SIGSEGV: 잘못된 메모리 참조SIGCHLD: 자식 프로세스 종료SIGKILL: 강제 종료SIGALRM: 타이머 만료시그널은 C에서 예외(exception)를 다룰 수 있는..
컴퓨터 시스템 : CSAPP 8장 정리 - 8.4 Process Control
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름
8.4 Process Control유닉스 시스템에서 프로세스를 생성, 종료, 관리하는 시스템 콜들을 소개한다. 프로세스를 제어하기 위한 함수들이 어떻게 동작하는지, 어떤 시점에 어떤 함수가 사용되는지를 예제와 함께 설명한다.주요 기능:프로세스 ID 확인프로세스 생성 (fork)프로세스 종료 (exit)자식 프로세스 회수 (wait)프로그램 실행 (exec)일시 중단 및 재개8.4.1 Obtaining Process IDs (프로세스 ID 얻기)각 프로세스는 시스템 내에서 고유한 양의 정수인 PID(Process ID)를 갖는다.관련 함수들#include #include pid_t getpid(void); // 현재 프로세스의 PID 반환pid_t getppid(void); // 부모 프로세스..
컴퓨터 시스템 : CSAPP 8장 정리 - 8.3 System Call Error Handling
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름
8.3 System Call Error Handling (시스템 콜 에러 처리)유닉스 시스템 콜이 실패했을 때의 에러 처리 방식과, 이를 간편하게 처리하기 위한 에러 처리 래퍼(wrappers)에 대한 설명이다.기본 에러 처리 메커니즘대부분의 Unix 시스템 콜은 실패 시 -1을 반환하고,전역 변수 errno를 설정하여 에러 원인을 나타냅니다.errno는 #include 에 정의되어 있으며, 에러 번호를 정수로 저장한다.이 번호에 대응하는 에러 메시지는 strerror(errno)를 이용해 문자열로 얻을 수 있다.예시: fork() 시스템 콜의 에러 체크if ((pid = fork()) 사용자 정의 에러 처리 함수반복되는 에러 처리를 간소화하기 위해 에러 출력 전용 함수를 정의할 수 있다.예: unix_..
컴퓨터 시스템 : CSAPP 8장 정리 - 8.2 Processes
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름
8.2: Processes운영체제가 프로세스를 제공하는 핵심 기법은 예외(Exception)를 기반으로 하며, 이를 통해 프로그램은 마치 시스템 전체를 독점하고 있는 것처럼 보이는 환상을 경험하게 된다.프로세스란?고전적인 정의: 실행 중인 프로그램의 인스턴스각 프로세스는 실행에 필요한 전체 컨텍스트(context)를 포함한다:코드, 데이터, 스택일반 레지스터, 프로그램 카운터(PC)환경 변수, 파일 디스크립터 등프로세스를 통해 얻는 두 가지 핵심 추상화논리적 제어 흐름 (Logical Control Flow)→ 프로그램이 CPU를 독점하고 실행되는 듯한 착각을 제공개인 주소 공간 (Private Address Space)→ 프로그램이 메모리를 독점하는 듯한 착각을 제공8.2.1 Logical Contro..
컴퓨터 시스템 : CSAPP 8장 정리 - 8.1 Exceptions
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/8장 예외적 제어 흐름
Exceptional Control Flow (ECF)는 프로그램의 일반적인 순차 흐름을 예외적으로 변경하는 메커니즘으로, 운영체제의 핵심 기능인 입출력, 프로세스, 가상 메모리 등을 구현하는 데 사용된다. 프로그래머에게 중요한 이유는 다음과 같다:시스템 개념 이해에 필수적: 프로세스 생성, 종료, 신호 처리 등은 모두 ECF를 기반으로 구현된다.운영체제와의 상호작용 이해: 응용 프로그램이 시스템 콜을 통해 OS 서비스를 요청할 때 trap이라는 형태의 ECF를 사용한다.응용 프로그램 작성 능력 향상: 예를 들어 유닉스 셸이나 웹 서버 같은 프로그램은 ECF 메커니즘을 적극적으로 활용한다.동시성(concurrency) 이해의 기초: 인터럽트, 프로세스, 스레드, 시그널 핸들러 등의 개념은 모두 ECF의 ..
컴퓨터 시스템 : CSAPP 7장 정리 - 7.13 ~ 7.15
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/7장 링커
7.13 라이브러리 인터포지셔닝 (Library Interpositioning)라이브러리 인터포지셔닝은 공유 라이브러리 함수 호출을 가로채어 자신이 정의한 코드로 대체할 수 있게 해주는 강력한 기술이다. 이를 통해 다음과 같은 작업이 가능하다:특정 함수 호출 횟수 추적함수의 입력/출력 값 검증 및 기록특정 함수를 완전히 다른 구현으로 대체기본 개념인터포지셔닝은 다음 세 단계를 포함한다:대상 함수와 동일한 시그니처의 래퍼(wrapper) 함수를 만든다.특정 메커니즘을 이용해 시스템이 원래 함수가 아닌 래퍼를 호출하게 한다.래퍼 함수는 자체 로직을 실행한 후 원래 함수를 호출하고 결과를 반환한다​.인터포지셔닝의 세 가지 방식1. 컴파일 타임 인터포지셔닝 (Compile-Time Interpositioni..
컴퓨터 시스템 : CSAPP 7장 정리 - 7.11 ~ 7.12
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/7장 링커
7.11 애플리케이션에서 공유 라이브러리 로딩 및 링킹지금까지는 프로그램이 시작되기 전에 동적 링커가 .so 파일을 로드하고 심볼을 해결하는 과정만 다뤘다. 그러나 실제로는 프로그램이 실행된 이후, 즉 런타임 중에 공유 라이브러리를 로드하고 연결할 수도 있다.런타임 동적 링킹의 유용성 소프트웨어 배포윈도우 프로그램은 자주 사용되는 기능을 DLL로 나눠서 제공한다.새로운 DLL 버전을 배포하면, 사용자는 프로그램을 다시 컴파일하지 않고도 자동으로 새로운 기능을 사용할 수 있다.고성능 웹 서버초기 웹 서버는 CGI를 위해 fork와 execve로 외부 프로그램을 호출했다.현대 서버는 요청마다 동적 함수를 라이브러리로부터 로드하고 함수 포인터로 직접 호출한다.함수는 서버 메모리에 캐시 되며, 이후 요청에서는 ..
컴퓨터 시스템 : CSAPP 7장 정리 - 7.8 ~ 7.10
·
크래프톤 정글 (컴퓨터 시스템: CSAPP)/7장 링커
7.8 실행 객체 파일 (Executable Object Files)링커는 여러 개의 목적 파일을 하나의 실행 객체 파일(executable object file)로 병합한다. 이 파일은 이제 디스크에서 메모리로 로드되어 바로 실행할 수 있는 상태이다. 즉, 소스 코드로 시작된 프로그램이 최종 실행 가능한 이진 파일로 완성되는 지점이다.ELF 실행 파일 구조 요약ELF 실행 파일은 여러 부분으로 나뉘며, 각 부분은 특정한 기능을 담당한다. 대표적인 구성은 아래와 같다 (그림 7.13 기준):주요 구성 요소:ELF 헤더: 전체 포맷에 대한 정보를 제공섹션 헤더 테이블: .text, .data 등 객체 파일 섹션에 대한 설명세그먼트 헤더 테이블(Program Header Table): 섹션을 런타임 메모리 ..