병행 프로세스는 운영체제가 프로세서를 빠르게 전환시켜 프로세서 시간을 나눠 마치 프로세스 여러개가 동시에 실행 되는것처럼 하는것을 병행 프로세스라고 한다.

병행프로세스는 독립 프로세스, 협력 프로세스로 구분된다.

병행성은 시스템의 신뢰도를 높이고 처리 속도를 개선하여 처리 능력을 높이는데 매우 중요하다.
그리고 이를 위한 다음 몇 가지 해결 과제가 있다.

1) 공유 자원을 상호 배타적으로 사용해야 한다.
2) 병행 프로세스 간 협력이나 동기화가 되어야 한다. 상호배제도 동기화의 한 형태이다.
3) 두 프로세스 사이에서는 데이터를 교환할 수 있도록 통신이 되어야 한다.
4) 프로세스는 동시에 수행하는 다른 프로세스의 실행 속도와 관계없이 항상 일정한 실행 결과를 보장하는 결정성을 확보해야한다.
5) 교착 상태(deadlock)을 해결해야 한다
6) 병행 프로세스를 수행하는 과정에서 발생하는 상호배제, 즉, 어떤 프로세스가 작업을 실행 중일때 나머지 프로세스는 그것과 관련된 작업을 수행할 수 없도록 보장해야 한다.

병행성병렬성

병행성(Concurrency)와 병렬성(pararellism)

병행성은 프로세서가 빠르게 여러 프로세스를 번갈아 처리해 마치 동시에 실행되는것처럼 보이는것이다.

반면에, 병렬성은 실제로 여러 프로세서를 사용해 여러 프로세스를 동시에 처리하는것이다. 

 

작업을 병렬로 처리할 때, 프로세서들이 모든 입출력 장치와 메모리를 참조할 수 있기 때문에 동시에 동일한 자원에 접근할 때 충돌이 발생할 수 있다.

따라서 프로세서간 충돌을 방지할 상호배제가 필요하다.

'운영체제' 카테고리의 다른 글

[운영체제 공부] 교착상태  (0) 2020.02.12
[운영체제 공부] 상호배제  (0) 2020.02.10
[운영체제 공부] 스레드  (0) 2020.02.06
[운영체제 공부] 프로세스  (0) 2020.02.05
[운영체제 공부] 커널(Kernel)  (0) 2020.02.05

스레드란 프로그램이 자체적으로 둘 이상의 동시에 실행중인 작업으로 분할하는 방법이다.

같은 프로세스의 스레드들은 프로세스의 직접 실행 정보를 제외한 나머지 프로세스 관리 정보를 공유한다. 

프로세스 하나에 포함된 스레드들은 공동의 목적을 달성하기 위해 병렬로 수행한다.

스레드를 이용하면 다음과 같은 이점들이 있다.

1) 사용자 응답성 증가 : 응용프로그램의 일부분을 봉쇄하거나 긴 작업을 수행하더라도 병렬 프로그래밍으로 프로그램을 계속 실행할 수 있어 사용자 응답성이 증가한다. 예를 들면 다중 스레드를 적용한 웹 브라우저는 스레드 한 개가 파일을 로딩하는 동안 다른 스레드는 상호 작용을 할 수 있다.

2) 프로세스의 자원과 메모리 공유 가능 : 프로세스 내의 스레드들은 동일한 주소 공간에서 자원과 메모리를 공유하므로 시스템 성능이 향상된다.

3) 경제성이 좋음 : 프로세스간 문맥 교환보다 스레드간 문맥 교환이 오버헤드가 적다.

4) 멀티 프로세싱으로 성능과 효율 향상 : 다수의 스레드를 여러 프로세서에서 병렬로 실행해 성능과 효율성을 높일 수 있다.

멀티 스레드 vs 멀티 프로세싱

멀티 스레드 - 자원을 공유하기 때문에 멀티 프로세싱에 비해 메모리 절약

멀티 프로세싱 - 프로세스가 독립적으로 운용되기 때문에 멀티 스레드에 비해 안정성 향상

 

스레드의 구현

1) 사용자 수준 스레드

2) 커널 수준 스레드

 

3) 혼합형 스레드

사용자 수준 스레드와 경량프로세스간은 다대다, 경량 프로세스와 커널 수준 스레드간은 일대일 매칭이다.

 

프로세스는 일반적으로 '실행 중인 프로그램'을 의미한다.

또한 프로세스는 다음과 같이 다양하게 정의되기도 한다.

-실행 중인 프로그램
-비동기적 행위
-실행 중인 프로시저
-실행 중인 프로시저의 제어 추적
-운영체제에 들어 있는 PCB(프로세스 제어 블록)
-프로세서에 할당하여 실행할 수 있는 개체 디스패치가 가능한 대상

프로그램이 메모리에 적재되면 프로세스가 된다!

프로그램은 보조 기억장치에서 실행되기를 기다리는 코드와 정적인 데이터의 묶음이다.
이 프로그램이 메모리에 적재되면 프로세스가 된다.

프로세스의 메모리 구조

