728x90
반응형





프로세스 및 쓰레드 개념






프로세스란?


프로세스란 단순히 실행 중인 프로그램이라고 할 수 있다. 즉, 사용자가 작성한 프로그램이 운영체제에 의해 메모리 공간을 할당 받아 실행중인 것을 말한다. 


여러 명의 사용자들에 의해 공유되고 있는 응용프로그램은 일반적으로 각 사용자들의 실행단계에서 하나의 프로세스를 갖게된다. 즉, 모든 프로그램은 실행 될 때 하나 이상의 프로세스를 갖는다. 


프로세스는 자식 프로세스라고도 불리는 서브 프로세스를 시작시킬 수 있다. 자식 프로세스는 부모 프로세스의 복제로서 부모 프로세스의 자원을 일부 공유하는데, 부모 프로세스가 종료되면 더 이상 존재 할 수 없게 된다.


프로세스는 여러 가지 자원을 사용하게 되는데, 해당 명령을 수행하기 위해 운영체제에 따라 CPU를 점유 할 수 있다. 명령어와 데이터를 저장하기 위해 물리적인 메모리를 사용한다. 프로세스는 운영체제의 제어를 받으면서 실행(Running), 대기(Waiting), 중단(Stopped), 좀비(Zombie) 중 한 상태에 있게 된다. 


프로세스는 각 고유한 번호를 가지고 있으며 이를 PID(Process Identification Number) 라고 한다. 데비안 리눅스가 부팅될 때에는 모든 프로세스의 최상위 프로세스인 systemd (PID는 1) 이 생성되고 모든 프로세스들은 이 1번 프로세스의 자식 프로세스가 된다. 부모 프로세스의 PID를 줄여서 PPID 라고 한다. 


이러한 프로세스는 프로그램에 사용되는 데이터와 메모리 등의 자원 그리고 스레드로 구성될 수 있다.





데몬 프로세스란?


데몬은 항상 백그라운드로 실행되는 프로세스이며 대부분 부팅시에 자동으로 시작된다. 데몬은 평수에 대기 상태로 서비스 요청을 기다리다가 요청이 들어오면 해당 서비스를 제공한다. 프로세스 이름 끝에 보통 'd'가 붙어있으며 이 프로세스는 부팅 시에 실행 되고 백그라운드에서 대기하다가 ftp 클라이언트 같은 네트워크 프로그램이 연결을 요구할 때까지 기다린다. 






쓰레드란?


쓰레드란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다. 모든 프로세스는 한 개 이상의 쓰레드가 존재하여 작업을 수행하게 되고, 두 개 이상의 쓰레드를 가지는 프로세스를 멀티 쓰레드 프로세스라고 한다. 


쓰레드는 특정한 시점에 프로그램의 특정한 부분을 수행하게 된다. 이러한 쓰레드를 사용하여 프로그램의 여러 부분을 동시에 수행시킬 수 있다. 즉 프로그램의 여러 부분을 수행하는 각각을 쓰레드라고 하게 된다. 


이러한 쓰레드는 독립적으로 수행되기 위한 두 가지 정보를 가지고 있다. 


* Program Counter : 프로그램의 어느 부분을 실행하고 있는지에 대한 정보를 저장


* Stack : 함수를 호출하는 순서(Function Call)에 대한 정보를 저장


프로세스는 독립된 각각의 프로세스들이 독립된 영역을 가지고 있는 반면, 쓰레드는 하나의 프로세스 내에서 여러개 존재하므로 그 프로세스에 있는 메모리 공간을 서로 "공유" 하게 된다. 그래서 메모리 공간을 독립적으로 가지고 있을 필요가 없으므로 Light weight process 라고도 한다. 



다음 그림은 단일 쓰레드와 다중 쓰레드 프로세스의 차이를 나타낸 그림이다. 




싱글 쓰레드에 비해 멀티 쓰레드는 쓰레드가 세 개인 프로세스를 나타내고 있는데, 이 세 개의 쓰레드는 데이터와 피일들을 공유 하고 있다. 이렇듯 쓰레드는 하나의 주소공간에 존재하며 코드의 여러 부분을 동시에 수행하고 있다. 이 쓰레드들이 각각 수행되기 위해서 CPU의 프로그램 카운터와 스택을 가지고 있어야 하는 것이다. 







참고자료 1 : http://wlgnschlkkk.tistory.com/58

참고자료 2 : http://tcpschool.com/java/java_thread_concept

참고자료 3 : http://bowbowbow.tistory.com/16

참고자료 4 : http://studymake.tistory.com/619

참고자료 5 : https://m.blog.naver.com/PostView.nhn?blogId=minichuuuuu&logNo=220549787121&proxyReferer=https%3A%2F%2Fwww.google.com%2F

728x90
반응형

'Programming > Linux' 카테고리의 다른 글

[Embedded linux] 크로스 컴파일  (0) 2018.08.05
[Linux] 리눅스 버전 확인  (0) 2018.08.05
[Linux] diff 명령어  (0) 2018.08.05
[Linux] cp 명령어와 mv 명령어  (0) 2018.08.05
[Linux] 프로세스 확인하기  (7) 2018.07.22