개발자는 기록이 답이다

운영체제 2주차 스터디 프로세스와 쓰레드 본문

CS/운영체제

운영체제 2주차 스터디 프로세스와 쓰레드

slow-walker 2024. 8. 22. 18:51
프로세스

📌 프로그램과 프로세스에 대해 설명해주세요.

프로그램은 저장장치에 존재하는 컴파일된 코드의 집합입니다.

실행되기 전까지는 그저 저장장치에 존재되는 데이터에 불과하지만, OS에서 명령을 받아 메모리에 적재하게 되면 그때부터는 운영체제의 관리를 받으며 CPU 자원을 통해 동작하는 '프로세스' 가 됩니다.

 

참고 : 혼자 공부하는 컴퓨터 구조와 운영체제

 

📌 프로세스 문맥에 대해 설명해주세요.

프로세스 문맥은 운영체제가 특정 프로세스를 실행하기 위해 필요한 모든 상태 정보를 말합니다. 프로세스가 실행되면서 사용하는 CPU 레지스터, 프로그램 카운터, 메모리 관리 정보, 스택 포인터, 프로세스의 현재 상태(실행 중, 대기 중, 종료 등), 열려 있는 파일 디스크립터 등과 같은 정보를 포함합니다.

프로세스 문맥은 프로세스가 일시적으로 중단되었다가 나중에 다시 실행될 때 해당 프로세스를 정확히 이전 상태에서 이어서 실행할 수 있도록 유지되어야 하는 중요한 데이터입니다.

 

 참고 : https://zangzangs.tistory.com/108

📌 문맥교환(context switch)에 대해 설명해주세요.

컨텍스트 스위칭이란 운영체제가 현재 실행 중인 프로세스의 문맥을 저장하고, 다른 프로세스의 문맥을 복원하여 그 프로세스를 실행하는 작업을 말합니다. 멀티태스킹 환경에서 필수적인 작업으로, 여러 프로세스가 CPU를 공유하면서 실행될 수 있게 합니다.

 

하나의 프로세스 수행을 재개하기 위해 기억해야할 정보를 문맥(context) 이라고 하며, 이러한 하나의 프로세스 문맥은 해당 프로세스의 PCB에 표현되어 있습니다. 기존 프로세스의 문맥을 PCB에 백업하고, 새로운 프로세스를 실행하기 위해 문맥을 PCB로 부터 복구하여 새로운 프로세스를 실행하는 것을 문맥 교(context switch)라고 합니다.

 

참고 : 혼자 공부하는 컴퓨터 구조와 운영체제

📌 문맥교환은 언제 발생하나요?

프로세스 A가 운영체제로부터 CPU를 할당받아 실행되다가 시간이 다 되어 프로세스 B에 CPU 사용을 양보해야 하는 경우 문맥 교환이 발생합니다. 

 

- 인터럽트 발생

- 시스템 호출(System Call)

- CPU 스케줄링에 따른 프로세스 변경

- 멀티 스레드 간 문맥 교환(스레드 스케줄링)

- 블로킹 I/O 요청(대기)

- 동기화 메커니즘 대기

 

참고 :

혼자 공부하는 컴퓨터 구조와 운영체제

https://csg1353.tistory.com/m/82

📌 문맥 교환 발생 과정에 대해서 조금 더 상세히 설명해주세요.

바로 직전까지 실행되던 프로세스 A는 프로그램 카운터를 비롯한 각종 레지스터 값, 메모리 정보, 실행을 위해 열었던 파일이나 사용한 입출력 장치 등 지금까지의 중간 정보를 백업해야 합니다. 그래야 다음 차례가 왔을 때 이전까지 실행했던 내용에 이어 다시 실행을 재개할 수 있습니다. 

 

  1. 현재 프로세스 문맥 저장
    • 실행 중인 프로세스의 상태 정보(CPU 레지스터, 프로그램 카운터, 스택 포인터 등)를 PCB(Process Control Block)에 저장합니다. PCB는 운영체제가 각 프로세스의 문맥을 관리하기 위해 사용하는 데이터 구조입니다.
  2. 스케줄러 호출
    • 운영체제의 스케줄러가 호출되어 다음에 실행할 프로세스를 결정합니다. 스케줄러는 다양한 스케줄링 알고리즘(예: Round Robin, Priority Scheduling 등)을 통해 다음 프로세스를 선택합니다.
  3. 새로운 프로세스 문맥 복원
    • 스케줄러에 의해 선택된 새로운 프로세스의 문맥이 해당 프로세스의 PCB에서 복원됩니다. 이 과정에서 새로운 프로세스의 상태 정보(CPU 레지스터, 프로그램 카운터, 스택 포인터 등)가 CPU에 로드됩니다.
  4. 프로세스 실행 재개
    • CPU는 복원된 문맥에 따라 선택된 프로세스를 실행하기 시작합니다. 프로그램 카운터가 가리키는 위치부터 명령어를 수행하며, 프로세스가 이어서 실행됩니다.

