`프로세스` 컴퓨터에서 실행되고 있는 프로그램
`작업` CPU 스케줄링의 대상
→ 둘이 거의 같은 의미로 사용
`스레드` 프로세스 내 작업의 흐름
📌 3.3.1 프로세스와 컴파일 과정
`프로세스` 프로그램으로부터 인스턴스화된 것
`프로그램` 컴파일러가 컴파일 과정을 거쳐 컴퓨터가 이해할 수 있는 기계어로 번역되어 실행될 수 있는 파일
`프로그램의 컴파일 과정`
`전처리` 소스 코드의 주석을 제거하고 헤더 파일을 병합하여 치환
`컴파일러` 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
`어셈블러` 어셈블리어는 obj 코드로 변환, 운영체제마다 확장자가 다름
`링커` 프로그램 내 라이브러리, 다른 파일들과 obj 코드를 결합하여 실행 파일을 만듦
라이브러리 - 정적/동적
`정적 라이브러리` 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
`동적 라이브러리` 프로그램 실행 시 필요할 때만 참조하는 방식
📌 3.3.2 프로세스의 상태
`생성`
- 프로세스가 생성된 상태, 이 때 PCB 할당
- fork() / exec()로 생성
`대기`
- 메모리가 충분하면 메모리를 할당받고 아니면 아닌 상태로 대기
- CPU 스케줄러로부터 CPU 소유권이 넘어오기를 기다리는 상태
`대기 중단`
- 메모리 부족으로 일시 중단된 상태
`실행`
- CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태
- CPU burst가 일어났다고도 표현
`중단 상태`
- 이벤트 발생 이후 기다리며 프로세스가 차단된 상태
- 인터럽트로 인하여 많이 발생
`일시 중단`
- 대기 중단과 유사
- 중단된 상태에서 프로세스가 실행되려 했지만 메모리 부족으로 일시 중단된 상태
`종료 상태`
- 메모리와 CPU 소유권을 모두 놓고 가는 상태
- 비자발적 종료로 종료되는 경우도 있음 (부모가 자식을 강제로 종료)
📌 3.3.3 프로세스의 메모리 구조
- 다음 구조를 기반으로 프로세스에 적절한 메모리가 할당됨
동적 영역 - 스택, 힙
정적 영역 - 데이터, 코드
스택은 위 주소부터 할당, 힙은 아래 주소부터 할당됨
`스택`
- 지연변수, 매개변수, 함수 저장
- `컴파일` 시 크기 결정 (동적)
- 함수가 재귀적으로 호출하면서 동적으로 크기가 늘어남! 따라서 힙과 스택 사이 공간을 비워둠
`힙`
- `런타임` 시 크기 결정
- 벡터와 같은 동적 배열
- 사용자가 직접 동적으로 할당하는 것들!
`데이터 영역`
- 전역변수, 정적변수 저장
- `BSS 영역` 초기화 되지 않은 변수가 0으로 초기화되어 저장
- `Data 영역` 0이 아닌 다른 값으로 할당된 변수들이 저장
`코드 영역`
- 프로그램에 내장된 소스 코드가 저장
- 수정 불가능한 기계어로 저장 (정적)
📌 3.3.4 PCB
`PCB`
- 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
- 프로세스 제어 블록
- 프로세스가 생성되면 해당 PCB를 생성
- 스케줄링 상태, 프로세스 ID, 권한, 카운터 등의 정보로 이루어짐
프로세스 생성 과정
1) 프로그램 실행
2) 프로세스 주소 값에 스택, 힙 구조를 기반으로 메모리 할당
3) 프로세스의 메타데이터가 PCB에 저장되어 관리
→ 중요한 정보를 포함하므로 커널 스택의 가장 앞부분에서 관리
컨텍스트 스위칭
- PCB를 교환하는 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
- 여러 프로그램 동시 실행 X, 프로세스끼리의 컨텍스트 스위칭이 아주 빠른 속도로 실행 (싱글코어 기준)
`캐시미스`
- 컨텍스트 스위칭에 드는 비용
- 가진 메모리 주소가 그대로 있으면 잘못된 주소 변환이 생기므로 캐시클리어 과정을 겪게 됨
`스레드에서의 컨텍스트 스위칭`
- 스레드에서도 일어남
- 스택 영역을 제외한 모든 메모리를 공유하기에 스레드에서는 비용이 더 적고 시간도 더 적음
📌 3.3.5 멀티프로세싱
`멀티프로세싱`
- `여러 개의 프로세스`, 동시에 두 가지 이상의 일을 수행하는 것
- 하나의 일을 병렬로 처리
- 특정 프로세스에 문제가 발생돼도 다른 프로세스를 이용
웹 브라우저
- 멀티프로세스 구조
- 브라우저 프로세스, 렌더러 프로세스, 플러그인 프로세스, GPU 프로세스로 구성
IPC
- Inter Process Communication
- 프로세스끼리 데이터를 주고받고 공유 데이터를 관리
ex) 클라이언트와 서버 간 데이터 교환
- 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메시지 큐
- 메모리를 완전히 공유하는 스레드보다는 속도가 떨어짐
`공유 메모리`
- 여러 프로세스에 `동일한 메모리 블록`에 대한 접근 권한을 부여
- 서로 통신할 수 있도록 `공유 버퍼`를 생성
`버퍼` 데이터 전송 시 일시적으로 데이터를 저장하여 처리 속도 차이를 조절하는 메모리 공간
- 기본적으로는 각 프로세스마다 다른 메모리 공간..
- 메모리 자체를 공유하기에 불필요한 데이터 복사가 필요 없어 가장 빠름
- 동기화 필요
`파일`
- 디스크에 저장된 데이터 또는 파일 서버에서 제공한 데이터
- 프로세스 간 통신
`소켓`
- 네트워크 인터페이스를 통해 전송하는 데이터
- TCP / UDP
`익명 파이프`
- 프로세스 간 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터 교환
- `단방향` 방식
- 부모, 자식 프로세스 간에만 사용 가능
`명명된 파이프`
- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 단방향, 또는 이중 파이프
- 여러 파이프를 동시에 사용 가능
- 다른 컴퓨터와도 가능
- 서버용, 클라이언트용 구분하여 작동
`메시지 큐`
- 메시지를 큐 데이터 구조 형태로 관리
- 커널에서 전역적으로 관리
- 사용 방법이 직관적이고 간단
- 공유 메모리는 동기화 때문에 복잡한데 얘는 간단함
📌 3.3.6 스레드와 멀티스레딩
스레드
- 프로세스의 실행 가능한 가장 작은 단위
- 프로세스는 여러 스레드를 가질 수 있음
- 프로세스 - 코드, 데이터, 스택, 힙을 각각 생성
- 스레드 - 코드, 데이터, 힙은 서로 공유
멀티스레딩
- 프로세스 내 작업을 `여러 개의 스레드`로 처리하는 기법
- 스레드끼리 서로 자원을 공유하기에 효율성이 높음
- 한 스레드가 중단돼도 다른 스레드는 실행 상태 ! 빠른 처리
- 그러나 스레드끼리 영향을 끼쳐 프로세스에 영향을 줄 수 있음
📌 3.3.7 공유 자원과 임계 영역
공유 자원
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는 자원이나 변수
- `경쟁 상태`(race condition) 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
임계 영역 (critical section)
- 공유 자원에 접근할 때 순서 등의 이유로 `결과가 달라지는 영역`
- 해결 방법 - 뮤텍스, 세마포어, 모니터
→ 모두 `상호 배제`, `한정 대기`, `융통성` 조건 만족
- 토대 메커니즘은 `잠금`(lock)
`상호 배제` 임계 영역에 한 프로세스만 들어갈 수 있음
`한정 대기` 특정 프로세스가 영원히 임계 영역에 들어가지 못하면 안됨
`융통성` 프로세스끼리 일을 방해해서는 안됨
`뮤텍스`
- 공유 자원을 사용하기 전에 잠금 설정, 사용한 후 해제
- 하나의 상태만 가짐 (잠금/잠금 해제)
`세마포어`
- 일반화된 뮤텍스
- 간단한 정수 값과 두 가지 함수 `wait` `signal`로 공유 자원에 대한 접근 처리
`wait` 차례가 될 때까지 기다리는 함수, 세마포어 값을 1 감소
`signal` 다음 프로세스로 순서를 넘겨주는 함수, 세마포어 값을 1 증가, 대기 중인 프로세스 깨우기
바이너리 세마포어
- 0 / 1 두 가지 값만 가지는 세마포어
- 뮤텍스라 할 수 있지만 엄밀히 말하면 다름
카운팅 세마포어
- 여러 개의 값을 가지는 세마포어
- 여러 자원에 대한 접근을 제어
`모니터`
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 `인터페이스만 제공`
- 공유 자원은 숨김
- 모니터큐를 통해 공유 자원 작업 처리
- 세마포어보다 구현하기 쉬움
- 상호배제 자동
📌 3.3.8 교착 상태 (deadlock)
- 두 개 이상의 프로세스들이 서로가 가진 자원을 기다리며 중단된 상태
ex) A는 B가 가진 자원을 요청, B는 A가 가진 자원을 요청하여 무한 대기
교착 상태의 원인
`상호 배제` 한 프로세스가 자원을 독점
`점유 대기` 특정 프로세스가 점유한 자원을 다른 프로세스가 요청
`비선점` 다른 프로세스의 자원을 강제로 가져올 수 없음
`환형 대기` 위의 사례
교착 상태의 해결 방법
- 애초에 조건이 성립되지 않도록 자원을 할당
- 교착 상태 가능성이 없을때만 자원 할당
- 자원 할당 가능 여부를 파악하는 `은행원 알고리즘` 사용
- 사이클이 있는지 확인하여 관련 프로세스를 하나씩 제거
- 응답 없음과 같이 작업 종료
`은행원 알고리즘`
- 총 자원의 양과 현재 할당 자원의 양을 기준으로 안정/불안정 상태로 나누고 안정 상태로 가도록 자원을 할당
'취준 > CS 정리' 카테고리의 다른 글
면접을 위한 CS 전공지식 노트 정리 - 3.2 메모리 (0) | 2024.07.11 |
---|---|
면접을 위한 CS 전공지식 노트 정리 - 3.1 운영체제와 컴퓨터 (0) | 2024.07.09 |
면접을 위한 CS 전공지식 노트 정리 - 2.5 HTTP (0) | 2024.07.04 |
면접을 위한 CS 전공지식 노트 정리 - 2.4 IP 주소 (0) | 2024.06.27 |
면접을 위한 CS 전공지식 노트 정리 - 2.3 네트워크 기기 (0) | 2024.06.21 |