안녕하세요? 허니입니다. 운영체제에서 매우 중요한 기능 중에 뽑으라고 하면 저는 쓰레드를 선택할 것 같습니다. 정말 어렵다면 어렵고, 쉽다면 쉬운 스레드에 대해 포스팅 하겠습니다. 학생이나 연구원분들에게 많은 도움이 될 것이라고 생각하며 언제든지 질문은 환영입니다. 

 


오늘의 주제

 

 스레드(Thread)란?

 Process는 어떤 방법으로 의사소통을 할 수 있는가?

 


커널 스레드(kernel thread)의 등장

 

커널 내의 스택이 하나이기 때문에 처리속도가 떨어지는 것을 걱정한 시스템 설계자는 커널스레드를 구상하기 시작했다. 바로 커널스레드가 각자가 스택을 가짐으로써 동시에 여러 프로세스나 커널 내부에서 수행을 할 수 있게 되는 것이다. 바로 벽돌공이 쉼 없이 벽돌을 쌓을 수 있도록 계속해서 벽돌을 제공할 수 있는 새로운 시스템을 만들어낸 것이다.

 

그림 10 커널스레드가 있을 경우

 

스레드란 무엇인가? 프로세스의 처리속도를 높이기 위해 하나의 프로세스가 수행해야 할 여러 작업들을 나누어 수행할 수 있도록 설계된 것이 바로 스레드이다. 다시 말해 1개의 프로세스를 3개의 스레드로 구성한 것은 3개의 프로세스와 같은 처리속도를 낼 수 있는 것이다. 3개의 프로세스가 수행되는 것과 3개의 스레드가 수행되는 것이 처리속도에서 큰 차이가 없다면 시스템 설계자는 그냥 프로세스를 통해 작업을 수행하지, 무엇 때문에 스레드라는 새로운 처리과정을 통해 작업을 수행하려 하는 것일까. 분명 3개의 프로세스를 구성하는 것과 3개의 스레드를 구성하는 데는 뭔가 차이점이 존재하기 때문일 것이다. 스레드는 시스템 설계자가 하나의 작업처리 환경을 구축하는데 있어 막대한 수고를 덜어주는 매력이 있다. 그 매력은 바로 프로세스와의 차이에서 찾아볼 수 있다.

 

프로세스와 스레드의 분명한 차이로는 프로세스는 자신만의 보호영역을 갖고 있지만 스레드는 자신만의 보호영역을 갖고 있지 않다.

 

그림 11 프로세스와 스레드

 

 잠깐, 상식!

보호영역(protected location)이란?

시스템의 동작 및 관리에 중요한 역할을 담당하는 정보가 저장되어있는 기억장소 영역을 말한다. 따라서 이러한 영역의 내용은 사용자가 직접 변경할 수 없고 중간에 위치한 OS에 의해 특정한 경우에 한해 제한적으로 갱신될 수 있도록 보호한다.

 

스레드가 자신만의 보호영역을 갖고 있지 않다는 말은 바로 한 프로세스에 존재하는 모든 스레드들은 프로세스의 상태를 공유한다는 의미가 된다. 예를 들어 스레드들은 똑같은 메모리 공간에 존재하고 똑같은 함수들과 똑같은 데이터를 참조한다. 하나의 스레드가 변수를 변경한 이후 다른 스레드들이 변수에 접근할 때 변경된 변수를 참고 할 수 있는 것이다. 별도의 communication이 스레드간에는 필요하지 않다는 뜻이다. 하나의 스레드가 한 파일을 읽기 위해 파일을 open하면 모든 다른 스레드들도 그것을 읽을 수 있다. 그러나 프로세스들은 그러한 정보를 고유하기 위해서-즉, 메모리를 공유하기 위해서- IPC라는 별도의 통신 방법이 필요하다. 이후 IPC(interprocess communication)에서 자세히 배우게 되겠지만 프로세스는 자신의 보호영역 안에서 실행되기 때문에 별도의 의사소통시스템이 필요하다.

 

동사무소를 예로 들어보자.

한 사람의 직원을 가진 동사무소가 있다. 동사무소가 제공하는 많은 서비스들이 한 직원(프로세스)의 손을 걸쳐 해결해야 하기 때문에 그는 여러 업무를 제각각 처리하고 또 다시 서로 관련된 여러 업무들을 연결하는데 많은 시간을 필요로 할 것이다.

 

삽화 1 직원 1명인 동사무소

 

직원이 세 명 있는 동사무소가 있다고 하자(스레드). 그들은 동사무소의 물건들을 공유할 수 있지만 각각 전문화된 기능들을 수행할 수 있을 것이다. 결국은 동사무소를 이용하는 주민들이 보다 질 높은 서비스를 제공받게 될 것이다.

 

삽화 2 직원이 여러 명인 동사무소

 

마을에 있는 동사무소의 수를 바꾸는 것은(새로운 프로세스를 생성하는 것) 많은 노력이 들지만 새로운 직원을 (새로운 스레드)고용하는 것은 매우 간단할 것이다. 또한 직원들 사이의 상호작용은 매우 간단하겠지만(스레드 사이의 작용) 아랫마을 동사무소와 관련된 일을(프로세스 사이의 작용) 처리하기 위해선 보다 복잡한 과정이 필요한 것은 당연하다. 다중 스레드 프로그램을 작성할 때 프로그램의 99%는 전과 동일하고 나머지 1%만이 스레드들을 생성하고 여러 가지 활동을 조정하는데 쓰인다. 시스템 설계자에게 있어 이보다 더 큰 매력은 없을 것이다. 그러나 스레드를 사용할 때의 문제점은 하나의 프로세스가 작업을 처리할 때에 비해 오류가 많이 발생한다는 것이다. 스레드의 생성은 간단했지만 보다 세심한 관리가 필요한 것이다.

 


따로 따로 떨어져 있는 프로세스들은 어떤 방법으로 의사소통을 할까?

 

앞서 설명했듯이 프로세스는 각각 자신의 고유영역에서 수행되기 때문에 Communication이 필요하다. 프로세스간에 Communication이 없다면 프로그램 수행 후 나온 결과물은 어떨까. 하나의 예를 들어보자. 갑씨는 5월달 전기료를 깜빡 잊고 내지 않았다. 한국전력의 컴퓨터시스템 내에 A프로세스는 갑씨가 5월 전기료를 미납했음을 처리하였다. 갑씨는 6월달에 두 달치의 전기료를 함께 납부하였다. B프로세스는 5월 6월 전기료가 함께 납부되었음을 처리하였다. 그렇다면 만약 A프로세스와 B프로세스간에 의사소통이 이뤄지지 않았다면 7월달 갑씨에게는 어떤 일이 생길까. A프로세스가 마지막으로 처리되었다면 갑씨는 5,6,7월, 석 달치의 전기료가 미납되었음을 통보받을 것이고 B프로세스가 마지막으로 처리되었다면 7월달의 전기료 미납만 통보받을 것이다. 바로 프로세스간에 의사소통이 이뤄지지 않았기 때문에 발생된 일이다. 그렇기에 IPC(interprocess communication)이 필요한 것이다. IPC에는 다음과 같은 방법들이 있다.

 

1. Pipe

파이프란 하나의 프로세스에 의해 출력된 데이터의 값을 다른 프로세스의 입력으로 전달되도록 하는 방법을 말한다. 이것은 다음과 같은 특성을 갖고 있기 때문에 마치 물파이프와 같은 성질을 갖는다고 표현된다..

 

그림 12 Pipe

 

a. 2개의 프로세스간에 하나의 pipe만이 연결되었다면 한쪽은 정보를 무조건 주기만 하고 다른 한쪽은 무조건 받기만 하는 단방향 시스템이 되고 만양방향의 의사소통이 가능하기 위해서는 2개의 pipe가 필요한 것이다.

b. 1대 1의 의사소통만이 가능하다.

c. 보내어진 순서대로 받는다.

d. 용량제한이 있기 때문에 파이프가 꽉 차면 더 이상 write를 할 수 없다.

 

2. Signal

시그널은 예전에 널리 사용되었던 무선호출 수신기-Radio Pager(삐삐)-와 유사한 성질을 갖고 있다. 호출을 할 때 우리는 상대방이 호출을 받을 수 있는 상태인지 받을 수 없는 상태인지는 모른 채 무조건 호출을 보낸다. 또한 호출을 받았을 경우 우리는 번호나 메시지 등을 확인한 후 전화를 해줄지 또는 호출을 무시할지를 결정한다. 시그널은 다음과 같은 특징을 가진다.

a. 발신자는 Signal number로 표현되는 시그널을 수신자에게 보낸다.

b. 수신자인 Signal handler는 시그널 수신을 받은 후 어떤 반응을 취할지 결정한다. Signal handler를 동작시키든지, 아니면 날아온 시그널을 무시할 수 있다.

c. 수신자에게 시그널은 비동기적이다.

 

그림 13 시그널

 

질문) 중요한 자료를 read하고 있는데 Signal이 들어오면 어떻게 됩니까?

답) 일단 Signal을 처리하고 read를 다시 한다.

질문) Signal은 시스템 내에서 어떤 방식으로 체크됩니까?

답) 커널이 디스패춰를 부르기 전에 Signal을 체크한다.

