잊지 않겠습니다.

리눅스 쓰레드 만들기<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>

리눅스는 POSIX 쓰레드를 지원한다. 리눅스 쓰레드는 다음의 코드로 만들어진다:


리눅스에서 쓰레드 만들기

여기에서, t1은 쓰레드 ID를 받기위해 사용되는 매개변수이다. 두 번째 인자는 많은 스케쥴링 옵션을 지원하는 쓰레드 속성 인자이다. 우리는 여기서 디폴트 세팅을 사용할 것이다. 세 번째 인자는 쓰레드를 생성할 때 실행 될 서브루틴(subroutine)이다. 네 번째 인자는 서브루틴으로 전달된 포인터이다. 이것은 쓰레드나 새로 만들어진 쓰레드에 필요한 것을 위해 저장한 메모리를 지시할 수 있다.

리눅스 쓰레드는 서브루틴에서 리턴하거나 pthread_exit() 루틴을 호출하여 종료한다. 쓰레드가 가지고 있는 리소스는 부모 쓰레드가 pthread_join() 루틴을 호출할 때 회복된다. pthread_join()는 프로세스용 wait() 함수와 비슷하다.pthread_join()는 쓰레드에 의해 할당된 힙 메모리(heap memory)를 회복하지 않는다. 전역으로(globally) 할당된 메모리가 프로그램 또는 쓰레드에 의해 자유로워 져야 한다.


Windows 쓰레드 만들기

Windows 쓰레드는 Windows 프로세스를 만드는 것보다 훨씬 간단하다. 쓰레드를 만드는 데에는 리눅스에서 사용한 매개변수를 비롯하여 보안 디스크립터와 초기 스택 크기도 포함된다.


Windows
에서 쓰레드 만들기

첫 번째 인자는 보안 디스크립터 로서 쓰레드 핸들이 상속 될 수 있을 지의 여부를 결정한다. NULL 은 이것이 상속될 수 없다는 것을 의미한다. 두 번째 인자는 스택 사이즈이다. 세 번째와 네 번째 인자는 서브루틴과 패스된 매개변수이다. 다섯 번째 인자는 플래그 인자이다. 쓰레드는 플래그가 CREATE_SUSPENDED로 설정될 때 중지 상태에서 만들어진다. 여섯 번째 인자는 결과 쓰레드 ID를 시스템에 저장한 위치를 가리킨다.

Windows 쓰레드는 호출된 서브루틴에서 리턴하거나 ExitThread() API를 호출하여 종료한다. 부모는WaitForSingleObject(threadid)를 호출하여 쓰레드를 정리하거나 WaitForMultipleObjects() API를 사용하여 다중 이벤트를 기다릴 수 있다.

Posted by Y2K
,

이 번 칼럼에서 Edward G. Bradford 박사는 리눅스와 Windows 시스템에서 쓰레드 및 프로세스 관리에 초점을 맞추었다. 프로세스와 쓰레드의 차이점과 그들을 만들고 없애는 방법을 설명한다. 각자의 시스템에서 쓰레드 관리를 공부할 수 있는 적합한 프로그램도 만들어본다.<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?>

에 서 처음으로 프로그래밍 소켓을 살펴보고 단일 시스템 내에서 완전하게 작동하는 소켓 코드의 퍼포먼스도 측정했다. 측정 결과는 네트워크 전송 비율을 반영하지는 않지만 소켓용 최대 쓰루풋을 나타냈다. 이번 달 칼럼에서는 프로세스와 쓰레드를 생성하고 없애는 방법을 설명할 것이다. 쓰레드와 프로세스는 매우 유사하다. 리눅스에서, 쓰레드와 프로세스는 구별이 불가능하다.

  

프로세스(Processes)

프로세스는 리눅스와 Windows에서 모두 실행 프로그램을 뜻한다. Windows에서는 .exe 확장자가 있는 파일 이름이 실행파일이다. 프로세스는 소스 파일을 컴파일 하고 실행 파일을 생산함으로서 만들어진다. 컴파일 단계는 Windows와 리눅스 모두 비슷하다:


프로그램 컴파일하기

  

위 두개의 컴파일 결과는 create-pt2.exe (Windows)와, create-pt2 (리눅스)라는 실행파일이다.

