理解linux进程管理和调度

最近在看Wolfgang Mauerer的《深入理解linux内核架构》的linux进程管理和调度,看了有点迷糊,查看了一下其他资料,这里我来总结一下,希望对像我一样的初学者有所帮助。下面讲述的东西不一定正确全面,希望各位同学老师能够批评指教!
一. 理解linux进程模型蓝图,有必要了解一下现在存在的三种比较重要的的进程管理的模型: 朴素unix进程模型window资源模型linux进程模型。他们最大的(至少在我现在看来是最大的)区别在于对于线程的概念的理解不同。在思考这个问题之前,先来思考一个现实开发中的一个问题:如果现在有一个进程,需要负责好几个工作,举个书中的例子,现在一个网页,也有很多张图片,需要缓存,为了获得最好的用户体验,你会怎么设计呢?
最土的办法是一个控制流的顺序执行(在window中就是单线程,在linux中可以叫单线程或者进程),一张图片图片缓存完成,缓存第二张图片,依次类推。此时,设想如果突然某一张图片缓存特别慢,后面的图片都不能缓存。所以,需要引入多个控制流一起运行的概念。所谓一起运行,并不是真正的一起运行,至少是用户体验是一起运行。那么问题来了,三种模型分别怎么解决这个问题呢?
在说Unix的可能解决方案之前,先来了解一下unix进程的概念:unix模型在19世纪60年末才形成雏形,unix系统下运行的应用程序,服务器及其他程序都成为进程,每个进程从虚拟内存中分配地址空间,进程之间是相互独立的,并不会意识到其他进程的存在,在最初的unix进程模型中,是没有线程概念的。既然可调度实体是进程,那么我们只要为每张图片的加载,分别创建一个进程,负责加载图片。这种方案是可行的,但是弊端是什么呢?这种方案太耗费资源了。unix创建新进程的方法是fork(和exec), fork就是在复制父进程的副本,包括各种资源的结构体等,但是我们真的有必要再复制一份吗?只是加载几张不同的图片而已,当然没有。这个时候,更细粒度的可调度体概念出现了,线程(thread)。但是朴素的unix中是没有线程概念的,这个时候windows资源模型出场了。 windows中线程和进程有着明显的界限,是两个不同的结构体。windows中进程一般由一个或者多个线程构成,进程为线程提供了运行的环境,线程则是控制流,几个线程可以共享一个进程的运行环境,而不用复制系统资源,这相对于unix的fork无疑是更高效的。而linux进程模型,则基于unix进程模型的基础上,提出了一个跟windows不同的解决方案。linux中线程跟进程界限不再明显,从内核表示的角度来说,都是task_struct。所以,线程和进程都有pid。linux相对于unix增加了一种创建线程的方式,clone,其工作方式类似于fork, 但启动了精确的检查,以确认那些资源与父进程共享,那些资源为线程独立创建。
那么问题来了,windows的资源模型跟linux的进程模型有什么优缺点呢?
未完待续

你可能感兴趣的:(理解linux进程管理和调度)