linux多线程服务器编程(全方面了解linux多线程服务)

来源:国外服务器 在您之前已被浏览:1 次
导读:目前正在解读《linux多线程服务器编程(全方面了解linux多线程服务)》的相关信息,《linux多线程服务器编程(全方面了解linux多线程服务)》是由用户自行发布的知识型内容!下面请观看由(国外主机 - www.2bp.net)用户发布《linux多线程服务器编程(全方面了解linux多线程服务)》的详细说明。
笨笨网美国主机,w ww.2 b p .n e t

1.什么是线程?

linux内核中是没有线程这个概念的,而是轻量级进程的概念:LWP。一般我们所说的线程概念是C库当中的概念。

1.1线程是怎样描述的?

线程实际上也是一个task_struct,工作线程拷贝主线程的task_struct,然后共用主线程的mm_struct。线程ID是在用task_struct中pid描述的,而task_struct中tgid是线程组ID,表示线程属于该线程组,对于主线程而言,其pid和tgid是相同的,我们一般看到的进程ID就是tgid。

即:

linux多线程服务器编程(全方面了解linux多线程服务)


获取线程ID和主线程ID的值:

linux多线程服务器编程(全方面了解linux多线程服务)


但是获取该gettid系统调用接口并没有被封装起来,如果确实需要获取线程ID,可使用:

#include

int TID = syscall(SYS_gettid);

则对线程组而言,所有的tgid一定是一样的,所有的pid一定是不一样的。主线程pid和tgid一样,工作线程pid和tgid一定不一样。

1.2如何查看一个线程的ID

命令:ps -eLf

linux多线程服务器编程(全方面了解linux多线程服务)


上述polkitd进程是多线程的,进程ID为731,进程内有6个线程,线程ID为731,764,765,768,781,791。

linux多线程服务器编程(全方面了解linux多线程服务)


1.3多线程如何避免调用栈混乱的问题?

工作线程和主线程共用一个mm_struct,如果都向栈中压栈,必然会导致调用栈出错。

实际上工作线程压栈是压了共享区,该共享区包含了许多线程独有的资源。如图:

linux多线程服务器编程(全方面了解linux多线程服务)


每一个线程,默认在共享区中占有的空间为8M,可以使用ulimit -s修改。

进程是资源分配的基本单位,线程是调度的基本单位。

1.3.1线程独有资源

线程ID

一组寄存器

errno

信号屏蔽字

调度优先级

1.3.2线程共享资源和环境

文件描述符表

信号的处理方式

当前工作目录

用户id和组id

1.4为什么要有多线程?

举个生活中的例子, 这就好比去银行办理业务。 到达银行后, 首先取一个号码, 然后坐下来安心等待。 这时候你一定希望, 办理业务的窗口越多越好。 如果把整个营业大厅当成一个进程的话, 那么每一个窗口就是一个工作线程。

1.4.1线程带来的优势

1、线程会共享内存地址空间。

2、创建线程花费的时间要少于创建进程花费的时间。

3、终止线程花费的时间要少于终止进程花费的时间。

4、线程之间上下文切换的开销, 要小于进程之间的上下文切换。

5、线程之间数据的共享比进程之间的共享要简单。

6、充分利用多处理器的可并行数量。(线程会提高运行效率,但当线程多到一定程度后,可能会导致效率下降,因为会有线程调度切换。)

1.4.2线程带来的缺点

健壮性降低:多个线程之中, 只要有一个线程不够健壮存在bug(如访问了非法地址引发的段错误) , 就会导致进程内的所有线程一起完蛋。

线程模型作为一种并发的编程模型, 效率并没有想象的那么高, 会出现复杂度高、 易出错、 难以测试和定位的问题。

【文章福利】需要C/C++ Linux服务器架构师学习资料加群(资料包括C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK,ffmpeg等)

linux多线程服务器编程(全方面了解linux多线程服务)


1.5注意

1、并不是只有主线程才能创建线程, 被创建出来的线程同样可以创建线程。

2、不存在类似于fork函数那样的父子关系, 大家都归属于同一个线程组, 进程ID都相等, group_leader都指向主线程, 而且各有各的线程ID。

通过group_leader指针, 每个线程都能找到主线程。 主线程存在一个链表头,后面创建的每一个线程都会链入到该双向链表中。

笨笨网美国主机,w ww.2 b p .n e t
提醒:《linux多线程服务器编程(全方面了解linux多线程服务)》最后刷新时间 2025-03-21 11:13:52,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《linux多线程服务器编程(全方面了解linux多线程服务)》该内容的真实性请自行鉴别。