Unix编程艺术阅读笔记版

来源:互联网 发布:淘宝大类目和小类目 编辑:程序博客网 时间:2024/05/19 19:39
这本书是一位面试官告诉我的,很感谢他的指点,关于面试的详细过程,我想以后再写,当然我也意识到自己的不足,一方面是面试的技巧,还有一方面就是学习的方法。阅读这本书很享受,加上之前的积累,一些疑惑,还有一些基础的不足,在这本书里找到了归宿。

 

下面,一起来享受这本书的精华吧

 

 Unix诞生与1969年,那时候我们还在闹文革吧,可一个可以改变21世纪甚至更远的未来的操作系统问世,至少现在的Linux是基于Unix的设计哲学。Unix是唯一一个在不同种类的计算机,众多厂商和各种硬件上提供一致的,文档齐全的API的操作系统。

 

Unix传统将重点尽量使各个程序接口相对小巧,简洁和正交,并有假定每个程序的输出都可能成为另一个程序的输入

 

Unix的哲学可以这样表述:一个程序只做一件事情,并做好。程序要能协作,程序要能处理文本流,因为这是最通用的接口

 

Unix哲学从整体上可以概括为如下几点:

1模块原则,使用简单的接口拼合简单的部件(其实文本流规范已经可以将程序的接口拼接起来了)

2清晰原则,代码要写的清晰可读,容易维护

3组合原则,设计时考虑拼接组合,在输入输出方面,Unix极力提倡采用简单、文本化、面向流、设备无关的格式。因此一般在Unix下多数程序都尽可能采用简单过滤器的形式,将一个输入的简单文本流处理为一个简单的文本流输出。

 

4分离原则,策略同机制分离,接口同引擎分离

5简洁原则,设计要简洁,复杂度能低则低

 

6健壮原则,源于透明和简洁

7通俗原则,接口设计避免标新立异(最少惊奇原则)

8缄默原则,即程序只做该做的事,不做多余的事,默默工作

9补救原则,出现异常时,需要给出足够的错误信息

10生成原则,尽量用程序生成程序,因为这比手动生成更值得信赖

 

一言以蔽之, KISSkeep it simple, stupid

 

 Unix的统一性理念

 

Unix有几个统一性理念或象征,并塑造了API及由此形成的开发风格。其中最重要的一点即“一切皆文件”模型以及在此基础上的管道概念(连接一个程序的输出和另一个程序的输入通路)。


这里我谈谈对于机制和策略的理解,所谓机制,指的是一种设计思想,具有思想上的高度理论性质,可具有长远的现实意义,而策略是一种现实的解决方案,很容易被时代淘汰。


多任务能力和协作进程

Unix系统拥有抢占式多任务能力,多进程并发能力,即是一个分时操作系统。在Unix中,低价的进程生成和简便的进程间通讯(IPC Inter-Process Communication)使众多小工具、管道和过滤器组成一个均衡系统成为可能。


内部边界

Unix准绳是:程序员最清楚一切,即当你进行危险操作时,Unix系统并不会阻止你,这意味着你要对自己的行为负责,简而言之即你必须清楚你的行为。所以Unix拥有很完善的权限管理体质,提倡多账户不同权限分配,这样可以有效保护系统不被无意或者恶意损坏。

Unix至少设置三层内部边界:一层是内存管理,二层是普通用户进程未经允许不能读取或者修改其他用户文件,三层即涉及安全性功能限制在尽可能小的可信代码块上


 Unix文件没有文件属性和记录结构,因为其增加了文件格式的不透明性质,不适用于面向字节流工具和管道的模式。


 程序设计


模块性:保持清晰和简洁,同时注重紧凑性和正交性

模块化不仅容易调试并定位问题,而且易于扩展。Unix程序员的传统是:更加笃信重视模块化、更注重正交性和紧凑性等问题。

根据经验,Hatton建议逻辑行与物理行之间为两倍的折算率,即最佳物理行数应该在400-800行之间。

紧凑性,即一个设计是否能装入人脑中的特性,如有经验的用户通常不需要操作手册,这个设计就是紧凑的。

正交性,即每个操作只改变一件事,不会影响到其它。

SPOT原则,任何一个知识点在系统内都应当有一个唯一的,明确的和权威的表述。重复会导致前后矛盾、产生隐蔽问题,如修改只修改部分重复点等。


Unix文本文件格式的约定

以新行符结束每一行只存一个记录;

每行不超过80个字符;

使用引入注释;

支持反斜杠约定;

每行一条记录格式中,使用冒号或者任何连续的空白作为字段分隔符;

不要过分区别tabwhitespace

优先选用十六进制而不是八进制;

对于复杂的记录,使用“节”格式,一个记录若有多行,使用“%%\n”或者“%\n”作为记录分隔符。




Linux IPC 进程间通信机制 适用性分析与实现


linux 继承了 System  V IPC 和基于socket IPC (POSIX IPC ),主要有一下进程间通信的几种方式:
1. 管道(Pipe)和命名管道: 管道可用于具有亲缘关系进程间通信,命名管道克服管道没有名字的限制,同时允许非亲缘关系进程间通信

2. 信号(Signal) : 是一种比较复杂的通信方式,用于通知接受进程某与之相关联的事件发生

3. 消息队列: 是消息的链接表,包括Posix消息队列 system V 消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息,消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点

4. 共享内存: 使得多个进程可以访问同一块内存空间,是最快的可用IPC 形式,往往与其他通信机制如信号量结合实现进程间同步

5. 信号量(semaphore): 作为进程间同一进程不同线程之间的同步手段

6. 套接字(Socket): 更为一般的进程间通信机制,可用于不同机器之间进程通信。


Linux 进程包含如下关键要素:
有一段可执行程序
专用系统堆栈空间
内核中有其进程控制块,描述进程占用资源情况,接受内核调度
具有独立存储空间


0 0
原创粉丝点击