본문 바로가기
CS/운영체제

운영체제 2주차 과제

by 미네구스 2024. 8. 20.

📌  프로세스와 쓰레드

📎 프로세스

프로그램의 실행 과정

어떤 프로그램을 실행시키게 되면, 해당 프로그램에 해당하는 주소공간이 생성됩니다.

이 주소 공간은 code, data, stack 영역으로 구성되어 있고 해당 영역의 이름은 Virtual Memory라고 부릅니다. 

물리적 메모리인 Physical Memory에는 주소 공간의 모든 데이터 정보가 저장되지 않고 필요한 정보만 저장됩니다.

 

+ Virtual Memory에서 Physical Memory로 주소 변환을 해주는 계층은 어디일까요? (네트워크 질문) 

 

커널 주소 공간의 내용


code

운영체제는 인터럽트가 들어올 때 CPU를 얻습니다.

  • 자원에 관련된 코드
  • 편리한 서비스 제공을 위한 코드
  • 시스템콜, 인터럽트 관련 코드

data

  • 하드웨어, PCB..

stack

  • 사용자 프로그램마다 커널 스택을 따로 둡니다. 
  • (커널) 함수가 실행되면 스택영역에 쌓입니다.
프로그램에 대해 설명해주세요.

파일이 저장 장치에 저장되어 있지만, 메모리에는 올라가 있지 않은 정적인 상태를 뜻합니다.

 

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

운영체제에 의해 메모리 공간을 할당받아 실행중인 프로그램을 프로세스라고 말합니다. 

 

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

 

프로세스의 현재 상태를 나타내는데 필요한 모든 요소를 프로세스 문맥이라고 합니다. 요소는 크게 세가지로 분류할 수 있는데,

CPU 수행 상태 (하드웨어)

현재 시점에서 프로세스가 instruction을 어디까지 실행했는가를 파악하기 위해선, 레지스터에 어떤 값이 있고, 프로그램 카운터가 어디를 가르키고 있는지에 대한 정보가 필요합니다. 

 

프로세스 주소 공간 (메모리)

현재 프로세스 주소 공간에 어떤 값들이 들어가 있는지 (stack / data / code) 를 파악을 해야 프로세스의 현재 상태를 정확하게 나타낼 수 있습니다.

 

프로세스 관련 커널 구조 (운영체제 관점)

커널이 가지고 있는 프로세스의 PCB(Process Control Block)와 커널 스택 (커널에 함수 호출이 이루어질 때 커널 스택 영역에 쌓이게 됩니다.)을 알아야 합니다. 커널 스택은 프로세스 별로 쌓이게 됩니다.

 

 

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

프로세스가 전환이 될 때, 기존 프로세스의 정보들 (레지스터 값, 메모리 정보, 실행 파일, I/O 등등..)이 백업이 되어있어야 이전 내용을 이어서 실행할 수 있습니다. 이 때 기억해야될 정보의 단위를 문맥이라고 하고, PCB에 저장이 되어있습니다. 

 

인터럽트가 발생하면, 운영 체제는 현재 실행중인 프로세스의 문맥을 백업하고, 다음 실행될 프로세스의 문맥을 복구합니다. 이 때 자연스럽게 다음 프로세스를 넘어가게 되고, 이 과정을 문맥 교환이라고 합니다.

 

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

현재 실행중인 프로세스가 운영체제로부터 CPU를 할당받다가 다음 프로세스에게 CPU의 사용권이 넘어갈 때 발생합니다. 

 

🎯 추가 

시스템 콜이나 인터럽트 발생 시, CPU가 사용자 프로세스에서 운영체제로 넘어가는데, 반드시 컨텍스트 스위칭이 일어나지는 않습니다.

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

프로세스는 사용자 영역에 코드, 데이터, 힙, 스택 영역으로 나뉘어 저장됩니다.

코드영역

실행할 수 있는 코드, 기계어로 된 명령어가 저장됩니다. (read-only 입니다)