프로세스가 메모리에 적재되었을 때 위 그림과 같은 구조를 지닌다.

스택

스택은 데이터를 일시적으로 저장하는 영역이다.
지역변수에 사용하고, 변수가 범위 밖으로 이동하면 공간을 해제한다. 호출한 함수의 반환 주소, 반환 값, 매개 변수 등에 사용하고, 함수를 호출할수록 커지고 반환하면 줄어든다.

힙은 코드 영역과는 별도로 유지되는 자유 영역이다. 동적으로 메모리를 할당하려고 프로그램 실행 중 시스템 호출을 사용했다가 해제하는 방법으로 활용한다.

데이터

데이터는 프로그램의 가상 주소 공간이다. 전역변수나 정적변수를 저장하거나 할당하고 실행하기 전에 초기화한다.
그런데 변수 값은 실행 시간에 변경할 수 있어 읽기 전용 영역은 아니지만 읽기 전용 영역이나 읽기와 쓰기 영역으로 초기화할 수 있다. 정적 변수는 0으로 초기화하거나 초기화하지 않아도 된다. 초기화하지 않은 데이터는 데이터 영역의 끝에서 시작한다.

코드

코드는 실행 명령을 포함하는 메모리이거나 목적 파일에 있는 프로그램 영역이다. 프로그램을 시작할 때 프로세서가 디스크에서 읽어 실행하는 컴파일한 프로그램을 저장한다. 프로세스로 변경할 수 없고, 읽기 전용이므로 프로그램이 코드 영역을 침범하여 쓰기를 시도하면 오류가 발생해서 프로그램을 종료한다. 코드 영역은 공유할 수 있으므로 자주 실행하는 워드 프로세서, C 컴파일러, 셸 같은 프로그램의 사본 하나는 메모리에 존재한다.

 

스택과 힙 사이는 서브루틴을 실행하는 영역으로 운영체제로 매핑되지 않는다.

 

프로세스의 상태 변화

 

프로세스 제어 블록(PCB)

프로세스 제어블록은 특정한 프로세스를 관리할 필요가 있는 정보를 포함하는 운영 체제 커널의 자료 구조이다.

실행중인 프로세스는 모두 PCB를 가지고, 수행이 완료되면 PCB도 삭제된다.

 

문맥 교환(Context Switch)

문맥 교환이란 하나의 프로세스가 프로세서를 사용중인 상태에서 다른 프로세스가 프로세서를 사용하도록 하기 위해, 이전의 프로세스의 상태(문맥)를 보관하고 새로운 프로세스의 상태를 적재하는 작업을 말한다. 문맥교환이 일어나는 동안에는 다른 작업을 할 수 없고, 이를 오버헤드라 한다.

 

단일형 커널(Monolithic Kernel)

초기에 생겨난 가장 보편적인 형태이다. 커널의 다양한 서비스 및 높은 수준의 하드웨어 추상화를 하나의 주소 공간으로 묶은 것이다.

모든 모듈이 같은 주소공간에서 실행되기 떄문에 코드의 집적도는 조밀하고 수정하기 어려우며, 한 모듈의 버그가 시스템 전반을 멈추게 할 수 있다. 하지만, 구현이 신뢰할 수 있을 정도로 완성되면 구성 요소의 내부 집적이 내부의 시스템 이용을 효과적이게 하여 높은 효율을 보인다.

초기 유닉스, 리눅스, 도스 등이 대표적이다.

마이크로 커널(Micro Kernel)

마이크로 커널은 컴퓨터 과학에서 운영체제에 추가되어야 하는 메커니즘을 최소한으로 제공하는 초소형 커널이다.
낮은 수준의 주소 공간 관리, 스레드 관리, 프로세스간 통신(IPC)을 포함한다.

일반적으로 커널이 제공하는 네트워킹과 같은 다른 서비스들은 사용자 공간 프로그램인 서버로 구현된다.

모놀리식 커널에 비해 문맥교환이 잦아 오버헤드가 비교적 크게 일어난다.

혼합형 커널(Hybrid Kernel)

본질적으로 마이크로 커널을 따르나, 일부 커널의 비본질적 기능이더라도 사용자 레벨에서 수행될 때 성능상 느린 코드들을 커널 레벨에서 수행하도록 수정한것을 말한다.

엑소 커널

엑소 커널은 말단 이론을 따르는 수직 구조의 운영체제이다.

엑소 커널을 강제적인 추상화를 줄여 개발자에게 하드웨어 추상화에 대해 선택지를 다양하게 하는것이다.

 

운영체제에서 제공하는 서비스

운영체제에서 보통 제공하는 서비스에는 부팅 서비스, 사용자 서비스, 시스템 서비스, 시스템 호출이 있다.

1.부팅 서비스

부팅 서비스의 과정 요약

부팅 서비스는 컴퓨터 하드웨어를 관리하고 프로그램을 실행할 수 있도록 컴퓨터에 시동을 거는것이다.

운영체제를 메인메모리에 적재하는 과정을 부팅 혹은 부트스트래핑이라고 한다.

