【第三章:BAT等名企面试真题解析8讲】第15节:字节面试真题解析之协程
前言
在第12节当中我们介绍了面试当中常考的进程和线程相关的问题,除了进程和线程之外,协程相关的问题在面试当中出现的频次越来越高,尤其是在一些使用Golang作为主要后端开发语言的大厂当中。本节我将以字节面试真题为例讲解协程相关知识。
并发模型
要理解协程的出现,首先需要了解网络服务器并发模型有哪些:
1.简单多线程模型:
该模型采用一个连接一个线程的模式,对于每一个连接都需要一个单独的线程去处理业务逻辑。
2.半同步半异步模型:
单独一个IO线程来异步处理各种网络IO,比如使用IO多路复用技术。同时使用线程池来同步处理每个请求,业务逻辑部分交给线程池当中的工作线程处理。
3.全异步模型:
该模型在网络IO部分和业务逻辑处理部分都是异步的,不会因为IO而导致程序阻塞,通过一个线程就处理所有的任务,由于避免了多线程的开销问题,能够最大程度利用计算机的性能,但是将给程序员带来编程的巨大困难,因为业务逻辑的编写将非常难以理解。
协程
我们知道线程可以看做轻量级进程,而协程简单来说可以看做更轻量级的线程。不同的语言有不同的协程实现,比如Golang原生支持协程,Python的Greenlet,C++的第三方库libgo等等。如同一个进程可以拥有多个线程,一个线程也可以拥有多个协程。如同线程是进程的一种优化,协程也可以看做线程的进一步优化。
协程内存开销:
以Golang为例,协程初始化创建的时候为其分配的栈有2KB,而线程栈一般为8M左右。如果对每个连接创建一个协程去处理,100万并发请求只需要2G内存,而如果用线程模型则需要8T,所以对于相同的内存而言,使用协程可以支持的并发量比线程多很多。
协程的实现:
以Golang为例,会在启动用户main函数之前启动runtime等几个协程。简单来说,runtime会维护用户级协程和操作系统线程的多对多的映射关系,Golang抽象出G,P,M的概念,将协程的调度完全实现在用户态的runtime当中:
M: Machine,简单理解为操作系统线程;
G: Goroutine,协程;
P: Processor,处理器抽象,协调多个个G在某一个M上执行。
字节跳动面试真题解析
1.协程的切换在什么时候?
答:1.当Golang当中协程在执行一些阻塞调用,例如网络IO,磁盘IO函数会发生协程切换;
2.Go
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
<p> 《收割BAT:C++校招学习路线总结》,专刊共计17节。专刊分为五大主要内容,包括后台开发学习路线、简历制作,面试技巧、BAT等名企面试真题解析和工作学习常用工具。本专刊将介绍我在技术成长过程当中的经验,通关BAT的面试技巧,并结合亲身经历的面试真题由浅入深的讲解后台开发方向的重点问题,让你们的求职之路更加顺畅。 本专刊购买后即可解锁所有章节,故不可以退换哦~ </p> <p> <br /> </p>