본문 바로가기
프로그래밍/CS

CS스터디 1주차 - 프로세스

by 숙님 2023. 3. 16.
728x90

어제 1주 차 cs스터디를 진행하면서 느낀 점 

- 진행방식: 대(大)주제 안에 소(小)주제 5개 정도 있고, 무작위로 선정하여 하나씩 소수제에 대해 면접자가 되어서 질문에 답변
- 너무 빡세다.. 많았던 꼬리질문을 블로그에 담지 못했다..
- 꼬리질문이 너무 딥하게 들어간다 
- 철저한 개념 이해부터 다른 개념과의 연관성, 차이점까지 꼬리질문이 들어오니 준비를 더 잘해야겠다 
- 그래도 서로 잘 못대답하는 부분이 있으면 질문 후 서로 아는 것 공유하면서 더 공부가 된다 


1. 프로세스와 스레드 

- 프로세스와 프로그램의 차이점 
프로그램은 실행 가능한 코드와 정적 데이터의 집합체이며, 디스크 상에 존재합니다. 반면, 프로세스는 실행 중인 프로그램으로, 프로그램이 메모리에 적재되어 실행되는 상태를 말합니다. 즉, 프로그램은 파일 시스템에 저장되어 있고, 프로세스는 메모리에서 실행 중인 프로그램의 인스턴스입니다.
 
- 프로세스와 스레드 차이점 
프로세스(Process)는 실행 중인 프로그램으로 디스크에서 실행 가능한 파일을 메모리에 올리면 운영체제에서 관리하는 작업 단위입니다. 각각의 프로세스는 자신만의 주소 공간과 자원을 갖고, 다른 프로세스의 메모리에 직접 접근할 수 없습니다. 프로세스는 각각 독립적으로 실행되며, 운영체제는 각각의 프로세스에 CPU 시간을 할당하여 동시에 여러 작업을 처리할 수 있습니다.
스레드(Thread)는 프로세스 내에서 실행되는 작업 단위로, 프로세스 내에서 공유 메모리를 사용하여 다른 스레드와 데이터를 공유할 수 있습니다. 스레드는 프로세스 내의 주소 공간을 공유하므로, 한 스레드에서 변경된 데이터는 다른 스레드에서도 접근할 수 있습니다. 스레드는 프로세스 내에서 동시에 여러 작업을 처리할 수 있기 때문에, 프로그램의 실행 속도를 높일 수 있습니다.
프로세스와 스레드는 모두 운영체제에서 관리하는 작업 단위로, 프로세스는 자신만의 주소 공간을 갖고 다른 프로세스의 메모리에 접근할 수 없으며, 스레드는 프로세스 내에서 공유 메모리를 사용하여 다른 스레드와 데이터를 공유할 수 있습니다.
 
- Light-weight process란 
Light-weight process는 스레드와 프로세스의 중간 개념으로, 프로세스 내에서 독립적인 실행 흐름을 갖는데, 스레드와는 달리 각각의 LWP는 별도의 레지스터와 스택을 가지고 있으며, 스케줄링 단위로 사용됩니다. LWP는 멀티 스레드와 비슷하게 동작하며, 프로세스의 가벼운 버전으로 볼 수 있습니다.
 
- 멀티 프로세스, 멀티 스레드 정의와 속도 차이
멀티 프로세스는 여러 개의 프로세스가 동시에 실행되는 것을 말하며, 각 프로세스는 독립된 메모리 영역을 갖습니다. 멀티 스레드는 한 개의 프로세스 내에서 여러 개의 스레드가 동시에 실행되는 것을 말하며, 스레드는 하나의 메모리 영역을 공유합니다. 멀티 스레드는 멀티 프로세스보다 적은 자원을 사용하고, 스레드 간의 컨텍스트 스위칭이 더 빠르기 때문에 속도가 더 빠릅니다.
 