부트 로더는 하드디스크와 같은 보조기억장치에 저장된 운영체제를 메인 메모리에 적재하는 ROM에 고정시킨 소규모 프로그램이다.

 

2.사용자 서비스

1) 사용자 인터페이스(UI) 제공

사용자 인터페이스는 사용자와 컴퓨터 간의 상호작용이 발생하는 공간으로, CLI, 메뉴, GUI등의 형태로 구현할 수 있다.

CLI : Command Line Interface (명령 인터페이스)
GUI : Graphical User Interface (그래픽 사용자 인터페이스)

2) 프로그램 실행

운영체제는 프로그램을 실행하기 위해 메모리 할당, 해제, 프로세서 스케줄링같은 작업을 처리한다.

3) 입출력 동작 수행

입출력 동작을 직접 수행할 수 없는 사용자 프로그램의 입출력 동작 방법을 제공한다.

4) 파일 시스템 조작

파일 시스템 조작 서비스를 제공해 사용자가 파일을 저장/삭제 작업을 쉽게 할 수 있게 한다.

5) 통신(네트워크)

프로세스끼리 정보를 교환하는 방식에는 두가지가 있다.
첫번째는 동일한 컴퓨터에서의 프로세스간 교환
두번째는 네트워크로 연결된 컴퓨터 시스템에서 수행하는 프로세스간의 교환이다.
운영체제는 다중 작업 환경에서 공유 메모리를 이용하거나 메세지 전달로 다양한 유형의 프로세스와 통신을 지원한다.

6) 오류 탐지

운영체제는 가능한 모든 하드웨어와 소프트웨어 수준에서 시스템을 모니터링하고 조정함으로써 하드웨어 문제를 예방한다.
 

3.시스템 서비스

1) 자원 할당

다수의 사용자가 있거나 다수의 작업을 실행할 때는 운영체제가 자원을 각각 할당해 관리한다. 

2) 계정

각 사용자가 어떤 자원을 사용하는지 정보를 저장하고 추적한다.

3) 보호와 보안

다중 사용자 컴퓨터 시스템에 저장된 정보 소유자의 사용을 제한할 수 있다.
사용자가 여럿인 컴퓨터 시스템에서 여러 프로세스의 동시 실행을 허용하려면 각 프로세스를 서로의 활동에서 보호해야 한다.

4.시스템 호출

시스템 호출은 프로그램과 운영체제간의 인터페이스이다.
사용자 프로그램은 시스템 호출을 통해 운영체제의 기능을 제공받는다.

시스템 호출 방법에는 두가지가 있다.
1) 프로그램에서 명령이나 서브루틴의 호출 형태로 호출하는 방법
2) 시스템에서 명령 해석기를 사용하여 대화 형태로 호출하는 방법

시스템 호출의 유형으로는 프로세스 제어, 파일 조작, 장치 관리, 정보 유지, 통신 등이 있다.

일괄처리 시스템

초기 운영체제인 일괄 처리 시스템은 작업 준비 시간을 줄이기 위해 데이터를 받는 즉시 처리하지 않고 일정기간(량)을 모아 한번에 처리하는 방식이다.

이로써 다수의 사용자와 프로그램이 컴퓨터 자원을 공유할 수 있었다.

 

멀티 프로그래밍 시스템

여러 프로그램을 메모리에 나눠 적재한 후, 프로세서를 번갈아 할당하여 프로세서의 사용을 극대화해 여러 프로그램을 동시에 실행하는것이다.

프로세서가 프로그램을 빠르게 번갈아 처리하기때문에 동시에 실행되는것처럼 보인다. 하지만 실제로는 그림과 같이 프로그램의 유휴시간동안 다른 프로그램을 처리하는것이다.  

멀티 프로세싱(다중 처리) 시스템

 

멀티 프로세싱 시스템(multiprocessing)은 하나의 컴퓨터에 여러개의 CPU(혹은 멀티코어)를 장착하고 하나 이상의 프로세스들을 동시에 처리하는것을 의미한다. 더 넓은 범위로 해석하면 컴퓨터 한대가 아닌 여러 장치에서 병렬로 처리하는것이기도 하다.

 

시분할 시스템

실시간 시스템

실시간 시스템은 일정시간(제약) 내에 응답하는것을 목표로 하는 시스템이다.

시간 제약의 엄격함에 따라 경성 실시간 시스템(hard real time processing system)과 연성 실시간 시스템(soft real time processing system)으로 나뉜다.

경성 실시간 처리 시스템은 작업의 실행 시작이나 완료에 대한 시간 제약 조건을 지키지 못할 때 시스템에 치명적인 영향을 주는 시스템이다. 예로 무기 제어, 발전소 제어, 철도 자동 제어, 미사일 자동 조준 등이 있다.

연성 실시간 처리 시스템은 작업 실행에서 시간 제약 조건은 있으나, 이를 지키지 못해도 전체 시스템에 치명적이지 않은 시스템이다. 예로 동영상 프레임이 있다.

 

헷갈리는 용어간 차이점

+ Recent posts