![Linux 커널의 프로세스는 커널 모드에서 서로 다른 스레드에 대해 별도의 스택을 어떻게 할당합니까?](https://linux55.com/image/90700/Linux%20%EC%BB%A4%EB%84%90%EC%9D%98%20%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4%EB%8A%94%20%EC%BB%A4%EB%84%90%20%EB%AA%A8%EB%93%9C%EC%97%90%EC%84%9C%20%EC%84%9C%EB%A1%9C%20%EB%8B%A4%EB%A5%B8%20%EC%8A%A4%EB%A0%88%EB%93%9C%EC%97%90%20%EB%8C%80%ED%95%B4%20%EB%B3%84%EB%8F%84%EC%9D%98%20%EC%8A%A4%ED%83%9D%EC%9D%84%20%EC%96%B4%EB%96%BB%EA%B2%8C%20%ED%95%A0%EB%8B%B9%ED%95%A9%EB%8B%88%EA%B9%8C%3F.png)
프로세스에 시스템 호출이 이루어지고 커널 모드에 있는 경우 2개의 스레드가 생성됩니다.
a) 커널에서 각 스레드의 스택은 어떻게 생성됩니까?
b) 스레드 중 하나가 다시 사용자 모드로 전환되고 다른 스레드가 커널 모드에 남아 있으면 상위 스레드가 할당한 커널 데이터(로컬)가 손실됩니까?
c) 생성된 두 스레드의 PID가 다른 이유는 무엇입니까?
답변1
커널을 많이 조사하고 동일한 주제와 관련된 프로젝트를 진행한 후 다음을 발견했습니다.
a) 예, 각 kthread에는 8k, 4k 등과 같은 아키텍처에 따라 달라지는 스택이 있습니다.
b) 예, 커널 스택이 비었을 때 사용자 공간으로 다시 전환하면 스레드 중 하나의 로컬 권한을 잃게 됩니다. 그러나 전역 변수를 선언하고 해당 변수를 실행하면 해당 스레드를 다른 스레드에서 사용할 수 있게 됩니다. . 또 한 가지 주목해야 할 점은 전체 커널에 단 1개의 데이터 세그먼트만 있다는 것입니다.
c) 두 스레드는 커널 컨텍스트에서 서로 다른 두 프로세스이고 ps에서 []로 표시되므로 두 스레드의 pid가 다릅니다.