Unity面试和总结分析(二)——编程基础之进程、线程、协程 - Go语言中文社区

Unity面试和总结分析(二)——编程基础之进程、线程、协程


从这一篇开始,仔细写写具体面试题目。
Unity的相关知识一般分为三大类型:编程基础、Unity功能、Unity相关的图形学,因此面试题也可以大致分成这三类。
这一篇先总结一下这段时间面试遇到的编程基础题目。
在这段时间遇到的所有笔试中,编程基础全无一例外都出现了,而其中出现最多的是排序算法,由于Unity做网游的项目也非常多,因此网络编程也会偶尔出现一些,此外还有一些考验细节性的题目,如果平时注意过就能做出来,否则可能完全没有想过。


先从一些理论基础开始吧。

线程、协程、进程有什么区别?

分析:进程、线程和协程的概念是程序运行的一个基本概念,大家虽然都知道有这些内容,但实际了解的并不透彻,很容易被语言或者平台限制,我在面试时就犯了这个错误,把协程局限在了Unity平台中。

1.要知道有什么区别,首先必须了解它们的定义。

进程的英文是process,这个单词本身的意思是“处理、加工”,而这个概念的引入,是为了描述系统中程序执行时动态变化的过程,由于程序本身是一个静态的概念,在运行时它表现为一个整体,因此我们可以把一个正在运行中的程序作为一个基本单位,而它在运行过程中就表现为一个进程。

在多道程序批处理系统和分时系统中有多个并发执行的程序,为了描述系统中程序执行时动态变化的过程引入了进程。进程是资源分配和独立运行的基本单位。
——《软件设计师教程(第5版)》 4.2 操作系统知识.进程管理 p185

在多道程序系统中,进程在处理器上交替运行状态也不断地发生变化 ,因此进程一般有三种基本状态:运行、就绪和阻塞
——《软件设计师教程(第5版)》 4.2.1 操作系统知识.进程管理.基本概念 p187-p188

线程的英文是Thread,这个单词本身的意思是“线索、线状物”,线程是程序调度和分配的基本单位,引入线程是为了提高进程的多并发能力。

传统的进程有两个基本属性:可资源的独立单位和可独立调度和分配的基本单位。
引入线程的原因是进程在创建、撤销和切换中,系统必须为之付出较大的时空开销,因此在系统中设置的进程数目不宜过多,进程切换的频率不宜太高,这就限制了并发程度的提高。进入线程后,将传统进程的两个基本属性分开,线程作为调度和分配的基本单位 ,进程作为独立分配资源的单位。用户可以通过创建线程来完成任务,以减少程序并发执行时付出的时空开销。
——《软件设计师教程(第5版)》 4.2.7 操作系统知识.进程管理.线程 p202

线程也具有就绪、运行和阻塞三种基本状态。由于线程具有许多传统进程所具有的特性,故称为“轻型进程(Light-Weight Process)”,传统进程称为“重型进程(Heavy-Weight Process)”
——《软件设计师教程(第5版)》 4.2.7 操作系统知识.进程管理.线程 p202

线程分为用户级线程(User-Level Threads)和内核支持线程(Kernel-Supported Theads)两类。用户级线程不依赖于内核......内核支持线程依赖于内核。
——《软件设计师教程(第5版)》 4.2.7 操作系统知识.进程管理.线程 p202

协程全名“协同程序”,英文是Coroutine,这本身是一个与语言无关的概念,但并不是所有的语言都支持协程,当然,也可以基于某语言自己开发一套协程的功能(例如Unity的协程)。在上面对线程和进程的介绍中,我们知道进程和线程有一个共同点,就是它们在运行时的三种基本状态:运行、就绪和阻塞,而这个过程是由系统控制的,使用者无法对它们进行调配,但是协程解决了这个问题。
例如Unity的协程中含有yield关键字,一个协程会在运行到yield关键字时暂停,等待下次系统再调用这个方法时再从上次暂停的位置继续运行。
协程只是一种执行方式,如果我们将协程的运行过程与线程、进程进行类比,以Unity的协程为例,当开始调用StartCoroutine方法时,这个协程就处于就绪状态;在运行到yield关键字前,它就处于运行状态;在运行到yield后到下次满足yield return的值为ture前,它将持续保持阻塞状态。因此,协程的运行状态是由代码控制的,而不由系统调度。

2.它们在使用和表现上的具体区别

解决了基本定义问题,那么我们来分析一下它们在使用和表现上的具体区别。
我们可以从很多个方面来看待它们,为了区别传统的进程概念,在没有特别说明的情况下,以下的进程是不包含线程的,即线程只作为调度和分配的基本单位 ,进程只作为独立分配资源的单位。
1.从实现上来说,线程和协程都是系统层级的,而协程是在编译层级的,虽然我们可以控制使用多线程,但它本质上是底层实现后暴露API给我们使用,而不是像协程一样,是在代码层实现的。
2.从体量(调用时对系统的时空消耗)来说,协程最大,线程居中,协程最小,协程又被称为“纤程”。
3.从控制上来说,进程的阻塞和结束只受系统控制,而线程可以一定程度被用户控制,协程完全受用户控制。在传统概念的进程中,一定是有一条主线程的,但是在这条主线程上可以开启、调用和关闭其他线程,并且也可以开启、调用、和关闭其他协程。
4.从功能上来说,进程只有资源管理功能,而线程和协程负责具体的执行。对同一程序运行时的进程而言,后两者调用的内存等资源都是自己对应的进程的资源。
5.从运行效率上来说,进程由于只有资源管理功能,可以认为不存在效率一说(对于传统的包含线程的进程概念,它的运行效率由主线程或多个运行的线程共同决定)。线程运行效率次于协程,因为线程的切换是需要开销的,并且对于多线程而言还需要考虑共享资源的冲突问题,因为协程本质上还是在主线程上运行,所以不需要考虑资源共享的冲突问题。

3.总结

以上剖析了一下进程、线程、协程三者之间的区别,并没有涉及到任何代码,只进行了原理探讨,并且从多个方面对三者进行了对比。
由于经验不足,其中难免存在很多疏漏,还希望各方大佬不吝指出。


版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/fb378af697d5
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 13:01:04
  • 阅读 ( 857 )
  • 分类:面试题

0 条评论

请先 登录 后评论

官方社群

GO教程

推荐文章

猜你喜欢