首页 > 编程知识 正文

jstat命令详解,dcl数据控制语言

时间:2023-05-04 12:27:55 阅读:175959 作者:4872

转自: http://www.jsniushi.com/rumen/2019 07 06/2364.html

在Linux的top和ps命令中,默认情况下最多见的是pid (process ID )。 虽然您可能还会看到thread id、tgid [ threadgroupidforthethreadgroupleader ]等,但Linux库函数、处理组(pgrp )、sid (sesed )等tpgid ) ttyprocessgroupidfortheprocessgroupleader )等)有更多的id,可能会因为概念太多而昏厥,但如果您准确了解Linux进程和线程的基本概念,就可以这里介绍了进程和线程的核心概念,并通过示例程序验证了这些身份之间的关系。

Linux的进程和线程Linux的进程和线程有很多不同点,可以在谷歌上使用。 但是,如果能清楚地理解几个点,就能充分理解Linux中各种ID的含义。

进程是资源分配的基本单位,线程是调度的基本单位进程是资源的集合,这些资源包括内存地址空间、文件描述符等,一个进程内的多个线程共享这些资源。 如果CPU调度任务,则可调度的基本单位是线程。 如果某个进程没有其他线程,则可以理解为该进程只有一个主线程,并且该主进程独占了进程中的所有资源。 进程的个体间完全独立,但线程间相互依存,共享资源。 在多进程环境中,任何进程终止都不会影响其他子进程。 在多线程环境中,父线程将终止,所有子线程将终止。

上述第一点说明是最基础、最重要的。

初步了解各种身份。 基本上按照重要度从高到低的顺序,分割线下的IDs不太重要。

pID:进程id。

lwp:线程ID。 用户状态命令(如ps )中常用的表示方法。

等于tID:线程id、lwp。 tid常用于系统提供的接口函数,如syscall(sys_gettid )和syscall (NR _ gettid )。 tgID:线程组ID,即线程组leader的进程ID,等于pid。

pgID:进程组ID,即进程组leader的进程ID。

pthread ID: pthread库提供的id可以忽略,因为其有效范围不是系统级的。

sid : sessionidforthesessionleader。

TPG id : ttyprocessgroupidfortheprocessgroupleader。

从上面的列表中可以看出,各种ID最后归结为pid和lwp(tid )。 因此,了解各种ID最终归结到了解pid和lwp(tid )之间的联系和差异。

下图说明了父子进程、线程之间的关系。

上图清楚地显示了线程在“用户视图”(user view )和内核视图(carnel view )之间的差异。

从用户的角度来看,pID 42中产生的tid 44线程属于tgid (线程组leader的进程id ) 42。 甚至ps和top的默认参数也看不到tid 44线程。 从内核的角度来看,tid 42和tid 44是独立的调度单元,可以认为它们是“pid 42”和“pid 44”。

另外,在Linux上,进程和线程的区分有时也十分严格。 无论是混合线程和进程,还是混合pid和tid,上下文都能清晰地分辨出对方想要表达的内容。 在上图中,从内核的角度看pid 44,从调度单元的角度看pid 44,但在top或ps命令中绝对找不到pid 44的进程。 lwp (只能看到tid为44的线程。

了解pID和lwp(tid )的示例程序以下是用于了解pID和lwp(tid )的示例程序,以及用于使用格式化的ps命令打印各种id的示例程序。 以下程序在main函数中创建两个子线程,再加上名为main函数的主线程,总共创建三个线程。 用3个线程分别打印pthread id、pid和lwp[tid],验证pid和lwp[tid]的关系。

# include unistd.h # includesys/syscall.h # include stdio.h # include pthread.h # definegettidv1() syscall ) _ _ _ NR threadfunc1) ) printf(thePthread_1idis%LD(n ),pthread_ ),pthread ) ) )。 printf(thethread_1) sPIDis%d(n ),getpid ); printf (thel wpid/tido fthread _ 1is : % LD (n ),) long int ) gettidv1); pause (; 返回0; }void *ThreadFunc2() printf(thePthread_2idis%LD(n ),pthread_self ) ); printf(thethread_2) sPIDis%d(n ),getpid ); printf (thel wpid/tido fthread _ 2is : % LD (n ),) long int ) gettidv1); pause (; 返回0; }intmain(intargc,char *argv[] ) { pid_t tid; pthread_t pthread_id; printf(themasterthread ) spthreadidis%LD(n ),pthread_self ); printf(themasterthread ) sPIDis%d(n ),getpid ); printf (thelwpidofmasterthreadis : % LD (n ),) long int ) gettidv1); 创建//2线程的pthread_create(pthread_id,NULL,ThreadFunc2,NULL ); pthread_create(pthread_id,NULL,ThreadFunc1,NULL ); pause (; 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。