小结:
1.系统中所有的信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位(bit/字节)表示的。区分数据对象的唯一方法是我们读到这些数据对象时的上下文。
即是:信息就是位(bit/字节)+上下文。
由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
gcc -o hello hello.c
gcc编译器驱动程序将hello.c编译成一个可执行文件hello经过四步:
1.hello.c -> 预处理(cpp) ->hello.i->编译器(ccl) -> hello.s -> 汇编器(as) ->hello.o -> 连接器(ld)
- 优化程序性能。了解编译过程是为了了解不同语句在编译器生成的代码执行的效率问题,从而优化代码。有哪些区别?怎么优化?
- 理解链接时出现的错误。链接是?现在的编译器用到了吗?哪些用到了?优化了吗?
- 避免安全漏洞。缓冲区溢出错误?学习安全编程,理解数据和控制信息存储在程序栈上的方式会引起哪种后果。
文件:字节序列,I/O设备、网络等都可以视为文件。
线程:每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
虚拟存储器:为每个进程提供一个假象,即每个进程都在独占的使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。在linux中,地址空间最上面的区域是为操作系统中的代码和数据保留的,这对所有的进程都是一样的。地址空间底部区域存放用户进程定义的代码和数据。
图中的地址是从下往上递增的。
从最低的地址开始,逐步向上介绍:
- 程序代码和数据。对于所有的进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。
- 堆。堆可以在运行时动态的扩展和收缩。(js中存储对象)
- 共享库。存放类似c标准库这样的共享库。
- 栈。位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用。栈也可在程序执行期间动态扩展和收缩。
并发:一个同时具有多个活动的系统。
并行:用并发使一个系统运行的更快。
- 线程级并发:构建进程这个抽象,我们能够设计出同时执行多个程序的系统,这就导致了并发。传统意义上,这种并发执行时模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换的方式实现的。
- 指令级并行:同时执行多条指令
- 单指令、多数据并行:允许一条指令产生多个可以并行执行的操作。
超线程:有时称为同时多线程,是一项允许一个cpu执行多个控制流的技术。