참고 : 혼자 공부하는 컴퓨터 구조와 운영체제

📌 프로세스의 메모리 공간에 대해 설명해주세요.

 

프로세스의 메모리 공간은 프로세스가 실행될 때 운영체제에서 할당받는 메모리 영역을 말합니다. 이 공간은 크게 4가지 주요 영역으로 나뉩니다. 즉, 프로세스가 생성되면 커널 영역에 PCB가 생성되고, 사용자 영역에는 프로세스가 코드 영역, 데이터 영역, 힙 영역, 스택 영역으로 나뉘어 저장됩니다.

1. 코드 영역(텍스트 영역)

  • 실행할 프로그램의 명령어 코드가 저장되는 영역입니다.
  • 데이터가 아닌 CPU가 실행할 명령어가 담겨있기 때문에 쓰기가 금지되어있고, 읽기 전용(read-only)공간입니다.
  • 다수의 프로세스가 같은 프로그램을 실행할 때 코드 영역을 공유할 수 있습니다.
  • 프로그램을 구성하는 명령어들이 갑자기 바뀔일이 없으므로 크기기가 변하지 않는 정적 할당 영역입니다.

2. 데이터 영역

  • 잠깐 썻다가 없앨 데이터가 아닌, 프로그램이 실행되는 동안 유지할 데이터가 저장되는 공간입니다.
  • 전역 변수와 정적 변수가 저장되는 공간으로, 이 영역은 프로그램이 시작될 때 할당되며, 프로그램이 종료될 때까지 유지됩니다.
  • 프로그램이 실행되는 동안 유지될 데이터이기 때문에 크기기가 변하지 않는 정적 할당 영역입니다.

3. 힙 영역

  • 프로그래머가 직접 할당할 수 있는 저장공간으로, 힙 영역에 메모리 공간을 할당했다면 언젠가는 반환해야 합니다.
    • 메모리 공간을 반환한다 : 더 이상 해당 메모리 공간을 사용하지 않겠다.
    • 메모리 공간을 반환하지 않는다면, 할당된 공간은 메모리 내에 계속 남아 메모리 낭비를 초래하고 메모리 누수가 발생합니다.
  • 프로세스 실행 과정에서 그 크기가 변할 수 있는 동적 할당 영역입니다.

4. 스택 영역

  • 데이터를 일시적으로 저장하는 공간으로, 데이터 영역과 달리 잠깐 쓰다가 사라지는 값이 저장되는 공간입니다.
  • 함수 호출 생겼다 사라지는 지역 변수, 매개 변수 등이 저장되는 영역입니다. 
    • 함수 호출 시 증가하고, 함수가 반환될 때 감소하며. 스택 오버플로우가 발생할 수 있으므로 주의해야 합니다.
  • 프로세스 실행 과정에서 그 크기가 변할 수 있는 동적 할당 영역입니다.

 

참고 : 혼자 공부하는 컴퓨터 구조와 운영체제

 

📌 프로세스 제어블록(PCB)에 대해 설명해주세요.

프로세스와 관련된 정보를 저장하는 자료구조 입니다. 

메모리는 커널 영역과 사용자 영역으로 나누어져 있는데, PCB는 커널 영역에 생성됩니다.

수 많은 프로세스들 사이에서 PCB로 특정 프로세스를 식별하고 해당 프로세스를 처리하는데 필요한 정보를 판단합니다.

PCB는 프로세스 생성 시에 만들어지고, 실행이 끝나면 폐기됩니다.

새로운 프로세스가 생성 되었다 = 운영체제가 PCB를 생성했다
프로세스가 종료되었다 = 운영체제가 해당 PCB를 폐기했다

 

모든 프로세스는 실행을 위해 CPU를 필요로 하지만, CPU자원은 한정되어 있습니다. 즉, 모든 프로세스가 CPU를 동시에 사용할 수 없습니다. 그래서 프로세스들은 차례때로 돌아가면서 한정된 시간만큼만 CPU를 이용하는데, 자신의 차례가 되면 정해진 시간만큼 CPU를 이용하고 시간이 끝남음을 알리는 인터럽트(타이머 인터럽트)가 발생하면 양보하고 다음 차례가 올때 까지 기다립니다. 이처럼 각 프로세스별로 필요한 CPU나 자원을 배분하기 위해 사용되는 것이 PCB입니다.

 

