首页  >  文章  >  系统教程  >  线程与进程的区别:进程是分配资源的基本单位,线程是独立运行的控制流

线程与进程的区别:进程是分配资源的基本单位,线程是独立运行的控制流

王林
王林原创
2024-07-23 10:57:541014浏览

线程与进程的区别:进程是分配资源的基本单位,线程是独立运行的控制流

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

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

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

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

스레드와 프로세스의 차이점은 다음과 같습니다. 일반적으로 프로세스에는 여러 스레드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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn