- 博客(24)
- 收藏
- 关注
原创 DHCP的认识
是一种运行在 TCP/IP 网络中的网络管理协议,它是基于UDP的,核心作用是,避免手动设置的繁琐和错误,实现网络设备的 “即插即用”。
2025-09-03 15:23:53
809
原创 零拷贝的认识
磁盘可以说是计算机系统最慢的硬件之一,读写速度相差内存 10 倍以上,所以针对优化磁盘的技术非常的多,比如零拷贝、直接 I/O、异步 I/O 等等,这些优化的目的就是为了提高系统的吞吐量,另外操作系统内核中的磁盘高速缓存区,可以有效的减少磁盘的访问次数。还有一点,读取磁盘数据的时候,需要找到数据所在的位置,但是对于机械磁盘来说,就是通过磁头旋转到数据所在的扇区,再开始「顺序」读取数据,但是旋转磁头这个物理动作是非常耗时的,为了降低它的影响,通常,对于磁盘,异步 I/O 只支持直接 I/O。
2025-09-03 10:11:01
951
原创 关于锁的认识
多线程访问共享资源的时候,避免不了资源竞争而导致数据错乱的问题,所以我们通常为了解决这一问题,都会在访问共享资源之前加锁。最常用的就是互斥锁,当然还有很多种不同的锁,比如自旋锁、读写锁、乐观锁等,不同种类的锁自然适用于不同的场景。如果选择了错误的锁,那么在一些高并发的场景下,可能会降低系统的性能,这样用户体验就会非常差了。所以,为了选择合适的锁,我们不仅需要清楚知道加锁的成本开销有多大,还需要分析业务场景中访问的共享资源的方式,再来还要考虑并发访问共享资源时的冲突概率。
2025-07-20 17:46:37
759
原创 死锁的认识与处理
简单来说,死锁问题的产生是由两个或者以上线程并行执行的时候,争夺资源而互相等待造成的。死锁只有同时满足互斥、持有并等待、不可剥夺、环路等待这四个条件的时候才会发生。所以要避免死锁问题,就是要破坏其中一个条件即可,最常用的方法就是使用资源有序分配法来破坏环路等待条件。
2025-07-19 16:22:44
793
原创 多线程的认识
在单核 CPU 系统里,为了实现多个程序同时运行的假象,操作系统通常以时间片调度的方式,让每个进程执行每次执行一个时间片,时间片用完了,就切换下一个进程运行,由于这个时间片的时间很短,于是就造成了「并发」的现象。另外,方案一的问题在于,会出现所有哲学家同时拿左边刀叉的可能性,那我们就避免哲学家可以同时拿左边的刀叉,采用分支结构,根据哲学家的编号的不同,而采取不同的动作。上面的这种实现,是读者优先的策略,因为只要有读者正在读的状态,后来的读者都可以直接进入,如果读者持续不断进入,则写者会处于饥饿状态。
2025-07-18 20:51:29
882
原创 进程间的通信
由于每个进程的用户空间都是独立的,不能相互访问,这时就需要借助内核空间来实现进程间通信,原因很简单,每个进程都是共享一个内核空间。Linux 内核提供了不少进程间通信的方式,其中最简单的方式就是管道,管道分为「匿名管道」和「命名管道」。匿名管道顾名思义,它没有名字标识,匿名管道是特殊文件只存在于内存,没有存在于文件系统中,shell命令中的「」竖线就是匿名管道,通信的数据是无格式的流并且大小受限,,通信的方式是单向的,数据只能在一个方向上流动,如果要双向通信,需要创建两个管道,再来。
2025-07-17 15:51:03
629
原创 进程、线程、调度基础知识
线程是进程当中的一条执行流程。同一个进程内多个线程之间可以共享代码段、数据段、打开的文件等资源,但每个线程各自都有一套独立的寄存器和栈,这样可以确保线程的控制流是相对独立的。
2025-07-16 16:03:44
786
原创 TCP的机制
拥塞窗口 cwnd是发送方维护的一个的状态变量,它会根据网络的拥塞程度动态变化的。我们在前面提到过发送窗口swnd和接收窗口rwnd是约等于的关系,那么由于加入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。拥塞窗口cwnd只要网络中没有出现拥塞,cwnd就会增大;但网络中出现了拥塞,cwnd就减少;
2025-07-15 17:00:13
943
原创 TCP断开连接
当发送没有携带数据的 ACK,它的网络效率也是很低的,因为它也有 40 个字节的 IP 头 和 TCP 头,但却没有携带数据报文。为了解决 ACK 传输效率低问题,所以就衍生出了TCP 延迟确认。当有响应数据要发送时,ACK 会随着响应数据一起立刻发送给对方当没有响应数据要发送时,ACK 将会延迟一段时间,以等待是否有响应数据可以一起发送如果在延迟等待发送 ACK 期间,对方的第二个数据报文又到达了,这时就会立刻发送 ACK。
2025-07-13 17:09:35
1394
原创 TCP的连接
相信大家比较常回答的是:“因为三次握手才能保证双方具有接收和发送的能力。这回答是没问题,但这回答是片面的,并没有说出主要的原因。在前面我们知道了什么是TCP 连接用于保证可靠性和流量控制的某些状态信息,这些信息包括Socet,序列号,窗口大小。所以,重要的是为什么三次握手才可以初始化 Socket、序列号和窗口大小并建立 TCP 连接。三次握手才可以阻止重复历史连接的初始化(主要原因)三次握手才可以同步双方的初始序列号次握手才可以避免资源浪费原因一:阻止重复历史连接的初始化。
2025-07-12 23:41:17
1165
原创 TCP的基本认识
TCP是面向连接可靠的基于字节流的传输层通信协议面向连接:一定是「一对一」才能连接,不能像 UDP 协议可以一个主机同时向多个主机发送消息。可靠的:无论的网络链路中出现了怎样的链路变化,TCP 都可以保证一个报文一定能够到达接收端;字节流:用户消息通过 TCP 协议传输时,消息可能会被操作系统「分组」成多个的 TCP 报文,如果接收方的程序如果不知道「消息的边界」,是无法读出一个有效的用户消息的。
2025-07-09 23:17:17
1002
原创 键入网址到网页显示,期间发生了什么?
所以图中的长长的 URL 实际上是请求服务器里的文件资源,当没有路径名时,就代表访问根目录下事先设置的,也就是或者这些文件,这样就不会发生混乱。
2025-07-05 20:53:00
945
原创 TCP/IP 网络模型简述
对于同一台设备上的进程间通信,有很多种方式,比如有管道、消息队列、共享内存、信号等方式,而对于不同设备上的进程间通信,就需要网络通信,而设备是多样性的,所以要兼容多种多样的设备,就协商出了一套。这个网络协议是分层的,每一层都有各自的作用和职责,接下来就根据TCP/IP 网络模型分别对每一层进行介绍。
2025-07-04 17:05:08
739
原创 虚拟内存的总结
以单片机举个例子,单片机是没有操作系统的,所以每次写完代码,都需要借助工具把程序烧录进去,这样程序才能跑起来。但是单片机的cpu是直接操作内存的物理地址如果一个新的程序要在在 2000 的位置写入一个新的值,那么上一个程序存放在相同位置上的所有内容会被覆盖掉。所以同时运行两个程序是根本行不通的,这两个程序会立刻崩溃。这里面的关键问题是这两个程序都引用了绝对物理地址,而这正是我们最需要避免的。为了解决这一个问题,操作系统把进程所使用的地址隔离开来。操作系统为每个进程分配独立的一套。
2025-06-11 00:16:59
1385
原创 cpu是如何执行程序的
程序就是一条条指令,因此程序的执行过程就是cpu把每一条指令一步一步的执行起来.1、cpu读取程序计数器里的数值,这里面存储的是即将执行的指令的,接着cpu的控制单元操作指定需要访问的内存地址,接着通知内存设备准备好数据,准备好的数据通过将数据传输到里2、(一般是在取值完成后自增,流水线架构)表示指向下一条指令的地址,这个自增的大小由cpu的字长来决定,比如是32位cpu,指令是4字节,需要4个内存地址存放,程序计数器的值就会增加4,同理64位就增加83、
2025-06-10 10:45:30
1127
原创 硬件的结构
计算机的5个基本结构分别是:运算器、控制器、存储器、输入设备、输出设备,这 5 个部分也被称为冯诺依曼模型。运算器,控制器是在中央处理器里面的,存储器就是内存,输入设备就是键盘之类的,输出设备就是显示器之类的,存储单元和输入输出设备作为整体要和中央处理器联系的话,就离不开总线了,总线有控制总线,地址总线,数据总线。接下来我将介绍内存,中央处理器,输入输出设备,总线。
2025-06-09 17:28:26
728
原创 C语言指针(二)
本质:指针数组是一个数组,数组中的每个元素都是指针类型 *数组名[数组大小];// arr 是一个数组,包含 5 个 int 指针注意它和数组指针的区别,数组指针本质上是指针,它的形式是:类型 (*指针变量)[数组大小];就是在指针变量了加了一个括号,提高优先级,防止被编译器误会区分:对于int* arr[5],可以理解arr是一个包含 5 个int*(整数指针)的数组。对于int (*p)[5],可以理解为p是一个指针(括号优先级高),然后指向int[5]的数组类型 *函数名(参数列表)示例。
2025-03-28 21:27:05
1085
原创 C语言time.h里部分函数
在 C 语言中,<time.h>头文件提供了与日期和时间相关的功能。通过这个头文件,可以获取当前时间、处理时间、进行时间计算等操作。
2025-03-28 20:52:40
1022
原创 C语言指针(一)
计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如int 占用4个字节,char 占用1个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。我们将内存中字节的编号称为地址 (Address) 或指针 (Pointer)这里只是对指针的一部个人理解,关于指针剩下一部分会在后续写到,欢迎大家指正。
2025-03-21 19:20:05
1162
原创 你真的了解浮点型吗?
0.1和0.2的二进制表示0.1 ≈ 0.0001100110011001100110011001100110011001100110011...(循环)0.2 ≈ 0.0011001100110011001100110011001100110011001100110...(循环)0.1 + 0.2在计算机中实际存储的值由于0.1和0.2不能被精确表示,它们在计算时的 误差会累积,导致0.1 + 0.2不等于0.3。
2025-03-19 23:29:23
965
原创 C语言的3个输入函数
特性scanfgetchar()fgets()基本功能从标准输入中读取格式化数据。从标准输入中读取一个字符。从标准输入中读取一行字符,直到换行符或文件结束。输入类型支持多种格式,如%d%s%f等。只读取一个字符。读取一行字符,包括空格,直到遇'\0'符或文件结束。空格和换行符的处理会跳过空白字符(包括空格、换行符、制表符等),但不包含在输入值中。会读取并返回字符,包括空白符和换行符。会读取换行符(\n)并包括在输入中。缓冲区的处理留下换行符(\n。
2025-03-18 23:01:42
754
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