进程,线程和协程
本文主要讲go中的进程线程和协程和其基础面试八股一、概念1.进程定义操作系统分配资源CPU、内存、磁盘 IO 等的基本单位是程序的一次运行实例。特点进程之间相互独立有自己的独立内存空间通信需要借助 IPC管道、消息队列、套接字等。开销大创建 / 销毁、切换进程需要操作系统内核参与消耗大量资源。示例你打开的一个 Go 程序、一个浏览器窗口都是一个进程。2.线程定义操作系统调度执行的基本单位隶属于进程一个进程可以包含多个线程。特点线程共享所属进程的内存空间代码段、数据段、堆但有自己的栈空间。开销中等比进程小但线程切换仍需内核态 / 用户态切换消耗一定资源。示例浏览器的一个标签页可能对应一个线程Go 程序运行时的runtime也会启动多个线程。3.协程Goroutine定义Go 语言层面实现的轻量级 “线程”由 Go 运行时runtime调度而非操作系统内核。核心特点轻量级初始栈大小仅 2KB可动态扩容最大几 MB一台机器可轻松创建十万级 Goroutine。调度成本低Goroutine 切换在用户态完成无需内核参与切换耗时仅为线程的 1/100 左右。由 Go runtime 管理runtime 会将多个 Goroutine 映射到少量操作系统线程上执行实现 GMP。语法简单通过go 函数名()即可创建。有个很好的比喻来区分三者关系进程一个独立的 “工厂”有自己的厂房、设备、原料独立内存 / 资源工厂之间完全隔离要协作只能通过 “快递”IPC / 网络线程工厂里的 “工人”共享工厂的所有资源内存 / 设备多个工人可以同时干活切换工人需要工厂管理员操作系统内核调度Go 协程工人手里的 “小任务”由工厂的 “小组长”Go 运行时调度多个小任务可以交给同一个工人执行切换成本极低一个工人能同时处理上千个小任务。二、对比与关系通俗一点来讲解一下三者关系运行一个go程序操作系统会创建一个进程这个进程是 Go 程序的运行载体。进程启动后运行时会初始化一组操作系统线程是操作系统内核直接调度的实体也就是代码执行者。goroutine需要依附在线程上一个线程可以有多个goroutine是轻量级执行体。用一句话概括的话进程管资源线程管内核调度Goroutine 管 Go 程序的轻量级执行。三、考点1.Goroutine 和操作系统线程的核心区别是什么Goroutine 是 Go 运行时管理的轻量级执行体和操作系统线程的核心区别有 5 点调度主体线程由操作系统内核调度内核态切换Goroutine 由 Go runtime 在用户态调度切换成本仅为线程的 1/10 左右资源开销线程创建 / 销毁、切换开销大Goroutine 开销极小单台机器可创建十万级 Goroutine而线程仅能创建几千个栈特性线程栈是固定大小MB 级易溢出Goroutine 栈初始 2KB可动态扩容 / 缩容最大几 MB更节省内存阻塞处理线程阻塞会导致对应内核线程闲置Goroutine 阻塞时runtime 会将绑定的 P 切换到其他空闲 M 上避免线程闲置通信方式线程依赖共享内存 锁易出竞态问题Goroutine 推荐用 Channel 通信“以通信代替共享内存”更安全。2.进程、线程、Goroutine 的层级关系是什么进程操作系统分配资源内存、CPU、文件描述符的最小单位是 Go 程序的运行容器一个 Go 程序对应一个进程线程隶属于进程是操作系统内核调度的最小单位CPU 真正执行的实体Go 协程必须依附线程运行Goroutine隶属于线程是 Go 运行时调度的最小执行单元运行在用户态一个线程可承载多个 Goroutine。记住进程管资源线程管内核调度Goroutine 管 Go 程序的轻量级执行。3.Go 中创建 Goroutine 的方式是什么Goroutine 如何退出主要是退出方式正常优雅和强制退出切记goroutine无法强制杀死创建方式通过go 函数名()即可创建无需手动管理Go runtime 会自动调度执行退出方式正常退出Goroutine 内的函数执行完毕自动退出优雅退出无法主动 “杀死” 一个 Goroutine需通过 Channel 传递退出信号、Context 控制超时 / 取消或 sync.WaitGroup 等待完成强制退出主 Goroutine 退出后进程终止所有子 Goroutine 会被强制终止。4.GMP调度模型这个我目前不打算单独记录一张具体可以看这位佬的和小林coding深入理解GMP模型小林coding的GMP面试题
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2412111.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!