process 2 , 3

ChoiYongHyeun·2023년 12월 8일
0

운영체제

목록 보기
5/16

동기실 입출력과 비동기식 입출력 회고

I/O instruction 이 주어졌을 때 I/O controller 를 거쳐 I/O buffer 에서 자료를 담고 Interupt 가 주어질 때 까지 CPU 를 할당 받지 못하고 blocked 되어 있는 상태인 프로세스를 동기식 입출력이라고 한다.

이 때 동기식 입출력 프로세스의 경우 I/O instruction 을 위해 system call 을 보내고 커널 모드에 들어 간 후 blocked 되어 레디큐에 들어가 I/O instruction 이 끝날 때 까지 대기한다.

비동기식 입출력 프로세스는 I/O instruction 을 위해 system call 을 보내고 커널 모드에 들어가 I/O controller 에 요청을 보내는 것 까지는 동기식 입출력과 동일하나 다시 유저 모드로 돌아와 I/O instruction 을 제외한 다른 프로세스를 진행한다.

Thread

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

좀 더 정리하면 프로세스 하나에 CPU 수행 단위가 여러개 존재한다.

프로세스마다 주소 공간 (가상 메모리) 내에 다양한 프로세스 별 stack 이 만들어지고

PCB 에는 thread 별 프로그램 카운터가 가리키고 있다.

강의 내용은 너무 훌륭하지만 나는 좀 더 어린아이에게 설명 받는 듯한 설명이 필요했기에 지피티 목을 졸라서 교육을 받았다.

정의

Thread 는 여러 프로세스 간에 공통적인 부분을 공유하여 동시에 실행 될 수 있는 가장 작은 실행 단위이다.

이전 process1 에서는 프로세스 간 레디 큐를 오고 가며 프로세스별 time sharing을 통해 CPU 할당을 주고 받는다고 하였다.

프로세스 간 독립적으로 개별 주소 공간을 가지고 있다면 프로세스간 통신을 주고 받을 때 IPC를 통해 데이터를 공유해야 하고, 공통된 자원을 사용 할 때에도 메모리를 낭비하게 된다.

하지만 프로세스 간 공통적인 부분을 공유하고, 동시에 실행 할 수 있도록 다른 단위를 사용한다면 더 효율적으로 CPU 를 이용 할 수 있을 것이다.

그것이 위에 있는 이미지와 비슷한 내용일 것이다.

프로세스 단위로 CPU 를 할당 하는 것이 아니라, 특정 task나 자원을 대상으로 묶은 여러 thread 를 만들어 작업에 맞게 thread 를 실행하고, CPU 에서도 thread 에 맞는 정보들을 PCB 에 담으며 실행하면 효율적일 수 있다.

위 이미지는 한 프로세스에서 작업 별로 작은 수행 단위인 thread 를 만들고 thread 에 맞게 운영체제에서도 PCB 에 thread 별 정보를 준비한 모습을 보여준다.

예시를 통한 이해

독립적인 프로세스A , B , C 가 존재한다고 해보자

프로세스 A

  • 작업 : 이미지 처리
  • 공통 자원 : 이미지 파일
- 스레드 A1: 이미지 파일을 읽어오는 작업
- 스레드 A2: 읽어온 이미지를 필터링하는 작업
- 스레드 A3: 필터링된 이미지를 저장하는 작업

프로세스 B

작업: 데이터 분석
공통 자원: 데이터 파일

- 스레드 B1: 데이터 파일을 읽어오는 작업
- 스레드 B2: 읽어온 데이터를 분석하는 작업
- 스레드 B3: 분석 결과를 출력하는 작업

프로세스 C

작업: 웹 서버 요청 처리
공통 자원: 네트워크 리소스

- 스레드 C1: 클라이언트로부터 요청을 받아오는 작업
- 스레드 C2: 요청된 작업을 처리하는 작업
- 스레드 C3: 처리 결과를 클라이언트에게 응답하는 작업

스레드를 구성하지 않았을 때 프로세스A 의 작업인 여러개의 이미지 파일을 읽어오고 , 읽어온 이미지를 필터링 하고 , 필터링 된 이미지를 저장하는 작업 을 해본다고 생각해보자

그렇다면 프로세스 A는 자기 첫 번째 차례일 때 이미지 파일을 읽어오기 위해 I/O instruction 을 시행하고 읽어 올 때 까지 대기를 하게 된다.

그리고 읽어오고 나면 다시 차례를 기다린 후 본인 차례 때 이미지를 필터링 한 후 저장하려고 I/O instruction 를 보내고 또 대기하게 된다.

하지만 스레드를 이용해 작업을 병렬화 해서 시행해본다 생각해보자

