운영체제 공부하다가 프로세스에서 모르는 부분이 생겼습니다

컴퓨터는 메모리가 허용하는 한 디스크에 저장된 프로그램들을 최대한 많이 execute하여

메모리상에 프로세스로 존재하게끔 만들고

CPU는 코어의 개수만큼의 run을 모든 프로세스마다 스케줄링한 순서대로 수행하잖아요?

그럼 총 프로세싱을 코어 개수만큼… 코어가 2개라면 2개만큼 동시에 하고있단 말인데

각 프로세스 내부의 스레드는 몇개까지 만들 수 있는지 그런말은 없더라구요

설마 cpu가 스레드를 무한정 만들진 않을테고… 스레드를 몇개까지 늘릴 수 있고

그냥 스레드 만들겠다고 만들어버리는게 가능한지, 가능하다면 프로세스 마다 몇개까지 만들 수 있는지 궁금합니다

작업 관리자를 켜보면 제컴퓨터에 현재 200개의 프로세스, 2400개의 스레드가 존재하니깐

프로세스 개당 12개의 스레드가 존재하는건가싶기도 한데… 그런규칙같은걸 잘 알고싶어요

2 Likes

안녕하세요.

그걸 알려면 각 커널의 규칙을 아셔야합니다.
쉬운방법으로는 리눅스 커널 소스를 보는 방법이 있죠.
오픈소스니까용.

이곳에 리눅스의 최대 스레드갯수를 확인하는 방법이 있습니다.

또한 각 운영체제에서 스레드와 프로세스를 바라보는 시각이 다를수도 있어요.

프로세스를 스레드의 모음이며 메모리를 할당받는 단위로 볼수도 있고,
스레드를 단순히 공유메모리가잇는 다른 프로세스로 볼수도 있죠

정말 감사합니다!

생각을 다듬으세요.
컴퓨터는 프로그램을 최대한 많이 execute 하여 메모리 상에 프로세스를 존재하게끔 만드는 녀석이 아닙니다.
컴퓨터는 열받는걸 싫어하고 추운것도 싫어합니다. 추우면 안켜지고, 열받으면 throttling 걸려서 버벅 대죠.
CPU 는 오행상 ‘목’ 에 해당하고 인간 꼬마들 처럼 놀기 좋아합니다.
그래서 idle process 상태인걸 매우 좋아합니다.

다만, 글쓴분의 표현을 조금 다듬는다면
메모리가 허용하는한 논리적인 실행단위인 쓰레드와 프로세스를 지원해 주는 것이죠.

여기서 ‘논리적인 실행단위’ 라는 말이 나왔는데, 논리 라는 단어가 튀어나오면 일단 OS 레벨이라고 보면 됩니다.
즉 OS 가 갖는 쓰레드의 실행한계는

  1. handle 로 표현가능한 범위 수 ( 65536 개 이하거나 4294967296 개 이하 등 )
  2. 가용한 메모리를 thread 를 생성하는데 소요되는 메모리의 크기로 나눈 것

으로 볼 수 있지만, 쓰레드 마다 프로세스 마다 메모리 크기 설정을 다르게 할 수 있기 때문에 엄밀히는
가용 메모리의 크기로 쓰레드 생성 수가 제한된다고 보는게 맞습니다.

이렇게 보면 님이 서두에서 쓴 표현만 조금 다듬어도 이미 해답이었다는걸 아실 수 있겠죠.

구체적인 예를 든다면, visual studio 의 프로젝트 설정에서 쓰레드 당 할당 메모리 기본크기를 1MB 로 잡고 있고 모든 프로그램이 기본설정으로 빌드되었다면 32비트 환경에서 ( 논리적으로 4GB, OS 가 2GB 를 사용중이라 2GB 가용 ) 2GB / 1MB = 2000 개의 쓰레드를 생성할 수 있는 것이죠.

것도 램과 디스크가 적어서 가상메모리로도 4GB 를 만들 수 없으면 더 줄어드는 것이구요.

코어의 수는 물리적 ‘동시성’ 에 가까운 수를 알려주는 것이고,
것도 하이퍼 쓰레딩이라는 형식으로 최대 클럭을 나누어 쓰는 대신
코어가 2배인것 처럼 속여주는 방법도 쓰이는 것이죠

정말로 감사합니다!! 스레드를 생성하는데 소요되는 메모리가 크면 클수록 뭔가 성능이 좋아진다거나 할수도 있겠네요

무슨 말씀인지 모르겠습니다.

무슨 말이냐면… 비주얼 스튜디오에서 쓰레드 당 할당 메모리 기본크기가 1MB라고 하셨는데 인위적으로 2MB로 늘린다거나 뭐 매우 작게 한다거나 하면 하면 뭐 성능이 변한다거나 그런가 싶어서 한 말이었습니다.

할당 메모리가 커지면 성능이 좋아진다는 말에 개연성이 없습니다.

크기와는 관련이 없나요… 혹시 VS에서 쓰레드 기본 할당 크기를 1MB로 잡아주는 이유같은게 있나요?

아무말이나 던지고 이유를 묻지 말고 생각을 하세요.

사용하는 메모리가 크다고 성능이 좋은것이냐? context switching cost 는?
cache hit ratio 는? 그렇게 단순히 성능이 결정되는게 아니죠.

멀티 쓰레딩은 혼자 도는게 아니기에, 어떤 쓰레드가 구동되는데 소요되는 메모리가 많다면,
그 작업이 백그라운드로 갔다가 포어그라운드로 올라올때의 랙이 심해지는겁니다.

어떤 쓰레드가 잔뜩 램을 확보해 놓고 떵떵 거리며 혼자 램과 CPU 자원을 다 쓰고 있다면 물론 성능이 좋은거겠죠.
하지만 그건 멀티쓰레딩 이슈랑 별 상관이 없잖아요. 차라리 single thread 지.

thread 의 성능은 가장 작게 구현했을때 일반적으로 좋아진다고 추측할 수 있는겁니다.
물론 메모리 사용량을 극도로 줄이기 위해서 허리띠를 너무 졸라매다 보면 오히려 연산량이 늘어나는 경우가 허다하죠.

지식이 없어 도메인에 익숙한 사고를 하지 못하더라도,
나름 고민한 흔적이 보였으면 합니다.

그렇군요… 스레드가 메모리에서 차지하는 크기가 작을수록 컨텍스트 스위칭이 일어날 때 캐시에 덜 올라가니깐 부하가 적고… 그렇다고 절약하잡시고 너무 작게 해버리면 연산을 한번에 못해버리는 작업이 생기니깐 연산량이 늘어나고 그런걸까요… 정말 감사합니다!! ㅠㅠ 이쪽으로 내공을 엄청 많이 쌓아야 겠네요

1 Like