프로세스에 대해 설명해주세요.
: 운영체제로부터 메모리 공간을 할당 받아 실행중인 프로그램을 의미합니다.
프로세스의 특징
- 프로세스들은 서로 독립된 메모리 공간을 가지므로, 프로세스끼리는 임의로 서로의 영역에 접근할 수 없습니다.
- IPC(inter process communication)를 통해 프로세스간에 통신할 수 있다.
- 프로세스는 운영체제 커널에 의해 관리됩니다.
- 커널은 프로세스를 위해 사용자 공간에 메모리를 할당하고, 프로세스 ID를 부여하며, 프로세스 테이블을 이용하여 생성된 모든 프로세스의 정보를 관리합니다.
프로그램에 대해 설명해주세요.
: 하드 디스크나 USB 등 저장장치에 저장된 실행 가능한 파일입니다.
프로세스의 메모리 공간에 대해 설명해주세요.
: 프로세스는 4개의 메모리 영역으로 구성되며, 이들은 모두 사용자 공간에 형성됩니다.
- 코드 영역 : 프로세스 코드가 적재되는 영역
- 데이터 영역 : 프로세스의 전역 변수와 정적 변수들이 적재되는 영역
- 힙 영역 : 프로세스가 실행 중에 동적 할당받는 영역 (e.g. c언어의 malloc, Java의 new 연산자로 생성되는 객체들)
- 스택 영역 : 함수가 호출될 때 함수 내부의 지역변수, 매개변수, 함수의 리턴 값, 복귀 주소 등이 저장되는 영역
프로세스 제어블록(PCB)에 대해 설명해주세요.
: 커널이 각 프로세스를 생성할 때마다 저장하는 프로세스의 정보입니다.
커널은 시스템 전체에 하나의 프로세스 테이블을 두고 모든 프로세스의 정보를 관리합니다.
프로세스 제어블록을 생성할 때, 운영체제는 프로세스 테이블의 한 항목으로써 PCB를 PID와 1:1 매핑시켜 저장합니다.
프로세스 테이블과 PCB는 커널 공간에 생성되며 커널만이 접근할 수 있습니다.
PCB에는 어떤 정보가 담겨있을까요?
: 프로세스 관리의 핵심 데이터들이 담겨있습니다.
- 프로세스 번호 (PID)
- 부모 프로세스 번호 (PPID)
- 프로세스 수행 상태 정보 : 생성 초기, 실행, 준비 등
- 프로세스 컨텍스트 정보 : 현재 프로세스의 실행 상태 (PC, SP 등 레지스터들의 값)
- 스케줄링 정보 : 프로세스의 우선순위, 프로세스가 사용한 CPU 시간 등
- 종료 코드
- 프로세스의 오픈 파일 테이블
- 메모리 관리를 위한 정보
- 프로세스 사이의 통신 정보
- 회계 정보
- 소유자 정보
프로세스 수행 상태 변화 과정에 대해 설명해주세요.
- 생성(New) 상태 : 프로세스를 생성하면서 커널은 새 프로세스의 데이터와 코드를 메모리에 적재하고 PCB를 만들어 프로세스 테이블에 등록합니다. 실행 준비를 마쳤을 때 프로세스를 준비(Ready) 상태로 만듭니다.
- 준비(Ready) 상태 : 프로세스가 스케줄링(실행)을 기다리는 상태.
준비 상태의 프로세스들은 커널에 있는 준비 큐(Queue)에 들어갑니다.
실행중이던 프로세스가 종료되거나 중단되는 경우, 다음 프로세스가 CPU 스케줄링에 따라 실행됩니다. - 실행(Running) 상태 : CPU에 의해 현재 실행되고 있는 상태.
컨텍스트 스위칭 과정 : 프로세스를 실행 상태에서 다른 상태로 바꿀 때, 스케줄링을 시행한 다음, 실행 상태였던 프로세스의 컨텍스트를 PCB에 저장하고, 다음에 실행하기로 스케줄링된 프로세스의 PCB로부터 컨텍스트를 가져와 CPU에 복귀시킵니다. - 대기(Blocked) 상태 : 프로세스가 I/O 등을 요청하고 그 완료를 기다리는 상태
- 종료 상태 : 프로세스가 종료하면 커널은 프로세스가 차지하고 있던 메모리와 할당받았던 자원들을 모두 반환합니다.
현대 운영체제는 시분할 시스템으로, 동시에 여러 프로세스를 메모리에 올려놓고 번갈아 실행하기 때문에 프로세스들의 상태가 다양해지게 되었습니다.
프로세스끼리 협력하는 방법에 대해서 설명해주세요.
IPC(inter process communication)를 통해 프로세스간에 통신할 수 있습니다.
공용 파일 또는 운영체제가 제공하는 파이프를 사용하여 통신합니다.
⭐ 멀티 프로세스에 대해서 설명해주세요.
: 하나의 부모 프로세스가 여러 개의 자식 프로세스를 생성함으로써 여러 개의 프로세스를 수행하는 것입니다.
프로세스는 프로세스 생성 시스템 콜을 통해 새로운 프로세스들을 생성할 수 있는데, 다른 프로세스를 생성하는 프로세스를 부모 프로세스(Parent Process)라 하고, 다른 프로세스에 의해 생성된 프로세스를 자식 프로세스(Child Process)라 한다.
멀티 프로세스의 예로는 웹 브라우저의 각각의 탭들이 있습니다.
fork() 명령어에 대해 설명해주세요.
: 프로세스에서 새로운 자식 프로세스를 생성하는 명령입니다.
이때 새로운 프로그램을 생성시킨 프로그램을 부모 프로세스, 생성된 프로그램을 자식 프로세스라고 합니다.
문맥교환(context switch)에 대해 설명해주세요.
: 컨텍스트 스위칭은 CPU가 한 프로세스에서 다른 프로세스로 전환할 때 발생하는 과정입니다.
좀 더 구체적으로 말씀드리자면, 동작 중인 프로세스가 대기를 하면서 해당 프로세스의 상태(Context)를 보관하고, 대기하고 있던 다음 순서의 프로세스가 동작하면서 이전에 보관했던 프로세스의 상태를 복구하는 작업을 말한다. 컨텍스트 스위칭의 주체는 스케줄러이며, 스케줄링 정책에 따라 프로세스들의 순서가 결정됩니다.
CPU는 한 번에 하나의 프로세스만 실행할 수 있으므로, 여러 개의 프로세스를 번갈아가며 실행하여 CPU 활용률을 높이기 위해(마치 동시에 실행되는 것처럼 하기 위해) 컨텍스트 스위칭이 필요한 것입니다.
문맥교환은 언제 발생하나요?
: 시스템 호출이나 인터럽트 서비스 루틴이 실행되면서 이루어집니다.
- I/O 작업을 요청하는 경우, 대기 상태로 전환
- 타임 슬라이스(시분할 시스템)를 모두 소진한 경우, 타이머 인터럽트에 의해 준비 상태로 전환
- I/O 장치로부터 인터럽트가 발생한 경우
- 스레드가 자발적으로 다른 스레드에게 양보하는 경우
- 문맥 교환 발생 과정에 대해서 조금 더 상세히 설명해주세요.
👶 컨텍스트 스위칭은 다중 프로그래밍에서 생겨난 개념으로, 한번에 여러 프로그램을 메모리에 올려놓고 최대한 많은 CPU 점유가 가능하도록 하기 위해 프로세스 혹은 스레드의 실행 환경 정보를 교환하는 것을 말합니다. 이러한 정보들은 레지스터에 저장됩니다.
쓰레드에 대해 설명해주세요.
: 프로세스 내에 존재하는 실행 흐름입니다.
현대 운영체제의 실행 단위이며
CPU를 할당하는 스케줄링 단위입니다.운영체제는 스레드를 TCB를 통해 제어합니다.
스레드는
- 빠른 컨텍스트 스위칭
- 프로세스보다 작은 실행 단위 필요
- 프로세스들 사이의 통신에 대한 어려움 해소
등의 목적으로 출현하게 되었습니다.
쓰레드의 메모리 공간(스택, 데이터, 코드)에 대해 설명해주세요.
쓰레드는 프로세스로부터 각각의 스택을 나눠갖지만 데이터, 코드, 힙의 공간은 여러 스레드가 공유한다.
같은 프로세스의 스레드끼리는 해당 프로세스 내에 선언된 코드/데이터/힙 영역과 기타 운영체제 자원을 공유합니다.
반면에 각 스레드는 독립적인 스레드 ID, 스레드 컨텍스트(PC와 레지스터 집합), 스택 영역을 가집니다.
쓰레드 제어블록(TCB)에 대해 설명해주세요.
: 커널은 스레드를 실행 단위로써 관리하기 위해, 스레드가 생성될 때마다 커널 내에 스레드 제어 블록(TCB, Thread Control Block)을 만들어 관리합니다.
TCB에는 스레드 관리를 위한 정보들이 담기는데,
- 스레드 정보 : 스레드 ID, 스레드 상태 정보
- 컨텍스트 정보 : PC(스레드가 다음에 실행할 명령의 주소), SP 등의 레지스터 값들
- 스케줄링 정보 : 우선순위, CPU 사용 시간
등이 있습니다.
⭐ 프로세스와 쓰레드가 어떤차이가 있는지 예시를 들어 설명해주세요.
👶 c언어로 만든 프로그램이 있다고 할 때, 해당 프로그램이 실행된 것을 프로세스라고 부르고 main 함수는 메인 스레드가 수행할 작업이 됩니다.
- 프로세스는 각각 독립된 메모리 영역(Code, Data, Stack, Heap의 구조)을 할당받고 고유 프로세스 ID를 가집니다.
프로세스끼리는 서로의 영역에 접근할 수 없습니다.
한 프로세스가 다른 프로세스의 자원에 접근하려면 IPC(inter-process communication)을 사용해야 합니다. - 스레드는 IPC와 같은 별도의 통신 방법 없이도 같은 프로세스의 Code, Data, Heap 메모리 영역을 공유합니다.
- 과거의 실행 단위는 프로세스였지만, 현대 운영체제의 실행 단위는 스레드입니다.
⭐ 멀티 쓰레딩에 대해서 설명해주세요.
: 멀티 스레드는 하나의 프로세스 안에 여러개의 스레드가 있는 것을 말합니다.
웹 서버는 대표적인 멀티 스레드 응용 프로그램이다.
사용자가 서버 데이터베이스에 자료를 요청하는 동안 다른 HTTP 통신을 할 수 있게 됩니다. 즉, 하나의 스레드가 지연되더라도, 다른 스레드는 작업을 지속할 수 있게 된다.
사용자 수준 쓰레드와 커널 수준 쓰레드의 차이를 설명해 보세요.
- 사용자 수준 스레드란, 라이브러리를 통해 구현한 스레드를 의미합니다. 스레드와 관련된 모든 행위를 사용자 영역에서 하기 때문에, 커널은 사용자 수준 스레드의 존재를 알지 못하고 스레드 교환에 개입하지 않습니다.
- 커널 수준 스레드란, 커널이 직접 생성하고 관리하는 스레드를 의미합니다.
멀티 쓰레딩 프로그래밍 대해서 설명해주세요.
- 쓰레드는 프로세스의 자원을 공유하기 때문에 fork로 인한 쓰레드 생성은 프로세스 생성보다 빠릅니다. (공유하는 부분을 제외한 부분만 복사하면 되기 때문 입니다.)하지만 쓰레드가 접근하는 공유 데이터에 대해 동기화 작업을 수행해야 합니다.
- 또한 커널의 개입 없이 쓰레드간 통신을 할 수 있습니다.
- 멀티쓰레딩은 프로세스로 해야하는 작업을 여러개의 쓰레드로 나누어서 수행하는 것을 말합니다.
멀티 쓰레드 프로그래밍의 장단점을 설명해 주세요.
- 장점
- 프로세스 내에 있는 모든 스레드들이 프로세스의 자원을 공유하므로 자원 중복에 대한 낭비를 막을 수 있습니다.
- 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도, 다른 스레드가 작업을 이어서 할 수 있습니다.
- 단점
- 한 스레드에 문제가 생기면 전체 스레드에 영향을 미칩니다.
- 공유 자원에 대한 동기화가 필요합니다.
- 멀티 스레드 프로그래밍은 하나의 프로세스에서 여러 개의 스레드를 만들어 처리하는 프로그래밍 방식입니다.
멀티 프로세스대신 멀티 쓰레드를 사용하는 이유가 뭔가요?
- 프로세스 내에 있는 모든 스레드들이 프로세스의 자원을 공유하므로, 자원 중복에 대한 낭비를 막을 수 있습니다.
멀티 쓰레드 프로그래밍에서 주의할 점이 있을까요?
- 자원을 공유하기 때문에 Thread-safe하게 작성하여, 동시성 이슈가 발생하지 않도록 해야 합니다.
Thread-Safe하다는 의미와 그렇게 설계하는 방법을 설명해 주세요.
배운 점
- 너무 암기에 의존하려고 하지 말자. 이해한 내용을 평소 말하듯이 말하는게 가장 자연스럽다.
참고 자료
- 명품 운영체제 - 황기태
- https://github.com/Seogeurim/CS-study/tree/main/contents/operating-system
- https://en.wikipedia.org/wiki/Thread_(computing)
- https://gmlwjd9405.github.io/2018/09/14/process-vs-thread.html
'CS > 운영체제' 카테고리의 다른 글
[OS] 스터디 3주차 : CPU 스케줄링 (0) | 2023.09.30 |
---|---|
[OS] 스터디 1주차 : 운영체제와 커널, 다중 프로그래밍 (0) | 2023.09.15 |