etc 配置文件 根文件系统,必须存在于/系统上,不可单独分区
bin 用户可执行文件(基本应用程序)
sbin 系统可执行文件(基本应用程序)
lib 共享库文件
dev 设备
boot 启动文件 单独分区
tmp 临时文件 tmp目录中的数据默认每10天自动清除
mnt/media 外设挂载点 早期Linux系统使用mnt目录
usr 发型版厂商自定义应用程序 可以考虑单独分区
var 服务器数据:日志、打印池等 可以考虑为不同的服务目录单独分区
home 普通用户家目录 如果作为认证服务器,则考虑单独分区
root root用户家目录
opt 存放第三方大型应用程序,如Oracle 可以考虑单独分区
selinux selinux信息
misc/net 自动挂载点
proc linux系统信息,可在运行时进行调整 没有独立挂载点(内核映像,无法挂载)
sys 硬件相关信息
lost+found ext3文件系统收集文件碎片用 自动存在于每个ext3文件系统上
由于近期一直在写文档,有人问我是如何画图的,实际上一开始我主要是画流程图,后面慢慢开始画框图。画图不仅可以对思路进行整理,还可以对思维进行很好的表达。下面根据我个人的经验,对如何画好系统框图做一些简单的介绍。图画是另一种形式的思考,我们需要对想要表达的内容进行抽象总结,不同的思维结构,决定了采用什么形式的构图。看过《金字塔原理》的读者都知道,作者把思维表达方式都描述为金字塔的层级结构,每一层又由若干个分论点来支撑,因此金字塔结构非常稳固,并且易于理解。
构图的三种结构
那么,到底有哪些好的构图方式呢?
实际上,所有的框图都可以总结为分层结构、流水线结构、树型结构3大类。每一种结构都代表了一种思维方式。掌握了上述3种构图方法,你就基本上可以解决90%以上的构图问题,表达和抽象能力将大幅提升。
1. 分层结构
分层结构是目前普遍采用的构图方法,金字塔原理就是分层结构中的一种,这种结构强调对系统进行模块化和分层级的划分,把复杂的系统分为几个层级,各个层级又可以分为几个子模块。复杂的分层结构之间还可以有包含和跨越的关系,分层结构主要有2种排版方式,横向和竖向结构。
下面我们分别看下横向结构和竖向结构的经典排版。
横向结构
竖向结构
大体的排版方向(横向和竖向)确定之后,子模块之间也可以有包含和跨越的关系,也可以根据重点不同,对结构进行调整,例如突出从下到上稳定性的金字塔结构。
金字塔结构
另外我最喜欢的就是linux kernel方面的学习路线图,由于整个linux *** 作系统结构非常复杂,所以人们把 *** 作系统分为了不同的模块,每个模块又划分为不同的子模块,子模块之间有些会跨越多个层。通过分层结构,我们可以很清晰的认识到 *** 作系统的复杂性,这种结构也可以方面我们理解和记忆,可以说linux *** 作系统框图是分层结构的集大成者,下图是2个例子。
2. 流水线结构
流水线线结构强调了模块之间的顺序和关系,模块之间是按照一定的因果关系往前推进,比较常见的场景是学习计划,事件根因分析,一般是从左到右的顺序。
下面是流水线结构的典型实例。
当然也有对流水线结构进行各种形式的扩展,都可以理解为流水线结构。
阶梯式流水线结构
S型流水线结构
多流水线结构
流水线结构除了线性结构之外,还有环形流水线,环形流水线往往表示了事件从开始到结束可以循环往复。
环形结构
环形结构
三角环形结构
最后,我们看下复杂的树型结构
3. 树型结构
对于比较复杂的数据结构,可能就不能简单的用线型结构来表示了,只有采用更加发散和复杂的树型结构来表示它们之间的复杂关系。树型结构一般从一个中心节点(起点或中心节点)往外界进行发散,分支又发散出分支,类似一颗大树。
最简单的树型结构是一个中心,几个基本点的结构,围绕着中心论点进行展开论证。
复杂的树型结构有思维导图,鱼骨图,这类结构围绕一个论点进行思维发散,并不限制分支的数量。
树型发散导图
思维导图
最后
了解了3种主要的构图方式之后,要画好图,还需要把描述的事物通过图标进行形象化以方便理解。比如下图是描述intel主板实现的功能,通过对摄像头、GPS、internet等的形象化描述,可以更加方面用户理解它的实际用途。
1. /* 移动SOURCE到DEST.主要处理跨文件系统的情况如果SOURCE是一个目录, DEST必须不存在.2.如果成功了返回true. */
3. static bool
4. do_move (const char *source, const char *dest, const struct cp_options *x)
5. {
6. bool copy_into_self
7. bool rename_succeeded
8. bool ok = copy (source, dest, false, x, ©_into_self, &rename_succeeded)
9. if (ok)
10. {
11. char const *dir_to_remove
12. if (copy_into_self)
13. {
14. /* 通常当SOURCE和DEST一样或者是DEST的父目录的时候copy会返回copy_into_self在这种情况
15. 下我们知道SOURCE是作为一个父目录出现的,移动一个目录到他自己里是没有意义的 and 除此之
16. 外在某些情况下这么做会带来很不直观的结果,在一个空目录中执行 `mkdir btouch a c
17. mv * b'.这时候会返回错误,mv: 无法将目录 “b” 移动至自身的子目录 “b/b” 下。通过一个
18. 特征值处理这个问题, 删除copied-into-self目录, DEST (`b/b' 在这个例子中),并返回失
19. 败. */
20. dir_to_remove = NULL
21. ok = false
22. }
23. else if (rename_succeeded)
24. {
25. /* SOURCE成功的rename到DEST不许要删除任何文件,或者权限拒绝重命名一个文件 */
26. dir_to_remove = NULL
27. }
28. else
29. {
30. /* 这个可能意味着SOURCE和DEST在不同的设备中也可能被认为是尽管SOURCE和DEST在同一个设
31. 备中但是rename是不被允许的.
32. 就好象你用ftpfs向ftp服务器申请上传,下载,删除但是不能重命名一样
33. 在检查can-rename的时候设备号是不可靠的,因为有些系统从不同物理设备上建立文件但是他
34. 们有相同的st_dev字段(NFS就是这样的)
35. 如果SOURCE成功的copy到DECT,那么我们必须删除SOURCE
36. 这个函数通常用在复制只是当重命名失败并且设置errno等于EXDEV */
37. dir_to_remove = source
38. }
39. if (dir_to_remove != NULL)
40. {
41. struct rm_options rm_options
42. enum RM_status status
43. char const *dir[2]
44. rm_option_init (&rm_options)
45. rm_options.verbose = x->verbose
46. dir[0] = dir_to_remove
47. dir[1] = NULL
48. status = rm ((void*) dir, &rm_options)
49. assert (VALID_STATUS (status))
50. if (status == RM_ERROR)
51. ok = false
52. }
53. }
54. return ok
55. }
56. /* 移动文件SOURCE到DEST.主要处理DEST是目录的时候如果DEST_IS_DIR则DEST是目录
57.如果成功返回true. */
58. static bool
59. movefile (char *source, char *dest, bool dest_is_dir,
60. const struct cp_options *x)
61. {
62. bool ok
63. /*
64. 这段代码处理由于重命名函数的不同语义导致的mv语义上的歧义
65. 有些系统(如:GNU/Linux)的重命名函数处理最后的‘/’,
66. 一些别的系统(如: Solaris 5,6,7)的重命名函数忽略最后的‘/’
67. (此处引用源代码中的注释)
68. */
69. if (remove_trailing_slashes)
70. /* bool strip_trailing_slashes(char *file)
71. 函数删除FILE最后的‘/’ */
72. strip_trailing_slashes (source)
73. /* 如果第二个参数是目录 */
74. if (dest_is_dir)
75. {
76. /* 获取source整个路径名的最后部分 */
77. char const *src_basename = last_component (source)
78. /* 将获取的最后部分和dest连接构成新的目标路径 */
79. char *new_dest = file_name_concat (dest, src_basename, NULL)
80. strip_trailing_slashes (new_dest)
81. ok = do_move (source, new_dest, x)
82. /* 释放申请的内存 */
83. free (new_dest)
84. }
85. /* 如果第二个参数不是目录 */
86. else
87. {
88. ok = do_move (source, dest, x)
89. }
90. return ok
91. }
呵呵 莫见怪 不是程序流程图
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)