大家好,今天小编关注到一个比较有意思的话题,就是关于linux c语言多线程的问题,于是小编就整理了4个相关介绍Linux c语言多线程的解答,让我们一起看看吧。
- linux 多个窗口命令是多线程嘛?
- linux系统下,编程c中,线程的意义作用和具体使用方法是什么?
- linux C/C++中进程的销毁和创建为何比线程的销毁和创建开销大?
- Linux是如何记录进程资源的?你能从C语言源代码层面分析下吗?
linux 多个窗口命令是多线程嘛?
在Linux中,多个窗口(终端窗口)运行的命令通常不是多线程,而是多进程。每个终端窗口都可以运行一个或多个独立的进程,这些进程可以并行运行。每个进程都有自己的内存空间和***,相互之间不共享内存,因此它们是独立的。多线程是在同一进程内并发运行的多个执行线程,它们共享进程的内存空间。
linux系统下,编程c中,线程的意义作用和具体使用方法是什么?
大体来说,进程之间的数据,需要经过至少一次上下文切换(打了反幽灵补丁是四次),而同一个进程的多个线程交换数据,经常不需要花费额外的时间——最坏情况下,这两边会有上百万倍的差距……
具体使用方法,建议 man pthread
linux C/C++中进程的销毁和创建为何比线程的销毁和创建开销大?
线程概念
线程是操作系统能够调度和执行的基本单位,在Linux中也被称之为轻量级进程。从定义中可以看出,线程它是操作系统的概念,在不同的操作系统中的实现是不同的。
对于Linux操作系统而言,它对Thread的实现方式比较特殊。在Linux内核中,其实是没有线程的概念的,它把所有的线程当做标准的进程来实现,也就是说Linux内核,并没有为线程提供任何特殊的调度语义,也没有为线程实现特定的数据结构。取而代之的是,线程只是一个与其他进程共享某些***的进程。每一个线程拥有一个唯一的task_struct结构,Linux内核它仅仅把线程当做一个正常的进程,或者说是轻量级进程,LWP(Lightweight processes)。
***共享
Linux线程与进程的区别,主要体现在***共享、调度、性能几个方面,首先看一下***共享方面。上面也提到,线程其实是共享了某一个进程的***,这些***包括:
哪些是线程独自拥有的呢?
调度
说到调度,就得提到进程的上下文切换。上下文切换也被称作为进程调度或者任务切换,简单的来说是把CPU从一个进程或者线程切换到另一个执行。概括的来说,线程的上下文切换,要比进程更加快速,因为本质上,线程很多***都是共享进程的,所以切换时,需要保存和切换的项是很少的。
线程上线文切换时,虚拟地址空间是不变的,但是进程上下文切换时,是需要重新映射虚拟地址空间。进程切换上下文时,进出OS内核&寄存器切换,是最大的时间支出。更模糊的代价是上下文切换时,会干扰处理器的缓存机制。当上下文切换时,处理器需要重新cache一些内存。
这里更大的一个区别时,当更改虚拟地址空间时,CPU 的 TLB 等也会被刷新,导致接下来的内存访问更加耗时,所以相对线程切换来说,进程的切换耗时更大。
Linux是如何记录进程***的?你能从C语言源代码层面分析下吗?
谢邀。
其实简单来说,进程无非就是处于运行期的程序及其相关***的总和。这里读者应该注意“相关***”一词,Linux 在内核中是如何记录进程的***的呢?
首先应该明白,Linux 内核大都是***用C语言编写的,因此要弄清楚内核如何记录进程***,只需要查看相关的C语言代码就可以了。事实上,Linux 内核是使用 task_struct 结构体描述进程的***的,它的C语言部分代码如下,请看:
task_struct 结构体很长,在我手中的 Linux 内核C语言源代码中,它占用了280行。当然了,这其中包含很多条件编译部分,在 32 位机器上,task_struct 大约要占用 1.7 KB 的内存空间,不过考虑到它可以管理完整的进程,1.7kB 其实并不算大了。
鉴于 task_struct 结构体过长,这里不可能将其成员一一介绍清楚。如果读者和我一样好奇,粗略的浏览 task_struct 结构体,应该能够发现一些比较令人熟悉的成员,例如:
通过C语言注释以及成员的变量名,能够看到 task_struct 结构体包含了文件系统,线程结构体,以及进程打开的文件等信息,这就与上一节文章的内容对应上了。其他成员在我之后的文章中会涉及到,这里暂不赘述。
在创建进程时,Linux 通过 slab 分配器分配 task_struct 结构,这样可以避免动态分配和释放带来的开销,提高内存的使用效率。
根据我手上的内核C语言源代码,Linux 中还有一个结构体 thread_info,它的其中一个成员 task 指针正好适合用于索引 task_struct 结构体,在X86_64平台上,thread_info 的相关C语言代码如下,请看:Linux 通常会在内核栈底或者栈顶保留 thread_info 结构,而内核栈通常大小都是可知的,因此每个进程都能方便的从自己的栈中找到 thread_info 结构,进而找到 task_struct 结构。
查找当前进程的 thread_info 结构,可以调用 current_thread_info() [_a***_],它的C语言代码如下,请看:
可见,current_thread_info() 函数其实就是通过进程栈计算的,因此它的实现与平台架构有关,上述C语言代码其实只是 arm 平台的实现方法,其他平台的实现方法,读者可自行查阅。
到此,以上就是小编对于linux c语言多线程的问题就介绍到这了,希望介绍关于linux c语言多线程的4点解答对大家有用。