프로세스A 는 위 3 작업을 3개의 스레드로 나눠놨으며, 가상 메모리 공간에 스레드 별 stack , PCB에서도 스레드 별 Program counter 가 존재한다.

프로세스A 의 차례가 되면 이미지를 읽어오기 위해 thread1 이 이미지를 읽어오는 작업을 시행한다. 그러 이미지를 읽어 오는 동안 다른 프로세스로 넘어가는 것이 아닌

thread 2 , 3 이 병렬적으로 나머지 작업을 동시에 처리하며 더욱 효율적으로 CPU 를 활용 할 수 있다.

장점

  1. 자원 공유 및 효율성
    프로세스 내의 스레드는 같은 주소 공간을 공유한다. 이는 데이터 및 자원을 쉽게 공유 할 수 있게 해준다.
    프로세스간 IPC에 비해 같은 공간을 참좋는 스레드 간 통신은 간단하고 효율적이다.

    같은 일을 하는 여러 프로세스를 띄워 두는 것보다 자원을 효율적으로 사용 할 수 있다.

    예시를 통한 이해

    만약 10개의 웹 브라우저에서 뭔가 이미지를 다운 받는 작업을 해본다 생각해보자
    스레드를 사용하지 않으면 10개의 웹 브라우저에서 다운 받기 위해 동일한 코드를 가진 10개의 웹 프로세스가 올라가 있기 때문에 작업이 느릴 뿐 아니라 더 많은 메모리를 차지하게 된다.
    만약 스레드를 이용해 한 프로세스에서 이미지를 다운 받는 스레드를 10개를 만든다면 병렬적으로, 한 프로세스 만으로 작업을 수행 할 수 있어 자원 공유 및 효율성이 올라간다.

  2. 빠른 생성 및 소멸
    스레드는 프로세스 내에서 생성 및 소멸이 비교적 빠르다. 새로운 스레드를 만들거나 종료하는 것이 프로세스를 생성하거나 종료하는 것볻 경제적이며 빠르다.

  3. 효율적인 동시성
    각 프로세스가 독립적으로 동작하는 것보다 스레드를 사용하면 CPU 가 각 스레드를 더 빠르게 전환하여 실행 할 수 있다.

  4. 경량 프로세스
    스레드는 프로세스에 비해 더 가벼우며 더 작은자원을 사용하므로 , 여러 스레드를 사용 하는 것이 효율적이다.

  5. 응답성 향상
    하나의 프로세스에 여러 스레드를 사용하면 스레드가 블록 되어도 (I/O instruction) 다른 스레드가 계속 실행 될 수 있어 응답성이 향상 된다.

    예시를 통한 이해

    어떤 웹 브라우저에서 이미지나 텍스트 등등을 읽어와야 한다 생각해보자 (웹 브라우저를 키면 HTML 태그를 받아 텍스트나 이미지 등을 띄워준다.)
    스레드를 안쓴다면 HTML 태그 순으로 텍스트를 띄우다가 이미지를 받아와야 하면 또 한세월 두세월 받아올 때 까지 기다렸다가 다시 또 텍스트를 띄우다가 이미지 가져와야되면 한세월 두세월..
    하지만 텍스트를 가져오는 스레드, 이미지를 가져오는 스레드 등이 있다면 이미지를 가져오는 작업이 오래 걸린다 하더라도 텍스트를 가져오는 스레드는 열심히 일을 해서 텍스트라도 먼저 띄워줄 것이다.
    (일종의 비동기식 입출력)

이런 장점으로 인해 스레드는 light process 라고 불리기도 한다.


여러개의 스레드를 가진 프로세스 하나가 올라가있다고 해보자

그러면 PCB 는 몇 개가 만들어질까 ?

PCB 는 올라간 프로세스 개수와 같기 때문에 하나의 PCB 만 만들어지고, PCB 에는 프로세스 별 정보를 독립적으로 나눠 가지고 있는다.

예아~~~

(어차피 스레드는 같은 프로세스에서 가지고 오기 때문에 코드와 데이터 공간은 공유한다.)

스레드 구현 방법

자세한 설명은 하지 않겠지만

어떤 프로세스는 운영체제 상에서 스레드를 지원하는 커널 스레드 가 있다.

커널 스레드 는 운영체제 상에서 프로세스의 스레드간 변동이 있다는 사실을 운영체제가 알고 스케줄링 한다.

어떤 프로세스는 라이브러리의 지원을 받아 프로세스가 사용자 수준에서 스레드를 관리 하는 유저 스레드 가 존재한다.

이 때 커널은 스레드의 존재 유무를 모른다.

profile
빨리 가는 유일한 방법은 제대로 가는 것이다

0개의 댓글

관련 채용 정보