취준/CS 정리

면접을 위한 CS 전공지식 노트 정리 - 3.3 프로세스와 스레드

린구 2024. 7. 16. 16:56
반응형

`프로세스` 컴퓨터에서 실행되고 있는 프로그램

`작업` 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가 가진 자원을 요청하여 무한 대기

 

교착 상태의 원인

`상호 배제` 한 프로세스가 자원을 독점

`점유 대기` 특정 프로세스가 점유한 자원을 다른 프로세스가 요청

`비선점` 다른 프로세스의 자원을 강제로 가져올 수 없음

`환형 대기` 위의 사례

 

교착 상태의 해결 방법

- 애초에 조건이 성립되지 않도록 자원을 할당

- 교착 상태 가능성이 없을때만 자원 할당

- 자원 할당 가능 여부를 파악하는 `은행원 알고리즘` 사용

- 사이클이 있는지 확인하여 관련 프로세스를 하나씩 제거

- 응답 없음과 같이 작업 종료

 

`은행원 알고리즘`

- 총 자원의 양과 현재 할당 자원의 양을 기준으로 안정/불안정 상태로 나누고 안정 상태로 가도록 자원을 할당

 

 

반응형