
Linux
文章平均质量分 83
Fun gun
github:https://github.com/fufufu11
展开
-
Linux 读写锁
读写锁是互斥锁的升级版,如果加了读锁,多个线程作读操作,那么读是并发的或者并行的,所以可以提高读操作的时候程序的执行效率。但是在写操作的时候,和互斥锁一样,还是串行的。读写锁在 Linux 中类型为锁定状态:锁定 / 打开锁定的是什么操作:读操作/写操作哪个线程上的锁读写锁的使用方式和互斥锁的使用方式一样:找共享资源,确定临界区,在临界区的开始位置加锁(读锁 / 写锁),临界区结束的位置解锁。原创 2024-09-08 23:01:06 · 965 阅读 · 0 评论 -
【Linux 网络】NAT技术——缓解IPv4地址不足
NAT(Network Address Translation,网络地址转换)技术,是解决IP地址不足的主要手段,并且能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机。原创 2023-08-09 09:20:27 · 2563 阅读 · 0 评论 -
【Linux 网络】 数据链路层协议
从ARP的数据格式也可以看出,ARP是MAC帧协议的上层协议,ARP数据格式中的前3个字段和最后一个字段对应的就是以太网首部,但由于ARP数据包的长度不足46字节,因此ARP数据包在封装成为MAC帧时还需要补上18字节的填充字段。站在系统的角度来看,这里各个主机所共享的通信信道就是一种临界资源,这个临界资源同一时刻只允许一台主机使用。也就是说,网络中的路由器会不断去掉数据旧的局域网报头,并添加上新的局域网报头,因此数据在进行跨网络传输时,就算所需跨越的网络采用的是不同的局域网技术,最终也能够正确实现跨越。原创 2023-08-08 13:32:10 · 1641 阅读 · 1 评论 -
【Linux 网络】网络层协议之IP协议
就拿传输层来说,发送的数据并不是直接从一方的传输层直接发送到了另一方的传输层,而是需要传输层将数据继续向下进行交付,在网络层和链路层经过数据封装后再通过网络发送到对方主机,对方主机收到数据后再从数据链路层到网络层进行数据解包,此时对方的传输层才拿到了发送过来的数据,然后再继续将该数据向上进行交付。因此一个数据在路由的时候,随着数据不断路由进入更小的子网,其网络号的位数是在不断变化的,准确来说其网络号的位数是在不断增加的,这也就意味着IP地址当中的主机号的位数在不断减少。例如,下图中路由器连接了两个网段。原创 2023-08-07 12:19:47 · 1338 阅读 · 0 评论 -
【Linux 网络】 传输层协议之TCP协议 && TCP的三次握手和四次挥手
我们经常说UDP协议是一种不可靠的传输协议,而TCP协议是可靠的传输协议。所谓的不可靠指的是,由于传输距离的问题,双方在传输数据时,数据包可能出现丢包、乱序、重复、校验失败、发送太快/太慢,网络出现异常造成的一系列情况等问题。这也是UDP协议在拥有简单、快速这些特点的同时,对应的不足的地方。而TCP协议就是为了解决传输不可靠的问题,因此TCP一定会比UDP复杂。TCP虽然复杂,但是效率不一定比UDP低,TCP当中不仅有保证可靠性的机制,还有保证传输性能的各种机制。原创 2023-08-04 15:24:27 · 2638 阅读 · 2 评论 -
【Linux 网络】 传输层协议之UDP协议
在接收方,如果有一个DNS服务器应用程序在监听UDP端口,它会接收该数据包,并根据DNS协议的规范进行解析和处理有效载荷中的DNS查询请求,UDP本身不参与其中。如果UDP没有接收缓冲区,那么就要求上层及时将UDP获取到的报文读取上去,如果一个报文在UDP没有被读取,那么此时UDP从底层获取上来的报文数据就会被迫丢弃。需要注意的是,UDP协议报头当中的UDP最大长度是16位的,因此一个UDP报文的最大长度是64K(包含UDP报头的大小)。UDP是一种无连接的传输协议,不对数据包的内容进行解析和处理。原创 2023-08-01 11:33:07 · 1426 阅读 · 2 评论 -
【Linux 网络】 HTTPS协议原理 && 对称加密 && 非对称加密 && 数字证书
加密就是处理把明文(要传输的信息) 变成密文。解密就是把密文再经过一系列的变化,变成明文。在加密和解密的过程中,通常需要用到一个或多个中间的数据,辅助进行这个过程,这样的数据称为密钥。数据摘要(数字指纹),其基本原理就是用单向散列函数(Hash函数),对信息进行运算,生成一串固定长度的数据摘要。这并不是一种加密加密,而是用来判断有没有被篡改摘要常见算法:有MD5、SHA1、SHA256、SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出的摘要相同,但是概率非常低)原创 2023-07-31 14:02:35 · 1394 阅读 · 4 评论 -
【Linux网络】 网络套接字(三)socket编程_TCP网络程序
TCP创建套接字并绑定的过程和UDP创建套接字并绑定的过程一样,这里对一些参数进行说明。TCP服务器在调用socket函数创建套接字时,参数设置如下:UDP服务器的初始化只需要上述的创建套接字并绑定,因为UDP是面向数据报服务的,负责把消息传递即可。而TCP服务器是面向连接的,客户端在正式向TCP服务器发送数据之前需要进行连接,才能进行通信。因此TCP服务端需要时刻监听客户端是否发来连接请求,那么我们上面创建的套接字需要用来监听。设置套接字为监听状态的函数叫做listen,该函数的函数原型如下:参数说明原创 2023-07-24 11:55:31 · 606 阅读 · 2 评论 -
【Linux网络】 网络套接字(二)socket编程_UDP网络程序
当我们调用socket函数创建套接字时,实际相当于我们打开了一个“网络文件”,打开后在内核层面上就形成了一个对应的struct file结构体,同时该结构体被连入到了该进程对应的文件双链表,并将该结构体的首地址填入到了fd_array数组当中下标为3的位置,此时fd_array数组中下标为3的指针就指向了这个打开的“网络文件”,最后3号文件描述符作为socket函数的返回值返回给了用户。对于一般的普通文件来说,当用户通过文件描述符将数据写到文件缓冲区,然后再把数据刷到磁盘上就完成了数据的写入操作。原创 2023-07-23 13:12:38 · 581 阅读 · 0 评论 -
【Linux网络】网络编程套接字(一)基础部分
首先,可靠是需要我们做更多的工作的,TCP协议虽然是一种可靠的传输协议,但这一定意味着TCP协议在底层需要做更多的工作,因此TCP协议底层的实现是比较复杂的,我们不能只看到TCP协议面向连接可靠这一个特点,我们也要能看到TCP协议对应的缺点。同样的,UDP协议虽然是一种不可靠的传输协议,但这一定意味着UDP协议在底层不需要做过多的工作,因此UDP协议底层的实现一定比TCP协议要简单,UDP协议虽然不可靠,但是它能够快速的将数据发送给对方,虽然在数据在传输的过程中可能会出错。原创 2023-07-22 16:18:07 · 359 阅读 · 0 评论 -
【Linux系统 学习笔记】利用POSIX信号量完成基于环形队列的生产消费模型
在这篇文章中,我们利用了互斥锁和条件变量机制来完成了基于阻塞队列的生产消费模型。本篇文章是利用POSIX信号量来完成基于环形队列的生产消费模型。原创 2023-07-20 14:57:00 · 409 阅读 · 4 评论 -
【Linux系统】结合有趣的小故事让你学懂生产者消费者模型
三种关系:生产者和生产者之间的关系(互斥),生产者和消费者之间的关系(互斥与同步),消费者和消费者之间关系(互斥)两种角色:生产者和消费者一个交易场所:通常是缓冲区。原创 2023-07-19 16:57:58 · 1652 阅读 · 9 评论 -
【Linux系统 学习笔记】Linux线程互斥 && 线程同步&& 线程安全 && 可重入 && 不可重入 && 死锁
假设此时thread-1读取到g_val的值是1,-1操作后,当thread-1被切走时,寄存器中的数据就叫做thread-1的上下文信息,thread-1需要将它保存起来,之后就挂起了,等待下一次调度。假设此时CPU调度了thread-2,thread-2 判断此时g_val还是 1 ,所以进入if语句代码块里面,当还没开始进行 - - 操作时,如果因为时间片比较短,此时又切换到了thread-1,此时thread-1恢复上下文信息到CPU寄存器,会接着执行上一次还没完成的指令,于是就把0写回到了内存。原创 2023-07-18 16:41:10 · 829 阅读 · 3 评论 -
【Linux网络】网络基础
最初,ARPAnet主要是用于军事研究目的,它主要是基于这样的指导思想:网络必须经受得住故障的考验而维持正常的工作,一旦发生战争,当网络的某一部分因遭受攻击而失去工作能力时,网络的其他部分应能维持正常的通信工作。数据链路层(网卡层): 负责设备之间的数据帧的传送和识别. 例如网卡设备的驱动、帧同步(就是说从网线上检测到什么信号算作新帧的开始)、冲突检测(如果检测到冲突就自动重发)、数据差错校验等工作. 有以太 网、令牌环网, 无线LAN等标准,网卡层的标准可以不一样。最终会在应用层收到最终的数据。原创 2023-07-10 22:37:04 · 647 阅读 · 1 评论 -
【Linux系统】Linux进程信号详解
在计算机科学中,信号是Unix、类Unix以及其他POSIX兼容的操作系统中进程间通讯的一种有限制的方式。它是一种异步的通知机制,用来提醒进程一个事件已经发生。当一个信号发送给一个进程,操作系统中断了进程正常的控制流程,此时,任何非原子操作都将被中断。如果进程定义了信号的处理函数,那么它将被执行,否则就执行默认的处理函数。在Linux中使用 kill -l 命令来查看信号类型在上图中,1-31的信号为分时信号,34-64为实时信号。本篇文章过多不讨论实时信号。原创 2023-05-17 22:46:39 · 1242 阅读 · 0 评论 -
【Linux系统】理解Linux中进程间通信
Linux进程间通信原创 2023-04-13 21:36:13 · 2790 阅读 · 7 评论 -
【Linux】理解Linux中硬链接和软链接
Linux中硬链接和软链接的区别原创 2023-04-03 09:38:09 · 691 阅读 · 4 评论 -
【Linux系统】Linux EXT2文件系统
Linux EXT2文件系统原创 2023-04-02 22:53:04 · 682 阅读 · 2 评论 -
【Linux】文件描述符的分配规则和重定向的原理以及dup2函数
重定向的原理原创 2023-03-29 20:37:23 · 525 阅读 · 0 评论 -
【Linux】文件描述符fd
linux文件描述符fd原创 2023-03-28 22:29:50 · 395 阅读 · 0 评论 -
【Linux系统】简单理解进程地址空间(物理空间和虚拟空间)以及写时拷贝
简单理解进程地址空间和写时拷贝原创 2023-02-28 16:19:17 · 250 阅读 · 5 评论 -
【Linux系统】认识操作系统和操作系统如何进行管理以及进程相关状态
认识操作系统和操作系统如何进行管理以及进程相关状态原创 2023-02-22 12:26:12 · 799 阅读 · 9 评论 -
【Linux】Linux调试器——gdb的使用以及一些指令
Linux下gdb调试器的使用原创 2023-01-10 21:17:52 · 435 阅读 · 1 评论 -
【Linux】编写一个简单进度条小程序
进度条小程序原创 2023-01-10 15:31:14 · 323 阅读 · 2 评论 -
【Linux】项目构建自动化工具——make和makefile
项目构建自动化工具make和makefile的使用原创 2023-01-10 11:35:41 · 852 阅读 · 1 评论 -
【Linux】简单理解静态库(.a)和动态库(.so)
Linux 静态库 动态库原创 2023-01-07 17:16:14 · 2155 阅读 · 0 评论 -
【Linux】Linux编译器-gcc/g++的使用和程序执行的基础底层原理
Linux gcc的使用 程序执行的基础底层原理原创 2023-01-07 14:08:13 · 1157 阅读 · 9 评论 -
【Linux】sudo给某条指令提权
sudo给指令提权和把普通用户加入到root的信任列表原创 2023-01-06 22:28:16 · 990 阅读 · 1 评论 -
【Linux】Linux编辑器-vim的使用以及指令集
vim原创 2023-01-03 21:17:19 · 543 阅读 · 11 评论 -
【Linux】vim自动配置
vim自动配置转载 2023-01-03 19:24:57 · 362 阅读 · 0 评论 -
【Linux】Linux权限(三)粘滞位
Linux粘滞位原创 2022-12-31 22:58:44 · 798 阅读 · 1 评论 -
【Linux】Linux权限(二)默认权限的来源
默认权限原创 2022-12-29 17:09:14 · 954 阅读 · 0 评论 -
【Linux】Linux权限(一)文件权限和目录权限
Linux初始文件权限原创 2022-12-29 12:51:21 · 2379 阅读 · 0 评论 -
【Linux】shell命令以及运行原理
shell运行原理原创 2022-12-18 22:34:38 · 925 阅读 · 22 评论 -
【Linux】Linux基本指令和工具
Linux一些基本的指令转载 2022-12-17 18:19:32 · 647 阅读 · 1 评论