急求Linux系统文件系统流程图

急求Linux系统文件系统流程图,第1张

目录名 说明 备注

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. }

呵呵 莫见怪 不是程序流程图


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6061993.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-13
下一篇 2023-03-13

发表评论

登录后才能评论

评论列表(0条)

保存