질문) 하나의 프로세스 안에 여러 개의 스레드가 존재할 경우 handler는 누가 수행합니까?

답) Signal마다  handler를 갖는데 중복 실행을 막기 위해 Signal mask를 갖는다. Signal mask란 스레드마다 받는 Signal list를 말한다. 스레드가 Signal mask를 설정해놓으면 그 설정에 따라 Signal을 골라서 받을 수 있다.

질문) Signal 1이 수행되고 있는데 Signal 2가 발생하면 어떻게 처리합니까?

답) 보통의 경우 Signal 2를 Queue에 저장하고  Signal 1을 먼저 수행한다. 그러나 Signal의 처리방법은 운영체제 마다 다르고 시스템 설계자의 자유의지를 반영한다.

 

3. 공유메모리(Shared memory)

공유메모리는 통신하는 프로세스들간에 메모리를 공유하도록 하는 것이다. 같은 메모리 공간을 공유함으로써 정보교환을 이루는 것이다. 프로세스들은 공유메모리를 자신의 메모리인 것처럼 접근할 수 있다. 하나의 프로세스가 공유메모리를 변경하면 다른 프로세스들은 공유메모리에 접근함으로써 변화의 내용을 알 수 있는 것이다. 공유메모리 방법이 어떤 식으로 동작하는지 데이터베이스 시스템의 동작을 통해 간단히 알아보자. 한 기업의 인사부에서 새로 10명의 신입사원을 채용했을 때 이 기업이 데이터베이스 시스템을 사용하고 있지 않다면 인사부는 기업 내에 각 부서마다 서면 통지를 통해 신입사원이 들어왔음을 통보하게 되고 통보를 받은 각부서는 제각기 입력을 통해 신입사원이 10명 입사하였다는 사실을 자기 부서의 컴퓨터에 기록하게 된다. 그런데 신입사원 연수 도중 1명이 사정에 의해 회사를 그만 두었다면 신입사원이 9명으로 줄었다는 사실을 각 부서마다 다시 서면 통보해야 하는 것이다. 그리고 또 각 부서에서는 다시 또 자기 부서의 컴퓨터에 변경된 사항을 입력해야 한다. 만약 다섯 개의 부서가 있다면 똑같은 과정을 각 부서마다 다시 수행해야 하는 것이다. 오직 한 가지의 변화 때문에 말이다. 여기서 신입사원 1명이 줄어 9명이 되었다는 것을 하나의 프로세스를 통해 데이터베이스-공유메모리-에 변화된 상황을 알려놓으면 모든 부서의 프로세스들은 간단히 그 변화를 깨닫게 되는 것이다. 또 이것은 경리부에서 한 달치 월급을 계산할 때 신입사원 10명의 월급을 계산할 오류가 줄어들게 해준다. 데이터베이스의 데이터가 변화된 순간, 월급을 계산하는 프로세스 역시 그 변화를 즉시 알 수 있기 때문이다. 정보를 공유해 작업을 처리해야 하는 모든 집단(기업, 학교, 병원, 경찰서, 동사무소, 대형매장 등)은 바로 공유메모리를 바탕으로 한 데이터베이스를 사용하고 있어 정보교환에 편리와 안전을 함께 이루는 것이다.

 

그림 14 공유메모리(Shared Memory)

 

4. 메시지 큐(Message queue)

메시지 큐란 데이터 통신에서 송신측과 수신측의 중간 단계 노드에서 전달할 메시지를 임시보관하기 위하여 사용되는 대기열을 말한다. 하나의 시스템 안에서는 프로세스간에 pipe나 Signal을 사용해 의사 소통을 했지만 부산에 떨어져 있는 친구의 컴퓨터에 pipe나 Signal을 통해 편지를 주고 받을 수는 없는 노릇인 것이다. 그렇기에 Message queue라는 의사소통방법이 고안된 것이다. 바로 송신측과 수신측 중간에 메시지를 보관하는 대기열이 존재하기 때문에 거리가 떨어져 있는 시스템간에 의사소통이 가능한 것이다. Message queue의 대표적인 예는 바로 인터넷 통신이다. 인터넷을 통한 통신은 때로는 미국을 때로는 일본을 연결해 자료를 전송받을 수 있다. 이렇듯 하나의 시스템이 아닌 거리가 떨어져있는 시스템간의 의사소통은 하나의 메시지 안에 전달되어야하는 의미가 확실해야한다.

 

 잠깐, 상식!

메시지란 하나의 의미를 가지고 있는 문자들의 집합을 말한다. 데이터통신에서 메시지는 논리적으로 독립된 하나의 단위로 간주된다.

 

그림 15 Message Queue

 

a. read/writer와 같이 연속된 데이터를 주고 받는 것이 아니라 독립된 메시지 단위의 데이터를 주고 받는다.

