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


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

内核线程图解 缺点
内核级线程调度开销较大 。 调度内核线程的代价可能和调度进程差不多昂贵 , 代价要比用户级线程大很多 。
线程表是存放在操作系统固定的表格空间或者堆栈空间里 , 所以内核级线程的数量是有限的 。
Linux 线程实现
Linux 并没有为线程准备特定的数据结构 , 因为 Linux只有task_struct这一种描述进程的结构体 。 在内核看来只有进程而没有线程 , 线程调度时也是当做进程来调度的 。 Linux所谓的线程其实是与其他进程共享资源的轻量级进程 。
为什么说是轻量级呢?在于它只有一个最小的执行上下文和调度程序所需的统计信息 , 它只带有进程执行相关的信息 , 与父进程共享进程地址空间。
轻量级进程
轻量级线程 Light-weight Process简称LWP, 是一种由内核支持的用户线程 , 每一个轻量级进程都与一个特定的内核线程关联 。
它是基于内核线程的高级抽象 , 系统只有先支持内核线程才能有 LWP 。 每一个进程有一个或多个 LWPs, 每个LWP 由一个内核线程支持 , 在这种实现的操作系统中 LWP 就是用户线程 。
台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出
本文插图
轻量级进程
轻量级进程最早在Linux 内核 2.0.x 版本就已实现 , 应用程序通过一个统一的 clone() 系统调用接口 , 用不同的参数指定创建的进程是轻量进程还是普通进程 。
特点和缺点
由于轻量轻量级进程基于内核线程实现 , 因此它的特点和缺点就是内核线程的缺点 , 这里不再赘述 。
查看 LWP 信息
轻量级线程也没什么神秘的 , 还记得我在这篇文章《》教你的方法吗?我们用 Linux 的 pstack 命令可以查看进程的轻量级线程 LWP 信息 。 下图的黄色字体就是打印出的轻量级线程 ID, 以及该线程的调用堆栈信息 , 从最新的栈帧开始往下排列 。
用法示例:pstack pid
台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出
本文插图
pstack查看lwp 协程
协程的知名度好像不是很高 , 在以前我们谈论高并发 , 大部分人都知道利用多线程和多进程部署服务 , 提高服务性能 , 但一般不会提到协程 。 其实协程的概念出来的比线程还早 , 只不过最近才被人们更多的提起 。
协程之所以最近被大家熟知 , 个人觉得是 PythonGo 从语言层面提供了对协程更好的支持 , 尤其是以 Goroutine 为代表的 Go 协程实现 , 很大程度上降低了协程使用门槛 , 可以说是后起之秀了!
台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出
本文插图
why 协程
当今无数的 Web 服务和互联网服务 , 本质上大部分都是 IO 密集型服务 , 什么是 IO 密集型服务?意思是处理的任务大多是和网络连接或读写相关的高耗时任务 , 高耗时是相对 CPU 计算逻辑处理型任务来说 , 两者的处理时间差距不是一个数量级的 。
IO 密集型服务的瓶颈不在 CPU 处理速度 , 而在于尽可能快速的完成高并发、多连接下的数据读写 。
以前有两种解决方案:
如果用多线程 , 高并发场景的大量 IO 等待会导致多线程被频繁挂起和切换 , 非常消耗系统资源 , 同时多线程访问共享资源存在竞争问题 。


推荐阅读