* 타이머 인터럽트 : 클럭 신호를 발생키니는 장치에 의해 주기적으로 발생하는 하드웨어 인터럽트 입니다.

 

참고 : 혼자 공부하는 컴퓨터 구조와 운영체제

📌 PCB에는 어떤 정보가 담겨있을까요?

- PID : 프로세스를 식별하기 위한 고유 번호

- 레지스터값 : 프로세스가 이전까지 실행했던 레지스터의 고유값을 복원한다. (Program Counter 등) 

- 프로세스 상태 : 현재 프로세스의 상태 정보를 저장

- CPU 스케줄링 정보 : 언제, 어떤 순서로 할당받을지에 대한 정보를 기록

- 메모리 관리 정보 : 프로세스가 어디에 저장되었는지를 확인할 수 있는 정보, 페이지 테이블 정보

- 프로세스 에 할당된 입출력장치의 정보 

참고 : 혼자 공부하는 컴퓨터 구조와 운영체제

📌 멀티 프로세스에 대해서 설명해주세요.

멀티 프로세스(Multi-process)는 하나의 운영체제에서 여러 개의 프로세스를 동시에 실행하는 것을 의미합니다. 멀티 프로세스 환경에서는 여러 프로세스가 독립적으로 실행되며, 각 프로세스는 별도의 메모리 공간과 리소스를 할당받아 작업을 수행합니다.

 

멀티 프로세스의 주요 장점은 다음과 같습니다

  • 안정성: 하나의 프로세스가 문제가 생기더라도 다른 프로세스에는 영향을 미치지 않습니다.
  • 병렬 처리: 다중 CPU 코어를 활용하여 여러 프로세스를 병렬로 처리할 수 있습니다.

그러나 멀티 프로세스는 프로세스 간의 문맥 교환이 발생할 때 오버헤드가 증가할 수 있으며, 프로세스 간의 데이터 공유가 어렵다는 단점이 있습니다.

📌 프로세스 수행 상태 변화 과정에 대해 설명해주세요.

프로세스의 수행 상태 변화는 운영 체제의 프로세스 관리의 중요한 부분입니다.

 

운영 체제는 프로세스의 생명 주기 동안 여러 가지 상태를 가지며, 프로세스의 현재 상황과 다음에 수행해야 할 작업을 나타냅니다.

 

  • 생성(New):
    • 프로세스가 처음 생성될 때의 상태입니다. 이 단계에서는 PCB가 생성되고 초기화됩니다.
  • 준비(Ready)
    • 프로세스가 CPU에서 실행될 준비가 된 상태입니다. 이 상태에서는 CPU를 할당받기를 기다립니다.
  • 실행(Running)
    • 프로세스가 CPU에서 실행되고 있는 상태입니다. 이 상태에서 명령어가 실행됩니다.
  • 대기(Waiting)
    • 프로세스가 특정 이벤트(I/O 완료, 자원 확보 등)를 기다리는 상태입니다. 이벤트가 발생하면 다시 준비 상태로 전환됩니다.
  • 종료(Terminated)
    • 프로세스가 실행을 완료하고 종료된 상태입니다. 이 상태에서는 PCB가 삭제되고, 할당된 리소스가 반환됩니다.

 

참고 : https://csg1353.tistory.com/m/84

📌 프로세스끼리 협력하는 방법에 대해서 설명해주세요.

 

IPC(Interprocess Communication)는 협력 프로세스 사이에서 서로 데이터를 주고 받는 방법을 의미합니다.

즉, 프로세스끼리 데이터를 주고 받고 공유 데이터를 관리하는 메커니즘을 뜻합니다. IPC의 종류로는 공유메모리, 파일, 소켓, 파이프, 메세지 큐가 있습니다.

 

예를 들어 브라우저를 띄워서 네이버 서버와 HTTP 통신해서 html 등의 파일을 가져오는 것도 IPC라고 볼 수 있습니다.

우리가 브라우저라는 어떤 프로그램을 띄우면 메모리에 올라가서 프로세스가 된다고 했는데, 주소창에 네이버를 입력하면, 네이버라는 서버에 요청을하는 것이다. 그러면 네이버 서버쪽에서도 어떤 프로세스를 띄워서 구동이 되는거라서 프로세스와 프로세스간 정보를 요청하고 응답하는거라 이것도 IPC입니다.

 

