08 2022 档案
摘要:##第十一章网络编程 ###11.1 客户端-服务器编程模型 包含一个服务器进程和多个客户端进程。 服务器管理某种资源,并通过操作这种资源给客户端提供某种服务。 基本操作是:事务 一个客户端-服务器事务由以下四步组成: 当一个客户端需要服务时,他向服务器发送一个请求,发起一个事务 服务器收到请求,就
阅读全文
摘要:
阅读全文
摘要:9.10 垃圾收集 垃圾收集器是一种动态内存分配器,它自动释放程序不再需要的已分配块。它定期识别垃圾块,调用相应的free,并把这些块放在空闲链表中。 垃圾收集器将内存视为一张有向可达图,图包括根节点和堆节点 每个堆节点对应堆中的一个已分配块。边的方向表示块p中的某个位置指向q的某个位置。根节点是不
阅读全文
摘要:###9.9 动态内存分配 动态内存分配器维护一个进程的虚拟内存区域,称为堆。 对于每个进程,内核维护一个变量brk,它指向堆的顶部。 分配器将堆视做一组不同大小的块的集合来维护。每个块就是一个连续的虚拟内存片,要么是已分配的,要么是空闲的。块被释放要么是应用程序显式的执行的,要么是内存分配器隐式的
阅读全文
摘要:###9.8 内存映射 定义:将一个虚拟内存区域和一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容的过程被称为内存映射。 虚拟内存区域可以映射到下面两种类型的对象中的一个: Linux文件系统中的普通文件:因为按需进行页面调度,所以这些虚拟页面没有实际交换进入物理内存,而是等到CPU第一次引
阅读全文
摘要:###9.7 案例:Intel Core i7/Linux 内存系统 见书576 ###9.8 Linux虚拟内存系统 与进程相关的数据结构(比如:页表、task和mm结构、内核栈)对每个进程不同 物理内存内核虚拟内存 内核代码和数据对每个进程一样 用户栈进程虚拟内存 共享库的内存映射区域 运行时堆
阅读全文
摘要:###9.3 虚拟内存作为缓存的工具 虚拟内存和物理内存的分页 虚拟内存可以分为: 未分配的,没有数据和它们相互关联,不占用磁盘空间。 缓存的,当前已经缓存在物理内存中的已分配页。 未缓存的,未缓存在物理内存的已分配页。 页表: 页表将虚拟页映射到物理页。页表是由页表条目(PTE)组成的数组。 PT
阅读全文
摘要:##第九章 虚拟内存 ####前言 为了有效的管理内存,现代系统建立了虚拟内存的概念。 虚拟内存: 将主存看做一个存储在磁盘上的地址空间的高速缓存,在主存中只包含活动区域,高效使用了主存。 为每个进程提供了一致的地址空间,简化了内存管理。 保护了每个进程的地址空间不被其他进程破坏。 ###9.1 9
阅读全文
摘要:
阅读全文
摘要:第九章 类 类的创建: class Dog: def __init__(self, name, age): # 初始化函数 self.name = name self.age = age def sit(self): print(f"{self.name} is now sitting") clas
阅读全文
摘要:第七章 用户输入和while循环 message = input("提示信息") message = input(str) #str可以提前赋值 message为字符串,需要数字,要先使用int()转化。 第八章 函数 定义: def print1(str): print(str.tittle())
阅读全文
摘要:###第四章操作列表 函数range(m,n) 包含m-n的数,包括m,不包括n,左闭右开。 range(m,n,d) d为步长。 value ** 2 其中**表示乘方。 列表解析: [expression for iter_val in iterable if cond_expr] [expre
阅读全文
摘要:7.13 库打桩机制 库打桩:允许截获对共享库的调用,转而执行自己的代码。使用这个机制可以追踪某个特殊库函数的调用次数,验证和追踪它的输入和输出值,或者替换它。 需要创建一个包装函数,原型和目标函数完全一样。通常包装函数执行自己的逻辑,然后调用目标函数,再返回目标函数。 打桩可以发生在编译时,链接时
阅读全文
摘要:##python语法基础 python解释器提供一个traceback,指出解释器尝试运行代码时的错误信息。 ###第二章变量和简单数据类型 在字符串中使用变量: f字符串: 实例代码: first_name = "ada" last_name = "lovelace" full_name = f"
阅读全文
摘要:###7.11 从应用程序中加载和链接共享库 共享库的作用例子: 分发软件,可以用户下载共享库来更新软件。 构建高性能的web服务器,不用fork和execve子进程,而是可以在运行时更新已经存在的函数,以及添加新函数。 #inlcude<dlfc.h> void *dlopen(const cha
阅读全文
摘要:加载器运行时,它创建类似与该表的内存映像,在程序头部表的引导下,加载器将可执行文件的片复制到代码段和数据段。然后加载器跳转到程序的入口点(_start函数的地址)。这个函数定义在系统目标文件ctrl.o里。_start函数调用系统启动函数__libc_start_main,该函数定义在libc.so
阅读全文
摘要:###7.7重定位 建立定义和引用对应关系之后,就可以进行重定位了,合并输入模块,并为每个符号分配运行时内存。 重定位包括两步: 重定位节和符号定义:合并所有目标文件的类型相同的节,同时链接器把运行时内存的地址赋给新的节和输入模块定义的每个符号。这一步完成之后程序的每条指令和全局变量都有唯一的运行时
阅读全文
摘要:7.6.3 链接器使用静态库来解析引用 链接器维护三个集合:E、D、U。 E:可重定位目标文件的集合 D:已定义的符号集合 U:未解析的符号的集合 第一步:链接器判断输入文件f的类型,如果是目标文件,则放入集合E中,同时根据f更新D和U。 第二步:如果f是一个文档文件,那么链接器使用f中的每个存档文
阅读全文
摘要:7.6符号解析 重整:编译器把每个唯一的方法和参数列表组合编码成一个对链接器来说唯一的名字。(C++,JAVA 重载会使用) 7.6.1 链接器解析多重定义的全局符号 函数和已初始化的全局变量为强符号,未初始化的全局变量为弱符号 链接器会按照以下规则处理强符号和弱符号: 1、 不允许强符号被多次定义
阅读全文
摘要:cmake里设置程序编译为debug模式 这种方法每次会执行一次 cmake .. 和 make tasks.json // tasks.json { "version": "2.0.0", "options": { "cwd": "xxx/build" //build文件的位置 }, "tasks
阅读全文
摘要:链接器使分离编译成为可能。 作用域规则的实现 .i文件ASCII码 main.c ->main.i ->main.s->main.o和函数的.o文件一起链接生成可执行文件 然后终端启动程序,调用加载器,把可执行文件的代码和数据复制到内存,然后将控制转移到程序的开头。 注意:.data保存已经初始化的
阅读全文