coursera 《现代操作系统》 -- 第十周 文件系统(2)

身份验证 Authentication

知道用户是谁。通过账号密码、Id 这样的识别出来。

 

访问控制 Permission

知道用户是谁后。

主动控制

记录用户ID和对应的访问权限 --> 记录可访问该文件的用户ID

文件没有记录的用户ID则不可以访问。

权限表

没有记录的文件名则用户不可以访问。

记录了文件名,但没有对应权限,也不能执行对应操作。

 

u 代表所有者(user)
g 代表所有者所在的组群(group)
o 代表其他人,但不是u和g (other)
a 代表全部的人,也就是包括u,g和o
r 表示文件可以被读(read)
w 表示文件可以被写(write)
x 表示文件可以被执行(如果它是程序的话)
  其中:rwx也可以用数字来代替
r ------------4
w -----------2
x ------------1
- ------------0

那么我们常见的以下的一些权限就很容易都明白了:
-rw------- (600) 只有所有者才有读和写的权限
-rw-r--r-- (644) 只有所有者才有读和写的权限,组群和其他人只有读的权限
-rwx------ (700) 只有所有者才有读,写,执行的权限
-rwxr-xr-x (755) 只有所有者才有读,写,执行的权限,组群和其他人只有读和执行的权限
-rwx--x--x (711) 只有所有者才有读,写,执行的权限,组群和其他人只有执行的权限
-rw-rw-rw- (666) 每个人都有读写的权限
-rwxrwxrwx (777) 每个人都有读写和执行的权限

UNIX 的文件访问控制

 

文件系统的性能

瓶颈主要为磁盘,因为磁盘的速度远远落后于内存

分析问题的过程:

问题:减少磁盘请求时间

1. 访盘请求呢通常是由三个时间组成:寻道时间、 旋转延迟时间、 和数据传送的时间。 

  从软件层面考虑,我们能做的就是:减少寻道时间,减少旋转延迟时间

2.1 如何减少寻道时间

  分析寻道时间:根据磁盘地址:台号+柱面号+盘面号+扇区号 找到对应的块。

由于要先获取 i 节点,再获取 i 节点对应的数据,所以 i 节点与对应的数据块的寻道时间越短越好。那么,放在i节点后面最好。

 

2.2 如何减少旋转延迟时间

  分析旋转延迟时间:磁头要等到数据块经过时才能读取,所以我们设计好,数据块在磁道的排列

 

 

缓存的使用

1. 因为存在速度差异,如 CPU --> 内存 --> 磁盘。

2. 局部性原理

如何实现:

在速度更快介质的里面,建立一个下级介质的缓存。缓存大小比较小,所以需要替换策略。

 

 

从硬盘耗时入手

减少寻道时间

 

磁盘调度

通过调度磁盘访问序列,达到减少寻道时间、延迟时间的目的。(感觉计算的很多调度都属于数学问题,是否可以让数学方面的人设计,然后程序员实现?)

还要考虑请求等待的问题,要让请求在一定期限内完成。

 

练习1

 

理解题目中的名词

链接结构

索引结构、物理地址、块地址以及启动磁盘之间的关系

顺序结构

 

错题

8。

有4个访问第66柱面的访盘请求,其访问要求如下:

请求号柱面号磁头号扇区号
66 1 4
66 4 2
66 4 4
66 2 7

下列哪一种执行顺序可以获得最小的平均服务时间?

②、①、④、③

①、②、③、④

①、②、④、③

②、①、③、④

先弄懂磁盘结构

所有磁头是否是共同进退的?

主要看柱面号与扇区号

扇区是有顺序的,比如读了1扇区,读完后就在2扇区了,想要继续读1扇区,只能等待转完一圈。所以相同扇区的顺序应该隔开

 

10。【多选题】(有问题)

设计文件系统时应尽量减少访问磁盘的次数,以提高文件系

统的性能。下列各种措施中,哪些可以减少磁盘服务时间?

当前目录

磁盘碎片整理

块高速缓存

磁盘的旋转调度

内存映射文件

 

假设磁头在65号柱面上操作时,有其他访问请求到达,其柱面(磁道)号为85、46、114、16和116。当系统完成65号柱面(磁道)的操作后,若采用最短寻找时间优先(SSTF)磁盘调度算法,为完成这些请求,磁头需要移动的柱面(磁道)数是

149

139

181

159

使用 Python 编写的 SSTF

 

# -*- coding: utf-8 -*-
from collections import OrderedDict

__author__ = 'Simon'

"""使用 Python 实现 SSTF 磁盘调度算法
思路:
计算移动到各个磁道的距离
生成字典,形式为 `目标磁道: 当前磁道到目标磁道的距离`
以`当前磁道到目标磁道的距离`排序,生成一个 OrderedDict

将当前磁道移动到目标磁道,
从目标磁道列表中删除目标磁道,
移动距离加上`当前磁道到目标磁道的距离`

循环上述过程,直到目标磁道列表为空
"""

track_list = [85, 46, 114, 16, 116]
current_track = 65


def find_shortest_track(current_track, a_list):
    a_dict = {num: abs(num - current_track) for num in a_list}
    ordered_dict = OrderedDict(sorted(a_dict.items(), key=lambda t: t[1]))
    return ordered_dict


def f(current_track, a_list):
    ans = 0
    ordered_dict = find_shortest_track(current_track, a_list)
    while ordered_dict:
        t = list(ordered_dict.items())
        next_track, movement = t[0]
        ans += movement
        current_track = next_track
        a_list.pop(a_list.index(current_track))
        ordered_dict = find_shortest_track(current_track, a_list)
    return ans

print(f(current_track, track_list))
# >>> 149

  

posted @ 2017-04-12 09:16  Jay54520  阅读(800)  评论(0编辑  收藏  举报