- 博客(892)
- 资源 (2)
- 收藏
- 关注
原创 《linux2.4内存管理》第3章 页表管理
Linux内存管理机制解析 摘要:本文详细分析了Linux内存管理系统的核心机制。Linux采用独特的三层页表结构(PGD-PMD-PTE),通过页表项(pte_t)管理物理页面,实现了与硬件体系结构的解耦。系统通过快速分配/释放机制优化页表操作,并利用TLB和CPU缓存提升性能。内存地址转换涉及物理地址与虚拟地址的映射,以及struct page结构的管理。
2025-06-12 11:52:28
305
原创 《TCP/IP协议卷1》 TCP的坚持和保活定时器
连接空闲两小时后,会发探查分组,可能出现对端仍正常运行、已崩溃、崩溃后重启、当前无法到达4种情况,通过实例展示了后三种情况的不同差错返回。若两端都无定时器,客户无法知晓对端崩溃或重启,使用保活功能时需关注此局限。基于窗口的流量控制方案(如TCP所用)会引发“糊涂窗口综合症”,出现该情况时,连接中只有少量数据交换,而非满长度报文段传输。在TCP连接两端,接收方通告小窗口,或发送方在等待大窗口时先发送少量数据,都可能触发该现象。:通常不通告小窗口,除非增大窗口(到MSS或使接收缓存空间达一半)。
2025-06-12 10:08:40
360
原创 《TCP/IP协议卷1》第19章 TCP的交互数据流
方面重传计时器的作用拥塞控制的作用协同方式丢包检测超时重传表示可能丢包将丢包视为拥塞信号触发降速机制网络反馈提供丢包时间信息根据反馈调节发送速率动态平衡网络负载性能优化快速重传减少等待快速恢复机制维持高吞吐提高整体传输效率。
2025-06-12 10:07:19
886
原创 《TCP/IP协议卷1》TCP协议&TCP连接建立和释放
TCP数据封装在IP数据报中,IP首部20字节,若不计任选字段,TCP首部通常也是20字节。,前者指定内核能管的孤儿连接数目,后者指定孤儿连接在内核中生存的时间。系统调用主动与服务器建立连接,首先发送同步报文段,连接转移到。状态的服务器直接收到带确认信息的结束报文段,可直接进入。:若服务器关闭连接(发送结束报文段),客户端进入。:客户端主动关闭连接,发送结束报文段,连接进入。调用成功收到服务器确认报文段,连接转移到。:客户端收到服务器确认报文段,转移到。状态,等待服务器确认。
2025-06-12 10:05:29
836
原创 《TCP/IP协议卷1》第11章 UDP:用户数据报协议
什么是 UDP 输入队列?UDP( 用户数据报协议 ) 输入队列是操作系统内核中用于存储接收到的 UDP 数据报的缓冲区。当网络接口收到 UDP 数据包时,内核会将其暂时存储在输入队列中,等待应用程序通过套接字(socket)读取这些数据。每个 UDP 套接字通常关联一个固定大小的输入队列(接收缓冲区),其大小可以通过系统配置或应用程序设置 (如SO_RCVBUF套接字选项 )进行调整。UDP 输入队列的用途缓冲网络数据:UDP 是无连接的协议,数据报到达时应用程序可能尚未准备好读取。
2025-06-12 10:02:29
770
原创 《TCP/IP协议卷1》第9章 IP选路
IP 选路是什么?IP选路,也称为路由选择或路由决策,是指在数据包传输过程中,确定从源主机到目标主机路径的过程。每个数据包都包含一个目的IP地址,路由器需要根据这个地址决定如何转发该数据包,以便其能够到达目的地。路由表的作用是什么?路由表是网络设备(如路由器和主机)中用于存储路由信息的数据结构。它包含了到达不同网络的路径信息,包括下一跳地址、接口信息以及可能的一些度量值(如距离、延迟等)。路由表的主要作用在于指导IP数据包的转发过程,确保数据包可以沿着正确的路径前进直至抵达目标网络。路由表是如何初始化的?路
2025-06-12 10:01:10
526
原创 《TCP/IP协议卷1》 ARP&ICMP协议
本章探讨Internet控制报文协议(ICMP ),介绍了ICMP报文类型(多数后续章节会深入讨论 )。
2025-06-12 09:58:49
450
原创 《TCP/IP协议卷1》第3章 IP协议
IP是TCP/IP协议族核心协议,TCP、UDP、ICMP及IGMP数据都以IP数据报格式传输。IP提供不可靠、无连接的数据报传送服务。不可靠指不能保证数据报成功到达目的地,出错时丢弃数据报并发送ICMP消息给信源端,可靠性由上层协议(如TCP )保障;无连接指不维护后续数据报状态信息,数据报处理相互独立,可无序接收。ifconfig命令用于在引导时配置主机网络接口,因拨号接口(如SLIP链路 )会频繁接通和挂断,每次都需运行该命令,具体运行方式取决于所使用的SLIP软件。通过展示作者子网接口的相关参数示例
2025-06-12 09:57:30
634
原创 《TCP/IP协议卷1》第1章 概述
稳健性原则:“在实现时,发送的数据要严格遵循规范,接收数据时要尽量宽容"。在 RFC 1122 中,这一原则被进一步应用于 TCP/IP 协议族的每一层,确保主机实现能够在不可靠的网络环境中稳定运行。稳健性原则的核心思想发送端严格:确保发送的数据完全符合协议规范,减少接收端的处理负担。接收端宽容:允许接收端处理非标准但可接受的数据(如忽略未知选项、处理乱序数据),以提高系统在复杂网络环境中的鲁棒性。应用于 TCP/IP 协议族每一层的稳健性原则链路层稳健性原则。
2025-06-12 09:56:17
662
原创 《性能之巅》第十章 网络
在系统日益分布式(尤其云计算环境)下,网络在性能方面愈发关键,任务包括改进网络延时、吞吐量,消除丢包引发的延时异常。网络分析涉及硬件(物理网络组件如网卡、交换机等)和软件(内核协议栈如TCP/IP 及相关协议行为)。因网络易因性能差受责,本章旨在挖掘实际情况、排除网络责任以推进分析。由五部分构成:背景:介绍网络术语、基本模型和关键性能概念。架构介绍:讲解硬件网络组件和网络栈。方法:阐述性能分析的观察法和实验法。分析:说明Linux和Solaris系统中的网络性能工具和实验。调优。
2025-06-12 09:52:36
499
原创 《性能之巅》第九章 磁盘
重要性:磁盘I/O可能导致应用程序严重延时,是系统性能分析关键目标。消除磁盘I/O瓶颈可大幅提升性能和应用程序吞吐量。磁盘类型:包括旋转磁性盘片和基于闪存的固态盘(SSD),SSD提升了I/O性能,但容量和I/O速率需求增长使闪存设备也无法完全解决性能问题。章节结构:分五部分,前三部分介绍磁盘I/O分析基础知识,后两部分在Linux和Solaris系统应用分析方法。背景:介绍存储术语、磁盘设备基本模型及磁盘性能关键概念。架构:概述存储硬件和软件架构。方法:描述性能分析的观察性和实验性方法。分析。
2025-06-12 09:51:25
419
原创 《性能之巅》第八章 文件系统
研究应用程序I/O性能时,文件系统性能比磁盘性能更关键,它通过缓存、缓冲、异步I/O等缓解磁盘延时影响。借助动态跟踪技术可分析文件系统请求,排查性能来源。背景:介绍文件系统术语、模型、原理及关键概念。架构:阐述一般和特殊的文件系统架构。方法:讲述性能分析的观察法和实验法。分析:展示基于Linux和Solaris的文件系统性能工具(静态和动态 )。调优:说明文件系统的可调参数。
2025-06-12 09:49:40
535
原创 《性能之巅 》 第七章 内存
系统主存存储应用程序、内核指令及其工作数据、文件系统缓存。二级存储(如磁盘)速度比主存低几个数量级。主存满时会与存储设备交换数据,此过程缓慢,可能影响性能甚至终止内存占用多的进程。影响系统性能因素还包括内存分配释放、复制、内存地址空间映射的 CPU 开销,多路处理器架构下内存本地性也有影响。本章分五部分:背景(内存术语和性能概念)、架构(软硬件架构)、方法(性能分析方法)、分析(分析工具)、调优(性能调优及可调参数范例)。
2025-06-12 09:45:52
470
原创 《性能之巅》第六章 CPU
本节介绍基于Linux和Solaris系统的CPU性能分析工具,相关工具及对应功能如下表:LinuxSolaris描述uptimeuptime平均负载vmstatvmstat包括系统范围的CPU平均负载mpstatmpstat单个CPU统计信息sarsar历史统计信息psps进程状态topprstat监控每个进程/线程CPU用量pidstatprstat每个进程/线程CPU用量分解timeptime给一个命令计时,带CPU用量分解DTrace。
2025-06-12 09:44:18
606
原创 《性能之巅》第三章 操作系统
UNIX及其衍生系统是分时系统,通过划分执行时间实现多进程同时运行。调度器是操作系统内核关键组件,负责进程在处理器和CPU间的调度,在Linux中操作对象是任务(task,即线程 ),并将其映射到CPU上。
2025-06-12 09:42:59
590
原创 《性能之巅》绪论&方法
动态跟踪技术可对所有软件进行监控,适用于真实生产环境。它利用内存中的CPU指令构建监测数据,能获取定制化性能统计数据,相比系统自带统计,大幅提升观测性,让原本因难以观测而无法处理或难处理的问题得到解决或简化。与传统观测方法对比传统观测方法(如利用系统自带统计分析操作系统内核 )如同拿着蜡烛在黑屋照亮特定地方,而动态跟踪像手电筒,可按需照亮。动态跟踪工具Dtrace诞生与移植。
2025-06-12 09:42:01
427
原创 muduo源码阅读:linux timefd定时器
零轮询编程模型是一种高效处理I/O操作的方法,旨在避免传统轮询(polling)带来的CPU资源浪费。传统的轮询会周期性地检查I/O设备是否准备好进行数据传输,可能导致大量的CPU时间被消耗在无意义的检查上。相比之下,零轮询编程模型利用了操作系统提供的机制(select/poll/epoll等),允许程序在等待I/O事件时进入阻塞状态,即不占用CPU资源,直到有实际的I/O事件发生才会唤醒程序进行处理。这种模型通过减少或消除不必要的检查循环。
2025-02-25 22:56:11
1043
原创 muduo源码阅读:socket常见操作及一些补充
读方向:从TCP连接中接收数据的操作。进程从TCP连接中读取来自远端的数据。应用程序正在执行读操作,它是在接收对方发送过来的数据。写方向:通过TCP连接发送数据的操作。进程向TCP连接中写入数据以发送给远端的应用程序。执行写操作时,你是在向对方发送数据。
2025-02-23 17:31:22
597
原创 muduo源码阅读:poller的实现
跨线程拷贝是指在一个线程中创建一个对象的副本,并将其传递给另一个线程进行操作。这种方式容易引发数据竞争和其他并发问题(见nocopyable)对象生命周期绑定所属 EventLoop 线程中的对象是什么?对象指的是PollPoller及其相关的 Channel 对象,生命周期是与创建它们的 EventLoop 线程绑定的,这些对象只能在创建它们的那个 EventLoop 线程中被访问和操作。为什么要绑定 EventLoop 线程的生命周期?
2025-02-23 11:43:55
1278
原创 muduo源码阅读:epoll底层原理
两个线程同时操作一个socket。用户程序调用epoll_wait后,内核循环检测就绪队列是否有就绪事件,如果有就绪事件,将就绪事件返回给用户,否则继续往下执行,判断epoll是否超时,超时返回0,如果没有超时则将epoll线程挂起,epoll线程陷入休眠状态,同时插入一个epoll等待队列项。当socket接收到数据后,会通过socket等待队列回调函数去检测epoll等待队列项,并将epoll线程唤醒,epoll线程被唤醒成功后,epoll线程再次查询就绪队列,此时就能成功返回socket事件。
2025-02-23 11:22:26
714
原创 muduo源码阅读:poll底层实现
poll是一种I/O多路复用机制,可以同时监视多个文件描述符,当其中任意一个文件描述符就绪时,就会通知程序进行相应的读写操作(和select一样)。poll机制与select机制类似,但是poll没有最大文件描述符数量的限制,所以在文件描述符数量较大时,poll的效率会更高。如何实现的的呢?poll引入一个结构体叫pollfd结构体,每个。
2025-02-23 11:20:29
826
原创 muduo源码阅读:select底层原理
fd_set;select位图为1024比特位图,通过整型数组模拟而成。select位图每个比特对应一个文件描述符数值。select位图数组长度为16,每个数组元素为8字节,一个字节为8比特,位图大小=16 * 8 * 8 = 1024比特。//设置fd对应位图位置为0。//判断fd对应位图位置是否为1。//设置fd对应位图位置为1。//整个位图清零。select编程select函数是Linux系统中的一种I/O多路复用机制,它可以同时监视多个文件描述符。nfds:最大文件描述符+1。
2025-02-23 11:18:49
767
原创 西工大VLSI复习指南
(2)很多地方不会考的,所以听不懂也没关系(听不懂是正常的,我们都听不懂),只要把重要的几个地方看懂就行了(后面会说哪些地方可能比较重要)。(1)开卷考试能带一张A4纸,所以认真准备只要写满都不至于挂科,而且考的不会很刁钻(会把我整理的资料放后面)(3)原书有700多页,很多地方都没有讲,我删减之后只有300页左右,我会把资料放到我CSDN资源里面。今年考了4个题目,第一题是给了反相器的棒图,说哪个是NMOS和PMOS(PPT原图)。(2)反相器的棒图,横截面会看,知道每个位置对应的是什么。
2025-01-28 00:21:48
290
原创 数据结构:log-structed结构&&MemTable&&SSTable
Log-Structured 结构,有时候也会被称作是 Append-only Sequence of Data,因为所有的写操作都会不停地添加进这个数据结构中,而不会更新原来已有的值,这也是 Log-Structured 结构的一大特性。比如说,Google 的三驾马车之一,Bigtable 文件系统的底层存储数据结构采用的就是Log-Structured结构, MongoDB 和 HBase 这类的 NoSQL 数据库,它们的底层存储数据结构其实也是 Log-Structured 结构。
2025-01-25 17:25:01
918
原创 进程通信(11)System V共享内存区
具体来说,它会更新 shmid_ds 结构中的 shm_perm.uid、shm_perm.gid 和 shm_perm.mode 成员,这些值来自于 buf 指向的结构体。创建或获取共享内存标识符:使用shmget系统调用,根据给定的关键字(key)、大小和标志创建一个新的共享内存段或获取一个已存在的共享内存段的标识符(ID)。将共享内存段附加到进程地址空间:使用shmat系统调用将由shmget返回的共享内存段ID所标识的共享内存段附加到调用进程的地址空间。它只是解除了该进程对共享内存段的访问。
2024-12-30 23:50:21
656
原创 进程通信(10):Posix 共享内存区
POSIX.1提供了两种主要的方法来实现这一目标:1. 内存映射文件描述符获取:通过open函数打开一个文件,并获得其文件描述符。映射过程:使用mmap函数将该文件映射到当前进程的地址空间。适用场景:不仅可以用于父子进程间的共享,还可以用于无亲缘关系的进程之间。只要所有需要访问该共享内存区的进程都能够打开同一个文件,它们就可以共享由该文件映射而来的内存区域。2. 共享内存区对象描述符获取:通过shm_open函数打开或创建一个Posix IPC名字(可能是文件系统中的路径名),并返回一个描述符。
2024-12-30 22:47:43
943
原创 进程通信(9):记录上锁
而本章讨论的是另一种类型的读写锁,它允许有亲缘关系或无亲缘关系的进程之间共享文件的读与写。这种类型的锁是基于文件描述符并通过函数fcntl实现的,其维护是在内核层面完成的,并且是以进程ID来标识锁的所有者。内核不会阻止一个进程写入已被另一个进程读锁定的文件,也不会阻止一个进程读取已被另一个进程写锁定的文件。在这种情况下,所有涉及的进程都遵循约定,尊重其他进程设置的锁。例如,在网络编程中,守护程序通常都是协作的,它们访问共享资源如序列号文件,并且都在系统管理员的控制之下。解锁时,unlink掉锁文件。
2024-12-30 21:21:59
770
原创 进程通信(8)读写锁
读写锁是一种同步原语,用于管理对共享资源或临界区的访问,允许多个线程同时读取数据(共享锁),但当有线程需要写入数据时(独占锁),则要求排他性的访问,即不允许其他任何线程(无论是读还是写)同时访问该数据。这种机制在读操作远多于写操作的应用场景中,能显著提高并发性能。读写锁的工作原理(1)共享锁(读锁):当没有线程持有写锁时,任意数量的线程可以同时持有读锁。持有读锁的线程只能进行读操作,不能修改共享资源。
2024-12-30 20:34:45
1255
原创 C++并发编程实战:第4章 同步并发操作
std::future和std::shared_future通常与std::async、std::promise等一起使用来创建异步任务和管理其结果。如果 std::promise 或 std::packaged_task 在没有调用 set_value() 或 set_exception() 的情况下被销毁,那么与之关联的 std::future 会接收到一个 std::future_error 异常,错误码为std::future_errc::broken_promise。最优的选择是利用条件变量。
2024-12-27 17:46:12
1103
原创 C++并发编程实战 第三章 线程间共享数据
add_to_list() 和 list_contains() 函数使用 std::lock_guard 来确保对 some_list 的访问是互斥的,即一个线程在修改列表时,其他线程不能读取或修改该列表。除了上述特性外,std::unique_lock 还支持锁所有权的转移,这意味着你可以将一个 std::unique_lock 持有的锁转移给另一个 std::unique_lock 实例。因为两个线程可能尝试在相同的一对实例之间交换数据,但选择了相反的锁定顺序,从而导致死锁。
2024-12-26 10:16:25
623
原创 C++并发编程实战(二):线程管理
一旦线程完成并且join()返回后,std::thread对象将不再关联任何线程,因此不能再次调用join()。如果std::thread对象在其析构之前没有被join()或detach(),那么析构函数会调用std::terminate()终止程序。因此,必须确保在线程对象销毁之前,要么join()要么detach()。如果std::thread对象没有关联任何执行线程(例如,它已经被join()或detach()),则get_id()将返回默认构造的std::thread::id值,表示“没有线程”。
2024-12-25 11:47:21
905
原创 Modern Effective C++ 条款四十二:考虑使用置入代替插入
考虑一个例子,如果尝试将 nullptr 添加到 std::vector<std::regex> 中,emplace_back 会成功编译,而 push_back 则不会,因为 std::regex 的构造函数是 explicit 的,不允许从 nullptr 进行隐式转换。这种场景不容易描述,因为依赖于传递的实参的类型、使用的容器、置入或插入到容器中的位置、容器中类型的构造函数的异常安全性,和对于禁止重复值的容器(即。时,没有理由期望置入比插入运行的更快,因为不需要创建临时对象来满足插入的接口。
2024-12-10 20:18:09
796
原创 Modern Effective C++ 条款四十一:对于移动成本低且总是被拷贝的可拷贝形参,考虑按值传递
对于特殊的场景,可拷贝且移动开销小的类型,传递给总是会拷贝他们的一个函数,并且切片也不需要考虑,这时,按值传递就提供了一种简单的实现方式,效率接近传递引用的函数,但是避免了传引用方案的缺点。然而,由于移动操作通常比拷贝更轻量级,特别是对于大型对象或者资源管理类(如std::string),这种额外的开销通常是可接受的。(3)高效利用现代C++特性:得益于C++11的移动语义,当传入的是右值时,newName会通过移动构造而不是复制构造初始化,从而提高了性能。为了提高效率,应该拷贝左值,移动右值。
2024-12-10 19:42:22
972
原创 Modern Effective C++ 条款四十:对于并发使用std::atomic,对于特殊内存使用volatile
但是在编译器拿到看起来合理的代码,执行了模板实例化,内联和一系列重排序优化之后,结果会出现冗余访问和无用存储,所以编译器需要摆脱这样的情况并不少见。由于auto推导出的y是一个普通的int类型,它不受volatile的影响,因此对y的操作可以被优化。对象被构建,在其上的操作表现得像操作是在互斥锁保护的关键区内,但是通常这些操作是使用特定的机器指令实现,这比锁的实现更高效。对象,这也是默认的和唯一的一致性模型。那些不那么相同,但是如果我们暂时忽略它,只关注编译器执行的操作,则概念上可以说,编译器看到这个,
2024-12-10 10:48:47
840
原创 Modern Effective C++ 条款三十九:对于一次性事件通信考虑使用void的futures
虽然 std::promise 和 std::future 提供了一种简洁且有效的线程间通信方式,并解决了条件变量和标志位设计中的某些问题,但它们也有自己的局限性和适用范围。即使检测任务和反应任务之间没有共享数据的竞争,我们仍然需要互斥锁来防止所谓的“竞态条件”,即检测任务可能在反应任务检查条件之前改变了条件,但又在反应任务开始等待之前再次改变条件。这种情况下,反应任务可能会错过通知。使用共享的布尔型 flag 进行线程间通信的方法确实避免了条件变量设计中的一些复杂性,如互斥锁的需要和虚假唤醒的问题。
2024-12-09 21:53:22
830
eclipse连接hadoop
2022-05-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人