台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出( 二 )


上述几种内存区域中数据段、BSS 段、堆通常是被连续存储在内存中 , 在位置上是连续的 , 而代码段和栈往往会被独立存放 。 堆和栈两个区域在 i386 体系结构中栈向下扩展、堆向上扩展 , 相对而生 。
台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出
本文插图

程序内存分段
你也可以再 linux 下用size 命令查看编译后程序的各个内存区域大小:
[lemon ~]# size /usr/local/sbin/sshd text data bss dec hex filename1924532 12412 426896 2363840 2411c0 /usr/local/sbin/sshd 内核空间
x86 32 位系统里 , Linux 内核地址空间是指虚拟地址从 0xC0000000 开始到 0xFFFFFFFF 为止的高端内存地址空间 , 总计 1G 的容量 ,包括了内核镜像、物理页面表、驱动程序等运行在内核空间。
台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出
本文插图
内核空间地址映射 线程
线程是操作操作系统能够进行运算调度的最小单位 。 线程被包含在进程之中 , 是进程中的实际运作单位 , 一个进程内可以包含多个线程 , 线程是资源调度的最小单位 。
多线程程序模型 线程资源和开销
【台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出】同一进程中的多条线程共享该进程中的全部系统资源 , 如虚拟地址空间 , 文件描述符文件描述符和信号处理等等 。 但同一进程中的多个线程有各自的调用栈、寄存器环境、线程本地存储等信息 。
线程创建的开销主要是线程堆栈的建立 , 分配内存的开销 。 这些开销并不大 , 最大的开销发生在线程上下文切换的时候 。
台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出
本文插图
线程切换 线程分类
还记得刚开始我们讲的内核空间和用户空间概念吗?线程按照实现位置和方式的不同 , 也分为用户级线程和内核线程 , 下面一起来看下这两类线程的差异和特点 。
用户级线程
实现在用户空间的线程称为用户级线程 。 用户线程是完全建立在用户空间的线程库 , 用户线程的创建、调度、同步和销毁全由用户空间的库函数完成 , 不需要内核的参与 , 因此这种线程的系统资源消耗非常低 , 且非常的高效 。
特点
用户线级线程只能参与竞争该进程的处理器资源 , 不能参与全局处理器资源的竞争 。
用户级线程切换都在用户空间进行 , 开销极低 。
用户级线程调度器在用户空间的线程库实现 , 内核的调度对象是进程本身 , 内核并不知道用户线程的存在 。
台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出
本文插图
用户线程图解 缺点

如果触发了引起阻塞的系统调用的调用 , 会立即阻塞该线程所属的整个进程 。
系统只看到进程看不到用户线程 , 所以只有一个处理器内核会被分配给该进程, 也就不能发挥多核 CPU 的优势。
内核级线程
内核线程建立和销毁都是由操作系统负责、通过系统调用完成 , 内核维护进程及线程的上下文信息以及线程切换 。
特点
内核级线级能参与全局的多核处理器资源分配 , 充分利用多核 CPU 优势 。
每个内核线程都可被内核调度 , 因为线程的创建、撤销和切换都是由内核管理的 。
一个内核线程阻塞与他同属一个进程的线程仍然能继续运行 。


推荐阅读