1. 공유 메모리

 

여러 프로세스가 서로 통신할 수 있도록 메모리를 공유하는 것을 말합니다

어떠한 매개체를 통해 데이터를 주고 받는게 아니라 메모리 자체를 공유하기 때문에 불필요한 데이터 복사의 오버헤드가 발생하지 않아 가장 빠르며, 같은 메모리 영역을 여러 프로세스가 공유하기 때문에 동기화가 필요합니다. IPC 중에서 가장 빠른 통신 방법입니다.

 

2. 파일

디스크에 저장된 데이터를 기반으로 통신하는 것을 의미합니다.

 

3. 소켓

 

네트워크 인터페이스(TCP, UDP, HTTP 등)를 기반으로 통신하는 것을 의미합니다.

 

4. 파이프

파이프는 익명파이프, 명명 파이프로 나눠집니다.

- 익명 파이프 : 익명 파이프(anonymous pipe or unnamed pipe)는 프로세스 사이에 FIFO 기반의 통신채널을 만들어 통신하는 것을 말합니다.

- 명명 파이프 : 명명파이프(named pipe)는 익명 파이프의 확장된 개념이며 부모, 자식 뿐만 아니라 다른 네트워크 상에서도 통신할 수 있는 파이프를 말합니다. 보통 서버, 클라이언트용 파이프를 구분해서 동작합니다.

 

5. 메세지큐

메시지를 큐(queue) 자료구조 형태로 관리하는 버퍼를 만들어 통신하는 것을 말합니다.

  1. 프로세스가 메시지를 보내거나 받기 전에 큐를 초기화합니다.
  2. 보내는 프로세스 A(sender)의 메시지는 큐에 복사되어 받는 프로세스 B(receiver)전달됩니다.

 

참고 : https://qkrtngus116.tistory.com/44

📌 fork() 명령어에 대해 설명해주세요.

 

fork()는 UNIX 및 Linux 환경에서 사용되는 시스템 호출로, 현재 프로세스를 그대로 복제하여 자식 프로세스를 생성하는 역할을 합니다.

주소 공간만 복사할 뿐이지 부모 프로세스의 비동기 작업 등을 상속하지는 않습니다. 자식 프로세스는 부모 프로세스와 동일한 코드, 데이터, 파일 디스크립터를 가지지만, 독립된 메모리 공간을 가집니다. fork() 호출 후, 부모 프로세스에는 자식 프로세스의 PID가 반환되고, 자식 프로세스에는 0이 반환됩니다. 이를 통해 부모와 자식 프로세스가 다른 동작을 수행할 수 있게 됩니다.

exec( )

exec()은 새롭게 프로세스를 생성하는 함수입니다.

 

스레드

📌 쓰레드에 대해 설명해주세요.

스레드는 프로세스 내에서 실행되는 하나의 흐름입니다. 하나의 프로세스는 여러 개의 스레드를 가질 수 있으며, 이들 스레드는 같은 메모리 공간을 공유하면서 독립적으로 실행됩니다. 스레드는 경량 프로세스로 불리기도 하며, 프로세스의 자원을 공유하면서 동시에 실행되는 단위입니다.

📌 쓰레드의 메모리 공간에 대해 설명해주세요.

스레드는 프로세스의 메모리 공간을 공유합니다. 이 공유 메모리에는 코드 섹션, 데이터 섹션, 힙 등이 포함됩니다. 그러나 각 스레드는 자신의 스택을 가지고 있으며, 이는 함수 호출이나 로컬 변수와 같은 데이터를 저장하는 데 사용됩니다. 스레드 간의 메모리 공유 덕분에 빠른 데이터 교환이 가능하지만, 동기화 문제를 주의해야 합니다.

📌 쓰레드 제어블록(TCB)에 대해 설명해주세요.

스레드 제어블록(TCB, Thread Control Block)은 스레드의 실행을 관리하기 위한 정보를 담고 있는 데이터 구조입니다. TCB에는 스레드 식별자, 프로그램 카운터, 레지스터 상태, 스택 포인터, 스레드 상태, 우선순위 등의 정보가 포함됩니다. 운영체제는 TCB를 참조하여 스레드의 상태를 관리하고 스케줄링합니다.

