CS 면접 준비 - 운영체제(지속 업데이트 예정)

2024. 6. 5. 16:00단순답변정리

1. 프로세스와 쓰레드의 차이

 

 프로세스와 쓰레드의 가장 큰 차이는 메모리의 차이라고 생각합니다. 프로세스는 개별적으로 Data, Heap, Stack, Code 영역을, 쓰레드는 Stack 영역을 가집니다. 이러한 차이는 멀티 프로세스, 쓰레드 환경에서의 차이로 이어집니다. 프로세스는 서로 간의 데이터를 전송하기 위해서 소켓 혹은 파이프라인과 같은 방식으로 접근을 해야 하는데, 이는 복잡하고 느립니다. 반면 쓰레드는 공유하고 있는 메모리 영역이 있기 때문에 해당 영역으로 데이터를 주고 받으면 돼서 빠릅니다. 그래서 데이터를 나눠서 처리해야 하는 멀티 쓰레드를 통해서 작업을 합니다.

 

※ 꼬리 질문

그럼, 무조건 쓰레드가 좋은 걸까요?

 아니요, 쓰레드가 좋지 않을 수도 있습니다. 우리가 코드를 작성할 때 a라는 변수에 1을 더하는 경우, a+1이 원자적인 작업처럼 보이지만 실제적으로는 컴퓨터입장에선 a라는 변수의 값을 가져와 해당 변수에 1을 더하고 그 값을 레지스터에 저장하는 총 3개의 인스트럭션으로 나뉘어져있습니다. 그렇기 때문에 a라는 변수를 두 개의 쓰레드가 공유해 100만 개씩 더하면 200만이 나올 것 같지만 실제로는 200만보다 작은 값이 나오는 것을 관찰할 수 있습니다.

 

그럼, 그 문제를 해결하려면 어떻게 해야할까요?

 한 쓰레드가 점유를 했을 때에, 다른 쓰레드가 해당 자원에 접근하지 못하게 락을 걸어주면 됩니다. 락을 걸어주게 되면 작업하는 쓰레드가 접근했을 때, 다른 쓰레드가 접근하지 못해 원자성을 보장해줄 수 있습니다.

 

그럼, 쓰레드에 락을 걸어주면 빠르게 작업을 할 수 있겠네요?

 그건 확신할 수 없습니다. 락은 보통 해당 CPU 자원을 지속적으로 소모하는 것을 막기 위해 락으로 배제된 경우엔 해당 CPU 할당된 자원을 놓고,  yield라는 시스템 콜을 호출해서 다른 쓰레드로 이동을 합니다. 그런데 스케쥴링이 어떤 쓰레드가 할당될지 모르고 계속 쓰레드 자원을 포기하는 현상이 발생할 수 있습니다. 아니면 데드락과 같이 서로가 서로에게 필요한 자원을 잡고 있고 서로의 자원을 원하는 경우, 영원히 프로그램이 멈춘 채로 진전이 일어나지 않을 수 있습니다.


2. 데드락에 관해서 설명해주세요.

 

 데드락은 멀티 쓰레드 환경에서 서로가 서로에게 필요한 자원을 점유한 상태로 상대방의 자원을 원하는 경우에 발생합니다. 데드락이 발생하기 위해서는 4가지 조건이 필요합니다. No preemtion은 다른 쓰레드가 자원을 뻇어올 방법이 없는 것을, Mutual Exclusion은 자원에 한 개의 쓰레드만 접근이 가능한 것을, Hold and Wait은 해당 공유자원을 잡은 채로 대기하는 것을, Circular Wait은 원하는 자원 간의 관계도를 그렸을 때 순환하는 경우를 의미합니다. 이 모든 조건이 다 충족되었을 때 데드락은 발생하며 한 가지 조건이라도 불만족하는 경우, 데드락이 풀립니다.