스레드와 프로세스의 차이점: 프로세스는 자원 할당의 기본 단위이고, 스레드는 독립적으로 실행되는 제어 흐름입니다.

王林
풀어 주다: 2024-07-23 10:57:54
원래의
975명이 탐색했습니다.

스레드와 프로세스의 차이점: 프로세스는 자원 할당의 기본 단위이고, 스레드는 독립적으로 실행되는 제어 흐름입니다.

스레드: 프로세스의 단일 시퀀스에 대한 제어 흐름입니다(총칭하여 경량 프로세스라고 함)

스레드는 운영 체제가 계산 스케줄링을 수행할 수 있는 가장 작은 단위입니다. 프로세스에 포함되며 프로세스의 실제 작동 단위입니다. 스레드는 프로세스에서 단일 시퀀스의 제어 흐름을 의미합니다. 프로세스에서 사용되는 스레드는 운영 체제 커널에 의해 예약된 커널 스레드일 수 있습니다.

동일한 프로세스의 여러 스레드는 가상 주소 공간, 파일 설명자, 신호 처리 등과 같은 프로세스의 모든 시스템 리소스를 공유합니다.

그러나 동일한 프로세스의 여러 스레드에는 자체 호출 스택, 자체 레지스터 환경 및 자체 스레드 로컬 저장소가 있습니다.

스레드와 프로세스의 차이점은 다음과 같습니다. 일반적으로 프로세스에는 여러 스레드Linux 프로세스와 스레드 커널이 포함될 수 있습니다. 운영 체제에서는 일반적으로 프로세스가 기본으로 간주됩니다. 자원 할당 단위, 쓰레드(Thread)는 독립적인 동작과 독립적인 스케줄링의 기본 단위로 프로세스보다 크기가 작고 기본적으로 시스템 자원을 필요로 하지 않는다.

프로세스에는 명령 실행 본체로 하나 이상의 스레드가 필요합니다. 프로세스는 리소스(예: CPU, 비디오 메모리, 파일 설명자 등)를 관리하며 스레드는 실행을 위해 CPU에 할당됩니다.

스레드 모델은 코어 수준 스레드와 사용자 수준 스레드의 두 가지 스레드 모델로 구분됩니다. 분류 표준은 주로 스레드 스케줄러가 커널 내부에 있는지 아니면 커널 외부에 있는지에 따라 다중 동시 사용에 더 도움이 됩니다. -프로세서 리소스, 전자가 더 많이 고려되는 것은 컨텍스트 전환 오버헤드입니다.

内核进程和内核线程_linux进程与线程 内核_linux内核线程和用户线程

Linux 커널은 경량 프로세스만 지원하므로 보다 효율적인 스레딩 모델의 구현이 제한됩니다.Linux 프로세스 및 스레드 커널, Linux는 다음에 중점을 둡니다

Linux는 경량 프로세스를 지원하지만 코어 수준 프로세스를 지원한다고 말할 수는 없습니다. Linux의 스레드와 프로세스는 실제로 동일한 스케줄링 수준에 있고 프로세스 식별자 공간을 공유하기 때문에 이러한 제한 사항은 Linux 감지 POSIX에서 완전히 실현될 수 없습니다. 스레딩 메커니즘.

Linux 커널은 진정한 의미에서 스레드를 지원하지 않습니다. Linuxthreads는 스레드 지원을 구현하기 위해 일반 프로세스와 동일한 커널 스케줄링 보기를 갖는 경량 프로세스를 사용합니다. 이 경량 프로세스는 독립적인 프로세스 ID를 가지며 프로세스 스케줄링, 신호 처리, IO 등의 측면에서 일반 프로세스와 동일한 기능을 사용합니다.

Linux의 스레드는 가벼운 프로세스입니다.

각 Linuxthread 스레드에는 스레드 ID와 프로세스 ID가 모두 있습니다. 여기서 프로세스 ID는 커널이 유지 관리하는 프로세스 번호입니다

, 스레드 ID는 linuxthreads

에 의해 할당되고 유지됩니다.

内核进程和内核线程_linux进程与线程 内核_linux内核线程和用户线程

__pthread_initial_thread의 스레드 ID는 PTHREAD_THREADS_MAX이고, __pthread_manager_thread의 스레드 ID는 2*PTHREAD_THREADS_MAX+1linux 형식 지정 명령이며, 첫 번째 사용자 스레드의 스레드 ID는 PTHREAD_THREADS_MAX+2이고, 후속 n번째 사용자 스레드의 스레드 ID는 다음 공식을 따릅니다. :

tid=n*PTHREAD_THREADS_MAX+n+1

這些分配形式保證了進程中所有的執行緒(包括早已退出)都不會有相同的執行緒id,而執行緒id的型別pthread_t定義為無符號長整型(unsignedlongint),也保證了有理由的運行時間內線程id不會重複。

從線程id查找線程資料結構是在pthread_handle()函數中完成的,實際上只是將線程號按PTHREAD_THREADS_MAX取模,得到的就是該線程在__pthread_handles中的索引。

5.線程的創建

在pthread_create()向管理執行緒發送REQ_CREATE懇求以後,管理執行緒即呼叫pthread_handle_create()建立新執行緒。分配棧、設定thread屬性後馬哥linux,以pthread_start_thread()為函數入口呼叫__clone()建立並啟動新執行緒。 pthread_start_thread()讀取自身的進程id號存入執行緒描述結構中,並依照其中記錄的調度方式配置調度。一切打算就緒後,再呼叫真正的執行緒執行函數,並在此函數返回後呼叫pthread_exit()清除現場。

linux下查看線程數的三種方式:

1.cat/proc/pid/status

2.pstree-ppid

3.top-H-ppid

4.psxH,查看所有存在的線程

5.ps-mppid

linux进程与线程 内核_linux内核线程和用户线程_内核进程和内核线程

6.ps-eLf|grep

裡面指令查詢結果的第二列為PID,第三列為PPID,第四列為LWP,第六列為NLWP。

jstack30420|less,之後查找nid=0x44bf,哦,找到了

Shell程式碼

"main"prio=10tid=0x11400nid=0x44bfrunnable[0x0000000040f5c000..0x0000000040f5ced0]

java.lang.Thread.State:RUNNABLE

at.SocketInputStream.socketRead0(NativeMethod)

at.SocketInputStream.read(SocketInputStream.java:129)

at.SocketInputStream.read(SocketInputStream.java:182)

atcom.caucho.server.resin.Resin.waitForExit(Resin.java:524)

atcom.caucho.server.resin.Resin.main(Resin.java:614)

jstack指令告一段落,先不研究了

위 내용은 스레드와 프로세스의 차이점: 프로세스는 자원 할당의 기본 단위이고, 스레드는 독립적으로 실행되는 제어 흐름입니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:itcool.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!