📌 사용자 수준 쓰레드와 커널 수준 쓰레드의 차이를 설명해 보세요.

  • 사용자 수준 스레드: 사용자 공간에서 관리되는 스레드로, 커널의 개입 없이 스레드 라이브러리를 통해 스케줄링됩니다. 문맥 전환이 빠르며, 운영체제에 독립적입니다. 그러나 한 스레드가 블록될 경우 전체 프로세스가 블록될 수 있습니다.
  • 커널 수준 스레드: 커널에서 직접 관리하는 스레드로, 운영체제가 스레드의 스케줄링과 관리를 담당합니다. 개별 스레드가 독립적으로 스케줄링되며, 한 스레드가 블록되더라도 다른 스레드는 계속 실행될 수 있습니다. 그러나 문맥 전환에 상대적으로 오버헤드가 큽니다.

📌 멀티 쓰레딩 프로그래밍 대해서 설명해주세요.

멀티 쓰레딩 프로그래밍은 하나의 프로세스 내에서 여러 스레드를 생성하여 병렬 처리를 수행하는 방법입니다. 각 스레드는 동시에 실행되며, 이를 통해 CPU 사용률을 극대화하고 프로그램의 성능을 향상시킬 수 있습니다. 멀티 쓰레딩은 주로 다중 작업을 수행해야 하는 응용 프로그램에서 사용됩니다.

📌  멀티 쓰레드 프로그래밍의 장단점을 설명해 주세요.

 

  • 장점:
    • 응답성 향상: UI 응용 프로그램에서 멀티 쓰레딩을 사용하면, 백그라운드 작업이 진행되는 동안에도 사용자가 응답을 받을 수 있습니다.
    • 자원 효율성: 프로세스의 메모리 공간을 공유하여, 새로운 프로세스를 생성하는 것보다 자원을 덜 소비합니다.
    • 병렬 처리: 멀티코어 시스템에서 병렬 처리를 통해 성능을 극대화할 수 있습니다.
  • 단점:
    • 동기화 문제: 여러 스레드가 동일한 자원에 접근할 때 경합 상태(race condition)가 발생할 수 있어, 이를 방지하기 위한 동기화 코드가 필요합니다.
    • 디버깅 어려움: 스레드 간의 상호작용으로 인해 디버깅이 어렵고, 복잡한 버그가 발생할 수 있습니다.
    • 오버헤드: 스레드 간의 문맥 전환과 동기화로 인해 오버헤드가 발생할 수 있습니다.

 

📌  멀티 프로세스대신 멀티 쓰레드를 사용하는 이유가 뭔가요?

멀티 프로세스는 각 프로세스가 독립적인 메모리 공간을 가지므로 안정성이 높지만, 프로세스 간의 데이터 교환이 복잡하고 오버헤드가 큽니다. 반면, 멀티 쓰레드는 메모리 공간을 공유하므로 자원 효율성이 높고, 데이터 교환이 용이하여 더 빠르고 가벼운 병렬 처리가 가능합니다.

📌 멀티 쓰레드 프로그래밍에서 주의할 점이 있을까요?

멀티 쓰레드 프로그래밍에서는 스레드 간의 동기화 문제에 특히 주의해야 합니다. 동기화가 잘못되면 경합 상태, 데드락, 교착 상태 등의 문제가 발생할 수 있습니다. 이를 방지하기 위해 뮤텍스, 세마포어, 모니터 같은 동기화 메커니즘을 적절히 사용해야 합니다.

📌  Thread-Safe하다는 의미와 그렇게 설계하는 방법을 설명해 주세요.

Thread-Safe는 여러 스레드가 동시에 접근해도 프로그램의 동작에 문제가 없도록 설계되었음을 의미합니다. Thread-Safe하게 설계하기 위해서는 다음과 같은 방법을 사용합니다:

  • 동기화 메커니즘 사용: 뮤텍스, 세마포어, 모니터와 같은 동기화 도구를 사용하여 공유 자원에 대한 접근을 제어합니다.
  • 불변 객체 사용: 불변 객체(immutable object)를 사용하면, 상태 변화가 없어 여러 스레드에서 안전하게 접근할 수 있습니다.
  • 스레드 로컬 저장소 사용: 각 스레드가 독립적인 데이터를 가질 수 있도록 스레드 로컬 변수를 사용하여 공유 데이터를 피합니다.
  • 원자적 연산 사용: 원자적 연산을 사용하여 데이터의 일관성을 보장합니다.

이와 같은 방법을 통해 멀티 쓰레드 환경에서도 안전하게 동작할 수 있는 프로그램을 작성할 수 있습니다.