- 博客(210)
- 问答 (1)
- 收藏
- 关注

原创 TCP笔记详解
文章目录一:为什么要传输层二:寻址三:运输层的两个协议1.UDP协议(1).UDP协议的特点(2) UDP的首部格式(8字节)2.TCP协议(1)TCP的特点(2)套接字(3)TCP报文段的首部格式(4)TCP的建立连接(5)TCP连接的释放(6)TCP的可靠传输(7)TCP的流量控制(8) TCP的拥塞控制一:为什么要传输层既然IP协议能够把源主机发送出的分组按照首部中的目的地址交送到目的主...
2020-03-14 22:38:39
679
原创 六:操作系统虚拟内存之页替换算法
页替换是虚拟内存管理中的一个关键环节,它发生在物理内存不足以容纳新页面时。页替换算法的目标是选择一个“最佳”的页面从物理内存中移除,以最小化未来的缺页次数。OPT是理论最优但不可实现的算法。FIFO简单但性能较差,不考虑页面使用模式。LRU基于局部性原理,性能通常较好,但精确实现开销大。时钟算法(第二次机会算法)是 LRU 的一种有效近似,利用引用位在性能和实现复杂度之间取得了平衡,是许多实际操作系统采用的方法。LFU基于使用频率,但实现复杂且难以适应程序行为变化。
2025-05-21 12:58:05
315
原创 六:操作系统虚拟内存之缺页中断
缺页中断是一种特殊的中断 (Interrupt)或更准确地说,是陷阱 (Trap)或异常 (Exception)。它发生在当程序试图访问一个虚拟地址时,内存管理单元 (MMU) 在该进程的页表中查找对应的页表条目 (Page Table Entry, PTE),发现该页面的存在位 (Present Bit)为 0。存在位为 0 表示该虚拟页面当前不在物理内存中。此时,MMU 无法完成虚拟地址到物理地址的翻译,硬件会立即停止当前指令的执行,并产生一个内部中断信号,将控制权交给操作系统内核中预设的。
2025-05-21 12:56:09
691
原创 六:操作系统虚拟内存之虚拟内存概念
虚拟内存是操作系统提供的一种抽象(Abstraction)。它给每个进程提供了一个独立、连续且巨大的地址空间,称为虚拟地址空间。这个空间的大小通常远大于实际的物理内存。程序中使用的地址。程序看到的内存范围是从 0 到某个非常大的值(例如,在 64 位系统上可达 2^64)。实际硬件内存(RAM)的地址。将程序的虚拟地址空间映射(Mapping)到物理内存空间。这种映射是由操作系统和硬件(主要是内存管理单元,MMU - Memory Management Unit)共同完成的。
2025-05-21 12:53:21
685
原创 五:操作系统内存管理之非连续内存分配
在上一篇文章中,我们讨论了连续内存分配策略(如固定分区和动态分区)及其主要问题:内部碎片和外部碎片。虽然紧凑技术可以缓解外部碎片,但其高昂的成本使得它在现代多任务系统中不甚理想。为了更有效地利用内存并解决这些碎片问题,现代操作系统普遍采用了**非连续内存分配 (Non-Contiguous Memory Allocation)**技术。非连续内存分配允许一个进程的不同部分可以分散地加载到物理内存中的不同非连续区域。这需要操作系统和硬件的紧密协作来管理这些分散的内存块,并在进程执行时进行地址翻译。
2025-05-20 13:15:09
1180
原创 五:操作系统内存管理之连续内存分配
顾名思义,连续内存分配要求一个进程的所有部分(代码、数据、栈、堆等)必须加载到内存中一个连续的地址空间里。操作系统需要找到一块足够大的空闲内存区域来容纳整个进程。这种方法的优点是概念简单,易于实现。进程的各个部分之间通过相对地址就可以直接访问,不需要复杂的地址翻译机制(至少在加载时或运行时,只需要一个基地址即可)。然而,连续内存分配的最大挑战在于如何有效地管理和分配可用的连续内存块,尤其是在多个进程动态创建和终止的环境中。
2025-05-20 13:09:21
570
原创 五:操作系统内存管理之基本概念
内存是计算机系统中一种宝贵且有限的资源。操作系统的核心职责之一就是有效地管理内存,确保多个程序能够安全、高效地共享主存。理解操作系统如何管理内存需要掌握几个基本概念:地址绑定、逻辑地址与物理地址的区别以及内存保护。本文将详细探讨这些概念。
2025-05-20 13:05:25
505
原创 四:操作系统CPU调度之实时调度
实时调度算法的设计和分析方法对于硬实时和软实时系统是不同的。在实际的实时操作系统中,往往会根据具体的应用需求,结合使用或扩展这些基本算法,例如处理优先级反转、抖动(jitter)、非周期性事件等,以构建鲁棒可靠的实时调度系统。与 RMS 不同,EDF 任务的优先级不是固定的,而是在运行时根据其当前的**绝对截止期(absolute deadline)**动态决定的。这是一种抢占式算法:如果一个新到达的任务实例或一个被唤醒的任务实例的绝对截止期比当前正在执行的任务的绝对截止期更早,它就会抢占当前任务。
2025-05-19 13:06:25
613
原创 四:操作系统cpu调度之调度算法
我们探讨了操作系统中的几种主要调度算法。简单公平,但可能导致长等待时间。理论上最优的平均等待时间,但难以实现且可能导致饥饿。SRTF通过抢占改善了响应时间。可以优先处理重要任务,但需要老化机制防止饥饿。为分时系统设计,公平且响应时间好,但上下文切换开销大。根据进程类型应用不同策略,实现简单但不够灵活且可能饥饿低优先级队列。最灵活复杂的算法,能动态调整优先级,近似 SJF 并避免饥饿,是现代操作系统的常见选择。
2025-05-19 12:57:57
1313
原创 四:操作系统系统调度之调度概念与目标
操作系统调度是现代多任务系统的基石。通过长程、中程和短程三个不同层次的调度,操作系统有效地管理着系统的多道程序度、内存资源以及CPU的分配。理解调度发生的时机(进程状态变化)对于理解调度机制的运作至关重要。而衡量调度算法性能的CPU利用率、吞吐量、周转时间、等待时间和响应时间等指标,则帮助我们评估不同调度策略的优劣,以及它们如何平衡系统的效率、公平性和响应性等目标。
2025-05-19 12:49:25
707
原创 三:操作系统线程管理之用户级线程与内核级线程
特性用户级线程 (ULT)内核级线程 (KLT)管理者用户空间的线程库操作系统内核内核感知无感知完全感知创建/销毁快速慢切换速度快慢阻塞调用阻塞整个进程只阻塞当前线程多核利用无法利用可以利用调度库定制,内核无感知(同进程内非抢占)内核调度,系统范围内公平实现复杂度库实现较易(对应用开发者),内核无需改动涉及修改内核用户级线程和内核级线程是实现多线程的两种基本方式,它们各自的优缺点直接影响了在其上构建的线程模型的特性。
2025-05-18 21:43:38
590
原创 三:操作系统线程管理之线程概念
想象一下,你正在电脑上运行一个程序,比如一个文字处理器。这个文字处理器本身就是一个进程(Process)。进程是操作系统进行资源分配和调度的基本单位,它拥有独立的内存空间、文件句柄、设备等资源。可以把进程看作是一个独立的“工厂”,它有自己的厂房、设备、原材料仓库,与其他工厂完全隔离开来。那么,**线程(Thread)**是什么呢?简单来说,线程是进程内的执行单元,是CPU调度的基本单位。一个进程可以包含一个或多个线程。如果把进程比作一个工厂,那么线程就是在这个工厂里工作的工人。
2025-05-18 21:39:04
607
原创 二:操作系统之进程通信(IPC)
IPC 方式Python 实现示例通信方式数据传输速度复杂性(对程序员)适用场景亲缘关系要求共享内存直接内存读写最快高(需同步)大量数据传输、高性能无特定要求消息传递队列/通道慢于共享内存中等结构化消息交换、解耦通信无特定要求无名管道单向字节流中等较低父子/兄弟进程简单通信有亲缘关系命名管道os.mkfifoopen()单向字节流 (FIFO)中等较低无亲缘进程简单通信无特定要求信号signal模块事件通知很快较低(有限制)异步事件通知、异常、控制。
2025-05-18 21:33:18
550
原创 二:操作系统之进程的创建与终止
进程的创建与终止是操作系统最基础也是最重要的功能之一。新进程通过系统调用(如类 Unix 的fork()和exec()组合)由现有进程创建,形成了父子关系。进程的终止可以是正常完成任务,也可以是异常中断或被外部强制停止,最终都会通过系统调用(如exit())向操作系统报告。父进程需要通过wait()系统调用来回收子进程的资源并获取其退出状态,避免僵尸进程的产生。
2025-05-18 21:19:22
1040
原创 二:操作系统之进程控制块(PCB)
简单来说,PCB 是操作系统用来管理和跟踪进程的核心数据结构。操作系统为系统中的每个进程都维护了一个 PCB。你可以把 PCB 看作是进程的**“身份证”和“状态记录卡”**。它包含了操作系统需要了解的关于一个特定进程的所有信息,从它的唯一标识符到它当前的执行状态、占用的资源、优先级等等。PCB 是进程存在的唯一实体。也就是说,只要一个进程存在,操作系统就必然为其维护一个 PCB;当一个进程终止时,其 PCB 也会被回收。
2025-05-18 21:14:21
708
原创 二:操作系统之进程概念
进程是程序的一次执行实例。程序是静态的,它是一组存储在磁盘上的指令集合。就像菜谱一样,只是一份蓝图或说明书。进程是动态的,它代表了程序正在运行的过程。就像按照菜谱“做菜”一样,是一个正在进行中的活动。同一个程序可以同时运行多次,每次运行都是一个独立的进程。比如,你可以同时打开多个浏览器窗口,每个窗口通常对应一个或多个独立的进程。所以,当你双击一个应用程序图标时,操作系统就会为你创建一个进程,并将该程序的指令和数据加载到内存中,然后让 CPU 开始执行这些指令。正在执行的程序的机器指令。
2025-05-18 21:09:33
947
原创 一:操作系统之系统调用
在计算机的世界里,应用程序是我们日常接触最多的部分,比如浏览器、文本编辑器、游戏等等。然而,这些应用程序并不能直接控制硬件资源,比如读写硬盘、创建新进程、发送网络数据包。它们需要一个“管家”来代劳,这个管家就是。那么,用户程序是如何向操作系统这个“管家”提出服务请求的呢?答案就是通过。
2025-05-18 21:06:36
1094
原创 一:操作系统之操作系统结构
操作系统结构的选择是设计者在性能、可靠性、可维护性、可扩展性等多个目标之间进行权衡的结果。单体结构追求极致性能,但牺牲了可维护性和可靠性。分层结构追求清晰的结构和易于验证,但在性能和实现上存在挑战。微内核结构追求高可靠性和灵活性,但引入了性能开销。模块化结构在单体基础上提升了灵活性和可扩展性,是现代单体内核的主流改进方向。混合内核则是在实际应用中常见的折衷方案,试图结合不同结构的优点。
2025-05-18 21:01:28
580
原创 一:操作系统概述之操作系统发展历史和分类
这六种操作系统类型代表了操作系统在不同历史时期和不同应用场景下的设计重点。批处理追求效率和吞吐量。分时追求交互性和多用户共享。实时追求时间约束和可靠性。分布式追求资源整合和透明化。网络追求资源共享和网络服务。移动追求用户体验、低功耗和移动特性。
2025-05-15 11:22:47
834
原创 操作系统知识点概览
一、 操作系统概述 (Introduction to Operating Systems)二、 进程管理 (Process Management)三、 线程管理 (Thread Management)四、 CPU 调度 (CPU Scheduling)五、 内存管理 (Memory Management)六、 虚拟内存 (Virtual Memory)七、 文件系统 (File Systems)八、 设备管理 (Device Management)九、 并发与同步 (Concurrency and Sync
2025-05-15 11:04:39
798
原创 五:操作系统内存虚拟化之页表
从直接访问物理内存的混乱到虚拟内存的有序世界,操作系统的内存管理经历了巨大的飞跃。虚拟内存为每个进程提供了隔离、巨大的虚拟地址空间,解决了安全、碎片和地址空间限制问题。页表是实现虚拟地址到物理地址映射的核心数据结构,它记录了虚拟页与物理帧的对应关系,并包含了权限、状态等重要信息。多级页表通过分级索引的方式,有效地解决了单级页表占用内存过大的问题,使得巨大的虚拟地址空间变得可行。快表 (TLB)作为硬件缓存,极大地加速了地址翻译过程,弥补了多级页表带来的性能开销,使得虚拟内存系统在实际应用中高效运转。
2025-05-15 09:00:00
928
原创 python进程池引发OOM排查
最近用进程池做了一个数据分析和预测的项目,里边大量用到了pandas和statsmodels,此外还有matplotlib画图。但是出现了一个问题,我进程池开3个进程,刚开始跑了半天没问题,内存到了6/16G,第二天登陆一看,结果OOM了。由于不知道哪里出现了问题,我猜测要么是在list里边引用了很多对象,导致没法释放,要么就是循环引用了,要么就是资源没有释放。可以看到是每次没有关掉figure对象,所以只需要每次画图完毕之后plt.close(fig)就行。打印进程里边每一个对象的大小情况。
2024-07-16 10:47:17
416
1
原创 cx_oracle连接oracle的us7ascii数据集乱码问题
这是在cx_oracle5或者之前的版本可以支持,现在都升到9了,甚至官网都不建议使用cx_oracle了,建议使用他们最新的驱动,不需要本地下载客户端。oracle数据库使用到的字符集是us7ascii,总的来说就是ascii数据集,7位表示一个字符,对于英文还没有问题,但是遇到中文就G了。这种方法对于数据库字符集本来就是utf8或者gbk的数据好使,但是对于数据库字符集是us7ascii的真的没用。对于很多老旧的项目的数据库,没怎么维护,也没怎么用,索性数据库字符集就是默认的us7ascii,坑人。
2024-01-31 15:46:31
964
原创 配置远程服务器环境等踩得坑
4.注册kernel python -m ipykernel install --user --name env_name --display-name “name(jupyter显示名称)”1.看看有哪些 kernel jupyter kernelspec list。2.如果以前命令找不到,那么先安装 pip install ipykernel。3.安装好之后,激活某个环境 conda activate env_name。5.重新打开jupyter就可以切换kernel。......
2022-08-25 12:24:19
585
原创 有效的回文,最多删除一个字符得到回文,回文链表
题目一:有效的回文解法一:class Solution { public boolean isPalindrome(String s) { int n = s.length(); int left = 0, right = n - 1; while (left < right) { while (left < right && !Character.isLetterOrDigit(s.charA
2022-05-31 15:25:39
132
原创 (不定长滑动窗口)含有所有字符的最短字符串
题目:代码:public String minWindow(String s, String t) { // 两个map, 一个存放target的字符和数量, 另一个存放s字符出现在t中的字符和数量 HashMap<Character, Integer> need = new HashMap<>(); HashMap<Character, Integer> windows = new HashMap<>(
2022-05-26 12:48:40
147
原创 (定长滑动窗口)字符串中的所有变位词
题目:代码:public List<Integer> checkInclusion(String s1, String s2) { // need存放s1的字符和个数, window当作滑动窗口字符的计数 HashMap<Character, Integer> need = new HashMap<>(); HashMap<Character, Integer> windows = new HashMap&
2022-05-26 10:48:35
99
原创 (双指针)排序数组中两个数字之和
题目:解法:/** * 基本思路:双指针 * @param numbers * @param target * @return */ public int[] twoSum(int[] numbers, int target) { // 初始化左右指针 int left = 0, right = numbers.length-1; while (left < right){
2022-05-20 16:57:23
130
原创 (双指针)数组中和为 0 的三个数
题目:题解:/** * 解析:有一道题叫做 在排序数组中找两数等于目标数 的题目,用的就是双指针法。 * 这道题是三数之和等于0,稍加改变就是两数等于第三个数字的负数。但是,要防止找重复的三个数字。所以,需要加防重设计。 * @param nums * @return */ public List<List<Integer>> threeSum(int[] nums) { Arrays.sort
2022-05-20 16:46:25
138
原创 (位运算+动态规划)前 n 个数字二进制中 1 的个数
一:题目:二:解答题解:对于所有的数字,只有奇数和偶数两种:奇数:二进制表示中,奇数一定比前面那个偶数多一个 1,因为多的就是最低位的 1。偶数:二进制表示中,偶数中 1 的个数一定和除以 2 之后的那个数一样多。因为最低位是 0,除以 2 就是右移一位,也就是把那个 0 抹掉而已,所以 1 的个数是不变的。所以我们可以得到如下的状态转移方程:dp[i] = dp[i-1],当i为奇数dp[i] = dp[i/2],当i为偶数上面的方程还可进一步合并为:dp[i] = dp[i/2
2022-05-16 15:40:55
239
原创 (位运算)二进制加法
一:题目:二:解答题解:记得之前写过一道题,跟这个很类似,不用加减乘除做加法,所以我们只要把这个二进制字符串转换为Interger整数,然后套用这个方法。代码:public String test2(String a, String b){ int a1 = Integer.parseInt(a, 2); int b1 = Integer.parseInt(b, 2); while (b1 != 0){ int c = (a
2022-05-16 15:01:02
886
原创 剑指 Offer 64. 求1+2+…+n
题目:解法:代码:class Solution { public int sumNums(int n) { boolean x = n > 1 && (n += sumNums(n - 1)) > 0; return n; }}Java 中,为构成语句,需加一个辅助布尔量 xx ,否则会报错;Java 中,开启递归函数需改写为 sumNums(n - 1) > 0 ,此整体作为一个布尔量输出,否则会报错;
2022-05-13 09:58:04
899
原创 剑指 Offer 65. 不用加减乘除做加法(位运算)
题目:题解:虽然s = a + b = n + c,但是n + c还是用了’+',因此我们对n + c再次采用这种运算 (也就是把n当成a,c当成b,继续做a+b运算。看似无限循环,但是进位c总会有等于0的时候,此时结果就等于n)代码:class Solution { public int add(int a, int b) { while(b != 0) { // 当进位为 0 时跳出 int c = (a & b) << 1
2022-05-13 09:50:12
218
原创 剑指 Offer 62. 圆圈中最后剩下的数字(动态规划)
题目:题解:通过数学推导,得到该题的状态转移方程式,这个方程式说真的,挺难推导的,一般人想不到。解法一:(动态规划)class Solution { public int lastRemaining(int n, int m) { int x = 0; for (int i = 2; i <= n; i++) { x = (x + m) % i; } return x; }}..
2022-05-13 09:25:52
127
原创 状态模式(代码+类图详解)
1.例子电梯有不同的状态,比如运行,停止,开门,关门四种状态,在这四种状态下面可以有不同的行为,例如在运行状态下不能开门,只能停止,其他的行为读者可以根据自己坐电梯的经历联想。假如我们使用if-else来做判断完成逻辑,这势必在在业务做出改动时会改动原来的代码,导致这个功能需要重新测试,甚至当业务代码量很大时,不知道哪些地方会用到这些代码,导致出现bug。以上的if-else的方法我就不示范了,根据逻辑来做就可以。我们这里着重讲的是状态模式。下面上类图:2.代码2.1 state抽象状态类p
2022-05-12 10:22:27
870
空空如也
多线程生产者消费者bug,感觉比较困难,求帮助
2022-04-14
TA创建的收藏夹 TA关注的收藏夹
TA关注的人