데이터 영역

프로그램이 실행되는 동안 유지되는 데이터, 전역 변수, 정적변수같은 데이터가 저장됩니다.

힙 영역

메모리 주소 값에 의해서만 참조되고 사용되며, 프로그램 실행 시(런타임시)에 크기가 결정됩니다.

스택 영역

매개변수, 지연 변수 등 함수의 실행이 끝나면 사라지는 값들을 저장하는 공간입니다.

 

코드영역과 데이터 영역은 크기가 정해져 있는 반면, 힙과 스택 영역은 실행 과정에서 크기가 변할 수 있어 동적 할당 영역이라고 부릅니다.

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

운영체제가 각 프로세스를 관리하기 위해 프로세스 당 유지하는 정보를 말합니다. 커널 영역에 생성되며 수많은 프로세스들 중에서 PCB를 통해서 특정 프로세스를 식별할 수 있습니다.

 

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

 

PCB

 

1. OS가 관리하기 위해 사용하는 정보

2. CPU 하드웨어 값

3. 메모리 관리 정보

4. 파일 관련 (사용한 파일과 I/O목록)

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

하나의 부모 프로세스가 트리 형식으로 자식 프로세스를 생성하는 방식을 말합니다. 생성되는 프로세스들은 모두 독립적인 프로세스이고, 웹 브라우저 상단 탭에서 여러 창을 띄워놓는 경우가 멀티 프로세스를 설명할 수 있습니다.

 

멀티 프로세스 vs 멀티 프로세서 

두가지 의미는 완전히 다른데, 프로세서는 CPU 코어를 일컫는 말 입니다. 그래서, 멀티 프로세서는 여러개의 CPU가 하나의 시스템에서 돌아가는 방식을 이야기 합니다.

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

 

1) 시작 상태

2) 준비 상태

3) 실행 상태

4) 대기 상태

5) Blocked 상태

6) 중지 준비 상태

7) 종료 상태

가 있습니다.

 

추가해야함.

 

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

 

프로세스 간 협력 메커니즘(IPC)이 존재합니다.

메세지를 전달하는 방법

  • message passing: 커널을 통해서 메세지를 전달합니다. 

주소 공간을 공유하는 방법

  • shared memory: 원래 프로세스는 독자적인 주소 공간을 가지고 있는데, 프로세스 간에 주소 공간을 공유하는 메커니즘이 있습니다.
  • thread: 스레드끼리 주소 공간을 공유하므로 협력이 가능합니다.
fork() 명령어에 대해 설명해주세요.

 

부모 프로세스가 자식 프로세스를 생성하는 시스템 콜 호출을 fork()라고 합니다. 이 과정에서, 부모 프로세스의 주소 공간(PCB, 자원 등) 을 자식 프로세스가 복제하게 됩니다.

📎 쓰레드

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

하나의 프로세스 내부에 CPU 수행 단위가 여러개가 있는 경우를 스레드라고 부릅니다.

 

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

코드영역, 데이터영역, 힙 영역은 스레드끼리 서로 공유를 하지만, 각 스레드는 별도의 스택을 가지게 됩니다. 

 

스택 영역은 함수 호출과 관련된 정보를 저장하기 때문에 독립적인 스택 영역이 존재한 다는 것은 스레드 그 자체도 독립적인 실행 흐름을 가진다는 것을 의미합니다.

 

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

PCB와 유사하게 TCB는 각 스레드에 대한 정보를 담고 있는 자료 구조 입니다. TCB는 PCB안에 존재하며, 스레드의 상태 정보, ID, 스케줄링 정보 등을 관리하고 있습니다. 

 

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

커널엔 커널모드, 사용자모드 두개가 있는데 사용자 수준 쓰레드는 사용자 모드에서 동작하는 스레드이고, 커널 수준 쓰레드는 커널 모드에서 발생하는 쓰레드 입니다.

 