- 크롬의 탭은 프로세스인가 스레드인가 
크롬의 탭은 각각이 독립된 프로세스입니다. 따라서 각 탭은 프로세스의 개념으로 동작하며, 이는 하나의 탭에서 문제가 발생하더라도 다른 탭에 영향을 미치지 않는 안정성을 제공합니다.


2. 프로세스 메모리 구조 

- 프로세스와 스레드는 각각 어떻게 생성되는가 
프로세스는 운영체제에 의해 생성되며, 프로그램 실행에 필요한 자원을 할당 받습니다. 스레드는 프로세스 내에서 실행되는 작업 단위로, 프로세스 내에서 생성되며, 동시에 실행될 수 있습니다. 스레드는 프로세스의 자원을 공유하며, 경량화되어 빠른 실행이 가능합니다.
 
- 프로세스 메모리 구조 설명
프로세스 메모리 구조는 크게 4가지 영역으로 나눌 수 있습니다.

  1. 코드 영역: 프로그램의 실행 코드가 저장되는 영역으로, CPU가 직접 접근할 수 있는 메모리입니다.
  2. 데이터 영역: 전역 변수, 정적 변수 등의 데이터가 저장되는 영역으로, 초기화된 데이터와 초기화되지 않은 데이터가 각각 저장됩니다.
  3. 스택 영역: 함수 호출 시 생성되는 지역 변수와 매개변수 등이 저장되는 영역으로, 메모리의 끝에서부터 할당되며, 스택 포인터가 이동하면서 메모리를 사용합니다.
  4. 힙 영역: 동적으로 할당되는 메모리가 저장되는 영역으로, 메모리의 시작 주소를 반환하는 malloc()과 같은 함수를 사용하여 할당하고, free() 함수를 사용하여 해제합니다.

- 멀티 스레드랑 싱글 스레드 차이
싱글 스레드는 하나의 스레드만 사용하여 작업을 처리하는 방식이며, 작업이 순차적으로 처리됩니다. 멀티 스레드는 여러 개의 스레드를 사용하여 작업을 동시에 처리하는 방식이며, 작업이 병렬적으로 처리됩니다. 멀티 스레드는 작업을 더 빠르고 효율적으로 처리할 수 있지만, 스레드 간에 공유 자원을 관리하고 동기화하는 등의 복잡한 작업을 처리해야 하므로 디버깅이 어렵고 오류 발생 가능성이 높습니다.
 
- 멀티 스레드랑 싱글 스레드가 각 유리한 경우
싱글 스레드는 작업이 간단하고 단순한 경우, 그리고 자원을 공유하지 않고 독립적으로 처리해야 하는 경우에 유리합니다. 멀티 스레드는 대규모 데이터 처리나 복잡한 계산이 필요한 경우, 그리고 여러 스레드에서 공유 자원을 관리해야 하는 경우에 유리합니다. 또한, 멀티 스레드는 UI 업데이트와 같은 비동기적 작업을 처리하는 데도 유용합니다.
 
- 오버헤드가 발생하는 이유
오버헤드는 작업을 처리하는 데 필요한 추가적인 비용이 발생하는 현상입니다. 이는 작업을 처리하기 위해 필요한 자원을 할당하거나 해제하는 과정, 작업을 수행하기 위해 여러 과정을 거치는 등의 이유로 발생할 수 있습니다. 이러한 오버헤드는 작업을 처리하는 데 필요한 시간과 자원을 증가시키며, 성능 저하와 비용 증가를 초래할 수 있습니다. 따라서 시스템 설계나 프로그램 작성 시 오버헤드를 최소화하는 것이 중요합니다.
 
- 스레드와 프로세스 중 웹서버에 더 선호되는 것은 
웹서버는 많은 요청을 동시에 처리해야 하기 때문에 멀티스레드 방식이 보통 선호됩니다. 스레드는 프로세스보다 가벼우며, 스레드 간의 통신이 프로세스보다 더 쉽기 때문입니다. 또한, 스레드는 프로세스보다 공유 메모리 영역을 더 많이 활용하므로, 메모리 절약에도 효과적입니다. 그러나 스레드를 사용할 때는 동기화와 데드락 등의 문제를 해결해야 하므로 주의가 필요합니다.


