Linux 中进程与线程
发布时间:2023-05-24 10:26:37 所属栏目:Linux 来源:
导读: 进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。进程的概念主要有两点:第一,进程是一
进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stack region)。文本区域存储处理器执行的代码;数据区域存储变量和进程执行期间使用的动态分配的内存;堆栈区域存储着活动过程调用的指令和本地变量。第二,进程是一个“执行中的程序”。程序是一个没有生命的实体,只有处理器赋予程序生命时(操作系统执行之),它才能成为一个活动的实体,我们称其为进程。 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。进程与线程之间的关系 同一进程中的多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调用栈(call stack),自己的寄存器环境(register context),自己的线程本地存储(thread-local storage)。 linux内核中,进程与线程它们虽然都是任务,但是应该加以区分。其中,pid 是 process id,tgid 是 thread group ID。任何一个进程,如果只有主线程,那 pid 是自己,tgid 是自己,group_leader 指向的还是自己。但是,如果一个进程创建了其他线程,那就会有所变化了。线程有自己的 pid,tgid 就是进程的主线程的 pid,group_leader 指向的就是进程的主线程。所以有了 tgid,我们就知道 tast_struct 代表的是一个进程还是代表一个线程了。 关于线程与进程的内核参数 ulimit 限制,在 Linux 下执行ulimit -a,你会看到 ulimit 对各种资源的限制。 其中的“max user processes”就是一个进程能创建的最大线程数,我们可以修改这个参数: 复制 ulimit -u 66535 1. 2.参数sys.kernel.threads-max限制。这个参数限制操作系统全局的线程数,通过下面的命令可以查看它的值。查看threads-max的方法: 复制 cat /proc/sys/kernel/threads-max 32768 修改这个值的方法: 复制 #方法一,重启后会失效 echo 65535 > /proc/sys/kernel/threads-max #方法二,永久修改 echo "kernel.threads-max = 65535" >> /etc/sysctl.conf 3.参数sys.kernel.pid_max限制。这个参数限制操作系统全局的线程数,通过下面的命令可以查看它的值。这里说一下32位操作系统这个值最大是32768不能修改,64位系统上pid_max最大值为2^22。Linux 内核在初始化系统的时候,会根据机器 CPU 的数目来设置 pid_max 的值。比如说,如果机器中 CPU 数目小于等于 32,那么 pid_max 就会被设置为 32768(32K);如果机器中的 CPU 数目大于 32,那么 pid_max 就被设置为 N*1024 (N 就是 CPU 数目)。查看pid_max的方法: 复制 cat /proc/sys/kernel/pid_max 32768 修改这个值的方法: 复制 #方法一,重启后会失效 echo 65535 > /proc/sys/kernel/pid_max #方法二,永久修改 echo "kernel.pid_max = 65535" >> /etc/sysctl.conf 注意:一个线程数也会占用一个pid,所以threads-max须要小于等于pid_max。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |