생성가능한 쓰레드 최대 개수 (feat.pthread_)

pinelancer·2021년 10월 4일
0

식사하는 철학자 문제를 풀고있다. 철학자의 수 만큼 쓰레드를 생성하여 시물레이션을 진행해야하는데 인자로 받은 철학자의 수가 생성 가능한 스레드 수를 초과하는 경우 에러 처리가 필요하다. 임의값을 지정하여 풀 수 있지만... 정말로 궁금해졌다.

헤더에서 찾을 수 있을까

#include <unistd.h>

#define _SC_THREAD_THREADS_MAX      94


_SC_THREAD_THREADS_MAX
Inquire about the parameter corresponding to _POSIX_THREAD_THREADS_MAX.

https://ftp.gnu.org/old-gnu/Manuals/glibc-2.2.3/html_node/libc_637.html
#include <limits.h>

#define _POSIX_THREAD_THREADS_MAX       64


PTHREAD_THREADS_MAX
Maximum number of threads that that can be created per process. Minimum Acceptable Value: _POSIX_THREAD_THREADS_MAX
https://pubs.opengroup.org/onlinepubs/7908799/xsh/limits.h.html

limits.h 에서 PTHREAD_THREADS_MAX 값을 확인할 수 없었지만, 프로세스 당 최소 _POSIX_THREAD_THREADS_MAX 이상 생성할 수 있음을 확인했다.

테스트 프로그램을 만들어 프로세스에서 생성가능한 스레드의 수를 알아보자.

테스트

환경

OS: macOS Catalina v10.15.7, 3.1
Processor: 3.1 GHz 6-Core Intel Core i5
Memory: 32 GB 2667 MHz DDR4

main()
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <errno.h>
#include <stdlib.h>

#include <limits.h>
void * ThreadFunc( void * pclsArg )
{
 sleep(1000);

 return NULL;
}

int	main( int argc, char * argv[] )
{
	int iCount = 0;
	pthread_t *iThread;

	iThread = (pthread_t *)malloc(sizeof(pthread_t));
	while( iCount <= 8191)
	{
		if( pthread_create( iThread, NULL, ThreadFunc, NULL ) != 0 )
		{
			printf( "error = %d\n", errno );
			break;
		}
		pthread_detach( *iThread );
		++iCount;
		printf( "%d\n", iCount );
	}
	return 0;
}

[소스코드 출처][리눅스] 64bit 리눅스에서 프로그램이 생성할 수 있는 쓰레드 최대 개수|작성자 까미유

결과

확인해보니 8191개의 새로운 스레드를 생성했고, 8192번째 스레드 생성 에러가 발생했다.(errno = 12)

$>echo $?
12

================================================================================
$>man errno
...

12 ENOMEM

Cannot allocate memory.  The new process image required more memory than was allowed by the hardware or by system- imposed memory management constraints.  A lack of swap space is normally temporary; however, a lack of core is not.  Soft limits may be increased to their corresponding hard limits.

...

어떤 의미인지 싶어 헤더에 8192인 값을 가지는 상수 매크로를 찾았다.

limits.h

#define PTHREAD_STACK_MIN       8192

8191개의 스레드까지 생성했으니 메인스레드를 포함해 총 8192개의 스레드이다.
스레드 속성이 디폴트라면 프로세스당 PTHREAD_STACK_MIN 만큼 생성가능하다고 유추할 수 있다.

pthread_stack_size를 변경할 수 있을까?

8192보다 작거나 큰값을 스택사이즈로 지정하려 할 때 모두 에러가 발생했다. 방법을 찾으려 했지만 실패했다.

...
  pthread_attr_init(&attr);
	//pthread_attr_setguardsize(&attr, 9000);
	ret = pthread_attr_setstacksize(&attr, 6000);
	//ret = pthread_attr_setstacksize(&attr, 8000);
	if (ret != 0)
	{
			printf( "error = %d\n", errno );
			return ret;
	}
...
  
errno = 0, ret = 22 ENIVAL
  
22 EINVAL Invalid argument.  Some invalid argument was supplied. (For example, specifying an undefined signal to a signal or kill function).
profile
🏃🏾

0개의 댓글