3. 멀티 프로세스, 멀티 스레드 

- 스레드는 PCB 갖고 있나 
스레드는 PCB(Process Control Block)를 갖고 있습니다. PCB는 프로세스나 스레드의 상태, 레지스터 값, 실행 위치 등의 정보를 담고 있는 구조체로, 컨텍스트 스위칭이 일어날 때 현재 상태를 보존하고 다음에 실행될 때 불러오는 역할을 합니다. 따라서 스레드도 PCB를 갖고 있으며, 스레드의 상태 정보는 해당 스레드의 PCB에 저장됩니다.
 
- 자식 프로세스가 상태를 알리지 않고 죽거나, 부모 프로세스가 먼저 죽게 되면 어떻게 처리하나

  1. 좀비 프로세스 처리 : 자식 프로세스가 종료되면 해당 프로세스의 PCB(Process Control Block)는 운영체제에서 제거되지만, 해당 프로세스가 자신의 상태를 부모 프로세스에게 알리기 전에 종료되었다면, 해당 PCB는 메모리에 남아 있게 됩니다. 이러한 상태를 좀비 프로세스(Zombie Process)라고 합니다. 운영체제는 이러한 좀비 프로세스들을 제거하여 메모리 누수를 방지합니다.
  2. 부모 프로세스가 죽은 경우 : 부모 프로세스가 종료되었을 때, 운영체제는 자식 프로세스에게 SIGTERM 및 SIGKILL과 같은 시그널을 보내고, 해당 프로세스를 종료시킵니다.

- 프로세스 주소공간이란 
프로세스 주소 공간은 프로세스가 사용하는 메모리 공간을 말합니다. 이는 코드, 데이터, 스택, 힙 영역 등으로 구성되며, 각 영역은 프로세스 실행에 필요한 메모리 공간을 할당받습니다. 주소 공간은 가상 메모리로, 실제 물리적인 메모리보다 크게 할당되어, 여러 프로세스가 동시에 실행될 때 충돌하지 않고 동작할 수 있도록 합니다.
 
- Stack Heap 공간에 대해, 접근 속도가 빠른 공간은
접근 속도가 더 빠른 공간은 Stack입니다. Stack은 메모리 상에서 연속된 영역을 사용하며, 주로 함수 호출 시 매개변수, 지역 변수, 복귀 주소 등을 저장하는 데 사용됩니다. 이에 비해 Heap은 동적으로 메모리를 할당하고 해제하는 공간으로, 사용할 공간을 운영체제에 요청하여 할당받은 후 반환해야 합니다. 따라서 Heap은 Stack에 비해 접근 속도가 느리며, 메모리 관리에 대한 오버헤드가 발생합니다.


4. PCB와 Context Switching 

- 콘텍스트스위칭은 언제 일어날까
콘텍스트스위칭은 CPU가 하나 이상의 프로세스를 처리할 때 발생합니다. 이때 현재 실행 중인 프로세스의 상태를 보관하고, 다음 실행할 프로세스의 상태를 불러오는 작업이 수행됩니다. 이는 CPU의 처리 시간을 분할하여 여러 프로세스가 동시에 실행될 수 있도록 하기 위해 필요합니다.
 
- 프로세스와 쓰레드는 컨텍스트 스위칭이 발생했을 어떤 차이가 있을까
프로세스와 스레드는 모두 실행 중인 프로그램의 단위입니다. 하지만 콘텍스트 스위칭(Context Switching)에 대한 처리 방식에서 차이가 있습니다.
프로세스는 각각 독립된 메모리 공간을 가지고 있기 때문에, 프로세스 간 컨텍스트 스위칭이 발생하면, 현재 실행 중인 프로세스의 상태 정보를 PCB(Process Control Block)에 저장한 후, 새로운 프로세스의 PCB로 전환하여 해당 프로세스를 실행합니다. 이는 새로운 프로세스가 시작되는 것과 동일합니다.
스레드는 하나의 프로세스 내에서 실행되기 때문에, 컨텍스트 스위칭이 발생하면, 스레드 간의 스택, 레지스터 값 등의 상태 정보만 전환하면 됩니다. 따라서, 스레드 간의 컨텍스트 스위칭은 프로세스 간의 컨텍스트 스위칭보다 훨씬 빠릅니다.
 
- 컨텍스트 스위칭이 발생할 , 기존의 프로세스 정보는 커널스택에 어떠한 형식으로 저장되나
컨텍스트 스위칭이 발생할 때, 기존의 프로세스 정보는 PCB(Process Control Block)라는 구조체에 저장됩니다. 이 구조체에는 프로세스의 상태, 레지스터 값, 실행 위치 등의 정보가 저장되며, PCB는 커널스택에 저장됩니다. 다음에 실행될 프로세스의 PCB가 커널스택에서 불러와지고, 해당 프로세스의 상태가 복원됩니다.


5. Scheduling 

- Preemptive / Non-Preemptive 설명 
Preemptive와 Non-Preemptive는 스케줄링 방식에 대한 용어입니다. Preemptive는 운영체제가 프로세스 실행 중에도 강제로 다른 프로세스를 실행시킬 수 있는 방식이며, 실행 시간이나 우선순위 등을 기준으로 스케줄링이 결정됩니다. Non-Preemptive는 실행 중인 프로세스가 스스로 실행을 완료하기 전까지 다른 프로세스를 실행시키지 않는 방식으로, 실행 시간이 긴 프로세스가 우선순위를 가지게 됩니다
 
- Multi-level feedback Queue 나왔는지
첫째, 짧은 작업을 먼저 실행시켜 반환시간을 최적화하고자 합니다. 
둘째, MLFQ는 대화형 사용자(즉, 컴퓨터 사용자)에게 응답이 빠른 시스템이라는 느낌을 주고 싶기 때문에 응답 시간을 최적화 합니다.
 
- Linux Process Scheduling이란

  1. time slicing : 프로세스는 스케줄러 부터 타임 퀀텀을 할당 받는 방식으로 스케줄링
  2. priority : 각각의 프로세스는 우선순위에 기반해 다음 돌아갈 프로세스를 정함
  3. static/dynamic priority : 우선순위의 경우 고정되는 방식과 돌아가는 도중에 바뀌는 우선순위 두가지 방법을 다 지원
  4. preemptive : 자신의 프로세스보다 우선순위가 높은 프로세스가 존재할 경우 도중에 실행을 중단하고 자원을 넘겨줄 수 있음

- RR 사용할 , Time Slice 따른 trade-off란
Round Robin(RR) 스케줄링에서는 각 프로세스가 공정하게 CPU를 할당받기 위해 일정 시간(Time Slice) 동안 CPU를 할당합니다. 이 때, Time Slice의 크기는 짧으면 짧을수록 CPU가 빠르게 전환되어 공정한 스케줄링이 이루어지지만, Context Switching 오버헤드가 높아져 CPU 사용량이 감소할 수 있습니다. 반대로 Time Slice가 길면 Context Switching 오버헤드는 낮아지지만, 각 프로세스가 CPU를 점유하는 시간이 길어져 공정한 스케줄링이 어려울 수 있습니다. 따라서 Time Slice 크기를 적절히 조절하는 것이 trade-off를 관리하는 데 중요합니다.
 
- 싱글 스레드CPU에서상시로 돌아가야 하는 프로세스가 있다면, 어떤 스케쥴링 알고리즘을 사용하는 것이 좋을까
싱글 스레드 CPU에서는, 상시로 돌아가야 하는 프로세스가 있을 경우, 우선순위 기반 스케줄링 알고리즘을 사용하는 것이 좋습니다. 이는 해당 프로세스의 우선순위를 높게 설정하여, 다른 프로세스보다 우선적으로 CPU를 할당하도록 하기 때문입니다. 또한, 이를 위해 Aging 등의 기법을 사용하여, 우선순위가 낮은 프로세스도 일정 시간이 지나면 우선순위가 높아지도록 조정할 수 있습니다.
 
