在该项目中,server扮演的是分布式文件系统的角色,为了保证consistency,所有client对文件的访问及修改需要首先申请对应资源的锁--每个资源,无论是文件还是目录,都有它自己的id和锁。
锁的分配与释放,可以是基于严格一致性(任何时候,用户修改了某个资源,则该资源的最新值是所有用户都可见的)的:用户申请资源时,从lock server获取锁;资源使用完毕后,将锁释放,返回给lock server。但是这样可能会带来很多不必要的网络开销:设想一个client有若干个独立线程,每个线程都想访问资源A,在严格一致性的要求下,每个线程需要单独的向lock server去申请使用锁,然后释放给lock server。有N个线程,就意味着有2N次网络请求。
其实可以将一致性的要求稍稍放宽,当client申请到锁以后,可以把锁看作是进程资源,而非线程资源。当某一个线程释放锁时,并不是把锁直接返还给lock server,相反,锁仍然留在本地,仅仅把它的状态置为FREE。这样,如果有其他线程需要访问该锁时,并不会产生网络开销,因为锁是在本地的。随之而来的复杂性就是,如果锁成了本地锁,其他client如何获取这个资源?