프 로세스는 오픈 파일 핸들을 상속 받을 수 있다. Windows에서, 핸들이 작은 정수가 아니기 때문에 정확한 값은 알 수 없다. Windows에서 기존의 오픈 파일을 위해 핸들을 정확한 값으로 초기화 하는 것은 문서화된 프로시져가 아니다. 리눅스에서 파일 디스크립터(descriptor)를 20으로 설정하고 사용하는 것은 매우 쉽다.

일단 프로세스가 만들어지면 시작할 때 명령행에서 프로그램 이름을 타이핑 하면 된다. 리눅스와 Windows 모두 같다:


프로그램 실행하기

Windows 프로그램의 경우, .exe 서 픽스를 타이핑 할 필요가 없다. 프로그램이 실행권한이 있고 합법적인 Windows 바이너리 형식의 프로그램이라면 Windows는 모든 프로그램 이름을 실행 파일로서 인식한다. 따라서 나는 마이크로소프트 컴파일러의 아웃풋을 리눅스와 마찬가지로 create-pt2 라고 이름을 붙였다.

  

쓰레드(Threads)

쓰레드는 실행 콘텍스트(context)이다. 처음에 각 프로세스는 하나의 실행 콘텍스트를 갖는다. 이 실행 콘텍스트를 쓰레드라고 한다. 프로세스가 다른 실행 콘텍스트를 필요로 한다면 간단히 다른 프로세스를 만들 수 있다. 하지만 프로세스 생성은 프로세서 사이클과 메모리 사용의 관점에서 볼 때 사치스러운 일이다. 쓰레드는 다중 실행 콘텍스트를 만드는데 경량의(lightweight) 메커니즘을 제공하도록 되어있다. Windows와 리눅스는 한 쌍의 실행 환경을 제공할 목적으로 오퍼레이팅 시스템에서 쓰레드를 스케쥴링한다.

프 로세스와 쓰레드의 가장 뚜렷한 차이는 프로세스의 모든 쓰레드가 같은 메모리 공간과 시스템 정의의 "도구(facility)"를 공유한다는 점이다. 오픈 파일 핸들(파일 디스크립터), 공유 메모리, 프로세스 동기화 프리머티브(process synchronization primitives), 현재 디렉토리 등이 "도구"이다. 글로벌 메모리가 공유되고 새로운 메모리가 할당되지 않기 때문에 쓰레드를 만드는 것은 프로세스를 만드는 것보다 간단하고 빠르다.

Posted by Y2K
,

아파치 1.x 대 버전과 아파치 2.x 대 버전의 차이점이 이것이 아닐까 합니다. 프로세스로서의 아파치와 스레드로서의 아파치의 성능차이..
아파치 2.x 대 버전부터는 멀티스레드 기능이 추가되었다는 것 아시죠^^

프로세스


프로세스는 컴퓨터 내에서 실행중인 프로그램의 인스턴스이다. 이 용어는 몇몇 운영체계에서 사용되는, "태스크"라는 용어와 의미상으로 가깝다. 유닉스나 몇몇 다른 운영체계에서는, 프로그램이 시작되면 프로세스도 시작된다. 태스크와 마찬가지로, 프로세스는 그 프로세스가 추적 관리될 수 있게 하기 위한 특정한 데이터 셋이 관련되어 실행 중인 프로그램이다. 여러 명의 사용자들에 의해 공유되고 있는 응용프로그램은 일반적으로 각 사용자들의 실행단계에서 하나의 프로세스를 갖는다.

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

프로세스들은 몇 가지 IPC 방식을 통하여 정보를 교환하거나 그들의 연산을 동기화할 수 있다.


스레드


1. 유즈넷의 뉴스그룹이나 그와 비슷한 토론의 장에서, 스레드란 초기에 올려진 메시지에 대해 올라간 일련의 응답들을 의미한다. 스레드는 수없이 많은 뉴스그룹내의 각각의 토론들을, 추후에 관련 있는 것끼리 찾아서 이해하거나 또는 그 토론에 참여하는데 도움을 준다. 스레드는 보통 최초의 메시지 위에 관련되는 메시지들을 올려놓는 형식의 그림으로 표시된다.