사용자 수준 쓰레드에선, 동일한 메모리 영역에서 병렬적으로 속도가 상대적으로 빠르다는 장점이 있지만, 하나의 쓰레드가 종료되면 나머지도 영향을 받는다는 단점이 있습니다.

커널 수준 쓰레드에선 스레드의 생성 및 스케쥴링 관리를 합니다.  사용자 쓰레드 1개낭 커널 쓰레드 1개가 생성되기 때문에 속도가 상대적으로 느리나, 이로 인해서 나머지 쓰레드에 영향이 미치지 않는다는 장점이 있습니다.

 

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

하나의 프로세스 안에 여러개의 스레드가 존재해서 하나의 프로그램에서 여러 동작을 동시에 처리하는 것을 말합니다. 

 

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

 

장점

메모리 낭비가 적다

멀티 프로세스 방식은, 프로세스가 생성될 때 부모 프로세스의 주소 공간까지 같이 복사한다고 이전에 말했습니다. 그래서, 프로세스를 fork() 해서 다른 프로세스를 생성한다면, code, data, heap 영역 등 중복된 정보들이 저장될 것 입니다. 반면에, 스레드는 같은 프로세스 내부에서 다른 스레드끼리 code, data, heap 영역을 공유합니다. 그렇기 때문에 다른 스레드가 생성되어도 메모리 낭비가 적습니다.

 

컨텍스트 스위칭 비용 감소

문맥교환이 이루어질 때, 기존 프로세스들의 정보를 저장하고, 다음 프로세스의 정보를 백업한다고 했는데 멀티 스레딩 방식은 정보를 교체할 때 공유하는 자원들을 제외하고 스레드의 대한 정보(stack, register)만 교체하면 되기 때문에 프로세스 문맥교환 오버헤드보다 비용이 적게 듭니다.

 

응답 시간 단축

앞서 이야기 했던 스레드끼리 자원 공유를 하는 특성과 문맥교환을 할 때 오버헤드가 작기 때문에 빠른 응답 시간을 보장합니다.

 

단점

안정성 문제

멀티 프로세스 방식은 예를 들 때 인터넷 창에서 여러개의 탭을 띄워놓는 경우를 이야기 했는데, 이 때 하나의 인터넷 페이지에서 오류가 발생하더라도 다른 탭은 문제없이 동작이 가능합니다.

 

하지만, 스레드는 다른 스레드끼리 자원을 공유하고 있기 때문에 하나의 스레드에 문제가 발생한다면 다른 스레드에도 영향을 받아 프로그램에 에러를 발생시킬 수 있습니다.

 

데드락 

공부 예정..

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

메모리 낭비가 적고, 컨텍스트 스위칭 시 오버헤드 비용이 적고 응답시간이 단축되기 때문입니다.

 

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

앞서 이야기한 안정성 문제가 존재할 것 같습니다. 하나의 스레드에 문제가 발생할 때 에러처리를 하거나 다른 방식을 통해 다른 스레드에 문제가 발생하지 않도록 구현을 해야합니다.

 

 

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

 

두 개 이상의 스레드가 race condition에 들어가거나 같은 객체에 동시 접근해도, 정합성이 보장될 수 있게끔 구현한 것을 말합니다.

  • 코드를 짜면서 Map을 구현할 때 일반적인 HashMap이 아닌 ConcurrentHashMap을 사용해서 구현해본 경험이 있습니다. 

 

 

프로세스가 실행이 되면 , PCB도 같이 생성이 됩니다. 프로세스의 메모리도 커널 영역과 사용자 영역으로 나뉘어져 있는데, 사용자 영역에는 코드, 스택, 힙, 데이터가 저장이되고 커널 영역에는 PCB가 생성됩니다. 문맥은 PCB에 저장된 정보를 보고 파악할 수 있습니다. 

 

 

 

