随笔分类 -  操作系统 / 深入理解计算机系统笔记

第七章,第九章
摘要:11.3全球因特网 因特网的客户端和服务器混合使用套接字接口函数和UNIX I/O函数来进行通信。通常将套接字函数实现为系统调用,这些系统调用会陷入内核,并调用内核模式的TCP/IP函数。 IP协议提供基本的命名方法和递送机制,这种机制可以从一台因特尔网主机往其他主机发包(数据报) IP协议是不可靠 阅读全文
posted @ 2022-09-01 21:59 227569hy 阅读(30) 评论(0) 推荐(0)
摘要:##第十一章网络编程 ###11.1 客户端-服务器编程模型 包含一个服务器进程和多个客户端进程。 服务器管理某种资源,并通过操作这种资源给客户端提供某种服务。 基本操作是:事务 一个客户端-服务器事务由以下四步组成: 当一个客户端需要服务时,他向服务器发送一个请求,发起一个事务 服务器收到请求,就 阅读全文
posted @ 2022-08-31 21:52 227569hy 阅读(59) 评论(0) 推荐(0)
摘要:![image](https://img2022.cnblogs.com/blog/2945255/202208/2945255-20220829220121423-1520603786.png) 阅读全文
posted @ 2022-08-29 22:01 227569hy 阅读(17) 评论(0) 推荐(0)
摘要:9.10 垃圾收集 垃圾收集器是一种动态内存分配器,它自动释放程序不再需要的已分配块。它定期识别垃圾块,调用相应的free,并把这些块放在空闲链表中。 垃圾收集器将内存视为一张有向可达图,图包括根节点和堆节点 每个堆节点对应堆中的一个已分配块。边的方向表示块p中的某个位置指向q的某个位置。根节点是不 阅读全文
posted @ 2022-08-29 22:00 227569hy 阅读(42) 评论(0) 推荐(0)
摘要:###9.9 动态内存分配 动态内存分配器维护一个进程的虚拟内存区域,称为堆。 对于每个进程,内核维护一个变量brk,它指向堆的顶部。 分配器将堆视做一组不同大小的块的集合来维护。每个块就是一个连续的虚拟内存片,要么是已分配的,要么是空闲的。块被释放要么是应用程序显式的执行的,要么是内存分配器隐式的 阅读全文
posted @ 2022-08-28 20:10 227569hy 阅读(195) 评论(0) 推荐(0)
摘要:###9.8 内存映射 定义:将一个虚拟内存区域和一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容的过程被称为内存映射。 虚拟内存区域可以映射到下面两种类型的对象中的一个: Linux文件系统中的普通文件:因为按需进行页面调度,所以这些虚拟页面没有实际交换进入物理内存,而是等到CPU第一次引 阅读全文
posted @ 2022-08-28 20:09 227569hy 阅读(180) 评论(0) 推荐(0)
摘要:###9.7 案例:Intel Core i7/Linux 内存系统 见书576 ###9.8 Linux虚拟内存系统 与进程相关的数据结构(比如:页表、task和mm结构、内核栈)对每个进程不同 物理内存内核虚拟内存 内核代码和数据对每个进程一样 用户栈进程虚拟内存 共享库的内存映射区域 运行时堆 阅读全文
posted @ 2022-08-25 21:29 227569hy 阅读(73) 评论(0) 推荐(0)
摘要:###9.3 虚拟内存作为缓存的工具 虚拟内存和物理内存的分页 虚拟内存可以分为: 未分配的,没有数据和它们相互关联,不占用磁盘空间。 缓存的,当前已经缓存在物理内存中的已分配页。 未缓存的,未缓存在物理内存的已分配页。 页表: 页表将虚拟页映射到物理页。页表是由页表条目(PTE)组成的数组。 PT 阅读全文
posted @ 2022-08-23 21:06 227569hy 阅读(60) 评论(0) 推荐(0)
摘要:##第九章 虚拟内存 ####前言 为了有效的管理内存,现代系统建立了虚拟内存的概念。 虚拟内存: 将主存看做一个存储在磁盘上的地址空间的高速缓存,在主存中只包含活动区域,高效使用了主存。 为每个进程提供了一致的地址空间,简化了内存管理。 保护了每个进程的地址空间不被其他进程破坏。 ###9.1 9 阅读全文
posted @ 2022-08-22 21:36 227569hy 阅读(32) 评论(0) 推荐(0)
摘要:![image](https://img2022.cnblogs.com/blog/2945255/202208/2945255-20220822203233545-1871798038.png) 阅读全文
posted @ 2022-08-22 20:33 227569hy 阅读(9) 评论(0) 推荐(0)
摘要:7.13 库打桩机制 库打桩:允许截获对共享库的调用,转而执行自己的代码。使用这个机制可以追踪某个特殊库函数的调用次数,验证和追踪它的输入和输出值,或者替换它。 需要创建一个包装函数,原型和目标函数完全一样。通常包装函数执行自己的逻辑,然后调用目标函数,再返回目标函数。 打桩可以发生在编译时,链接时 阅读全文
posted @ 2022-08-17 22:07 227569hy 阅读(34) 评论(0) 推荐(0)
摘要:###7.11 从应用程序中加载和链接共享库 共享库的作用例子: 分发软件,可以用户下载共享库来更新软件。 构建高性能的web服务器,不用fork和execve子进程,而是可以在运行时更新已经存在的函数,以及添加新函数。 #inlcude<dlfc.h> void *dlopen(const cha 阅读全文
posted @ 2022-08-16 21:31 227569hy 阅读(42) 评论(0) 推荐(0)
摘要:加载器运行时,它创建类似与该表的内存映像,在程序头部表的引导下,加载器将可执行文件的片复制到代码段和数据段。然后加载器跳转到程序的入口点(_start函数的地址)。这个函数定义在系统目标文件ctrl.o里。_start函数调用系统启动函数__libc_start_main,该函数定义在libc.so 阅读全文
posted @ 2022-08-11 21:49 227569hy 阅读(65) 评论(0) 推荐(0)
摘要:###7.7重定位 建立定义和引用对应关系之后,就可以进行重定位了,合并输入模块,并为每个符号分配运行时内存。 重定位包括两步: 重定位节和符号定义:合并所有目标文件的类型相同的节,同时链接器把运行时内存的地址赋给新的节和输入模块定义的每个符号。这一步完成之后程序的每条指令和全局变量都有唯一的运行时 阅读全文
posted @ 2022-08-10 21:51 227569hy 阅读(121) 评论(0) 推荐(0)
摘要:7.6.3 链接器使用静态库来解析引用 链接器维护三个集合:E、D、U。 E:可重定位目标文件的集合 D:已定义的符号集合 U:未解析的符号的集合 第一步:链接器判断输入文件f的类型,如果是目标文件,则放入集合E中,同时根据f更新D和U。 第二步:如果f是一个文档文件,那么链接器使用f中的每个存档文 阅读全文
posted @ 2022-08-09 21:45 227569hy 阅读(46) 评论(0) 推荐(0)