목차
챕터3. 운영체제
3. 프로세스와 스레드
- 프로세스 process: 컴퓨터에서 실행되고 있는 프로그램
- CPU 스케줄링의 대상이 되는 작업 TASK이라는 용어와 거의 같은 의미
- 스레드는 프로세스 내 작업의 흐름 지칭
3.3.1 프로세스와 컴파일 과정
- 프로세스: 프로그램이 메모리에 올라가 인스턴스화된 것
- 예)
- 프로그램: 구글 크롬 프로그램 exe 와 같은 실행 파일
- 프로세스: exe를 두 번 클릭하면 프로세스로 변환됨
- 프로그램을 만드는 과정은 언어마다 상이
- C 언어 기반의 프로그램 기준
- 컴파일러가 컴파일 과정을 통해 컴퓨터가 이해할 수 있는 기계어로 번역하여 실행할 수 있는 파일 생성
- 예)
- 전처리: 소스 코드의 주석을 제거, #include 등 헤더 파일 병합하여 매크로를 치환
- 컴파일러: 오류 처리, 코드 최적화 작업을 하며 어셈블리어로 변환
- 어셈블러: 어셈블리어는 목적 코드 object code로 변환. 확장자는 운영체제마다 상이 (리눅스는 .o)
- 링커: 프로그램 내에 있는 라이브러리 함수 또는 다른 파일들과 목적 코드 결합하여 실행 파일 만듦
- 확장자: .exe, .out
- 라이브러리는 정적 라이브러리와 동적 라이브러리로 나뉨
- 정적 라이브러리:
- 프로그램 빌드 시 라이브러리가 제공하는 모든 코드를 실행 파일에 넣는 방식
- 장점) 시스템 환경 등 외부 의존도가 낮음
- 단점) 코드 중복 등 메모류 효율성이 떨어짐
- 동적 라이브러리:
- 프로그램 실행 시 필요할 때만 DLL이라는 함수 정보를 통해 참조하여 라이브러리를 쓰는 방법
- 장점) 메모리 효율성
- 단점) 높은 외부 의존도
3.3.2 프로세스의 상태
- 프로세스의 상태는 여러 가지 상태 값을 가짐
- 생성 상태 create
- 프로세스가 생성된 상태
- fork() 또는 exec() 함수를 통해 생성
- PCB가 할당됨
- 대기 상태 ready: 메모리 공간이 충분하면 메모리 할당 받고, 아니면 아닌 상태로 대기, CPU 스케줄러로부터 CPU 소유권이 넘어 오기를 기다리는 상태
- 대기 중단 상태 ready suspended: 메모리 부족으로 일시 중단된 상태
- 실행 상태 running: CPU 소유권과 메모리를 할당받고 인스트럭션을 수행 중인 상태 (=CPU burst)
- 중단 상태 blocked: 어떤 이벤트가 발생한 이후 기다리며 프로세스가 차단된 상태
- 일시 중단 상태 blocked suspended: 대기 중단과 유사, 중단된 상태에서 프로세스가 실행되려고 했지만 메모리 부족으로 일시 중단된 상태
- 종료 상태 terminated: 메모리와 CPU 소유권을 모두 놓고 가는 상태
- 자연스럽게 종료
- 부모 프로세스가 자식 프로세스를 강제시키는 비자발적 종료 abort로 종료
- 사용자 process.kill 등
3.3.3 프로세스의 메모리 구조
- 운영체제는 프로세스에 적절한 메모리 할당
- 스택과 힙
- 동적 할당: 런타임 단계에서 메모리를 할당받는 것
- 스택: 지역 변수, 매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역
- 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 스택에 계속해 저장됨
- 힙: 동적으로 할당되는 변수들을 담음
- 데이터 영역과 코드 영역
- 정적 할당: 컴파일 단계에서 메모리를 할당하는 것
- 데이터 영역
- BSS segment: 전역 변수 또는 static, const로 선언, 0으로 초기화 또는 초기화가 되어 있지 않은 변수들이 이 메모리 영역에 할당
- Data segment: 전역 변수 또는 static, const로 선언. 0이 아닌 값으로 초기화된 변수가 이 메모리 영역에 할당
- code segment: 프로그램의 코드
3.3.4 PCB Process Control Block
- 운영체제에서 프로세스에 대한 메타데이터를 저장한 데이터
- 프로세스 제어 블록이라고도 함
- 프로세스가 생성되면 운영체제는 해당 PCB를 생성
- 프로그램 실행 → 프로세스 생성 → 스택, 힙 등의 구조를 기반으로 메모리 할당
- → 프로세스의 메타데이터들이 PCB에 저장, 관리
- 프로세스의 중요 정보 포함 → 일반 사용자 접근 불가하도록 커널 스택의 가장 앞부분에서 관리됨
- PCB의 구조
- 프로세스 스케줄링 상태, 프로세스 ID
- 프로세스 권한, 프로그램 카운터, CPU 레지스터, CPU 스케줄링 정보, 계정 정보, I/O 상태 정보
- 등의 정보로 구성됨
- 컨텍스트 스위칭 context switching
- PCB를 교환하는 과정
- 한 프로세스에 할당된 시간이 끝나거나 인터럽트에 의해 발생
- 컴퓨터는 많은 프로그램을 동시에 실행하는 것처럼 보이지만
- 어떠한 시점에서 실행되고 있는 프로세스는 단 한 개
- 다른 프로세스와의 컨텍스트 스위칭이 아주 빠른 속도로 실행되기 때문
- 사실) 현대 컴퓨터 = 멀티코어의 CPU를 가지기 때문에 한 개의 프로그램 X
- → 싱글코어를 기준으로 설명
3.3.5 멀티프로세싱
- 여러 개의 “프로세스”, 즉 멀티프로세스를 통해 동시에 두 가지 이상의 일을 수행할 수 있는 것
- 하나 이상의 일을 병렬로 처리 가능
- 특정 프로세스의 메모리, 프로세스 중 일부에 문제 발생되더라도 다른 프로세스를 이용해 처리 가능 → 신뢰성 높음
- 웹 브라우저: 멀티프로세스 구조를 가짐
- 브라우저 프로세스, 렌더러 프로세스, 플러그인 프로세스, GPU 프로세스
- IPC Inter Process Communication
- 멀티프로세스는 IPC 가능
- IPC는 프로세스끼리 데이터를 주고 받고 공유 데이터를 관리하는 메커니즘
- IPC 예)
- 클라이언트: 데이터 요청
- 서버: 클라이언트 요청에 응답하는 것
- 종류: 공유 메모리, 파일, 소켓, 익명 파이프, 명명 파이프, 메세지 큐 등
- 메모리가 완전히 공유되는 스레드보다는 속도가 떨어짐
- 공유 메모리 shared memory
- 여러 프로세스에 동일한 메모리 블록에 대한 접근 권한이 부여되어, 프로세스가 서로 통신할 수 있도록 공유 메모리를 생성해서 통신하는 것
- 기본적으로는 각 프로세스의 메모리를 다른 프로세스가 접근 불가
- 공유 메모리를 통해 여러 프로세스가 하나의 메모리 공유 가능
- 메모리 자체 공유
- 불필요한 데이터 복사의 오버헤드 발생 X → 가장 빠름
- 같은 메모리 영역을 여러 프로세스가 공유 → 동기화 필요
- 하드웨어 관점) 공유 메모리는 CPU가 접근 가능한 RAM을 가르키기도 함
- 파일: 디스크에 저장된 데이터 또는 파일 서버에 제공한 데이터
- 소켓:
- 동일한 컴퓨터의 다른 프로세스나 네트워크의 다른 컴퓨터로 네트워크 인터페이스를 통해 전송하는 데이터
- TCP, UDP
- 익명 파이프 unamed pipe:
- 프로세스 간에 FIFO 방식으로 읽히는 임시 공간인 파이프를 기반으로 데이터 주고 받는 방식
- 단방향 방식의 읽기 전용, 쓰기 전용 파이프 만들어서 작동
- 부모, 자식 프로세스 간에만 사용 가능
- 다른 네트워크 상에서 사용 불가
- 명명된 파이프 named pipe:
- 파이프 서버와 하나 이상의 파이프 클라이언트 간의 통신을 위한 명명된 단방향 또는 양방향 파이프
- 클라이언트/서버 통신을 위한 별도의 파이프 제공
- 여러 파이프 동시 사용 가능
- 컴퓨터의 프로세스끼리 또는 다른 네트워크 상의 컴퓨터와도 통신 가능
- 메세지 큐
- 메세지를 큐 queue 데이터 구조 형태로 관리하는 것
- 커널의 전역변수 형태 등 커널에서 전역적으로 관리
- 다른 IPC 방식에 비해서 사용 방법이 매우 직관적, 간단
- 공유 메모리를 통해 IPC 구현 시,
- 쓰기 및 읽기 빈도가 높으면 동기화 때문에 기능 구현이 복잡
- → 대안으로 메세지 큐 사용
3.3.6 스레드와 멀티스레딩
- 스레드
- 프로세스의 실행 가능한 가장 작은 단위, 프로세스는 여러 스레드를 가질 수 있음
- 프로세스: 코드, 데이터, 스택, 힙을 각각 생성
- 스레드: 코드, 데이터, 힙은 스레드끼리 서로 공유. 그 외의 영역 각각생성
- 멀티스레딩
- 프로세스 내 작업을 여러 개의 스레드, 멀티스레드로 처리하는 기법
- 장점) 스레드끼리 서로 자원 공유, 효율성 높음, 동시성
- 단점) 한 스레드 문제 → 다른 스레드 영향, 스레드로 이루어져 있는 프로세스에 영향
3.3.7 공유 자원과 임계 영역
- 공유 자원 shared resource
- 시스템 안에서 각 프로세스, 스레드가 함께 접근할 수 있는
- 모니터, 프린터, 메모리, 파일, 데이터 등의 자원이나 변수
- 경쟁 상태: 공유 자원을 두 개 이상의 프로세스가 동시에 읽거나 쓰는 상황
- 임계 영역 critical section
- 둘 이상의 프로세스, 스레드가 공유 자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역
- 해결 방법: 뮤텍스, 세마포어, 모니터
- → 모두 상호 배제, 한정 대기, 융통성 조건 만족
- → 토대가 되는 매커니즘: 잠금 lock
- 뮤텍스 mutex
- 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후 unlock()을 통해 잠금 해제하는 객체
- 세마포어 semaphore
- 일반화된 뮤텍스
- 간단한 정수 값과 두 가지 함수 wait(), signal() 로 공유 자원에 대한 접근 처리
- 모니터
- 둘 이상의 스레드나 프로세스가 공유 자원에 안전하게 접근할 수 있도록 공유 자원 숨기고, 해당 접근에 대해 인터페이스만 제공
- 모니터큐를 통해 공유 자원에 대한 작업들 순차적 처리
3.3.8 교착 상태
- 교착 상태 deadlock: 두 개 이상의 프로세스들이 서로 가진 자원을 기다리며 중단된 상태
- 원인: 상호 배제, 점유 대기, 비선점, 환형 대기
- 해결 방법:
- 자원 할당 시 원인 조건이 성립되지 않도록 설계
- 교착 상태 가능성 없을 때만 자원 할당, 은행원 알고리즘
- 교착 상태 발생, 관련된 프로세스 하나씩 지움
- 작업 종류 (교착상태는 드물게 발생)
'Boaz > Computer Science' 카테고리의 다른 글
[CS 전공지식 #12] 챕터4-1. 데이터베이스의 기본 (0) | 2025.02.24 |
---|---|
[CS 전공지식 #11] 챕터3-4. CPU 스케줄링 알고리즘 (0) | 2025.02.17 |
[CS 전공지식 #9] 챕터3-2. 메모리 (0) | 2025.02.17 |
[CS 전공지식 #8] 챕터3-1. 운영체제와 컴퓨터 (0) | 2025.02.17 |
[CS 전공지식 #7] 챕터2-5. HTTP (0) | 2025.02.10 |