Mentor's Q
- Process와 Thread는 무엇인가 ? (어떤 문제를 해결하기 위해 나오게 되었는지에 대한 조사 필수)
- MultiThread와 MultiProcess의 장단점
- MultiThread와 MultiProcess의 각각의 접근방식은 어떤 서비스를 개발하는 데 더 적절한가 ? 그리고 그 이유는 무엇인가?
- Blocking과 Non-Blocking 연산 수행간에 MultiThread와 MultiProcess중 어떤 것이 더 빠르고, 어떠한 경우에 왜 빠른지에 대해 공유 자원의 측면에서 설명하라
keyword
프로세스는 컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램을 말한다. 종종 task라는 용어와 거의 같은 의미로 쓰이고, 여러개의 프로세서를 사용하는 것을 이후 다룰 멀티프로세싱이라고 하며 같은 시간에 여러 개의 프로그램을 띄우는 시분할 방식을 멀티태스킹이라고 한다. 프로세스 관리는 OS의 중요한 부분이 되었다.
프로그램은 뭡니까 ? 하드 디스크 등에 저장 되어 있는 실행코드,
프로세스는요 ? 프로그램을 구동하여 프로그램 자체와 프로그램의 상태가 메모리 상에서 실행되는 작업 단위를 지칭
예를 들면, 하나의 프로그램을 여러 번 구동하면 여러 개의 프로세스가 메모리 상에서 시랳ㅇ되는 것입니다.
커널 내에는 준비 큐, 대기 큐, 실행 큐 등의 자료 구조가 있으며 커널은 이것들을 이용하여 프로세스의 상태를 관리한다.
운영체제 학부 수업시간이나, 정보처리기사를 준비하며 많이 보았던 그림이다. 자세히 살펴보도록 하면, 하나의 프로그램이 실행되면 그 프로그램에 대응되는 프로세스가 생성되어 준비리스트(자료구조가 궁금해 = 정답 queue)의 끝에 들어간다. 준비 리스트상의 다른 프로세스들이 CPU를 할당받아 준비리스트에서 나가면 그 프로세스는 준비리스트의 앞부분으로 가게되고 언젠가 cpu를 사용할 수 있게 된다.
dispatch (processname) : ready → running
block (processname) : running → blocked
wakeup (processname) : blocked → ready
timeout(processname) : running -> ready
당연한 이야기지만 text section 같은 경우엔 크기가 고정 되기 때문에 프로그램 실행 시간 동안 크기가 변하지 않는다. 그러나 스택 및 힙 섹션은 프로그램 실행 중 동적으로 줄어들거나 커질 수 있다.
과정은 간단하게 함수가 호출 되면 함수 매개변수 , 지역변수 및 복귀주소를 포함하는 활성화 레코드(activation record)가 스택에 푸쉬 되고, 함수에서 제어가 돌아오게 되면 스택에서 활성화 레코드가 팝된다.
프로그램 그 자체는 프로세스가 아님을 강조한다. 프로그램은 명령어 리스트를 내용으로 가진 디스크에 저장된 파일과 같은 수동적인 존재이다(passive entity)
이와는 대조적으로 프로세스는 다음에 실행할 명령어를 지정하는 프로그램 카운터와 관련 자원의 집합을 가진 능동적인 존재이다(active entity)
실행파일이 메모리에 적재될 때, 프로그램은 프로세스가된다.
이거 뭐 꽃이라고 불러줄때 비로소 꽃이된다 이런거 있지 않았나 그거랑 비슷한 것 같다.
스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
스레드는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 하나의 애플리케이션(프로그램)은 하나 이상의 프로세스를 가지고 있고, 하나의 프로세스는 반드시 하나 이상의 스레드를 갖는다. 즉 프로세스를 생성하면 기본적으로 하나의 (메인)스레드가 생성되는 셈이다.
프로세스는 실행될 때 운영체제로부터 각각 독립된 메모리 영역을 할당받지만 스레드는 한 프로세스 내에서 동작되는 흐름으로 프로세스 내에서 stack영역만 별도로 할당 받고, 부모 프로세스의 Code, Data, Heap 영역은 공유한다.
즉, 프로세스내에서 자식 스레드들은 서로의 주소공간이나 자원을 공유하면서 실행될 수 있다. 프로세스는 독립적으로 실행되며 각각 별개의 메모리를 차지하고 있는 것과 달리, 멀티스레드는 프로세스 내의 메모리를 공유하기 때문에 프로세스 간의 전환속도보다 스레드간의 전환속도가 빠르다
게다가 CPU가 여러 개일 경우 각각의 CPU가 스레드 하나씩을 담당하는 방법으로 속도를 높일 수 있다. 여러 스레드가 실제 시간상으로 동시에 수행될 수 있기 때문이다.
스레드는 각각의 스레드 중 어떤 것이 실행될지 그 순서를 알 수가 없다. 이것은 원래 프로그램의 의도와 다를 수 있다. 이에 대한 결과로 스레드의 실행 조건에 따라 결과가 다르게 나오므로, 오류가 발생했을 때, 원인을 찾기가 힘들다. 이를 경쟁조건이라고 하는데, 문제를 막기 위해 세마포어와 같은 방법을 통해 공유 데이터에 접근하는 스레드의 개수를 한 개 이하로 유지하는 방법을 사용할 수 있다.
스레드를 지원하는 주체에 따라 2가지로 나눌 수 있다.
사용자 스레드는 커널 영역의 상위에서 지원되며 일반적으로 사용자 레벨의 라이브러리를 통해 구현되며, 라이브러리는 스레드의 생성 및 스케줄링 등에 관한 관리 기능을 제공한다. 동일한 메모리 영역에서 스레드가 생성 및 관리되므로 속도가 빠른 장점이 있는 반면, 여러 개의 사용자 스레드 중 하나의 스레드가 시스템 호출 등으로 중단되면 나머지 모든 스레드 역시 중단되는 단점이 있다. 이는 커널이 프로세스 내부의 스레드를 인식하지 못하며 해당 프로세스를 대기 상태로 전환시키기 때문이다.
커널 스레드는 운영체제가 지원하는 스레드 기능으로 구현되며, 커널이 스레드의 생성 및 스케줄링 등을 관리한다. 스레드가 시스템 호출 등으로 중단되더라도, 커널은 프로세스 내의 다른 스레드를 중단시키지 않고 계속 실행시켜준다. 다중처리기 환경에서 커널은 여러 개의 스레드를 각각 다른 처리기에 할당할 수 있다. 다만, 사용자 스레드에 비해 생성 및 관리하는 것이 느리다.
멀티 프로세스란 하나의 애플리케이션을 여러 개의 프로세스로 구성하여 각 프로세스가 하나의 작업을 처리하도록 하는 것이다.
멀티프로세스는 다음과 같은 특징을 지닌다.
멀티 스레드란 하나의 애플리케이션을 여러 개의 스레드로 구성하여 하나의 스레드가 하나의 작업을 처리하도록 하는 것이다. 일반적으로 멀티스레드르 사용하는 이유는 사용자와 상호작용하는 애플리케이션에서 단일 스레드로 Network 또는 DB 와 같은 긴 작업(Long-running task) 을 수행하는 경우 해당 작업을 처리하는 동안 사용자와 상호작용이 불능인 상태가 될 수 있기 때문이다. 그림을 살펴보면 두개의 스레드가 서로에게 방해주지 않고, 각자 할일을 하는 모습을 보여주고 있다.
멀티 스레드는 다음과 같은 특징을 지닌다.
멀티 스레드는 멀티 프로세스에 비해 상당한 이점을 가지는 반면 위험 부담도 따른다. 그 이유를 알아보자.
자원의 효율성증대
멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행할 경우 프로세스를 생성하여 자원을 할당하는 비용이 적고, 스레드는 프로세스 내의 메모리를 공유하기 때문에 독립적인 프로세스와 달리 스레드 간 데이터를 주고 받는 것이 간단해지고 시스템 자원 소모가 줄어든다.
응답 시간 단축 및 처리 비용 감소
프로세스간 IPC를 사용하여 통신하는 것은 상대적으로 비용이 크다. 하지만 스레드는 프로세스의 메모리 영역을 공유하여 스레드 간의 통신 비용이 적게 든다. 또한 프로세스간의 Context Switching은 느린 반면 쓰레드간의 Context Switching 은 빠른데, 그 이유는 Context Switching 시 스레드는 Stack 영역만 처리하면 되기 때문이다.
멀티 스레드의 안정성 문제
여러 개의 스레드가 동일한 데이터 공간(Critical Section)을 공유하면서 이들을 수정한다는 점에 필연적으로 생기는 문제이다. 멀티 프로세스의 프로그램은 문제가 생기면 해당 프로세스가 중단되거나 중단 시키고 다시 시작 하면된다. 하지만 멀티 스레드 방식의 프로그램에서는 하나의 스레드가 자신이 사용하던 데이터 공간을 망가뜨린다면, 해당 데이터 공간을 공유하는 모든 스레드를 망가뜨릴 수 있다.
Critical Section: 임계 구역(critical section) 또는 공유변수 영역은 둘 이상의 스레드가 동시에 접근해서는 안되는 공유 자원(자료 구조 또는 장치)을 접근하는 코드의 일부를 말한다.
위키 : 프로세스 히스토리 https://en.wikipedia.org/wiki/Process_(computing)#History