程序设计与计算机系统-笔记

1编译系统如何工作?

+性能界定:如何转换c到机器代码起着重要作用(今天学会了switch与if,then,else更好。指针引用/数组索引,while/for,本地变量/引用参数,排列括号)
+错误提醒,多由链接器操作导致,动态库/静态库
+安全隐患,堆栈原理,缓冲区溢出。

2处理器,存储器(层次结构),指令。
4个硬件组成:
 1)总线,字节数,字长,4字节(32),8字节(64),总线传字节块。
 2)I/O设备,键盘鼠标(控制器)显示器(配适器)磁盘(控制器),控制器/配适器封装方式不同。
 3)主存,DRAM芯片(线性字节数组,有数组索引),有指令
 4)处理器(CPU),核心是寄存器,称为计数器(PC)。PC总是指向指令的地址。
4.)处理器

执行pc指向指令,更新计数器pc。指令集结构决定模型。
cpu的4个操作:
加载(cpu),存储(主存),操作(涉及ALU即逻辑单元),跳转(cpu)。
处理器的两个层面:指令集结构和微体系结构。即机器代码指令效果与如何实现。

高速缓存:指令在磁盘上,加载时复制到主存,运行时复制到处理器。
存储设备大则运行慢。
大小排序:(远程二级储存,分布式文件系统,web服务器)(本地二级储存)磁盘,主存(几十亿字节),处理器(几百)。
于是出现了高速储存存储器(高速缓存),分L1(数万字节),L2(十万-百万),L3。
上一层(寄存器)是下一层的高速缓存。

1.7操作系统的管理硬件

程序与硬件之间有一层软件,操作系统。
操作系统的功能:
1.防止失控的程序破坏硬件
2.提供机制方便程序控制硬件设备
实现2个功能的手段涉及抽象概念(进程,虚拟存储器,文件)
进程(处理器,主存,i/o设备)
虚拟存储器(主存,i/o设备)
文件(i/o设备)
✔介绍-进程,虚拟存储器,文件
小故事:unix,是由原使用multics操作系统的贝尔实验室研究人员,用机器语言,写更小更简单的程序包来实现的,于1970年取名。1973年用c语言重新写,1974正式发布而Posix是写系统的规范。
1%进程,上下文切换。一个进程可有多个线程共享代码和数据。
2%虚拟存储器(初始化),堆(在运行时是动态扩展与收缩的),共享库,栈(和堆类似,在地址空间顶部),内核虚拟存储器(在内存中,禁止读写与调用),然而并不知道它怎么工作。
3%文件。字节序列。键盘,磁盘,显示器,网络都可以视为文件。如此一来,不懂磁盘技术也能写处理磁盘内容的应用程序。

1.8系统之间利用网络通信

创建服务器?服务器是有shell,能运行程序的东西?

1.9重要主题

并行与并发(线程型并发,指令级并行,单指令多数据并行),抽象的重要性
计算机做得多(并发concurrency),做得快(并行parallelism)
1%以前,一个处理器,单处理器系统是实行任务切换。后来出现多核,即微处理器芯片有4个cpu核,每个核都有自己的高速缓存,共享更高层次的高速缓存以及到主存的接口。
多处理器包括(多核,超线程)
simultaneous mult-threading,是运行cpu执行多个控制流。(CPU硬件备份?周期?转换线程?)一个核2个线程,4个核8个线程。多处理器不需要模拟并发,直接并发资源共享,并行执行程序。不过应用程序是在多核与超线程系统出现后才写出来的,离并发原理的形成与研究50年。

2%指令级并行
从3到10个钟一个指令(intel8060)
到一个钟3-4个指令(假设一个指令需要5个钟,把这个指令分步,发给不同硬件,那就相当于0.2个指令要处理了)。比一个周期一个指令更快的叫超标量superscaler。

