•
하드 Disk, 하드 드라이버, 디스크 메모리, 보조기억장치 - HDD, SSD
•
메인 메모리, 주 기억장치, 메모리 - RAM
•
CPU
보조 기억장치 : 디스크, SSD
애플리케이션 관련
프로세스 , CPU관련
프로세스 메모리 구조
섹션 | 내용 |
스택(Stack) | 함수 호출 시 및 지역 변수를 저장
(예: 함수 매개변수, 반환 주소, 지역 변수) |
힙(Heap) | 동적 메모리 할당에 사용 ← 이부분이 동적 라이브러리 연결이 맞나? |
데이터(Data) | 전역 변수(Global)와 정적 데이터? 정적 변수? 가 저장 |
텍스트(Text) | 실행 가능한 코드가 저장 |
커널
시그널
항목 | 설명 |
프로세스 식별자 | 프로세스 ID(PID) |
프로세스 상태 | 프로세스의 현재 상태 (New, Ready, Running, Waiting, Terminated 등) |
프로그램 카운터 | 다음 실행할 명령어의 주소를 가리킴
인터럽트(중단) 후 정확히 이어서 실행 가능 |
CPU 레지스터 | CPU의 현재 상태 정보를 저장
Accumulator, General Register 등을 포함한 CPU 레지스터 값을 저장
(누산기, 스택 포인터, 프로그램 상태 레지스터, 조건 코드 등) |
CPU 스케줄링 정보 | 프로세스 우선순위, 스케줄링 큐 포인터, 시간 제한 등 스케줄링 관련 데이터를 저장 |
메모리 관리 정보 | 프로세스의 메모리 공간 정보
(기본/한계 레지스터, 페이지 테이블, 세그먼트 테이블 등) |
I/O 상태 정보 | 프로세스가 사용하는 I/O 장치 및 열린 파일 목록, 현재 I/O 작업 상태 저장 |
계정 정보 | 프로세스 실행 자원 사용량
(CPU 사용량, 실행 시간, PID, 사용자 계정 정보 등) |
•
생성(New): 프로세스가 생성 중인 상태
•
준비(Ready): 프로세서에 할당되기를 기다리는 상태
•
실행(Running): 명령어가 실행 중인 상태
•
대기(Waiting): 특정 이벤트(예: I/O 완료 또는 신호 수신)를 기다리는 상태
•
종료(Terminated): 실행이 완료된 상태
컨텍스트 스위칭
1.
현재 프로세스에 인터럽트(중지)가 발생한다.
2.
현재 프로세스의 Context를 PCB에 저장: State Save
•
프로세스(P0)의 Context를 PCB0에 저장한다.
•
P0 프로세스 상태: Running → Ready / Sleeping
3.
스케줄러 작동:
•
스케줄러가 다음 실행할 프로세스(P1)를 선택한다.
•
우선순위, 대기시간, CPU 점유 시간 등을 고려
4.
새로운 프로세스의 Context 복원: State Restore
•
선택된 프로세스(P1)의 PCB1에서 Context 정보를 로드한다.
•
P1 프로세스 상태: Ready → Running
5.
CPU 재개
•
새로운 프로세스가 실행
1.
[UserApplicaion]애플리케이션에서 시스템 콜을 요청
•
애플리케이션이 파일 읽기/쓰기, 프로세스 생성 등 커널 기능을 요청한다.
•
write(), read() 등의 시스템 콜을 요청한다.
print("Hello, World!\n");
Python
복사
2.
[UserLibrary]라이브러리에서 시스템 콜 실행
•
glibc 라이브러리가 제공하는 시스템 콜 래퍼 함수를 통해 시스템 콜이 실행된다.
•
트랩 명령어 실행 시, CPU는 인터럽트 벡터 테이블에서 시스템 콜 핸들러 주소를 확인하고 실행한다.
_start:
; 시스템 콜 번호를 레지스터에 설정
mov rax, 1 ; 시스템 콜 번호 (1: write)
; 시스템 콜 인수 설정
mov rdi, 1 ; 첫 번째 인수: 파일 디스크립터 (1: stdout)
mov rsi, message ; 두 번째 인수: 출력할 메시지의 주소
mov rdx, length ; 세 번째 인수: 메시지 길이
; syscall 명령어 실행 (커널 모드로 전환)
syscall
; 프로그램 종료를 위한 시스템 콜
mov rax, 60 ; 시스템 콜 번호 (60: exit)
xor rdi, rdi ; 종료 코드 0
syscall
Assembly
복사
3.
[Kernal]커널의 시스템 콜 핸들러 호출
•
CPU가 인터럽트 벡터 테이블에서 시스템 콜 핸들러 주소를 확인한다.
•
시스템 콜 번호를 레지스터에서 확인 후, 커널 내부 함수를 실행한다.
4.
[Kernal]요청 처리
•
커널은 요청된 작업(파일I/O, 프로세스 관리, 네트워크 작업 등)을 수행한다.
•
필요한 경우 하드웨어 자원 제어 및 커널 기능과 상호 작용한다.
5.
[Kernel → User]시스템 콜 종료 및 복귀
•
작업 결과(성공여부, 반환 값 등)를 CPU 레지스터에 저장한다.
•
CPU는 커널모드에서 사용자 모드로 전환한다.
•
애플리케이션은 레지스터 값을 읽어 결과를 확인한다.
쓰레드
종료 과정
1.
[프로세스]프로세스 종료 시, exit() 시스템 콜 요청
•
자식 프로세스 종료 요청:
부모 프로세스가 자식 프로세스를 종료를 요청한다. 이를 종속적 종료 (Cascading Termination)라고 한다. 부모 프로세스가 종료되면 자식 프로세스도 자동으로 종료한다. 이 경우 자식 PID를 알고 있어야 종료 요청할 수 있다. 부모 프로세스가 자식 프로세스 종료를 요청하는 경우는 아래와 같다.
1.
자식이 할당된 자원을 초과 사용했을 때
2.
자식에게 부여된 작업이 더 이상 필요하지 않을 때
3.
부모 프로세스가 종료되면서 자식 프로세스를 더 이상 실행할 수 없도록 할 때
•
정상 종료:
프로세스가 맡은 작업을 완료하고 exit() 호출로 종료를 요청한다. (단, 권한 검증 필요하지 않음)
2.
[커널]요청 검증
•
권한 검토: 커널이 요청의 유효성을 검토하여 종료한 권한이 있는지 확인한다.
◦
부모-자식 관계, 슈퍼 유저(root)권한 여부 확인
•
오류 처리: 요청이 잘못 된 경우(권한 부족, 잘못된 PID 등) 오류를 반환한다.
3.
[커널]신호 전달 또는 종료 명령 실행
•
커널이 프로세스 테이블에서 대상 프로세스를 찾아 종료 신호(signal)를 전달한다.
◦
SIGTERM, SIGKILL
4.
[커널]종료 작업 수행
•
실행 중단: 프로세스의 실행을 멈추고, 프로세스 종료 대기 상태로 전환
•
자원해제: 프로세스가 사용 중이던 모든 자원 해제
◦
페이지 테이블 및 가상 메모리 해제
◦
PCB 제거
◦
열려 있던 파일 디스크립터 닫기
•
프로세스 테이블 갱신:
◦
프로세스를 종료 상태로 표시
◦
부모 프로세스가 wait()를 호출 해 종료 상태를 수집하기 전까지 자식 프로세스 좀비 상태
5.
[커널]부모에게 종료 알림
•
신호 전달: 커널 → 부모 프로세스에 SIGCHLD 신호를 전달
•
종료 상태 수집: 부모 프로세스가 wait() 또는 waitpid()를 호출해 자식의 종료 상태를 수집
•
프로세스 테이블 항목 삭제: 종료 상태가 수집되면 프로세스 테이블에서 해당 항목을 삭제
⇒ 자식 프로세스 좀비 상태 해제
메모리 관련
캐시
가상메모리
주소변환: Page Table, MMU
요구 페이지(Demand Paging) & 페이지 폴트(Page Fault)
•
요구 페이지(Demand Paging):
◦
프로세스를 메모리에 적재할 때 처음부터 모든 페이지를 적재하지 않고, 필요한 페이지만 물리 메모리에 로드하는 가상 메모리 관리 기법이다.
◦
실행 초기에는 모든 페이지를 메모리에 로드하지 않으므로 메모리 낭비를 줄임
◦
페이지 처음 접근 시, 메모리에 아직 적재 되어 있지 않으므로 페이지폴트(Page fault)발생
•
페이지 폴트(Page fault):
◦
페이지 폴트는 프로세스가 접근하려는 페이지가 물리 메모리에 없는 경우 발생하는 예외 상황
◦
커널은 페이지 폴트 핸들러 호출하여 디스크에서 해당 페이지를 읽어와 메모리에 적재하고 페이지 테이블을 갱신한다.
1.
CPU가 요청한 주소를 확인:
•
페이지 테이블의 유효비트(Valid Bit)가 0인 경우 페이지 폴트 발생
2.
페이지 폴트 핸들러 호출
•
커널이 페이지 폴트 예외를 처리하기 위해 페이지 폴트 핸들러 실행
3.
주소 유효성 검사
•
가상 주소가 유효한 경우 → 디스크에서 페이지 로드
•
유효하지 않은 경우 → 세그먼테이션 오류 발생 및 프로세스 종료
4.
물리 메모리 할당(allocation)
•
빈 프레임이 있으면 페이지 할당
•
빈 프레임이 없으면 페이지 교체 알고리즘을 통해 기존 페이지 교체
5.
디스크에서 페이지 적재(load)
페이지를 디스크에서 읽어와 물리 메모리에 적재, 디스크 I/O 발생
6.
페이지 테이블 업데이트
새로운 페이지의 물리 메모리 위치를 기록, 유효비트를 1로 변경
7.
프로세스 실행 재개
중단된 작업에서 다시 실행 시작
페이지 교체 알고리즘(Page replacement Algorithm)
언젠가 메모리가 가득 차면 기존 페이지를 교체해야한다. 운영체제는 한정된 메모리를 효율적으로 이용할 수 있도록 기존에 메모리에 적재된 불필요한 페이지를 선별하여 보조기억 장치로 내보낼 수 있어야 한다.
운영체제는 페이지 교체 알고리즘을 사용하여 교체할 페이지를 선택한다. 페이지 폴트가 가장 적게 일으키는 알고리즘을 좋은 알고리즘으로 평가한다. 페이지 폴트 횟수는 페이지 참조열(Page reference string)을 통해 알 수 있다.
FIFO(First-In-First-Out): 가장 오래된 페이지를 교체
최적 페이지 교체 알고리즘(Optimal Page replacement)
LRU교체 알고리즘(Least Recently Used replacement Algorithm): 최근에 사용되지 않은 페이지를 교체
LFU(Least Frequently Used): 참조 횟수가 가장 적은 페이지를 교체(과거 이력을 기반)
페이지 테이블 구조
파일 시스템
← 이거 한눈에 보기 괜찮은듯!!! 순서만 좀 수정하면 좋을듯?!
책 추천
시스템 운용
•
시스템 성능 분석과 최적화 (위키북스, 2015)
•
BRF 성능 분석도구 (인사이트, 2021)
커널, 하드웨어 프로그래밍
•
모두를 위한 리눅스 프로그래밍 (제이펍,2018)
•
Go라면 알수 있는 시스템 프로그래밍 (람다노트, 2020)
•
UNIX 고급 프로그래밍 (대웅출판다, 2009)
•
리눅스 API의 모든것 (에이콘, 2012)
커널 개발
•
operating Systems: Design and Implementation (Pearson, 2006)
•
리눅스 커널 심층 분석 (aicon, 2012)
•
리눅스 커널의 이해 (한빛미디어, 2006)
공부순서
입문
•
혼자 공부하는 컴퓨터 구조 + 운영체제 (한빛미디어, 강민철)
•
그림으로 배우는 리눅스 구조(한빛미디어, 타케우치 사토루)
중
고급
단어집
15장 파일 시스템
파일 | file | 의미 있고 관련있는 정보를 모은 논리적인 단위 |
파일 속성 | file attribute | 파일과 관련된 다양한 부가 정보
- 파일 유형, 크기, 생성날짜, 마지막 접근/수정 날짜 등 |
디렉터리 | directory | 파일 또는 디렉터리들을 한데 묶어 관리할 수 있다. |
경로 | path | 디렉터리를 이용해 파일의 위치를 특정 짓는 정보
-절대 경로: 루트 디렉터리부터 시작하는 경로
-상대 경로: 현대 디렉터리부터 시작하는 경로 |
파티셔닝 | partitioning | 하드 디스크나 SSD처럼 용량이 큰 저장 장치를 하나 이상의 논리적인 여러 단위(파티션)로 구획하는 작업 |
포매팅 | formatting | 파일 시스템을 결정하는 작업 |
연속할당 | contiguous allocation | 파일을 보조기억장치에 연속적인 블록으로 할당하는 방식
- 단점: 외부 단편화 |
연결 할당 | linked allocation | 각 블록 일부에 다음 블록의 주소를 저장하여 블록들을 연결 리스트로 관리
- 단점: 중간 지점 찾기가 어려움
- 연결할당을 변형한 대표적인 파일시스템이 FAT파일 시스템 |
색인할당 | indexed allocation | 파일의 모든 블록 주소를 색인 블록에 모아 관리하는 방식
- 색인 할당을 기반으로 만든 파일 시스템: 유닉스 파일 시스템 |
FAT 파일 시스템 | FAT File system | FAT를 이용하는 연결할당 기반의 파일 시스템 |
유닉스 파일 시스템 | UNIX File system | i-node를 이용하는 색인할당 기반의 파일시스템 |