b. 각각의 메시지 의미가 정의되어 있지 않다. 메시지 의미는 보내는 사람에 의해 정의되기 때문이다. 다만 메시지가 교환되는 양식은 정의되어 있어야만 교환이 제대로 이뤄질 수 있는 것이다.

c. 공유해야 하는 정보의 규모가 적다. 메시지 의미가 보내는 사람들에 의해 정의되기 때문에 공유되는 정보 역시 적을 수밖에 없을 것이다.

d. 공유되는 정보의 양이 적기 때문에 네트워크 환경으로 확장하기 쉽다.

 

 잠깐, 상식!

네트워크란?

우리말로 바꾸어 표현하면 통신망이라 할 수 있는데 데이터 통신이라는 공통의 목적을 바탕으로 두 개 이상의 장치들이 연결되어 있는 통신구조이다. 이러한 통신구조에는 데이터통신을 원하는 컴퓨터시스템뿐만 아니라 데이터 통신을 수행하기 위해 사용되는 전송장치, 교환장치 등이 통신선로에 의하여 연결되어 있다.  

 

앞서 설명한 프로세스 통신방법에 있어 어느 것이 가장 적절한 방법이라고 단편적으로 말할 수는 없을 것이다. 프로세스가 어떤 환경에서 서로 통신하느냐에 따라 적절한 방법은 달라질 것이다. 현재 시스템의 환경을 제대로 파악하고 보다 적절한 방법을 구현해 주는 것 역시 시스템 설계자의 몫인 것이다. 참고적으로 스레드간에 의사소통은 전역 변수(global variable)를 사용함으로 가능하다. 그렇기에 별도의 IPC는 필요 없는 것이다.

 

 잠깐, 상식!

전역변수란 프로그램 전체영역에서 사용될 수 있도록 선언된 변수를 말한다.

그 반대로 지역변수(local variable)는 일정한 영역에서만 사용될 수 있도록 선언된 변수를 말한다.

 


요점정리

 스레드란?

프로세스의 처리속도를 높이기 위해 하나의 프로세스가 수행해야 할 여러 작업들을 나누어 수행할 수 있도록 설계된 것이 바로 스레드이다.

 

 프로세스와 스레드의 차이

프로세스는 자신만의 보호영역을 갖고있지만 스레드는 자신만의 보호영역을 갖고 있지 않다.

 

 IPC란

프로세스는 각각 자신의 고유영역에서 수행되기 때문에 Communication이 필요한데 다음과 같은 방법이 사용된다.

1. Pipe

2. Signal

3. Shared memory

4. Message queue

 

 

목 차

 운영체제를 시작하는 분들을 위해

 운영체제의 역사와 구체적으로 어떤 일들을 수행하나요?

 운영체제의 목표와 역할이 미래에도 계속 증대될까요?

 운영체제를 이해하기 위해 필요한 기본 개념들은 무엇인가요?

 운영체제 프로세스 생애주기(Process Lifecycle)는 무엇인가요?

 운영체제 프로세스 관리(Process Management)는 어떻게 하나요?

 운영체제 프로세스(Process)의 처리 속도는 어떻게 높일까?

 운영체제 스레드(Thread)는 무엇인가요?

 운영체제 스케줄링 (Scheduling)은 어떻게 하나요?

 운영체제 스케줄링 알고리즘의 비교 기준이 있나요?

 운영체제 프로세스 동기화가 무엇인가요?

 운영체제에서 세마포어(Semaphore)란?

 운영체제 메모리 관리(Memory Management)는 어떻게 하나요?

 운영체제 메모리 분할 방법은 어떻게 하나요?

 운영체제 가상메모리(Virtual Memory)는 무엇인가요?

 운영체제 Page in/out, Swapping 등이 Page Table Entry와 어떤 관계인가요?

 운영체제 메모리 관련해서 알아야 할 개념은 어떤것이 있나요? (TLB, Locality, Working Set, Overlay)

 운영체제 Page replacement (페이지 대체) 알고리즘이란?

 운영체제 파일시스템(File System)은 어떻게 운영되나요?

 운영체제 파일시스템 내부구조는 어떻게 되나요?

 운영체제 디스크 공간 할당(Disk Space Allocation) 알고리즘과 효과적 알고리즘의 판단 기준은?

 운영체제 파일시스템에서 접근 시간, 디스크 스케줄링을 위한 알고리즘, I/O 시스템이란?

 리눅스 인터럽트 (Interrupt)에 대해 자세히 설명해 주세요.

 인텔 구조에서 운영체제 가상 메모리 (Virtual Memory)는?

 운영체제 아키텍처의 종류는 얼마나 있나요?

 

+ Recent posts