↖  深入理解计算机系统CSAPP..


深入理解计算机系统CSAPP

2020-12-14 , 1387 , 104 , 146

听音频 🔊 . 看视频 🎦

[编按: 转载于 361图书馆,2020-02-24. 如下为图书章节样张,请购买正版全部内容。《深入理解计算机系统Computer Systems: A Programmer's Perspective》已入选 有福经典UfqiClsc. https://ufqi.com/news/clscpage.1024.html   ]


第一章 

计算机系统漫游 


计算机系统是由硬件和系统软件组成的,它们共同工作来运行应用程序。虽然系统的具体实现方式随着时间不断变化,但是系统内在的概念却没有改变。所有计算机系统都有相似的硬件和软件组件,它们又执行着相似的功能。一些程序员希望深人了解这些组件是如何工作的以及这些组件是如何影响程序的正确性和性能的,以此来提高自身的技能。本书便是为这些读者而写的。

现在就要开始一次有趣的漫游历程了。如果你全力投身学习本书中的概念,完全理解底层计算机系统以及它对应用程序的影响,那么你会步上成为为数不多的“大牛"的道路。

你将会学习一些实践技巧,比如如何避免由计算机表示数字的方式引起的奇怪的数字错误。你将学会怎样通过一些小窍门来优化自己的c代码,以充分利用现代处理器和存储器系统的设计。

你将了解编译器是如何实现过程调用的,以及如何利用这些知识来避免缓冲区溢出错误带来的安全漏洞,这些弱点给网络和因特网软件带来了巨大的麻烦。你将学会如何识别和避免链接时那些令人讨厌的错误,它们困扰着普通的程序员。你将学会如何编写自己的Unixshell、自己的动态存储分配包,甚至于自己的web服务器。

你会认识并发带来的希望和陷阱,这个主题随着单个芯片上集成了多个处理器核变得越来越重要。

-loading- -loading--loading-


在Kernighan和Ritchie的关于C编程语言的经典教材[6到中,他们通过图1一1中所示的程序来向读者介绍。尽管hello程序非常简单,但是为了让它实现运行,系统的每个主要组成部分都需要协调工作。从某种意义上来说,本书的目的就是要帮助你了解当你在系统上执行程序时,系统发生了什么以及为什么会这样。

UfqiLong

hello.c.png

图1一1 hello程序(来源:[60])

我们通过跟踪程序的生命周期来开始对系统的学习一从它被程序员创建开始,到在系统上运行,输出简单的消息,然后终止。我们将沿着这个程序的生命周期,简要地介绍一些逐步出现的关键概念、专业术语和组成部分。后面的章节将围绕这些内容展开。


1.1 信息就是位+上下文

hello程序的生命周期是从一个源程序(或者说源文件)开始的,即程序员通过编辑器创建并保存的文本文件,文件名是源程序实际上就是一个由值0和1组成的位(又称为比特)序列,8个位被组织成一组,称为字节。每个字节表示程序中的某些文本字符。


大部分的现代计算机系统都使用ASCII标准来表示文本字符,这种方式实际上就是用一个唯一的单字节大小的整数值e来表示每个字符。比如,图1一2中给出了hello.c程序的ASCII码表示。

hello.c.ascii.JPG

图1一2 hello·c的ASCII文本表示

hello·c程序是以字节序列的方式储存在文件中的。每个字节都有一个整数值,对应于某些字符。例如,第一个字节的整数值是35,它对应的就是字符“#”。第二个字节的整数值为105,它对应的字符是'过,依此类推。注意,每个文本行都是以一个看不见的换行符'\n'来结束的,它所对应的整数值为10。像hello·c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。

-loading- -loading--loading-


UfqiLong

hello·c的表示方法说明了一个基本思想:系统中所有的信息一一一包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。比如,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

作为程序员,我们需要了解数字的机器表示方式,因为它们与实际的整数和实数是不同的。它们是对真值的有限近似值,有时候会有意想不到的行为表现。这方面的基本原理将在第2章中详细描述。


旁注: C编程语言的起源

C语言是贝尔实验室的DennisRitchie于1969年、1973年间创建的。美国国家标准学会(AmericanNationalStandardslnstitute,ANSI)在1989年颁布了ANSIC的标准,后来C语言的标准化成了国际标准化组织(lnternationalStandards()rgamzation,ISO)的责任。

这些标准定义了C语言和一系列函数库,即所谓的C标准库。Kernighan和Ritchie在他们的经典著作中描述了ANSIC,这本著作被人们满怀感情地称为“K&R“[61]。

用Rltch1e的话来说[92],C语言是“古怪的、有缺陷的,但同时也是一个巨大的成功”。为什么会成功呢?

.C语言与Unix操作系统关系密切。

C从一开始就是作为一种用于Unix系统的程序语言开发出来的。大部分Unix内核(操作系统的核心部分),以及所有支撑工具和函数库都是用C语言编写的。20世纪70年代后期到80年代初期,Unix风行于高等院校,许多人开始接触C语言并喜欢上它。因为Unix几乎全部是用C编写的,它可以很方便地移植到新的机器上,这种特点为C和Unix赢得了更为广泛的支持。

----

有其他编码方式用于表示非英语类语言文本。具体讨论参见2·节的旁注。



+计算机系统 +C语言 +字节 +程序 +字符

本页Url

↖回首页 +当前续 +尾续 +修订 +评论✍️


👍21 仁智互见 👎2
  • 还没有评论. → +评论
  • -loading- -loading- -loading-


    🔗 连载目录

    🤖 智能推荐

    + 爱语慰 爱语慰
    AddToFav   
    新闻 经典 官宣