1%单指令多数据并行SIMD并行
优点:影像声音视频处理速度更快。不过,与其从C程序中自动抽取SIMD并行性,更可靠的是使用特殊向量数据类型来写程序
-计算机系统中抽象的重要性
API应用程序接口,啥玩意?
4层重要抽象,虚拟机(进程(虚拟存储器(文件)))

45/程序结构和执行
####2.1.1-2.1.10
信息的处理和表示
无符号编码,补码编码,浮点数编码,了解不同属性能防止漏洞的产生。
1989推出ANSI C,随后ISO C90,ISO C99都是编写C的规范。GUN是编译器套装,可以编译不同规范下的C语言。而GCC是命令行选项。
2.1信息储存
字节的值域用十六进制编写更简洁好换算。
2.1.2字
32位字长限定虚拟地址空间4GB千兆。储存能力差。
2.1.3数据大小
指令分不同字节大小,2/4/8字节。在32位电脑上可以运行的程序在64上会出现什么问题?
2.1.4寻址和字节顺序
地址是按顺序的,一个对象的字节的排列规则有:大端,小端,双端。网络应用程序的编写应该遵循何种规则?传输和阅读字节时,顺序都很重要。
系统级编程要使用强制类型转换,应用编程强烈不要。
指针被看成字节序列,而不是一个原始数据类型的对象。
取地址运算符&创建一个指向变量x位置的指针。
sizeof确定字节,帮助代码在不同机器上移植。
浮点和整数不同编码方式探究。
指针下面是变量,上面是指向类型。

float fval =(float) ival;意思是,强行把值ival从int 转换float,注意括号的意思。实际,fval相当于容器。我们要比较不同容器的大小。
大端法看上去和正常一样,小端法看上去是倒过来的。
弄不清x和&x的关系,为什么用&x可以得到x的值?类元组的使用方法。
2.1.5表示字符串
文本用ASCII码表示,不涉及字节顺序与字大小,所以比二进制有更强的平台独立性。
为什么用十六进制表示“12345”,循环6次,结果是31 32 33 34 35 00?

为啥要注意十进制数字的ASCII码以及终止字节的十六进制表示方法?

命令行:man ascii就能得到一张字符码的表。

unicode,每个字符,4个字节
UTF-8,每个字符,1个字节序列?
ascii,每个字符,单字节,1个字节
ascii字符,可以用ascii码,也可用UTF-8码。

2.1.6表示代码
一个程序,在不同机器上运行,使用的指令编码是不同的。所以二进制代码不兼容?也就是不能在不同的机器和操作系统上得到相同的运行结果。

2.1.7布尔代数简介
关于布尔代数和布尔环
布尔代数和整数运算的相似性

C语言的位级运运算(or and not:|&∽)(适用于任何整形数据,即任何char, int)
掩码运算(0xff, 0x表示十六进制,ff表示二进制1111 1111)
练习题看都看不懂。
为什么!
C语言的逻辑运算((or and not:|| && !))(与位级运算功能不同)
不会对第二个参数求值,如果第一个参数能确定表达式结果???区别是位级运算是bit比较,结果是整形,而逻辑运算是0/1运算,结果是0/1。
表达式:0x41为啥结果是0x00?

C语言的移位运算
分逻辑右移和算数右移(特适用于有符号整数数据)
两种情况:unsigned数据必是逻辑右移,而有符号的数据,无明确规定。但是,几乎所有编译器/机器都使用算数右移。
(java>>表示算数右移,>>>表示逻辑右移)
求模mod和取余有些不同,不知道!

操作符优先级,加号运算符优先于移位。

2.2

整数2种表示(非负数/负数,零,正数)(以后学习,与数学属性和机器级实现的关联;扩展收缩已编码整数)
多种整数类型(long,short等)
long是唯一与机器(32/64位)有关,影响取值范围的指示符。
无符号编码,映射,双射
UMax(w)=∑w-1(i=0)=2∧i=2∧w-1(w位)
B2U(w):{0,1}∧w→{0,…,2∧w-1},因为长度为w的位向量有唯一值对应,即函数B2U(w)是双射。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值