- 동시성과 병렬성의 차이
병렬성은 동일한 시간에 독립적인 작업을 실행할 수 있음을 의미합니다. 동시성과는 달리 여러 작업을 다른 코어, 다른 프로세스, 별도의 컴퓨터 등에서 동시에 실행할 수 있습니다. 그래서 병렬 처리가 성능 향상에 필수적이라고도 합니다.
 
- 스케쥴러와 비교하여, Multi-level Feedback Queue 어떤 문제점들을 해결한다고 있을까
Multi-level Feedback Queue 스케줄링은 우선순위 기반 스케줄링에서 발생할 수 있는 문제점들을 해결할 수 있습니다.

  1. Starvation 문제 해결 : 우선순위가 낮은 프로세스가 계속해서 CPU를 할당받지 못하는 Starvation 문제를 해결할 수 있습니다. 낮은 우선순위 프로세스도 일정 시간이 지나면 우선순위가 높아지기 때문입니다.
  2. Aging을 통한 Fairness 유지 : Aging 기법을 사용하여 우선순위가 낮은 프로세스도 일정 시간이 지나면 우선순위가 높아지도록 조정할 수 있어, 프로세스들 간의 Fairness를 유지할 수 있습니다.
  3. 다양한 작업량 처리 : 다양한 작업량을 가진 프로세스들을 적절히 처리할 수 있습니다. 우선순위를 가진 여러 큐들을 사용하며, 각각의 큐에서 작업량이 다른 프로세스들이 각자 적절한 큐에서 CPU를 할당받을 수 있습니다.

6. CPU Scheduling 

- 현대 OS에는 단기, 중기, 장기 스케쥴러를 모두 사용하고 있나
네, 현대 OS에서는 단기, 중기, 장기 스케쥴러를 모두 사용하고 있습니다. 각각의 스케쥴러는 다른 목적과 기능을 가지고 있으며, 적절한 시점에서 상호작용하여 프로세스를 효율적으로 관리하고 실행합니다. 단기 스케쥴러는 CPU 자원을 효율적으로 할당하고, 중기 스케쥴러는 메모리 관리를 위해 프로세스를 대기시키며, 장기 스케쥴러는 디스크 공간과 같은 시스템 자원을 효율적으로 사용하기 위해 새로운 프로세스의 생성과 관리를 담당합니다.
 
- 프로세스의 스케쥴링 상태
프로세스의 스케쥴링 상태는 크게 준비(Ready), 대기(Blocked), 실행(Running) 상태로 나뉩니다. 준비 상태는 CPU 자원을 할당받기 위해 준비 중인 상태, 대기 상태는 입출력 등 다른 자원을 기다리는 상태, 실행 상태는 CPU를 사용하여 작업을 수행하는 상태를 의미합니다. 스케쥴러는 이러한 상태를 기반으로 프로세스를 관리하고 CPU 자원을 효율적으로 할당합니다.
 
- preemptive/non-preemptive 에서 존재할 없는 상태가 있을까
preemptive/non-preemptive 스케쥴링에서는 모든 상태에 대해 스케줄링이 가능합니다. 프로세스가 실행 중인 상태에서도 일정 조건을 만족하면 preemptive 하게스케줄링할 수 있습니다. 따라서 존재할 수 없는 상태는 없습니다.
 
- Memory 부족할 경우, Process 어떠한 상태로 변화할까
Memory가 부족할 경우, 프로세스는 대기(Blocked) 상태로 전환됩니다. 메모리가 충분하지 않기 때문에 해당 프로세스를 중지하고 다른 프로세스가 CPU 자원을 사용할 수 있도록 합니다. 프로세스가 다시 실행될 수 있도록 메모리 공간을 확보해야합니다.

댓글