台式机&硬件面试官:换人!他连进程线程协程这几个特点都说不出( 三 )
本文插图
线程表是存放在操作系统固定的表格空间或者堆栈空间里 , 所以内核级线程的数量是有限的 。
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
本文插图
协程之所以最近被大家熟知 , 个人觉得是 Python 和 Go 从语言层面提供了对协程更好的支持 , 尤其是以 Goroutine 为代表的 Go 协程实现 , 很大程度上降低了协程使用门槛 , 可以说是后起之秀了!
本文插图
why 协程
当今无数的 Web 服务和互联网服务 , 本质上大部分都是 IO 密集型服务 , 什么是 IO 密集型服务?意思是处理的任务大多是和网络连接或读写相关的高耗时任务 , 高耗时是相对 CPU 计算逻辑处理型任务来说 , 两者的处理时间差距不是一个数量级的 。
IO 密集型服务的瓶颈不在 CPU 处理速度 , 而在于尽可能快速的完成高并发、多连接下的数据读写 。
以前有两种解决方案:
如果用多线程 , 高并发场景的大量 IO 等待会导致多线程被频繁挂起和切换 , 非常消耗系统资源 , 同时多线程访问共享资源存在竞争问题 。
推荐阅读
- 彬彬这厢有礼了 ChinaJoy篇二:看到的一些不一样的硬件
- "飒"英雄!20岁女兵征服40吨远火车 巾帼不让秀媚
- 零售店|194年历史!美国最古老奢侈品百货店Lord&Taylor申请破产保护
- 环球网|泰国士兵赴美参加联合演习 回国后9人新冠确诊
- 新闻联播|辽宁+8 新疆+28 乌鲁木齐:救治费用全免
- 游戏青年|硬件收入下降31%,软游戏部门2020财年收入同比增长2%
- 供给|措施“变味”……“停车难”治理“堵点”咋打通
- 浙江|台风“黑格比”影响浙江等地 多地将有强降雨
- 网友|中储粮回应“禁带手机进粮库”:已责令纠正
- 环球时报|柏林两万人高喊"自由"参加新冠大游行,市长怒了
