본문 바로가기
운영체제/문제풀이

Operating System Concepts Chapter 4. 스레드 문제풀이

by 미네밍 2017. 1. 10.

chapter 4. 연습문제 풀기 숙제


4.1 단일 스레드와 비교하여 다중 스레딩 프로그램이 안좋을 수 있는 두 가지 사례


 -> 순차적 프로그램(sequential program) 같은 경우 좋지 않은 예가 될 것 같다. 예를 들면, 개인의 세금 환급액을 계산하는 프로그램들이 있다.

 -> "shell program" 같은 경우가 있다. (C-shell 이나 Korn shell 프로그램) 이러한 프로그램들은 자기 자신의 워킹 스페이스를 감독해야한다. 예를 들면 연 파일, 환경 변수, 최근 작업한 경로 등등을 감독한다. (자기 자신을 감독하는 경우니까 굳이 다중 스레딩으로 하지 않아도 된다는 의미 같다)


* sequential program vs parallel program : https://mivuletech.wordpress.com/2011/01/12/difference-between-sequential-and-parallel-programming/


 -> 동기화가 필요한 작업들...? 같은 변수를 공유하는 많은 스레드들이 동기화가 제대로 이루어지지 않는 경우


4.3 다중 스레드 프로세스의 스레드 사이에 공유되는 자원


a. 레지스터 값들  b. 힙 메모리  c. 전역 변수들  d. 스택 메모리


-> c. 전역변수, b. 힙 메모리


✡ 프로세스와 스레드 간의 차이점

- 스레드는 스레드를 위한 스택을 제외한 코드와 힙영역, 데이터들을 공유하는 반면, 프로세스는 그것들을 다른 프로세스와 공유하지 않는다.


4.4 Line C , Line P 출력


-> 5, 0


4.5 다중처리기 시스템, 다대다 모델에서의 세 가지 상황, 성능예측. (조건 : 사용자 수준 스레드 > 시스템 처리기)


사용자 수준 스레드와 커널 수준 스레드가 어떻게 상호작용(?) 하는지에 대한 이해가 잘 가지 않는다. 잘 모르겠다 이 문제는 ㅜㅜ


a. 프로그램에 할당된 커널 스레드 < 처리기 

(참고로 한국어판 교재에 있는 문제는 반대로 > 이러한 경우였는데, 솔루션들을 찾아보니 처리기가 더 많은 경우로 되어있었다. a,c가 비슷하길래 이상했는데, 번역 과정에서 오류가 있던 게 아닐까 ...)

 

 -> 커널 스레드가 처리기보다 작은 경우에는, 몇몇 처리기들은 커널 스레드를 기다려야 할 것이다. 스케쥴러가 유저레벨 스레드가 아닌 커널레벨 스레드에 처리기들을 다 할당하기 때문이다.

 

b. 프로그램에 할당된 커널 스레드 = 처리기


-> 각 스레드마다 하나의 처리기가 배정되기 때문에, 병렬 수행이 가능하다. + 하지만, 커널 스레드가 커널 안에서 봉쇄(block) 되었을 때 (페이지 폴트나 시스템 콜을 받는 동안), 배정된 처리기가 계속 기다려야 하는 경우가 생길 수 있다.


c. 사용자 수준 > 프로그램에 할당된 커널 스레드 > 처리기


-> 프로그램에 할당된 커널 스레드가 더 많기 때문에, 커널이 봉쇄(block) 되어도, 준비 상태에 있는 다른 커널 스레드로 교체되어 처리기가 기다리는 상태가 없어질 것이다. 그렇기 때문에 다중처리기 시스템의 효율성이 더 높아진다고 할 수 있다. 


4.9 다수의 사용자 수준 스레드를 사용하는 다중 스레드 해결책이 있다. 이것이 단일 보다 다중 처리기 상에서 더 나은지


-> 다중 처리기 상에서는, 시스템이 개별 스레드를 각 코어에 배정 가능하다. 단일 처리기 상에서는 시간에 따라 스레드들이 교차하며 실행되는 반면에, 다중 처리기 상에서는 스레드들이 병렬적으로 실행될 수 있으므로 효율적이다.


4.14 Linux vs Windows XP, Solaris 운영체제들이 프로세스와 스레드를 구별 혹은 구분하지 않는 것으로 나눠질 수 있다. 커널 안에서 이 두 가지 방식에 대해 비교하기


-> 솔직히 질문 자체가 잘 이해가 가지를 않는다. 정말 여러번 읽어봐도 왜이렇게 머리에 안들어오는지.. 여러 인터넷 페이지들을 보면서 그냥 내 나름대로 정리해 본 바로는,


1. windows 같은 경우는 fork() 로 자식 '프로세스'를 생성하는데, 이것은 복사의 개념이다. 스레드와 다르다

2. Linux 같은 경우는 clone() 을 제공하기 때문에 프로세스와 스레드를 구별하지 않는다고 표현한다. clone()은 '공유'의 개념이다. 보통 clone 은 공유를 얼만큼 할 것인가를 설정해 줄 수 있다. 만약 아무런 플래그없이 쓰면 하나의 독립된, 메모리 등 자원을 공유하지 않는 또다른 '프로세스'를 만드는 것과 같이 되는 것이고, 파일 시스템 정보, 메모리 공간 등을 공유한다고 설정해주면 스레드와 같은 개념이 된다.


fork() 와 clone() 의 개념을 참고한 페이지 - https://kldp.org/node/545


+ 커널 상에서의 두 모델에 대해 비교 하라는 말이라서 질문의 요지와 조금 다른 답변을 한 것 같다.


프로세스와 스레드가 비슷한 객체로 취급되는 시스템에서는, 운영체제 코드가 간결하다. 예를 들어, 스케쥴러는 서로 다른 '스레드' 와 '프로세스' 를 같은 입장으로 간주한다. 매 스케쥴링 과정에서 어떤 프로세스와 스레드가 연관되어 있는지를 매 스케쥴링 과정에서 요구하지 않는다.  

반면, 이러한 통합성은 (스레드와 프로세스를 같은 것으로 간주하는) process-wide 자원을 직접적으로 제한(constraint) 하기 어렵게 만든다. 

대신에, 어떤 스레드가 어떤 프로세스와 상응하는지, 또한 어떤 관련된 태스크들을 수행하는지를 확인하기 위해 조금 더 복잡성이 요구된다.


**그냥 공부한 내용 정리하려고 쓴 거라서 정답인지 아닌지 모릅니당**

댓글