사용자 영역에선 코드는 CPU가 실행할 명령어가 담겨 있고, 데이터 영역에선 전역 변수(global variable)이 저장되어 잇습니다. 코드 영역과 데이터 영역은 크기가 변하지 않는 정적 할당 영역인 반면, 힙 영역과 스택 영역은 동적 할당 영역입니다. 힙 영역에는 사용자가 직접 메모리 공간을 할당할 수 있고, 스택 영역에는 지역변수나 매개변수 등이 담깁니다. 

 

쓰레드가 실행되면 프로세스 내부에서 병렬적으로 생성이 되며, 스레드끼리는 코드, 데이터, 힙 영역을 서로 공유하게 되며 각자의 스택은 독립적으로 가지고 있습니다. (독립적인 함수 실행이 가능하다는 의미 입니다.) 이 영역을 공유하는 특징 덕분에 프로세스에 비해 가볍다고 볼 수 있습니다. 

 

 

추가 궁금한 사항

+) 스택은 왜 스레드끼리 공유가 안되나요? 

 

참고자료

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-multi-process-multi-thread

 

👩‍💻 멀티 프로세스 vs 멀티 스레드 비교 💯 완전 총정리

멀티 프로세스와 멀티 스레드는 한 어플리케이션에 대한 처리방식 이라고 보면 된다. 단순히 프로그램을 여러개 띄워놓는 것이 멀티 프로세스가 아니라 이 둘은 언제 어느때에 어떤 방식으로

inpa.tistory.com

 

https://velog.io/@alsgus92/ConcurrentHashMap%EC%9D%98-Thread-safe-%EC%9B%90%EB%A6%AC

 

[Java] ConcurrentHashMap는 어떻게 Thread-safe 한가?

ConcurrentHashMap이란? ConcurrentHashMap은 Java 1.5 버전에서 HashTable의 대안으로 처음 소개된 Collection이다. ConcurrentHashMap이 나오기전까진 multi-thread에서 map을 thread-safe하게

velog.io

 

http://www.kocw.net/home/search/kemView.do?kemId=1046323

 

운영체제

운영체제는 컴퓨터 하드웨어 바로 위에 설치되는 소프트웨어 계층으로서 모든 컴퓨터 시스템의 필수적인 부분이다. 본 강좌에서는 이와 같은 운영체제의 개념과 역할, 운영체제를 구성하는 각

www.kocw.net

 

https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4#:~:text=%ED%95%9C%EB%8B%A4%EB%8A%94%20%EC%A0%90%EC%9D%B4%EB%8B%A4.-,TCB%20(Thread%20Control%20Block),%EB%82%B4%EC%97%90%20%EC%9C%84%EC%B9%98%ED%95%9C%20%EA%B2%83%20%EC%B2%98%EB%9F%BC%20%EB%A7%90%EC%9D%B4%EB%8B%A4.

 

👩‍💻 ‍완전히 정복하는 프로세스 vs 스레드 개념

한눈에 이해하는 프로세스 & 스레드 개념 전공 지식 없이 컴퓨터의 프로그램을 이용하는데는 문제 없어 왔지만 소프트웨어를 개발하는 사람으로서 컴퓨터 실행 내부 요소를 따져보게 될때, 아

inpa.tistory.com

 

https://velog.io/@raejoonee/%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EC%99%80-%EC%8A%A4%EB%A0%88%EB%93%9C%EC%9D%98-%EC%B0%A8%EC%9D%B4

 

프로세스와 스레드의 차이

프로세스와 스레드의 차이는 프로세스와 스레드, 그리고 프로그램이 작동하는 방식에 대해서 잘 이해하고 있는지 확인하기 위해 기술면접에서 단골 질문 사항으로 나온다.

velog.io

 

'CS > 운영체제' 카테고리의 다른 글

운영체제 5주차 과제  (0) 2024.09.12
운영체제 4주차 과제  (0) 2024.09.05
운영체제 3주차 과제  (0) 2024.08.29
운영체제 1주차 과제  (0) 2024.08.14