반응형

프로세스와 스레드라는 것은 많이 들어 보셨을 텐데요.

우선 사전적 의미를 알아 볼게요~


Process [명사] 과정, 방법, 순서, 소송 수속 등...


Thread [명사] 실, 가는 것, 줄거리, 인간의 수명 등...


컴퓨터에서는 CPU가 프로그램을 실행하는 단위를 프로세스 및 스레드라고 합니다.

한번의 여러개의 프로세스나 스레드를 동작시키는 것을 멀티 프로세스, 멀티 스레드라고 해요.


CPU가 1개인 경우, 동시에 실행할 수 있는 프로그램은 1개 뿐인데요.

프로세스 및 스레드는 1개 입니다.

여러 프로그램이 실행된다는 것은 동시에 실행되는 것이 아니에요.

우리 눈에는 보이지 않을 정도로 굉장히 빠른 기계적 속도로 번갈아 교체되며 실행되는 것입니다.


예를들면 애니메이션 제작하는 것과 비슷하다 할 수 있죠

우리눈 에는 움직이는 것처럼 보이지만 한장한장의 그림들이 넘어가며 움직이는 것처럼 보이죠.


그렇다면 프로세스와 스레드는 대충 알겠는데 둘 차이가 뭐길래 이름이 다를까요?


그 이유는 바로 동일한 메모리 공간을 사용하는지 여부 입니다!


같은 메모리 공간을 공유하면 스레드(Thread)

다른 메모리 공간을 사용하면 프로세스(Process)



위의 구조를 함께 보시죠~


실제 메모리 주소 공간과 프로세스1, 프로세스2의 메모리 주소 공간이 다릅니다.


프로그램은 반드시 물리적인 메모리만을 사용하지 않는데요.

멀티 프로세스 시스템에서는 어플리케이션 프로그램이 사용하고 있는 주소와 실제 메모리 상의 주소가 다릅니다.

왜냐하면 각각의 프로세스가 다른 프로세스의 동작 내용에 상관없이 메모리 값을 읽거나 쓸 수 있도록 하기 위함입니다.


구체적으로 설명하자면,

위 그림의 프로세스 1의 0xC000번지와 프로세스 2의 0xC000번지는 실제 메모리 상에서는 다른 번지에 위치하고 있는데요.

프로세스 1이 0xC000번지의 값을 변경해도 프로세스 2의 0xC000번지의 값은 바뀌지 않습니다.


이 처럼 주소와 메모리상의 주소가 다른 것을 가상 기억이라고 해요.

가상 기억을 사용하면 프로그램이 정상적이지 않아도 다른 프로세스의 메모리 값을 바꾸는 일은 없어요.

가상 기억을 사용하는 시스템에서는 하드 디스크와 같은 보조 기억장치를 사용해서 물리적 메모리를 크게 보이게도 합니다.


반면 멀티 스레드 같은 경우에는 위 그림과 다르게 주소 공간을 공유하는데요.

즉, 1개의 스레드가 이상동작을 해서 메모리의 내용을 바꿔 버리면 주소 공간을 공유하고 있는

모든 스레드에 영향을 미칩니다.


이런 이유로 멀티 프로세스가 멀티 스레드보다 견고하다고 할 수 있습니다.

1개의 프로세스가 이상 동작을 해서 메모리의 내용이 바뀌었다고 하더라도 해당 프로세스만 이상 종료할 뿐

다른 프로세스나 오퍼레이팅 시스템에 아무런 영향을 미치지 않기 때문입니다.


그렇다고 해서 멀티 스레드는 안좋다라고 할 순 없는데요.

멀티 스레드는 메모리를 공유하고 있기 때문에 어떤 처리를 할 때에는 각 스레드의 연계가 수월합니다.


이상으로 프로세스와 스레드에 대한 설명을 마치겠습니다~


[참고] 도서, C를 배우기 전에 반드시 알아야 할 것들 (루비페이퍼 저 무라야마 유키오 옮김 이해란)


반응형

'IT > C' 카테고리의 다른 글

[C] 변수를 초기화해줘야 하는 이유  (0) 2018.06.04
반응형

변수에는 두 가지 종류가 있다.


자동변수

정적변수


자동변수는 필요할 때 만들었다가 필요가 없으면 다시 사라집니다.

정적변수는 프로그램을 실행해서 끝날 때까지 계속해서 메모리상에 존재합니다.


자동변수를 오토(Auto) 변수, 정적변수를 스태틱(Static) 변수라고도 해요.


정적변수는 메모리 값이 0으로 초기화 되어 있지만,

자동변수는 메모리 값이 정해져있지 않고 초기화 되어 있지 않습니다.

그래서 사용하기 전에 초기화를 해줘야 해요.


왜 그럴까요?


그 이유는 메모리 영역(세그먼트)가 다르기 때문이에요.


자동변수는 스택 세그먼트에 생성이 됩니다.

스택은 선형구조로 되어 있고 LIFO(Last In First Out)로 되어 있어요.

그렇기 때문에 가장 최근에 입력한 자료부터 출력하죠.

프로그램이 실행되는 동안에 생성되거나 삭제되기 때문에 명시적으로 초기화 하지

않는 이상 초기화 되지 않습니다. 초기화 여부는 개발자에게 달려있고,

초기화를 하지 않을 때는 속도면에서 좋습니다.


정적변수는 데이터 세그먼트에 생성이 돼요. 프로그램을 실행하기 전부터 

생성되어 있고, C소스를 컴파일 및 어셉블한 후에 만들어진 오브젝트 프로그램 안에

존재하죠. 그리고 프로그램이 실행되어 끝날 때까지 계속해서 메모리상에 존재합니다.

개발자가 지정한 값이 아닌 경우는 0으로 초기화 되어 있습니다.


상황에 맞게 쓰면 되겠습니다~


[참고] 도서, C를 배우기 전에 반드시 알아야 할 것들 (루비페이퍼 저 무라야마 유키오 옮김 이해란)

반응형

'IT > C' 카테고리의 다른 글

[C] 프로세스와 스레드(Process&Thread)  (0) 2018.06.19

+ Recent posts