1. PCB
PCB (프로세스 제어 블록)란
- 빠르게 번갈아 수행되는 프로세스 관리를 위해 사용하는 자료구조
- 프로세스 관련 정보를 저장하고
- 프로세스 생성 시 커널 영역에 생성된 후, 프로세스 종료 시 폐기된다.
PCB가 가지는 정보
- PID (프로세스 ID) : 프로세스 식별 번호
- 레지스터 값 : 마지막으로 연산한 곳을 기억하기 위한 값
- 프로세스 상태 : 현재 프로세스의 상태 (입출력 대기, CPU 사용을 위해 대기, CPU 사용 등)
- CPU 스케줄링 정보 : 할당 순서에 대한 정보
- 메모리 정보 : 프로세스가 저장된 곳의 정보 (페이지 테이블 정보)
- 사용한 파일과 입출력 장치 정보
2. 프로세스의 메모리 영역
코드 영역
- 실행할 수 있는 코드
- CPU가 실행할 명령어가 담겨있다.
- 정적 할당 영역
데이터 영역
- 프로그램이 실행되는 동안 유지할 데이터를 저장하는 영역
- 정적 할당 영역
- ex) 전역 변수
힙 영역
- 프로그래머가 직접 할당할 수 있는 저장공간
- 할당하면 반환해 주어야 한다.
- GC
- 동적 할당 영역
- 일반적으로 낮은 주소에서 높은 주소로 할당
스택 영역
- 데이터가 일시적으로 저장되는 공간
- 함수 호출 시 할당, 반환 시 해제 (컴파일 타임에 크기 결정)
- 동적 할당 영역
- 일반적으로 높은 주소에서 낮은 주소로 할당
- ex) 매개변수, 지역 변수
3. 스레드
스레드란
- 프로세스를 구성하는 실행 흐름의 단위
- 스레드의 구성 요소
- 스레드 ID
- 레지스터 값
- 스택 값
- 실행에 필요한 최소한의 정보 (code, data, files)
- 프로세스의 종류
- 단일 스레드 프로세스
- 멀티 스레드 프로세스
멀티 프로세스와 멀티 스레드
- 멀티 프로세스
- 동일한 작업을 수행하는 단일 스레드 프로세스를 여러 개 실행
- 프로세스끼리 자원 공유 불가능
- 독립적으로 실행
- IPC : 프로세스 간 통신 (가능은 하지만, 스레드 간 통신보다 복잡, 파일 및 공유 메모리를 통해 수행)
- 멀티 스레드
- 하나의 프로세스를 여러 스레드로 실행
- 스레드 끼리는 같은 프로세스 내 자원 공유 가능
- 레지스터 값, 스택 값만 고유하게 가짐 (코드, 데이터, 힙, 파일 영역은 공유)
- 협력과 통신에 유리하지만 하나의 스레드가 문제생기면 전체 프로세스에 문제가 생길 수 있다.
4. 컴파일러 및 컴파일 과정
컴파일러의 구성 요소
- 프론트엔드 : 소스코드의 구문 및 의미를 분석하여 변환하는 작업 수행
- 어휘 분석기 (Lexical Analyzer, Scanner)
- 소스코드를 토큰 단위로 나누기
- 불필요한 공백 및 주석 제거
- 구문 분석기 (Syntax Analyzer, Parser)
- 토큰을 조합하여 문법 구조 생성
- 문법 오류 검사 및 파싱 트리 생성
- 의미 분석기 (Semantic Analyzer)
- 변수 타입 검사, 범위 검사, 타입 변환 등을 수행
- 중간 코드 생성기 (Intermediate Code Generator)
- 중간 코드는 기계어와 소스 코드 사이의 추상적인 표현 형식
- 어휘 분석기 (Lexical Analyzer, Scanner)
- 미들엔드 : 코드 최적화를 담당하는 단계
- 중간 코드 최적화 (Optimization)
- 불필요한 연산 제거, 루프 최적화
- 데이터 흐름 분석
- 중간 코드 최적화 (Optimization)
- 백엔드 : 최적화된 중간 코드를 기계어로 변환
- 코드 생성기 (Code Generator)
- 중간 코드를 실제 CPU에서 실행할 수 있는 기계어로 변환
- CPU및 OS에 따라 명령어 선택
- 코드 최적화 (Machine-Specific Optimization)
- 레지스터 할당
- 파이프라이닝 및 인라인 함수 최적화
- 코드 생성기 (Code Generator)
C언어 컴파일 과정
- 소스 코드 입력
- 전처리
- 전처리기를 통해서 .c 파일을 .i로 변환하는 과정
- 주석 제거, 헤더파일 삽입, 매크로 및 치환 적용
- 컴파일
- 컴파일러를 통해 전처리된 코드 파일(.i) 를 어셈블리어 파일(.s)로 변환
- 언어의 문법 검사가 이루어진다.
- 정적인 역역들의 메모리 할당 수행
- 어셈블리
- 어셈블러를 통해 어셈블리어 파일(.s)를 오브젝트 파일(.o)로 변환하는 과정
- 오브젝트 파일
- 오브젝트 코드 (기계어로 변환된 코드)로 구성된 파일
- 오브젝트 파일 포맷 구조
- 오브젝트 파일 헤더 : 기초 정보 저장
- 텍스트 섹션 : 기계어로 변환된 코드 저장
- 데이터 섹션 : 전역, 정적 변수 포함
- 심볼 테이블 섹션 : 소스코드에서 참조되는 심볼들의 이름과 주소를 정의
- 재배치 정보 섹션 : 링킹 전까지 심볼의 위치를 확정할 수 없기에 정보를 저장하는 부분
- 디버깅 정보 섹션 : 디버깅에 대한 정보 저장
- 링킹
- 링커를 통해 오브젝트 파일(.o) 들을 묶어서 실행 파일로 만드는 과정
- 정적 링킹 및 동적 링킹을 통해서 라이브러리를 링크한다.
- 정적 링킹 : 실행 파일이 라이브러리를 복사해서 가지고 있음
- 동적 링킹 : 링커가 라이브러리를 가리키는 주소만 가지고 있다가 런타임에 해당 주소로 가서 가져오는 방
'CS' 카테고리의 다른 글
온라인 게임과 네트워크 구성 (0) | 2025.03.13 |
---|---|
네트워크 개념 (0) | 2025.03.13 |
운영체제 몇 가지 (1) | 2025.01.13 |