首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

送货 线程 = 开送货车 系统调度 = 决定合适开哪部送货车 进程 = 道路 + 加油站 + 送货车 + 修车厂 Linux 中有几种栈?...各种栈的内存位置? 介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。...对于 Linux 进程或者说主线程,其 stack 是在 fork 的时候生成的,实际上就是复制了父亲的 stack 空间地址,然后写时拷贝 (cow) 以及动态增长。

3.5K20

Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

送货 线程 = 开送货车 系统调度 = 决定合适开哪部送货车 进程 = 道路 + 加油站 + 送货车 + 修车厂 Linux 中有几种栈?...各种栈的内存位置? 介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。...对于 Linux 进程或者说主线程,其 stack 是在 fork 的时候生成的,实际上就是复制了父亲的 stack 空间地址,然后写时拷贝 (cow) 以及动态增长。

2.9K50
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    一文搞懂 | Linux 中的各种栈(进程栈 线程栈 内核栈 中断栈)

    送货 线程 = 开送货车 系统调度 = 决定合适开哪部送货车 进程 = 道路 + 加油站 + 送货车 + 修车厂 Linux 中有几种栈?...各种栈的内存位置? 介绍完栈的工作原理和用途作用后,我们回归到 Linux 内核上来。...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。...对于 Linux 进程或者说主线程,其 stack 是在 fork 的时候生成的,实际上就是复制了父亲的 stack 空间地址,然后写时拷贝 (cow) 以及动态增长。

    7.2K33

    一文读懂 | Linux 中的各种栈:进程栈 线程栈 内核栈 中断栈

    = 送货 - 线程 = 开送货车 - 系统调度 = 决定合适开哪部送货车 - 进程 = 道路 + 加油站 + 送货车 + 修车厂 Linux 中有几种栈?...二、线程栈 从 Linux 内核的角度来说,其实它并没有线程的概念。Linux 把所有线程都当做进程来实现,它将线程和进程不加区分的统一到了 task_struct 中。...线程仅仅被视为一个与其他进程共享某些资源的进程,而是否共享地址空间几乎是进程和 Linux 中所谓线程的唯一区别。...Linux 调度程序中并没有区分线程和进程,当调度程序需要唤醒”进程”的时候,必然需要恢复进程的上下文环境,也就是进程栈;但是线程和父进程完全共享一份地址空间,如果栈也用同一个那就会遇到以下问题。...无论栈指针被设置到哪个值,都会有问题不是吗? 3. 进程和线程是否共享一个内核栈?

    2.1K20

    Linux 内核中,多线程栈空间模型是怎样的?

    当进程运行起来后,产生另外两个动态区域,这就是堆和栈。 大多情况下,栈是CPU直接支持的一个内存区域。函数的局部变量便位于这个区域。 堆是一个没有严格定义的区域。...很简单,通过CPU直接支持的栈区,自动维护“函数调用链”: 栈顶 printSth函数的局部变量 main函数里面调用printSth函数的那条指令的位置 main函数的局部变量 栈底 对于printSth...而所谓“线程获得执行权”呢,实质上就是把对应线程的栈顶指针等信息载入CPU的栈指示器,使得它沿着这条调用链继续执行下去——执行一段时间,把它的栈顶指针等信息找个地方保存、然后载入另一个线程的栈顶指针等信息...---- 明白了这个之后,问题迎刃而解: 1、所有线程都是在各自独立的栈区维护的调用链(以及执行现场) 2、线程局部变量处于各自所属的栈区 3、不允许跨线程直接传递局部变量的引用/指针,因为它们随时可能失效...换句话说,所有线程都是平等的,它们各自独立使用自己的专属栈区(但主线程较为特殊,大多实现中,它的退出就意味着进程结束;除此之外,它们是平等的)。

    2.2K50

    Binder线程栈复用

    前言 Binder驱动有很多小的细节,目的就是提升Binder通信的效率。比较典型的是两个机制,因为没有官方名词,我对这两种机制起个名字:"线程栈复用"和"远程转本地"。...前者是为了减少线程消耗,后者是为了减少跨进程次数。这篇文章就是介绍"线程栈复用",以后我们再讲"远程转本地"。...一、假设一个场景 进程A在UI线程发起一次Binder通信到进程B的服务B,在服务B中再次发起Binder通信到进程A的服务A,请问整个过程会牵涉到几个线程,按照常理理解应该有三个线程: 1.进程A UI...,Binder驱动发现反正进程A的UI线程为了等ServiceB的结果休眠中,既然ServiceB又要请求进程A的ServiceA,与其采用进程A的Binder线程响应,还不如直接用进程A休眠的UI线程响应...彩蛋 其实一般来说对于普通工程师,了解清楚这个规则就够了,以后开发过程中注意一下这种Binder的嵌套调用即可。Binder驱动是如何实现线程栈复用?

    72210

    【Linux】线程的奥秘:Linux线程入门指南

    线程ID 一组寄存器 栈 errno 信号屏蔽字 调度优先级 进程的多个线程共享同一地址空间,因此Text Segment、Data Segment都是共享的,如果定义一个函数,在各线程中都可以调用,...Windows不同的线程设计 在Linux中,由于PCB和TCB的共同点太多了,于是直接复用了PCB的设计和调度策略,这样大大减少了系统的调度时的开销,因此Linux中实际没有真正的线程概念,有的只是复用了...在这种设计思想下,线程注定不会过于庞大,因此Linux中的线程又可以称为轻量级进程LWP,轻量级进程足够简单,且易于维护,效率更高、安全性强,可以使得Linux系统不间断的运行,不容易崩溃。...线程ID在后续操作(如pthread_join)中用于标识线程。 const pthread_attr_t* attr: 线程的属性。可以设置为NULL使用默认属性。...自定义属性可以用于指定线程栈大小、调度策略等。 void* (*start_routine)(void*): 线程执行的函数指针。 函数的返回值可以通过pthread_join获取。

    7010

    线程属性设置

    本文将通过一个创建n个线程的案例来展示一下线程属性的设定及使用,通常情况下,系统对于线程的创建是没有限制的,但是每一个线程都是需要一个栈空间的,每个栈空间大小也都是固定的,可通过系统命令 ulimit...-a 来查看,如果线程栈空间的总数超过了一个进程可使用的虚拟内存用户空间,那么就无法再继续创建线程了。...可以看出,我们的程序已经快将虚拟内存用户空间使用完了,所以程序再次分配线程失败了。 ---- 而如果我们将每一个线程的栈大小设定的更小了(线程属性设置),是不是就可以提高创建线程的数量呢?...); while(1){ // 分配栈空间 pStack = malloc(STACK_SIZE); if (NULL == pStack) break; // 设置线程栈大小 pthread_attr_setstack...至此我们验证了线程数量的创建取决于栈大小并且学会了如何设定一个线程的属性。

    19120

    Linux的线程

    Linux的线程 在计算机科学和软件工程中,多线程编程是一项关键技能,尤其在当今多核处理器和高并发应用程序的背景下显得尤为重要。...Linux环境下的线程编程优势 Linux作为开源操作系统,提供了丰富的线程支持和强大的多任务调度能力。...开发者可以利用Linux提供的POSIX线程库(pthread)或者C++11标准库中的 头文件来实现高效的线程管理和同步操作,适用于各种复杂的应用场景。 2....线程创建与启动 使用POSIX线程库(pthread) POSIX线程库是Linux系统中标准的线程库,提供了丰富的线程操作函数,能够实现线程的创建、启动、同步和销毁等操作。...线程管理 线程ID和属性管理 在创建线程时,可以设置线程的属性和优先级,以及获取线程的唯一标识符(ID)进行管理。

    17710

    【Linux 内核】线程调度示例一 ③ ( 获取线程优先级 | 设置线程调度策略 | 代码示例 )

    文章目录 一、获取线程优先级 1、pthread_attr_setschedparam 和 pthread_attr_getschedparam 函数 2、获取线程优先级代码示例 二、设置线程调度策略...函数 设置、获取 线程 优先级的 核心 函数 : ① 设置 " 创建线程 " 的优先级 : int pthread_attr_setschedparam(pthread_attr_t *attr, const...const struct sched_param *param) 设置 struct sched_param *param 结构体的 sched_priority 字段 , 即可设置 " 优先级 "...属性 ; 上述 2 个函数 , 如果执行成功 , 返回 0 ; 如果执行失败 , 则返回错误代码 : EINVAL : 属性设置无效 ; ENOTSUP : 设置的属性值不合法 ; 2、获取线程优先级代码示例...函数 创建 pthread 线程时 , 默认的线程时 SCHED_OTHHER 调度策略 , 可以通过下面的函数 , 修改调度策略 ; 修改线程 " 调度策略 " 函数 : int pthread_attr_setschedpolicy

    5.7K30

    线程的栈(基于linuxthreads-2.0.1)

    因为内存是共享的,所以线程不能共享栈,否则访问栈的地址的时候,会映射到相同的物理地址,那样就会互相影响,所以每个线程会有自己独立的栈。在调用clone函数的时候会设置栈的范围。...下面通过linuxthreads的代码看看线程的栈。linuxthreads里有一个__pthread_initialize函数,该函数会在main函数执行前执行。在该函数中会设置主线程的栈范围。...clone函数设置manager线程的栈。...CLONE_FS | CLONE_FILES | CLONE_SIGHAND, (void *)(long)manager_pipe[0]); 最后在函数pthread_handle_create中设置创建的线程的栈...否则访问的时候会segmentfault。最后调用clone创建进程(线程)并设置栈的栈顶和栈底位置。

    72120

    线程与栈那些事

    这篇文章是介绍一下线程与栈相关的话题,文章比较长,主要会聊聊下面这些话题: 进程与线程的本质区别,线程与内存共享 Linux pthread 与 Guard 区域 Hotspot 线程栈的 Guard...Java 线程栈溢出是如何处理的 前面介绍过,Linux 的线程通过 4k 的 Guard 区域实现了栈溢出的简单预防,只要读写 Guard 区域就会出现段错误。...Java 线程,如果是的话,guard 的大小设置为 0,如果不是则设置为 4k。...从源码调试的结果可以看到,对于 Java 线程,guard 区域大小被设置为 0,其他类型的线程都被设置为默认的 4k。...系统调用生成 进程与线程的一大区别在于进程拥有各自独立的进程资源,线程则是共享进程的资源 linux 线程栈的默认大小为 8M,除了线程栈的内存,每个线程还会额外多 4k 的 guard 区域防止栈溢出

    66910

    线程池大小的设置策略

    线程池大小的设置策略 线程池需要设置合适的大小,假如设置的太大,线程上线文切换过于频繁,造成大量资源开销,反而会使性能降低。...假如设置的太小,存在很多可用的处理器资源却未在工作,会造成资源的浪费和对吞吐量造成损失。 为了充分利用处理器资源,创建的线程数至少要等于处理器核心数。...如果所有的任务都是计算密集型的,那么线程数等于可用的处理器核心数就可以了。不过,如果所有的任务都是IO密集型,那么处理器大部分时间是空闲的,所有要适当的增加线程数。...线程等待时间所占比例越高,需要越多线程。线程运算时间所占比例越高,需要越少线程。...于是可以使用下面的公式进行估算: 最佳线程数 = (1 + 线程等待时间/线程计算时间)* 目标CPU的使用率 * 处理器核心数 例如:平均每个线程计算运行时间为0.5s,而线程等待时间(非计算时间,比如

    47150

    Linux之多线程(上)——Linux下的线程概念

    合理的对地址空间和页表进行资源划分,我们就可以对进程所拥有的资源进行分类:通过地址空间的区域划分,划分为栈区、堆区……,通过页表映射到不同的物理内存中。...Linux下并不存在真正的线程 Linux下的线程是用进程模拟的。 如果OS真正要专门设计“线程”概念,OS就要管理线程了(先描述,再组织)。...Windows下确实是为线程专门设计了数据结果表示线程对象TCB,但是线程的创建就是为被执行,执行需要被调度、存在ID/状态、优先级、上下文、栈……等内容,这些线程调度需要的东西与进程有很多地方是重叠的...因此,Linux下没有为“线程”专门设计对应的数据结构,而是直接复用了进程的PCB,用PCB来表示Linux下的“线程”。...线程独立的数据 进程内的线程共享进程的数据,但是也拥有自己独立的一部分数据。 线程ID、一组寄存器:存储线程的上下文信息、栈:线程的临时数据、errno、信号屏蔽字、调度优先级。

    34420

    线程池设置原则

    二:线程池参数 ThreadPoolExecutor类可设置的参数主要有: corePoolSize:核心线程 1.核心线程会一直存活,及时没有任务需要执行 2.当线程数小于核心线程数时,即使有线程空闲...3.当线程数大于等于核心线程数,且任务队列已满 3.1若线程数小于最大线程数,创建线程 3.2若线程数等于最大线程数,抛出异常,拒绝任务 三:线程池参数的合理设置 为了说明合理设置的条件,我们首先确定有以下几个相关参数...具体数字最好根据8020原则,即80%情况下系统每秒任务数,若系统80%的情况下任务数小于200,最多时为1000,则corePoolSize可设置为20。...队列长度可以设置为(corePoolSize/tasktime)responsetime: (20/0.1)2=400,即队列长度可设置为400。...若结合CPU的情况,比如,当线程数量达到50时,CPU达到100%,则将maxPoolSize设置为60也不合适,此时若系统负载长时间维持在每秒1000个任务,则超出线程池处理能力,应设法降低每个任务的处理时间

    9310

    Linux网络的设置

    一、介绍 目的:使Linux可以正常上网,前提是物理机可以上网 软件环境: 虚拟机版本: VMware Workstation 12, Linux系统版本:CentOS 7.3 二、设置网络 1,在登录黑框中输入如下命令...此时我们可以看到子网IP为192.168.47.0,子网掩码为255.255.255.0,我们所获取到的那个IP就在这个子网里面。 (2)点击右侧的“NAT设置”按钮 ?...4,手动给Linux系统设置IP地址 ? 现在打开的这个文件就是网卡的配置文件,要更改IP地址,就得编辑这个文件。...说明: ONBOOT设置为yes,表示网卡随着系统一同启动 BOOTPROTO用来设置网卡的启动类型,dhcp表示自动获取IP地址,static表示手动设置静态IP地址 IPADDR指定IP地址(取决于前面已自动获取到的地址...(2)查看IP地址(和前面看到的一样) ? (3)测试网络连通性 ? 6,网络设置完成!

    5.2K50

    Linux:线程的概念

    ——>因此我们Linux的设计者采用描述“进程”的PCB结构体来模拟描述“线程”,大不了在内部单独设置一些属性来区分就行了,其他很多概念接口都可以复用,大大降低了设计和维护成本  ——>无论是Linux...——>Linux中,虽然在我们的视角里有进程和线程的区别,但是在OS和CPU的眼里,我只有调度执行流的概念!...—>因此Linux基于这种设计方案,我们把内核的线程进行高度抽象,叫做轻量级进程,他是建立在内核之上并由内核支持的用户线程。...,此时就是> 问题3:如果理解有些教材上说“Linux没有真正意义上的线程,而是用“进程”模拟的线程”?...——> 这两句话不完全对,(1)前半句:不能说我Linux没有单独对TCB做描述,你就说我没有真正意义上的线程!!

    8510

    【Linux多线程】线程池的实现

    什么是线程池 线程池(Thread Pool)是一种线程管理机制,用于减少线程创建和销毁的开销,提高程序的并发性能。...线程池在初始化时会创建一定数量的线程,这些线程可以重复执行多个任务,而不是为每个任务创建新的线程。...线程池的引入主要有以下几个优势: 减少线程创建和销毁的开销:线程被复用,避免了频繁的创建和销毁,提高效率。 提高系统资源利用率:控制并发线程的数量,避免因大量线程导致系统资源耗尽。...上的线程池还是太简单了,如果你只是想了解简单的线程池的思想,上面也差不多。 下面,我们将一步步将线程池提升到完美。 3....include #include // 个人封装的线程库,用来描述线程 // 为此,我们需要拥有线程的名字,线程的ID,线程的状态,线程的回调函数,传递给回调函数的参数

    14010

    Linux 内核的网络协议栈

    前言 本文主要记录 Linux 内核网络协议栈的运行原理 数据报文的封装与分用 封装:当应用程序用 TCP 协议传送数据时,数据首先进入内核网络协议栈中,然后逐一通过 TCP/IP 协议族的每层直到被当作一串比特流送入网络...Linux 内核网络协议栈 协议栈的全景图 协议栈的分层结构 逻辑抽象层级: 物理层:主要提供各种连接的物理设备,如各种网卡,串口卡等。...函数 start_kerenl() 将会调用一系列的初始化函数,如:平台初始化,内存初始化,陷阱初始化,中断初始化,进程调度初始化,缓冲区初始化,完成内核本身的各方面设置,目的是最终建立起基本完整的 Linux...udp_sendto() 完成 sk_buff 结构体相应的设置和报头的填写后会调用 udp_send() 来发送数据。...4、在链路层中,函数调用会调用具体设备提供的发送函数来发送数据包,e.g. dev->hard_start_xmit(skb, dev);。具体设备的发送函数在协议栈初始化的时候已经设置了。

    3.1K61
    领券