计算机操作系统里面有两个重要概念:并发和隔离。想想操作系统从最初很简单的功能发展到现在这么强大就容易理解这两个概念了。计算机的很多思想其实也是从现实中来的,本文根据自己的理解对线程和进程进行了解释,适合编程初学者学习。
————————
个人技术公众号:解决方案工程师
欢迎同领域的朋友关注、相互交流。
————————
进程:指运行中的某个程序,是资源分配的单元
线程:是进程里的一个执行序列,是执行单元
进程比线程拥有更多资源,进程切换代价大,线程切换代价小
进程和线程都是一个时间段的描述,是CPU工作时间段的描述
进程是资源分配的最小单位,线程是CPU调度的最小单位
计算机操作系统里面有两个重要概念:并发和隔离。想想操作系统从最初很简单的功能发展到现在这么强大就容易理解这两个概念了。
并发是为了尽量让硬件利用率高,不然计算机不可能按照摩尔定律不停发展,个人也不可能用上这么便宜的电脑。代码要并发执行不一定要有线程,线程只是一个操作系统上的概念,是为了让代码好写和好理解而已。很多单片机的操作系统其实没用线程的概念的,汇编语言也没线程的概念。就和程序设计里面引入设计模式差不多。线程相当于一个执行指针加了一些寄存器状态的结构体而已,有了线程概念,代码本身就只用考虑在哪个线程执行就可以了,而不用像没线程的系统里面要自己用汇编去保持寄存器状态,然后分配时间片等一堆事情。操作系统的一个作用就是简化上层应用的开发,线程这个概念的引入就做到了这一点。没有线程的世界,你可以想想要在8086那种cpu用汇编写个同时做多件事情的程序就知道了。最近还流行一个概念叫纤程,这个和线程很相似,只是纤程是为了在应用层面做到高并发,而线程是为了在系统层面做到并发。
隔离也是并发之后要解决的重要问题,并发执行就表示有多段代码在跑,不能一段代码出错了整个系统就崩了,所以必须隔离。而隔离就涉及在多大范围内隔离了,因为代码是无状态的,有状态的是资源,这个隔离的范围一般和资源有关系。计算机的资源一般是共享的,隔离要能保障崩溃了这些资源能够被回收,不影响其他代码的使用,否则还不如蓝屏重启。所以说一个操作系统只有线程没有进程也是可以的,只是这样的系统会经常崩溃而已,操作系统刚开始发展的时候和这种情形很像。
那总结一下:线程和并发有关系,进程和隔离有关系。线程基本是为了代码并发执行引入的概念,因为要分配cpu时间片,暂停后再恢复要能够继续和没暂停一样继续执行;进程相当于一堆线程加上线程执行过程中申请的资源,一旦挂了,这些资源都要能回收,不影响其他程序。
人类社会也和这个有点像,例如将地球资源和生产资料想象成硬件,人想象成线程,为了提高效率,最好的方式是流水线,分时占用资源,这样就是有人白天上班有人晚上上班,整个社会一直都在运动。但由于每个人都不一样,资源在全球也不均,这相当于每个程序不一样,有的程序耗cpu,有的程序io密集,而且程序一般是为了解决一个问题,这个相当于一群人有个共同的愿景,将一堆人和一堆资源组合在一起,相当于一个国家了,隔离的作用就是要保证一个国家崩溃不至于地球没了。进程通讯啥的就相当于跨国交易了。
计算机的很多思想其实也是从现实中来的,联想一下当时的环境,就容易为什么出这个概念以及这个概念是为了解决什么。其实你在当时的环境下也会产生这两种概念的想法,只是牛逼的人能够抽象化了而已。这也是为什么将很多文章的引言当做历史书看,然后将你放在那个阶段去思考就容易理解了。