互联网技术的兴起,让更多的人接触到了计算机编程。进程、线程、协程等作为操作系统中最核心的概念及技术是每位服务器后端开发程序猿都绕不开的。那么什么是进程、线程以及协程呢?它们又各自有哪些相同和区别呢?本文将会对这些问题做一个深入浅出的介绍。
什么是进程?
进程是操作系统结构的基础,是一次程序的执行;是一个程序及其数据在处理机上顺序执行时所发生的活动,是程序在一个数据集合上运行的过程,它是系统进行资源分配和调度的独立单元。
初看这段文字回觉得十分抽象,难以理解。以Windows操作系统为例,打开任务管理器并切换到进程页,即可直观感触到进程所代表的含义。
简单来讲,进程就是服务端应用程序的一个个启动实例。一个word是一个进程,一个吃鸡在后台也是一个进程。进程理论上拥有独立代码和打开的文件资源、数据资源和内存空间。
进程主要由三部分组成:
①进程控制块PCB:进程存在的唯一标识,时操作系统用来记录和刻画进程状态及环境信息的数据结构,也是操作系统掌握进程的唯一资料结构和管理进程的主要依据。
②数据段:进程运行中的各种数据。
③程序段:程序代码。
什么是线程?
线程可以理解成进程的一个从属,是应用程序的执行者,线程是在进程中独立运行的子任务。一个进程理论上由有个一个主线程和多个子线程组成。相同进程的线程的内存、文件、数据是共用的,但拥有独立的栈空间。对于操作系统来讲,线程是最小的执行单元。比如使用聊天软件QQ时我们能够同时进行聊天、发送文件以及视频等,这每一项的功能背后都有对应的线程在后台默默地运行。
线程的特征和进程的差不多,线程还具备以下优点:①一个进程中可以同时存在多个线程,这些线程共享该集成的资源;线程间通信无需操作系统干预,开销更小;②线程的并发比进程的更小,系统并发性高。除了具备以上的优点外,线程也存在缺点:当进程中的一个线程崩溃时,会导致所属的进程的所有线程崩溃。
程序执行是在不同进程和线程之间协作进行的,操作系统在多个进程和线程同时执行并进行切换实现应用程序的并行执行,对操作系统而言,这是极大的性能开销,那不能不通过操作系统层面来实现高并发的程序运行呢?协程的概念也就因此产生了。
什么是协程?
协程并不像进程和线程那样广为人知,但其实协程的概念比线程出现得更早,直到近来的Golang、Python等编程语言从语言层面提供了对协程更好的支持,尤其是Goroutine为代表的Go协程实现,才让程序员对协程有了更多的了解。
协程是一种比线程更加轻量级的程序运行的存在。正如一个进程可以拥有多个线程一样,一个线程也可以拥有多个协程。协程不被操作系统内核所管理,完全在用户态执行,可以完全由用户程序进行控制。正因为如此,使用协程不需要操作系统进行资源消耗,使执行的性能得到了极大的提升。
作者:匡鹏
单位:中国移动智慧家庭运营中心