2. 컴퓨터 프로그래밍에서, 스레드는 다수의 사용자들을 동시에 처리할 수 있는 프로그램이 각각의 사용과 관련하여 가지고 있는 정보들 말한다. 프로그램의 관점에서 보면, 스레드는 한 명의 개별 사용자 또는 특정한 서비스 요청을 서비스하는데 필요한 정보이다. 만약 다수의 사용자들이 그 프로그램을 쓰고 있거나, 또는 다른 프로그램들로부터 동시에 요청이 발생했을 때, 각각의 사용자나 프로그램들을 위해 스레드가 만들어지고, 또 유지된다. 스레드는 프로그램에게 현재 어떤 사용자가 서비스를 받고있는지를 파악하게 함으로써, 다른 사용자들을 위하여 재진입 해야할 것인지의 선택을 할 수 있도록 한다 (단방향 스레드 정보는 특별한 데이터 저장소 내에 그것을 저장하고, 데이터 저장소의 주소를 레지스터에 집어넣음으로써 유지된다. 운영체계는 항상 프로그램이 중단되었을 때 레지스터의 내용을 저장하며, 그리고 다시 제어권이 주어졌을 때 그 내용을 복구한다).

멀티스레딩과 멀티태스킹은 비슷해서 자주 혼동된다. 오늘날의 컴퓨터들은 한번에 단 한 개의 프로그램 명령어만을 수행할 수 있다. 그러나, 그들이 매우 빠르게 동작하기 때문에, 동시에 많은 프로그램들을 실행하고, 많은 사용자들을 서비스하는 것처럼 보이는 것 뿐이다. 윈도우95와 같은 운영체계는 각 프로그램에게 실행될 때 "순서"를 주는데, 다른 프로그램들은 자신들에게 순서가 돌아올 때까지 기다리게된다. 이 프로그램들 각각은 운영체계에 의해 일정량의 자원들이 관계되고 진행상황을 계속 알게되는 하나의 작업, 즉 태스크로 간주된다. 운영체계는 PC 시스템 내의 각 응용프로그램(스프레드시트, 워드 프로세서, 웹 브라우저 등)들을 각각의 별도 태스크로 관리하고, 사용자가 태스크 목록 내에서 그것들을 보거나 관리할 수 있도록 해준다. 만약 그 프로그램이 파일을 읽거나 프린터를 통해 출력하는 등 입출력 요청을 개시했다면, 입출력 작업이 끝났을 때 그 프로그램이 원래의 장소로 정확히 재진입할 수 있도록 하나의 스레드가 만들어진다. 그 동안, 그 프로그램을 동시에 이용하던 태스크들은 또다른 스레드들에서 유지되고 관리된다. 오늘날 대부분의 운영체계는 멀티태스킹과 멀티스레딩을 모두 지원한다. 그들은 또한, 프로그램 프로세스들 안에서 멀티스레딩을 허용함으로써, 그 시스템이 각 스레드를 위해 새로운 프로세스를 만드는데 생기는 추가부담을 줄일 수 있게 해준다.

POSIX.4a라는 C 언어 규격은 프로그래머가 프로그램 내에서 스레드 지원을 포함할 수 있도록 하는 일련의 응용프로그램 인터페이스(API)를 제공한다. 또한, 고급 프로그램개발 도구나 미들웨어에서도 스레드 관리를 편하게 할 수 있는 기능들을 제공하기도 한다. 객체지향 프로그래밍 언어들 역시 여러 가지 방법을 통해 멀티스레딩에 관한 편의를 제공하고 있다. 자바는 언어의 구문 내에 동기변경자를 포함하는 것으로, 또 멀티스레딩을 위해 개발된 클래스(이 클래스들은 다른 클래스들에 의해 상속될 수 있다)들을 제공하는 것으로, 그리고 다중 스레드를 위한 자투리 모으기를 후면에서 실행함으로써 멀티스레딩을 지원한다.

- 출처 http://www.terms.co.kr/ 에서 얻어옴 -

- 결론 -
프로세스는 하나의 프로세스를 처리 후 다음 프로세스 처리로 넘어갈 때 시간이 많이 걸리게 된다. 그러나, 스레드는 컴퓨터의 자원을 아주 조금 점유하므로 하나의 스레드 처리 후 다음 스레드 처리로 넘어가는 시간이 아주 짧다는 점이죠.

Posted by Y2K
,