[OS] Process 2 & Process 3

밈무·2022년 11월 19일
0

운영체제

목록 보기
4/15
post-thumbnail
post-custom-banner

Q&A

동기식 입출력과 비동기식 입출력의 차이가 뭔가요?

동기식 입출력

  • 프로세스 관점 사용자 프로세스가 운영체제에게 입출력 요청 입출력이 끝날 때까지 아무 일도 안하고 기다리면 동기식 입출력 입출력이 끝나는 것을 보고 나서야 instruction 수행
  • 구현방법
    • 기다리는 동안 동안 CPU를 가지고 있으면서 기다리게 구현 - CPU 낭비
    • 기다리는 동안 다른 프로세스에게 CPU를 넘겨주게 구현 - 일반적인 방법

비동기식 입출력

입출력 요청을 한 다음에 입출력이 진행되는 동안 해당 프로세스가 곧바로 CPU 잡아서 instruction을 수행을 한다.


Thread란?

프로세스 내부에 CPU 수행 단위가 여러 개인 경우, CPU의 수행단위를 Thread라 한다.

Thread의 구성

CPU 수행과 관련된 정보를 가진다.

  • program counter
  • register set
  • stack space

따라서 thread를 사용하면 PCB를 아래와 같이 이해하면 된다.


PCB는 프로세스 당 하나만 만들어지는데, 스레드가 여러 개 있게 되면 하나의 PCB 내부의 CPU 관련 정보 (pc, registers)만 각 스레드 마다 별도의 copy를 가지고 있게 된다.

Thread 가 동료 thread와 공유하는 부분(=task라고 한다)

여러 개의 thread : 한 개의 task

  • code section
  • data section
  • OS resources

참고로, 여러 개의 스레드를 사용하지 않는 경우의 PCB는 다음과 같다.

thread는 lightweight process이다. 프로세스를 별도로 두는 것보다 프로세스 안에 스레드를 여러 개 두는 것이 훨씬 가볍다.
여러 개의 스레드를 사용하지 않는 전통적인 방법인 heavyweight process와 반대된다. 이는 하나의 thread를 가지고 있는 task로 볼 수 있다.

Thread 사용 장점

Responsiveness(응답성)

멀티스레드를 사용한다면 하나의 스레드가 blocked상태 일 때 다른 스레드가 CPU를 잡고 running할 수 있어 응답시간이 빨라진다.

예를 들면, 웹브라우저에서 naver.com을 접속하려면 네트워크를 통해 웹페이지를 읽어와야 한다. 웹페이지를 읽어오는 것은 I/O 작업이기 때문에 오래 걸리며 blocked 상태가 된다. 만약 웹페이지를 읽어올 때까지 아무 일도 못한다면 사용자 입장에게 높은 응답성을 제공할 수 없다.

만약 웹브라우저를 여러 개의 스레드를 사용해 만든다면 하나의 스레드가 웹 서버에서 웹 페이지의 그림을 불러오는 동안 이 프로세스를 blocked 시키는 것이 아니라, 이미지를 읽어오는 스레드만 blocked되고 또다른 스레드가 이미 읽어온 텍스트(텍스트 읽어오는 게 더 빠르니까)를 띄워줄 수 있다. 따라서 사용자에게 높은 응답성을 제공한다.

즉, 하나의 스레드가 다른 작업을 하는 동안 또 다른 스레드가 별도의 작업을 하여 사용자에게 높은 응답성을 제공할 수 있다.

동기식 입출력일까, 비동기식 입출력일까?

동기식 입출력/비동기식 입출력 차원에서 설명하자면, I/O 읽어오는 동안 프로세스를 blocked 시키는 게 아니라 이 프로세스가 I/O가 끝나기 전에 CPU를 얻어 화면에 html 텍스트만 먼저 display해준다.
→ 일종의 비동기식 입출력이다.

Resource Sharing(자원공유)

같은 일을 하는 다중 스레드가 협력하여 높은 처리율(throughput)과 성능 향상을 얻을 수 있다.

같은 일을 하는 작업을 별도의 프로세스로 만들면 메모리나 자원이 낭비된다. 프로세스가 만들어지면 프로세스 당 독자적인 주소공간이 생기고 이에 따라 메모리 공간을 차지하게 되기 때문이다.
만약 웹브라우저를 여러 개 띄우는 경우, 각각 다른 프로세스로 만들게 되는 경우에 해당한다.

하지만 멀티스레드 환경에서는 code, data, 각종 자원을 스레드가 공유하기 때문에 자원을 절약할 수 있다.

Economy

멀티 스레드를 사용하면 좀 더 빠르다. creating과 CPU switching 상황에서 overhead가 적게 일어나기 때문이다.
프로세스를 하나 만드는 것(creating)은 오버헤드가 크지만, 프로세스 하나에 스레드를 추가하는 것은 오버헤드가 비교적 적다.
프로세스에서 다른 프로세스로 넘어가는 문맥교환(CPU switching)의 경우 오버헤드가 크지만, 프로세스 내부에서 스레드 간 CPU switch가 일어나는 것은 굉장히 간단하다.(동일한 주소 공간을 사용하기 때문)

Utilization of MP Architectures(병렬성)

CPU가 여러 개인 환경에서만 적용할 수 있다.
프로세스는 하나지만 스레드가 여러 개 있으면 각각의 스레드가 서로 다른 CPU에서 병렬적으로 작업할 수 있다.

각 행과 열을 곱하는 것이 독립적인 작업인데, CPU가 하나밖에 없는 경우 따로 해야 하지만, 여러 개인 경우 동시에 수행할 수 있다. 이때 스레드를 사용하면 각 스레드들이 서로 다른 CPU에서 실행되고 그럼 병렬적으로 결과를 빠르게 얻을 수 있다.

Thread 구현 방법

Kernel Threads

운영체제 커널의 지원을 받고 있는 스레드. 스레드가 여러 개 있다는 사실을 운영체제 커널이 알고 있다.
하나의 스레드에서 다른 스레드로 CPU가 넘어가는 것을 커널이 CPU스케줄링 하듯이 관리한다.

  • Windows 95, 98, NT
  • Solaris
  • Digital UNIX, Mack

User Threads

라이브러리 형태로 구현한 스레드.
프로세스 안에 스레드가 여러 개 있다는 것을 운영체제가 모르고, 라이브러리의 지원을 받아 유저 프로그램이 스스로 여러 스레드를 관리한다. 커널이 볼 때는 일반적인 프로세스로 보인다. 구현 상의 제약점이 있을 수 있다.

  • POSIX Pthreads
  • Mach C-threads
  • Solaris threads

Real Time Threads

post-custom-banner

0개의 댓글