day03-计算机和编程基础
C语言为什么NewB(牛逼)
C语言是贝尔实验室的Ken Thompson、Dennis Ritchie等人开发的UNIX操作系统的副产品。Ken Thompson在1969年独自写出了UNIX的最初版本运行在DEC PDP-7计算机上,内存16KB,使用汇编汇编语言编写。后Ken Thompson在BCPL语言的语法基础上设计了B语言,后Ritchie加入到UNIX项目中,开始使用B语言编写程序,后来实验室争取到了一台PDP-11计算机,于是把B语言经过改进之后移植新机器上,并用B语言重写了部分的UNIX代码。
经过改进之后的语言改名为NewB,后来已经越来越不像B语言了,于是改名叫C语言。
到1973年C语言已经足够稳定。
从C源码到可执行程序的历练
虽然我们称GCC是C语言的编译器,但使用gcc由C语言源代码文件生成可执行文件的过程不仅仅只是编译
的过程,而是要经历四个相互关联的步骤∶预处理(也称预编译,Preprocessing)、编译(Compilation)、汇编(Assembly)和链接(Linking)。
命令gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.i为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是链接。在链接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方。
预处理
处理对象是预处理语句,拓展头文件、宏替换、去掉注释
扫描器(词法分析器)逐字符分析源文件文本,查找语言内置关键字。
解析器(语法分析器)获取扫描器提供的输入流,根据语法规则检查结构是否正确 并建立语法分析树。
中间代码生成 将语法分析树转换为另一种语法(寄存器传输语言,register transfer language,RTL)-汇编语言。
优化 简化算术表达式、消除无用代码...
生成 关注目标处理器生成实际的汇编代码,并不是可执行的二进制文件而是汇编指令文件。汇编器将其转化为二进制机器代码+可能的链接器。
执行指令 gcc hello.c -E -o hello.i
编译
编译器
将预处理之后的C代码进行词法分析、语法分析、语义分析转化为汇编代码,并进行优化(常数优化、循环优化...)。
执行指令 gcc hello.i -S -o hello.s
汇编
汇编器
将汇编语句(参数)转化为跟处理器相关的二进制格式;将常量(字符串、数值常数)放置到二进制的目标代码中。Linux通常使用ELF文件格式在二进制文件中保存程序代码和数据。每一个汇编语句几乎都对应一条机器指令。所以汇编器的汇编过程相对于编译器来讲比较简单,它没有复杂的语法,也没有语义,也不需要做指令优化,只是根据汇编指令和机器指令的对照表一一翻译即可。
执行指令 gcc hello.s -c -o test.o
od test.o
可以查看二进制文件
也可以直接调用汇编器 as hello.s -o hello.o
链接
链接器
将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件
目标文件是包括机器码和链接器可用信息的程序模块。简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。
执行指令 gcc hello.o -o hello
实际上是调用以下形式的命令
link hello.o 启动代码 库 -o hello
生成的可执行程序内部结构总的分为三部分:启动代码(初始化内存堆栈等等)、用户代码(入口main函数)、库代码
在程序执行的时候先执行启动代码,然后再调用main()函数开始用户编写的C程序的执行。
理解链接时出现的错误 链接器可能会经常 报告
无法解析的引用
,这是为什么。为什么这些链接错误直到链接甚至运行时才会出现?
进程的运行
在运行像hello这样的程序的时候,操作系统制造了一种假象,好像系统只有这个程序在运行,好像这个程序在独占CPU、内存、I/O设备。
这种现象就是通过进程的概念实现的,进程是计算机科学中最重要和最成功的概念之一。
进程是操作系统对一个正在运行的程序的一种抽象,一个系统上可以同时运行多个进程,而每个进程都好像在独占硬件资源。操作系统保持跟踪进程运行所需的所有状态信息,这种状态信息就称为 进程的上下文。
一个处理器核心(单核)在一个时间点只能执行一个进程的的代码。
当我们在播放网易云音乐的时候,一边还开着迅雷下载,这个怎么做到的呢?就是依靠在上下文切换(保存当前进程的上下文、恢复目标进程的上下文,将控制权传递给目标进程),目标进程就可以直接从上次停止的地方开始。同时运行多个进程的场景-并发。
当我们在shell上运行helloworld的时候 有两个进程:shell进程和hello进程。最开始时,只有shell进程在运行等待命令行上的输入。当我们输入./hello的时候shell通过一个专门的函数(系统调用)执行我们的我们的请求,系统调用会将控制权传递给操作系统,操作系统 保存shell进程的上下文,开始加载当前目录下一个名叫hello的可执行文件到内存,创建一个新的hello进程及其上下文,然后将控制权传递给hello进程。在hello进程运行完毕或者被直接终止之后,操作系统恢复shell进程的上下文,并且将控制权传给shell,然后shell又开始等待下一个命令行的输入。
helloworld表白也可以
一IT程序员跟他暗恋的姑娘聊天...以“Hello”开头...又情不自禁加了一“world”...于是一句"Hello world"打过去…姑娘回一害羞表情...接一句“you are my world too”...然后他们就在一起了..
计算机系统结构
计算机(Computer)是一种能够按照事先存储的程序,自动、高速地进行大量数值计算和各种信息处理的现代化智能电子设备。由硬件和软件所组成,两者是不可分割的。
1954年5月24日,晶体管电子计算机诞生。
1969年10月29日,通过ARPANET,首次实现了两台计算机的互联。
计算机是20世纪最先进的科学技术发明之一,对人类的生产活动和社会活动产生了极其重要的影响。 计算机发明者约翰·冯·诺依曼,我们目前使用的几乎所有的计算机都是冯诺依曼型计算机。
虽然随着科技的发展,现在新出现一些新型计算机有:生物计算机、光子计算机、量子计算机等,但是现在通用计算机还是以冯诺依曼型电子计算机为主。
冯诺依曼计算机特点
1)计算机处理的数据和指令一律用二进制数表示
2)顺序执行程序
计算机运行过程中,把要执行的程序和处理的数据首先存入主存储器(内存),计算机执行程序时,将自动地并按顺序从主存储器中取出指令一条一条地执行,这一概念称作顺序执行程序。
3)计算机硬件由运算器、控制器、存储器、输入设备和输出设备五大部分组成。
个人计算机
CPU架构
终于知道一种超越了跪键盘的酷刑---------------跪CPU。O(∩_∩)O
x86 x86-64 SPARC ARM
复杂指令集CISC
x86:Intel从16位微处理器8086开始的整个CPU芯片系列,系列中的每种型号都保持与以前的各种型号兼容,主要有8086,8088(前面两个是16位CPU),80186,80286(这两个是过渡产品), 80386,80486以及以后各种型号的Pentium芯片[奔腾,P2, P4,赛扬...](这些都是32位CPU)
x86-64:x86指令集的超集,在x86处理器上可以运行的程序可以运行在x86-64上(这也是为啥现在买的一些64bits CPU可以直接运行Win XP的原因)。x86-64是AMD发明的,也叫AMD64,Intel克隆了一把,叫做Intel 64,也叫EM64T。
x86-64 is a 64-bit superset of the x86 instruction set architecture. Because the x86-64 instruction set is a superset of the x86 instruction set, all instructions in the x86 instruction set can be executed by central processing units (CPUs) that implement the x86-64 instruction set; therefore these CPUs can natively run programs that run on x86 processors from Intel, Advanced Micro Devices (AMD), and other vendors.
x86-64 was designed by AMD, who have since renamed it AMD64. It has been cloned by Intel under the name Intel 64 (formerly known as EM64T among other names).[1] This leads to the common use of the names x86-64 or x64 as more vendor-neutral terms to collectively refer to the two nearly identical implementations.
x86和x86-64可以认为就是一种特定的指令集
i386:也是维基上的解释,也就是指Intel 80386,是第一个32位的x86架构的处理器,用了20多年了,后面出的 486(80486,i486),586(80586,Pentium,P5),686(80686,Pentium Pro,P6)等等都与之兼容。
The Intel 80386, otherwise known as the Intel386, i386 or just 386, is a microprocessor which has been used as the central processing unit (CPU) of many personal computers and workstations since 1986. It was the first x86 processor to have a 32-bit architecture, with a basic programming model that has remained virtually unchanged for over twenty years and remains completely backward compatible.
IA32:可以认为就是x86或者x86-32,也是一个指令集。
英特尔32位架构(英语:Intel Architecture, 32-bit,缩写为IA-32),常被称为i386、x86-32或是x86,由英特尔公司推出的复杂指令集(CISC)架构,至今英特尔最受欢迎的处理器仍然采用此架构。它是x86架构的32位延伸版本,1985年首次应用在Intel 80386芯片中,用来取代之前的x86 16位架构(x86-16),包括8086、80186与80286芯片。
一个IA32中央处理器(CPU)包含一组8个存储32位值的寄存器. 这些寄存器用来存储整型数据和指针英特尔32位架构(英语:Intel Architecture, 32-bit,缩写为IA-32),常被称为i386、x86-32或是x86,由英特尔公司推出的复杂指令集(CISC)架构,至今英特尔最受欢迎的处理器仍然采用此架构。
IA-32 (Intel Architecture, 32-bit), often generically called x86 or x86-32, is the instruction set architecture of Intel's most commercially successful microprocessors. It is a 32-bit extension, first implemented in the Intel 80386, of the earlier 16-bit Intel 8086, 80186 and 80286 processors and the common denominator for all subsequent x86 designs. This architecture defines the instruction set for the family of microprocessors installed in the vast majority of personal computers in the world.
IA64:就是所谓的安腾,Intel跟HP联合折腾的一种64-bits全新架构,与x86系列不兼容,号称采用了很多非常好的体系结构方面的技术,但是没火起来。再次证明光有好的技术是行不通的,还要有市场眼光啊。
Itanium is the brand name for 64-bit Intel microprocessors that implement the Intel Itanium architecture (formerly called IA-64). Intel has released two processor families using the brand: the original Itanium and the Itanium 2. Starting November 1, 2007, new members of the second family are again called Itanium. The processors are marketed for use in enterprise servers and high-performance computing systems. The architecture originated at Hewlett-Packard (HP) and was later developed by HP and Intel together.
注:所谓16位,32位,64位的CPU一般是指处理器中“算数逻辑单元(ALU)”或者CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度。此外还有数据总线宽度和地址总线宽度两个参数,前者决定了CPU在进行运算时,一次可以并行拿到的二进制数据bit数(可以想想C语言中short/int/long型数据分别的位数),通常与ALU的宽度相同(极个别例外),而后者决定了内存地址空间的大小(16位的地址总线,就是64K,32位就是4G,64位是128T;可以想一下C语言中指针所占的二进制长度),地址总线宽度自然来讲应该是跟数据总线宽度一致,但由于诸多原因(历史,技术,兼容性等等)不是这样。
另外,还有操作系统的位数区分,可以认为是word size(字长),也就是一个整数和指针数据的长度,原则上就是指上述CPU位数(即通用寄存器的位数),但同时也决定了操作系统能够支持的最大内存容量(每个进程能够使用的虚拟内存大小,严格说来没有这么多)。
精简指令集RISC
特点是所有指令的格式都是一致的,所有指令的指令周期也是相同的,并且采用流水线技术。在中高档服务器中采用RISC指令的CPU主要有Compaq(康柏,即新惠普)公司的Alpha、HP公司的PA-RISC、IBM公司的PowerPC、MIPS公司的MIPS和SUN公司的Sparc、Acorn公司的ARM。
内存
主存储器,内部存储器,简称内存。
内存(Memory)是计算机中重要的部件之一,它是与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。作用是用于暂时存放CPU运算所需的相关数据。只要计算机在运行中,CPU就会把需要运算的数据先调到内存中,当计算进行时部分数据被加载进缓存或者寄存器中。
内存的运行也决定了计算机的稳定运行。
如果数据在内存中未找到,则需要在硬盘中读取,效率低下。
速度快。
内存属于易失存储介质,在断电的时候将会丢失数据。
内存一般采用半导体存储单元,包括随机存储器(Random Access Memory,RAM),只读存储器(Read Only Memory,ROM),以及高速缓存(CACHE,片外cache)。只不过因为RAM是其中最重要的存储器,所以一般都使用RAM代表内存。
主要介质种类有 SDRAM、DDR、DDR2、DDR3、DDR4。
比较著名的品牌 金士顿、三星、东芝、海力士等等
手机内存16G不够使用怎么办???
这是一个误区,手机内存容量大小并不是指的内部存储器的容量,而是指的外部存储器的容量。截止2016年12月,市场上一般的手机内存容量在512M-2G左右。
1)一种称为静态RAM(Static Random Access Memory,SRAM),SRAM速度非常快,是目前读写最快的存储设备了,但是它也非常昂贵,所以只在要求很苛刻的地方使用,譬如CPU的一级缓冲,二级缓冲。
2)另一种称为动态RAM(Dynamic Random Access Memory,DRAM),DRAM保留数据的时间很短,速度也比SRAM慢,不过它还是比任何的ROM都要快,但从价格上来说DRAM相比SRAM要便宜很多,计算机内存就是DRAM的。
外存
外部存储器,简称外存。是指除计算机内存及CPU缓存以外的储存器,此类储存器一般断电后仍然能保存数据。常见的外存储器有硬盘、软盘、光盘、U盘等。容量较内存大,价格更加便宜,保存的数据持久性好,属于非易失存储介质。
PC机常见的外存储器有软盘存储器、硬盘存储器、光盘存储器、USB闪存等。
磁盘有软盘和硬盘两种。
硬盘目前可以分为机械硬盘,固态硬盘。
固态硬盘的存储介质分为两种,一种是主流技术 采用闪存(FLASH芯片)作为存储介质,另外一种是采用DRAM作为存储介质。
固态-机械硬盘和固态硬盘各有什么优缺点?
光盘有只读型光盘CD-ROM、一次写入型光盘WORM和可重写型光盘MO三种。
U盘存储介质为FLASH闪存,英文名称是"Flash Memory",一般简称为"Flash"。
在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。
世界上第一个U盘
朗科公司推出的以优盘为商标的闪存盘(OnlyDisk)是世界上首创基于USB接口,采用闪存(Flash Memory)介质的新一代存储产品。闪存盘,是中国在计算机存储领域二十年来唯一属于中国人的原创性发明专利成果。
美国科技博客网站BusinessInsider评选出本世纪迄今10款最重要电子产品,iPhone、iPad、iPod和MacBook Air等4款苹果产品榜上有名。微软也因为Xbox和Kinect上榜,中国朗科发明的U盘也上榜。但日本电子产品无一入选,曾经辉煌的日本电子帝国已全面衰落。
第一次知道原来U盘是中国人发明的,还被美国列为本世纪10大最重要电子产品。
朗科公司是由留学归国人员于1999年成立的高新技术企业。其创始人邓国顺推出了世界上首创的采用闪存介质的新一代存储技术及产品,这项在闪存盘及闪存应用领域的基础性发明专利,被称作是中国在IT行业第一项原创性发明专利。此项专利于2002年被中国知识产权局授予发明专利权,2004年12月7日,朗科获得美国国家专利局正式授权的闪存盘基础发明专利,美国专利号US6829672。这一专利权的获得,从法律上确认了中国朗科公司是U盘的全球第一个发明者。
美国时间2006年2月10日,朗科委托美国摩根路易斯律师向美国德克萨斯州东区联邦法院递交诉状,控告美国PNY公司侵犯了朗科的美国专利(美国专利号US6829672)。2008年2月,朗科与PNY达成庭外和解。朗科向PNY签订专利许可协议,PNY向朗科公司缴纳专利许可费用1000万美元。这是中国企业第一次在美国本土收到巨额专利许可费用。也进一步证明了朗科是U盘的全球发明者。
于是神评论:做产品早就是朗科副业了,打官司才是朗科的主业。
优盘是朗科的一个牌子,因为当时所有的U盘都是优盘牌的,所以优盘成了U盘的代名词,其他厂商,为了不侵权,只好将其称为U盘。
USB是谁发明的
2015 年 11 月 15 日 USB 技术问世 20 周年,全球有超过 100 亿台设备正在使用 USB 传输资料,做为这项应用最为广泛的技术发明者,Ajay Bhatt 在过去 20 年终却没有透过 USB 技术专利赚过钱,这位 Intel 的首席系统工程师表示,研发 USB 技术不是为了赚钱,而是为了给科技产业带来改变。
20 年前 Ajay Bhatt 仅仅是希望能够为电脑之间的资料传输创造一个统一的界面,使用者必须要为不同的硬盘安装特殊的程序,这款提升用户体验的想法却没有得到业内人士的支持,大公司固守着原有的传输标准,没有人敢走出打破规则的第一步。
只有 Intel 公司对 Ajay Bhatt 的想法感兴趣,并给予他研发技术和资金上的支持,Intel 的处理器也在第一时间支持 USB 传输技术。由于 USB 是应用在不同设备的传输技术,初期推广时并不顺利,Ajay Bhatt 首次向微软、苹果等公司推广这一技术时,这些公司没有表现出太多兴趣。第一款相容 USB 技术的产品是苹果在 1998 年 8 月推出的 iMac G3,随后微软宣布 Windows 98 支持 USB 技术,这项技术很快得到推广普及。
做为 USB 技术的投资方,Intel 公司持有该技术的全部专利,在这项技术全面推广和普及后,Intel 并没有透过 USB 技术赚钱,而是宣布对所有厂商开放 USB 技术专利。因此 Ajay Bhatt 也错过了获得丰厚回报的机会,Ajay Bhatt 表示,USB 技术让用户更轻松自如地使用电脑,这样厂商就可以卖出更多产品,Intel 可以售出更多晶片,市场规模也因此扩大,做为一名工程师,Intel 已经给他很好的待遇,因为在其他地方他没办法完成这样的研发。
操作系统
用户空间:应用程序、C语言库
内核空间:系统内核、设备驱动、硬件、系统调用
多任务
Linux是多任务操作系统,看上去支持很多并行执行的若干进程。一个CPU内核在一个时间点只能执行一个进程,因此要执行很多个进程需要内核在很短的时间间隔内在不同的进程间进行切换(用户无感知)。
1)内核借助CPU的帮助,负责进程切换的技术细节。必须给各进程一种错觉就是CPU总是可用(虽然不一定可用)。
在剥夺某个进程的CPU资源之前保存进程的上下文,在重新激活进程的时候恢复进程的上下文。这个切换过程叫进程切换。
2)内核必须确定如何在现存的进程之间共享CPU资源,确定每个进程运行时间称为调度。
系统调用
system()
系统调用的开销
系统调用时用户进程和内核交互的经典方法。POSIX定义了许多系统调用,以及这些系统调用在所有遵循POSXI的系统(Linux)的语义。总的来说,由以下几大类:
进程管理、信号、文件IO、文件系统、保护机制、定时器。
这些类的函数都对内核提出了要求:需要特别的保护机制来保障系统稳定性或者安全,所以这些函数不能以普通的用户库函数形式实现提供。
用户进程发出系统调用的时候,处理器改变该进程的特权级别,从用户态切换为内核态,每个硬件平台都提供了类似但又不同的机制。
文件系统
Linux系统有数以万计的文件,其数据存储在硬盘等其他设备。存储使用了层次式文件系统。文件系统使用目录结构组织存储的数据,并将其他元数据(所有者、访问权限)与实际数据关联起来。Linux支持许多文件系统:Ext2,Ext3文件系统。Ext2基于inode,对每个文件构造一个单独的管理结构,并且存储在磁盘上,inode包含了文件所有的元数据,以及指向项数据的位置。
编程语言
编程语言(programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并精确地定义在不同情况下所应当采取的行动。
编程语言俗称“计算机语言”,种类非常的多,总的来说可以分成机器语言、汇编语言、高级语言三大类。电脑每做的一次动作,一个步骤,都是按照已经用计算机语言编好的程序来执行的,程序是计算机要执行的指令的集合,而程序全部都是用我们所掌握的语言来编写的。所以人们要控制计算机一定要通过计算机语言向计算机发出命令。 目前通用的编程语言有两种形式:汇编语言和高级语言。
程序员通过编写跟人类思维较相近高级语言的程序代码,使用一种将该程序代码翻译为最终可执行的二进制代码。
这种翻译一般都是使用较为低级的编程语言。
这种拥有翻译功能的程序的设计思路跟具体的编程语言的语法要求是相关的。
从我们生活中就可以知道,将英文翻译为中文有两种基本模式。
第一种,将拿到的一篇完整的英文文章翻译为中文;
第二种,在外宾发表的演讲的同时将其翻译为中文,同声传译。
高级语言按照其执行方式,他所依赖的翻译工具实际上也有上述这两种情况。
解释器
边解释,边执行。
Python、shell等编程语言。
编译器
只有整个程序编译完成,才能进行下一步操作。
C、C++、OC等编程语言。
常用的C语言编译器
GNU Compiler Collection(GCC)
GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。GCC是自由软件过程发展中的著名例子,由自由软件基金会以GPL协议发布。
GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。后来又扩展能够支持更多编程语言,如Fortran、Pascal、Objective-C、Java、Ada、Go以及各类处理器架构上的汇编语言等,所以改名GNU编译器套件(GNU Compiler Collection)。
Microsoft C(cl.exe)
Borland Turbo C
Intel C++ Compiler(icc)
llvm-clang
LLVM官方网站:http://llvm.org/
Clang官方网站:http://clang.llvm.org/get_started.html
LLVM是构架编译器(compiler)的框架系统,以C++编写而成,用于优化以任意程序语言编写的程序的编译时间(compile-time)、链接时间(link-time)、运行时间(run-time)以及空闲时间(idle-time),对开发者保持开放,并兼容已有脚本。LLVM计划启动于2000年,最初由University of Illinois at Urbana-Champaign的Chris Lattner主持开展。2006年Chris Lattner加盟Apple Inc.并致力于LLVM在Apple开发体系中的应用。Apple也是LLVM计划的主要资助者.
Low Level Virtual Machine (LLVM) 是一个开源的编译器架构,它已经被成功应用到多个应用领域。Clang ( 发音为 /klæŋ/) 是 LLVM 的一个编译器前端,它目前支持 C, C++, Objective-C 以及 Objective-C++ 等编程语言。Clang 对源程序进行词法分析和语义分析,并将分析结果转换为 Abstract Syntax Tree ( 抽象语法树 ) ,最后使用 LLVM 作为后端代码的生成器。
Clang 的开发目标是提供一个可以替代 GCC 的前端编译器。与 GCC 相比,Clang 是一个重新设计的编译器前端,具有一系列优点,例如模块化,代码简单易懂,占用内存小以及容易扩展和重用等。由于 Clang 在设计上的优异性,使得 Clang 非常适合用于设计源代码级别的分析和转化工具。Clang 也已经被应用到一些重要的开发领域,如 Static Analysis 是一个基于 Clang 的静态代码分析工具。
C语言常用IDE
集成开发环境(IDE,Integrated Development Environment )是用于提供程序开发环境的应用程序,一般包括代码编辑器、编译器、调试器和图形用户界面等工具。集成了代码编写功能、分析功能、编译功能、调试功能等一体化的开发软件服务套。所有具备这一特性的软件或者软件套(组)都可以叫集成开发环境。如微软的Visual Studio系列。
VS
Qt creator
Code::Blocks
Eclipse
clion
值得注意的是 虽然vim一般来说是一个编辑器,但是vim支持拓展控件,所以这样拓展之后的vim完全可以当做一个IDE使用。
glibc
glibc是GNU发布的libc库,即c运行库。glibc是linux系统中最底层的api,几乎其它任何运行库都会依赖于glibc。glibc除了封装linux操作系统所提供的系统服务外,它本身也提供了许多其它一些必要功能服务的实现。由于 glibc 囊括了几乎所有的 UNIX 通行的标准,可以想见其内容包罗万象。
hello可执行程序的执行流程
当我们从键盘上输入字符串"./hello"之后 shell将输入的字符读入寄存器,将其放到存储器中。
当我们从键盘上敲回车键的时候shell就明白我们已经结束了命令的输入,开始解析输入的指令。
shell将加载可执行的hello文件,将hello文件中的代码和数据从磁盘复制到主存。
现代计算机已经通用 DMA技术。DMA(Direct Memory Access,直接内存存取) 是所有现代电脑的重要特色,它允许不同速度的硬件装置来沟通,而不需要依赖于 CPU 的大量中断负载。否则,CPU 需要从来源把每一片段的资料复制到暂存器,然后把它们再次写回到新的地方。在这个时间中,CPU 对于其他的工作来说就无法使用。
针对处理和主存之间的速度差异,设计了更小更快的存储设备即高速缓存存储器(高速缓存);
作为暂时的集结区域,用来存放处理器近期可能会需要的信息。
程序的局部性原理
L1、L2
访问L2的时间是访问L1的5倍。L1L2高速缓存是一种 静态随机访问存储器(SRAM)的硬件技术实现的。比较新的处理器甚至还有L3缓存。
DMA技术
DMA 传输将数据从一个地址空间复制到另外一个地址空间。当CPU 初始化这个传输动作,传输动作本身是由 DMA 控制器来实行和完成。典型的例子就是移动一个外部内存的区块到芯片内部更快的内存区。像是这样的操作并没有让处理器工作拖延,反而可以被重新排程去处理其他的工作。DMA 传输对于高效能 嵌入式系统算法和网络是很重要的。
在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。一个完整的DMA传输过程必须经过DMA请求、DMA响应、DMA传输、DMA结束4个步骤。
DMA请求
CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求。
DMA响应
DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。
DMA传输
DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过程中不需要中央处理器的参与。开始时需提供要传送的数据的起始位置和数据长度。
DMA结束
当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序。
由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。
操作系统的历史演化
第一部电脑并没有操作系统。这是由于早期电脑的建立方式(如同建造机械算盘)与效能不足以执行如此程式。但在1947年发明了晶体管,以及莫里斯·威尔克斯发明的微程序方法,使得电脑不再是机械装置,而是电子产品。系统管理工具以及简化硬件操作流程的程式很快就出现了,且成为操作系统的滥觞。到了1960年代早期,商用电脑制造商制造了批次处理系统,此系统可将工作的建置、排程以及执行序列化。此时,厂商为每一台不同型号的电脑创造不同的操作系统,因此为某电脑而写的程式无法移植到其他电脑上执行,即使是同型号的电脑也不行。
到了1964年,IBM System/360推出了一系列用途与价位都不同的大型电脑,而它们都共用代号为OS/360的操作系统(而非每种产品都用量身订做的操作系统)。让单一操作系统适用于整个系列的产品是System/360成功的关键,且实际上IBM目前的大型系统便是此系统的后裔,为System/360所写的应用程序依然可以在现代的IBM机器上执行。
OS/360也包含另一个优点:永久贮存装置—硬盘机的面世(IBM称为DASD)。另一个关键是分时概念的建立:将大型电脑珍贵的时间资源适当分配到所有用户身上。分时也让用户有独占整部机器的感觉;而Multics的分时系统是此时众多新操作系统中实践此观念最成功的。
1963年,奇异公司与贝尔实验室合作以PL/I语言建立的Multics,是激发1970年代众多操作系统建立的灵感来源,尤其是由AT&T贝尔实验室的丹尼斯·里奇与肯·汤普逊所建立的Unix系统,为了实践平台移植能力,此操作系统在1973年由C语言重写;另一个广为市场采用的小型电脑操作系统是VMS。
计算机中信息的表示
大多数计算机使用8位的块,或者字节(byte),作为最小的可寻址的内存单位,而不是访问内存中单独的位(bit)。
1 KB = 1024 Byte
1 MB = 1024 KB
1 GB = 1024 MB
甚至 TB、PB、EB、ZB。
针对每个数所在位置描述的值的范围(进制)不一样,因此常用的进制分为了二进制、八进制、十进制、十六进制。
十进制
对于有10个手指的正常人类来说,使用十进制表示法是很自然的事情。
我们生活中10 进制数是每个bit位所能表示的数有10个 (0,1,2,3,4,5,6,7,8,9(10-1)),十进制的特点就是满10进1.
至迟在商代时,中国已采用了十进位值制。从现已发现的商代陶文和甲骨文中,可以看到当时已能够用一、二、三、四、五、六、七、八、九、十、百、千、万等十三个数字,记十万以内的任何自然数。这些记数文字的形状,在后世虽有所变化而成为现在的写法,但记数方法却从没有中断,一直被沿袭,并日趋完善。甲骨卜辞中还有奇数、偶数和倍数的概念。
在计算数学方面,中国大约在商周时期已经有了四则运算,到春秋战国时期整数和分数的四则运算已相当完备。其中,出现于春秋时期的正整数乘法歌诀“九九歌”,堪称是先进的十进位记数法与简明的中国语言文字相结合之结晶,这是任何其它记数法和语言文字所无法产生的。从此,“九九歌”成为数学的普及和发展最基本的基础之一,一直延续至今。其变化只是古代的“九九歌”从“九九八十一”开始,到“二二如四”止,而现在是由“一一如一”到“九九八十一”。
九九歌是汉族民间谚语,在汉族传统文化中,九为极数,乃最大、最多、最长久的概念。九个九即八十一更是“最大不过”之数。古代汉族人民认为过了冬至日的九九八十一日,春天肯定已经到来。
远在公元前的春秋战国时代,九九歌就已经被人们广泛使用。在当时的许多著作中,都有关于九九歌的记载。最初的九九歌是从“九九八十一”到“二二如四”止,共36句。因为是从“九九八十一”开始,所以取名九九歌。大约在公元五至十世纪间,九九歌才扩充到“一一如一”。大约在公元十三、十四世纪,九九歌的顺序才变成和现在所用的一样,从“一一如一”到“九九八十一”止。 九九歌就是我们现在使用的乘法口诀 现在我国使用的乘法口诀有两种,一种是45句的,通常称为“小九九”;还有一种是81句的,通常称为“大九九”。
你心里那点小九九我还不清楚吗?
古代埃及倒是很早就用10进位制,但他们却不知道位值制。所谓位值制就是一个数码表示什么数,要看它所在的位置而定。位值制是千百年来人类智慧的结晶。零是位值制记数法的精要所在。但它的出现却并非易事。我国是最早使用十进制记数法,且认识到进位制的国家。我们的口语或文字表达的数字也遵守这一原则,比如一百二十七。计算机术语中,也常用位权值来表示每个bit上的数所表示的值。
十进制基数为10。
比如,有十进制数12396,总共有1、2、3、9、6共计5个位。
从左边第0位(6)权值为100 == 1,
从左边第1位(9)权值为101 == 10,
从左边第2位(3)权值为102 == 100,
从左边第3位(2)权值为103 == 1000,
从左边第2位(1)权值为104 == 10000,
所以,十进制数12306表示的数是1万2千3百9十6,即12396 == 1_10000+2_1000+3_100+9_10+6 。
当然当构造存储和处理信息的机器时,二进制值工作得更好。
二进制
二进制信号能够很容易地被表示、存储和传输,例如,可以表示为穿孔卡片上有洞或无洞、导线上的高电压或低电压,或者顺时针或逆时针的磁场。对二值信号进行存储和执行计算的电子电路非常简单和可靠,制造商能够在一个单独的硅片上集成数百万甚至数十亿个这样的电路。
在常用计算机内部所有指令和数据都是基于二进制系统表示的。
基数为2,进位规则是“逢二进一”。
十进制转二进制:
模2取余数直到商为0,倒取余数。
二进制转十进制:
所有 二进制位上权值*该位上的数值 之和
八进制
八进制,Octal,缩写OCT或O,一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢八进1。C语言以数字0开始表明该数字是八进制。
八进制的数和二进制数可以按位对应(八进制一位对应二进制三位)
0777,0123,034等均能合法地表示八进制数。
0877,0977等均不是合法的八进制数(只能有0-7等8个数字,而不能含有除此之外的数)。
从八进制到二进制的转换
八进制一位对应二进制三位
二进制 | 八进制 |
---|---|
000 | 0 |
001 | 1 |
010 | 2 |
011 | 3 |
100 | 4 |
101 | 5 |
110 | 6 |
111 | 7 |
二进制 (101111001)2 == (101 111 001)2 == 0571
十六进制
十六进制(英文名称:Hexadecimal),是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9;超过9的用字母A-F。
由于十六进制一位可以对应4位二进制数字,用十六进制来表示二进制较为方便。因此,八进制的应用不如十六进制。有一些程序设计语言提供了使用八进制符号来表示数字的能力,而且还是一些比较古老的Unix应用在使用八进制。
在C语言中以0x开始数字表示十六进制。
二进制 | 八进制 | 十进制 | 十六进制 |
---|---|---|---|
0000 0000 | 00 | 0 | 0x0 |
0000 0001 | 01 | 1 | 0x1 |
0000 0010 | 02 | 2 | 0x2 |
0000 0011 | 03 | 3 | 0x3 |
0000 0100 | 04 | 4 | 0x4 |
0000 0101 | 05 | 5 | 0x5 |
0000 0110 | 06 | 6 | 0x6 |
0000 0111 | 07 | 7 | 0x7 |
0000 1000 | 010 | 8 | 0x8 |
0000 1001 | 011 | 9 | 0x9 |
0000 1010 | 012 | 10 | 0xA |
0000 1011 | 013 | 11 | 0xB |
0000 1100 | 014 | 12 | 0xC |
0000 1101 | 015 | 13 | 0xD |
0000 1110 | 016 | 14 | 0xE |
0000 1111 | 017 | 15 | 0xF |
0001 0000 | 020 | 16 | 0x10 |
十六进制与二进制的相互转换
为什么程序员分不清圣诞节Dec25和万圣节Oct31?
Oct(Octal number) 31 == Dec(Decimal number) 25 。在西方国家,oct(31)即10月31日是万圣节,dec(25)即12月25日是圣诞节
数据的表示
原码、反码、补码
原码
原码(True form)是电脑运算的名词,是指“未经更改”的码。为了便于ALU的设计,又发展出反码、补码等转换过的码。
原码是指一个二进制数左边加上符号位后所得到的码,且当二进制数大于0时,符号位为0;二进制数小于0时,符号位为1;二进制数等于0时,符号位可以为0或1(+0/-0)
简单直观;例如,我们用8位二进制表示一个数,则+11的原码为00001011,-11的原码就是10001011。
反码
反码又叫一补数。
将二进制数反转,得到的数即为原二进制的反码(ones' complement)。若某一位为0,则使其变为1,反之亦然。
一个数的反码在很多算术运算中的表现与这个数的相反数很相似,此特性可使加法电路同时可以运算减法。然而,由于一补数中存在多余的负零和其它问题,反码并未像补码一样被广泛应用。
表示方式
例如,+3是0011,以一补码表示-3便是1100。
补码
补码又叫二补数。
二补数(2's complement)是一种用二进制表示有号数的方法,也是一种将数字的正负号变号的方式,常在计算机科学中使用。
一个数字的二补数的计算方法就是将该数字作位反相计算(即一补数),再将结果加 1,即为该数字的二补数。在二补数系统中,一个负数就是用其对应正数的二补数来表示。
最大的优点是可以在加法或减法处理中,不需因为数字的正负而使用不同的计算方式。只要一种加法电路就可以处理各种有号数加法,而且减法可以用一个数加上另一个数的二补数来表示,因此只要有加法电路及二补数电路即可完成各种有号数加法及减法,在电路设计上相当方便。
二补数系统数字的加法和一般加法相同,而且在运算完成后就可以看出结果的正负号,不需特别的处理。
正数与负数相加不会出现上溢错误,上溢错误只会在两个正数或两个负数相加时发生。
0111 1111 15
1000 0101 -5
1111 1011
- 0111 1111
进11111 111
0000 1111
1111 1011
10000 1010 10 第9个bit溢出忽略
若进位列的最左侧二个比特同为0或同为1,表示结果正确,若是一个为0,另一个为1,表示出现溢出错误。
0000 0111 7
0000 0011 3
0000 1010 10
4位补码可以表示的数字范围 -8~7
8位补码可以表示的数字范围 -128~127
假设 -60+(-78)运算呢
-60+(-78)
128 64 32 16 8421
1 011 1100 原码
1 100 0011 反码
1 100 0100 补码
1 100 1110 原码
1 011 0001 反码
1 011 0010 补码
10000 000
1100 0100
1011 0010
10111 0110
0111 0110 补码
1000 1010 原码 138
归根到底是因为8位有符号的补码系统不能表示138。
乘法在电脑的世界里其实就是不断的做加法。
例如:3*5=3+3+3+3+3=1
除法就是相减。
例如:10/3=10-3-3-3=3mod1
而减法又可做二的补数相加,所以所有四则运算的基础都是由加法而来。
以上只说明了整数的二进制在计算机中的表示。
对于小数的二进制表示,面试的频度太低,不展开。
字节序
字节顺序,又称端序或尾序(英语:Endianness)。在计算机科学领域中,是跨越多字节的程序对象的存储规则。
处理器体系的字节序
- x86,MOS Technology 6502,Z80,VAX,PDP-11等处理器为Little endian。
Motorola 6800,Motorola 68000,PowerPC 970,System/370,SPARC(除V9外)等处理器为Big endian。网络传输一般采用大端序,也被称之为网络字节序,或网络序。IP协议中定义大端序为网络字节序。
ARM, PowerPC (除PowerPC 970外), DEC Alpha, SPARC V9, MIPS, PA-RISC and IA64的字节序是可配置的。
Android(Google)和iOS(Apple)操作系统只能在小端模式下
为什么寄存器比内存快-闲扯话题
随处可见的cache机制
CPU的一级缓存、二级缓存
操作系统的虚拟内存(windows)和交换分区(swap)
硬盘的缓存
操作系统是如何启动的?
完成作业并且预习明天的知识点
1.写出10进制的88对应的二进制 八进制 十六进制
2.写出十六进制 0xff18ffec对应的二进制和八进制
3.写出二进制0100 1110 1111对应的十进制 八进制 十六进制
4.计算求出给定的整数中bit位上值为1的位的数量 比如65, 130,133等三个整数