pwn学习日记Day11 《程序员的自我修养》读书笔记

阅读基础

计算机系统软件体系结构采用一种层的结构——计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。
多线程的优势:
1.某个操作可能会陷入长时间等待,等待的线程会进入睡眠状态,无法继续执行。多线程执行可以有效利用等待时间。典型的例子是等待网络响应,这可能要花费数秒甚至数十秒。
2.某个操作(常常是计算)会消耗大量的时间,如果只有一个线程,程序和用户之间的交互会中断。多线程可以让一个线程负责交互,另一个线程负责计算。
3.程序逻辑本身就要求并发操作,例如下载一个多端下载软件。
4.多CPU或多核计算机,本身具备同时执行多个线程的能力,因此单线程程序无法全面地发挥计算机的全部计算能力。
5.相对于多进程应用,多线程在数据共享方面效率要高得多。
处在运行中线程拥有一段可以执行的时间,这段时间称为时间片。
一个函数要成为可重入的,必须具有如下几个特点:
1.不使用任何(局部)静态或全局的非const变量。
2.不返回任何(局部)静态或全局的非const变量的指针。
3.仅依赖于调用方提供的参数。
4.不依赖任何单个资源的锁(mutex等)
5.不调用任何不可重入的函数。
一对一线程缺点有两个:
1.由于许多操作系统限制了内核线程的数量,因此一对一线程会让用户的线程数量受到限制。
2.许多操作系统内核线程调度时,上下文切换的开销较大,导致用户线程的执行效率下降。
编译四步骤:
1.预处理
2.编译

  • 词法分析
  • 语法分析
  • 语义分析
  • 中间代码生成
  • 目标代码生成与分析

3.汇编
4.链接
数据和指令分段的好处:
1.当程序被装载后,数据和指令分别被映射到两个虚存区域。由于数据区域对于进程来说是可读写的,而指令区域对于进程来说只读的,所以这两个虚存区域的权限可以被分别设置成可读写和只读。这样可以防止程序的指令被有意或无意地改写。
2.对于现代的cpu来说,它们有着极为强大的缓存体系。由于缓存在现代的计算机中地位非常重要,所以程序必须尽量提高缓存的命中率。指令区和数据区的分离有利于提高程序的局部性。现代cpu的缓存一般都被设计成数据缓存和指令缓存分离,所以程序的指令和数据被分开存放对cpu的缓存命中率提高有好处。
3.当系统中运行着多个该程序的副本时,它们的指令都是一样的,所以内存中只须要保存一份改程序指令的部分。对于指令这种只读的区域来说就是这样,对于其他的只读数据也一样,比如很多程序里面带有的图标、图片、文本等资源也是属于可以共享的。当然每个副本进程的数据区域是不一样的,它们是进程私有的。这样可以节约大量的内存。

posted @ 2019-05-06 09:47  PwnKi  阅读(337)  评论(0编辑  收藏  举报