[OS] 3-2. Process 2
- IT/OS
- 2020. 12. 24.
2장 부연설명
"설명 드리기에 앞서 2장 동기식 입출력과 비동기식 입출력의 차이점에 대한 질문이 많이 들어와서 먼저 이것에 대한 간단한 부연 설명을 드리고 나서 3장을 계속 진행하겠습니다." -교수님-
-
사용자 프로세스가 OS에게 IO요청을 한 경우, IO가 수행되는 동안 이 프로세스가 입출력이 끝날때가지 아무일 안하고 기다린다면 동기식 입출력.
-
사용자 프로세스가 입출력 요청을 했을 때, 입출력이 진행되는 동안 그 프로세스가 무언가를 instruction을 하면 비동기식 입출력
-
동기식이냐 비동기식이냐를 구분할 때 프로세스가 CPU를 가지고 있느냐 없느냐는 중요하지 않음. IO작업 동안 다른 무언가를 실행하지 않고, 결과를 받을때 까지 기다린다면 동기식. IO작업 요청을 한 다음 자신의 일을 계속 수행하는 경우는 비동기식
-
동기식 입출력의 프로세스는 IO가 완료될 때까지는 일을 하지 못함. 이 때 CPU를 가지고 있으면서 기다리면 구현 방법 1. 어차피 일을 못할 거 다른 프로세스에게 넘겨 준다면 구현 방법 2.
Thread
-
쓰레드 : CPU 수행 단위
-
쓰레드마다 독립적으로 가지고 있는 것 : Program Counter, 레지스터, 스택(밑에 그림 참조)
-
쓰레드들끼리 공유하는 부분을 task라고 함
-
프로세스를 별도로 여러 개를 두는 것 보다 하나의 프로세스 안에 여러 개의 쓰레드를 두는 것이 훨씬 가벼움 ⇒ 여러 개의 쓰레드로 구성된 프로세스를 lightweight process라고 부름
-
어떤 동일한 일을 하는 프로세스가 여러 개 있다고 하면, 별도의 프로세스 주소 공간(왼쪽그림)이 여러 개가 만들어 짐. 메모리 낭비.
-
같은 일을 하는 프로그램을 여러 개 띄어 놓고 싶은 경우. 주소공간(메모리 공간)을 하나만 띄워 놓고 현재 프로세스에서 다른 부분의 코드를 실행할 수 있게 해주면 됨. ⇒ 쓰레드의 개념
-
쓰레드라는 것은 프로세스를 하나만 띄어놓고, CPU가 이 프로세스에서 어떤 부분을 실행하고 있는 가에 관한 Program counter만 여러 개를 둠. 즉, 프로세스 하나에 CPU 수행 단위만 여러 개 두는 상태. instruction을 수행하기 위해서는 현재 코드의 어느 부분을 실행하고 있는 지를 가리키는 PC가 필요. 각 CPU 수행 단위마다 현재 레지스터에 어떤 값을 넣고 PC이 코드 어느부분을 가리키면서 실행하고 있었는가에 대한 정보 유지
-
코드를 실행하다가 함수 호출을 하면 함수 호출, 리턴에 관한 정보를 스택에다가 쌓음. CPU 수행 단위가 여러 개 있게 되면 stack도 별도로 둬야 함. 쓰레드라는 것은 프로세스 하나를 가지고 공유할 수 있는 것을 최대한 공유.
-
일단 메모리 주소 공간(왼쪽 그림)을 공유. 프로세스는 하나이기 때문에 프로세스 상태(PCB)도 공유한다고 할 수 있음. 프로세스가 사용하는 각종 자원들도 쓰레드들끼리 공유.
-
다만, 별도로 가지고 있는 것은 CPU 수행과 관련된 정보 (Program Counter, 레지스터, 스택)
▣ 쓰레드를 사용 할 때의 장점
-
메모리 낭비를 줄일 수 있음 ⇒ 같은 일을 하는 프로세스를 여러개 띄운다면 메모리에 각각의 코드, 데이터, 스택이 올라가야 하기 때문에 메모리 낭비가 심함.
-
병렬성을 높인다? CPU를 여러개 가지고 있는 PC의 얘기. 1000 x 1000 행렬 연산을 한다고 해보면 각 행과 열을 곱하는 것과 그 결과를 더하는 것은 독립연산. 여러개의 쓰레드를 사용하면 각 쓰레드들이 서로 다른 CPU에서 사용이 되어 곱하는 건 이 쓰레드가, 더하는 건 이 쓰레드가 할 수 있도록 하여 결과를 빨리 얻을 수 있음.
-
프로세스가 생성될 때 OS에 PCB 자료구조가 만들어져서 관리. 프로세스가 하나이고 쓰레드가 여러개 있으면 CPU 수행과 관련된 쓰레드 정보(Program counter, registers)만 하나의 PCB안에 여러개가 있게 됨.
-
프로세스 안에 쓰레드가 하나 있는 그림(왼쪽)과 쓰레드가 여러 개 있는 그림(우측)
-
코드, 데이타, 여러 OS자원들은 쓰레드들끼리 공유.
-
CPU 수행과 관련된 정보(레지스터, 스택부분 등)은 쓰레드마다 별도로 가지고 있음.
▣ 쓰레드를 사용 할 때의 장점 요약 2
1) 응답성 : 사용자 입장에서 빠름. 웹 브라우저를 띄어놓고 포털 사이트의 홈페이지 주소를 치면 제일 먼저 html문서가 날아옴. 그 문서를 웹브라우저 화면에 디스플레이 하려고 봤더니 그 문서 안에는 여러가지 embeded된 이미지들이 있음. 그러면 웹브라우저가 그것을 해석해서 이미지들을 다시 웹서버에 요청. 그 이미지들이 다 도착을 하면 html화면에 text, 이미지등을 집어넣어 웹페이지를 완성하고 사용자들에게 보여주게 됨. 그러한 과정에서 제일 먼저 html문서를 읽어온 다음에 그 안에 있는 이미지들을 다시 웹서버에 요청. 이 과정이 오래걸리는 작업이기 때문에 보통 이 프로세스를 block시킴. 사용자 입장에서는 답답. 웹페이지를 읽어오는 동안 프로세스가 block이 되기 때문에 화면에 display도 못해주고 오래 걸림. 그러나 웹브라우저를 여러 개의 쓰레드를 사용하여 프로그램을 만들면 html문서를 가져와서 그 안에 있는 이미지 파일들을 웹 서버에게 요청할 때, 요청을 한 그 쓰레드만 block이 됨. 이 때, 다른 쓰레드가 이미 읽어온 html문서(text)라도 화면에 먼저 display에 해줄수 있기 때문에 (그림은 나중에 나오더라도) 사용자 입장에서는 답답함이 덜할 것.
위의 작업을 동기식, 비동기식 입출력과 연관지어 얘기해보자면 이미지 파일을 읽어오는 동안(I/O를 실행하는 동안)에 프로세스를 block 시키는 것이 아니라 이 프로세스는 I/O가 끝나기 전에 CPU를 얻어서 화면에 html text만 먼저 display를 해줌. 즉, 그림을 읽어오는 작업은 오래 걸리지만 그 읽어오는 결과를 보고 instruction을 실행하는 것이 아니라 읽어온 결과와 무관하게 실행할 수 있는(화면에 text라도 보여주는) 작업을 하게 되면 이것이 일종의 비동기식 입출력. ⇒ IO결과를 보고 작업하는 것이 아니라 IO를 던져놓고 할 수 있는 작업을 이 프로세스가 먼저 실행하는 것이 쓰레드를 이용한 응답성 향상 방법
2) 자원공유 : 똑같은 일을 하는 프로그램이 여러개 있는데 그것을 별도의 프로세스로 사용하는 것 보다는 하나의 프로세스를 만들고 그 안에 CPU 수행 단위만 여러개 두게 되면 코드, 데이타, 각종 자원은 쓰레드들이 공유를 함. 그러면 자원을 좀 더 효율적으로 쓰는 효과를 얻을 수 있음.
3) 경제성? 좀 빠르다는 의미(응답성과는 조금 다른 의미에서)
프로세스를 하나 만드는 것 ⇒ 오버헤드가 큼. 반면 프로세스 안에다가 쓰레드를 하나 추가하는 것은 숟가락 하나 얹는 정도. 그리고 문맥교환이 일어날 때, 하나의 프로세스로부터 또 다른 프로세스로 CPU가 넘어 갈 때도 오버헤드가 큼. CPU관련 정보를 저장하고 캐쉬 메모리 플러쉬 등 여러가지 복잡한 일이 있음. 그러나 프로세스 내부에서 쓰레드 간 CPU 스위치가 일어나는 것은 굉장히 간단함. (동일한 주소공간을 쓰고 있기 때문에 대부분의 문맥은 그대로 사용) Solaris(유닉스) 운영체제의 경우 프로세스 하나 생성할 때 쓰레드 하나 생성하는 것 보다 오버헤드가 30배, CPU switch 할 때는 5배
4) CPU가 여러개 있는 환경에서 쓰레드를 여러개 두었을 때 얻을 수 있는 장점
연산 결과를 더 빨리 얻을수 있음. (행렬연산 같은 것)
쓰레드 구현 방법
1) OS 커널의 지원을 받는 경우 - 커널 쓰레드
어떤 쓰레드들은 커널의 지원을 받음. 쓰레드가 여러개 있다는 사실을 운영체제 커널이 알고 있음. 하나의 쓰레드에서 다른 쓰레드로 CPU가 넘어가는 것도 커널이 CPU 스케줄링을 하듯이 넘겨주게 됨.
2) 라이브러리 형태로 구현 - 유저 쓰레드
프로세스 안에 쓰레드가 여러개 있다는 사실을 운영체제는 모름. 유저 프로그램이 스스로 여러개의 쓰레드를 관리(라이브러리의 지원을 받아서). 그렇기 때문에 유저 레벨의 쓰레드는 구현상의 제약이 있을 수 있음.
3) real-time 쓰레드
real-time 기능을 지원하는 쓰레드
출처 : 반효경 교수님(이화여대) 강의
반효경 교수님의 강의를 들으며 정리한 것입니다.
'IT > OS' 카테고리의 다른 글
[OS] 4. Process Management (0) | 2020.12.24 |
---|---|
[OS] 3-1. Process 1 (0) | 2020.12.18 |
[OS] 2-2. System Structure & Program Execution 2 (0) | 2020.12.16 |
[OS] 2-1. System Structure & Program Execution 1 (0) | 2020.12.15 |
[OS] 1. Introduction to Operating Systems (0) | 2020.12.14 |