WIN32 프로그래밍에 익숙한 사람들은 WIN32의 프로세스 관리 방식이 Linux의 프로세스 관리 방식과 매우 다르다는 것을 알아야 합니다. UNIX에는 프로세스라는 개념만 있지만 WIN32에는 "스레드"라는 개념도 있으므로 Linux는 및 WIN32가 여기에 있습니다. 차이점은 무엇인가요?
WIN32의 프로세스/스레드는 OS/2에서 상속됩니다. WIN32에서 "프로세스"는 프로그램을 의미하고 "스레드"는 "프로세스"의 실행 "단서"를 의미합니다. 핵심적인 관점에서 볼 때 WIN32의 다중 프로세스는 Linux의 다중 프로세스와 크게 다르지 않습니다. WIN32의 스레드는 Linux 프로세스와 동일하며 실제 실행 코드입니다. 그러나 WIN32에서는 동일한 프로세스의 스레드 간에 데이터 세그먼트가 공유됩니다. 이것이 Linux 프로세스와의 가장 큰 차이점입니다.
다음 프로그램은 WIN32의 다음 프로세스가 스레드를 시작하는 방법을 보여줍니다.
정수 g; DWORD WINAPI ChildProcess(LPVOID lpParameter){ 나는 int; for ( i = 1; i <1000; i ++) { g++; printf( "하위 스레드입니다: %dn", g ); } 종료스레드( 0 ); }; 무효 메인() { int 스레드ID; 나는 int; g = 0; CreateThread( NULL, 0, ChildProcess, NULL, 0, &threadID ); for ( i = 1; i <1000; i ++) { g++; printf( "이것은 상위 스레드입니다: %dn", g ); } }
WIN32에서는 CreateThread 함수를 사용하여 스레드를 생성합니다. Linux에서 프로세스를 생성하는 것과 달리 WIN32 스레드는 생성 지점에서 실행을 시작하지 않습니다. 대신 CreateThread는 함수를 지정하고 해당 함수에서 스레드가 실행을 시작합니다. 이 프로그램은 이전 UNIX 프로그램과 동일하며 두 개의 스레드가 각각 1000개의 정보를 인쇄합니다. threadID는 자식 스레드의 스레드 번호입니다. 또한 전역 변수 g는 자식 스레드와 부모 스레드가 공유합니다. 이것이 Linux와의 가장 큰 차이점입니다. 보시다시피, WIN32의 프로세스/스레드는 Linux의 프로세스/스레드보다 더 복잡합니다. Linux에서 WIN32와 유사한 스레드를 구현하는 것은 포크 후에 자식 프로세스가 ThreadProc 함수를 호출하고 공유 프로세스를 여는 것입니다. 그러나 WIN32에서는 포크와 유사한 기능을 구현하는 것이 불가능합니다. 따라서 WIN32에서 C 언어 컴파일러가 제공하는 라이브러리 함수는 이미 대부분의 Linux/UNIX 라이브러리 함수와 호환되지만 여전히 포크를 구현할 수 없습니다.
멀티 태스킹 시스템에서는 데이터 영역을 공유하는 것이 필요하지만 이는 쉽게 혼동을 일으킬 수 있는 문제이기도 합니다. WIN32에서는 스레드 간에 데이터가 공유된다는 사실을 프로그래머가 쉽게 잊어버릴 수 있지만 다른 스레드가 수정됩니다. 이로 인해 프로그램 문제가 발생합니다. 그러나 Linux에서는 변수가 원래 공유되지 않기 때문에 프로그래머가 공유할 데이터를 명시적으로 지정하여 프로그램을 더 명확하고 안전하게 만듭니다.
WIN32의 "프로세스" 개념은 "응용 프로그램"을 의미하며 UNIX의 exec와 동일합니다.