![](https://img-blog.csdnimg.cn/20201014180756724.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Linux
文章平均质量分 96
XHumble
这个作者很懒,什么都没留下…
展开
-
关于线程安全的那些事
什么是线程安全?描述的是多个执行流之间对资源的访问操作的安全问题,线程安全就是线程之间对于资源的访问操作不会造成数据二义性线程不安全的现象编写了一个黄牛的抢票程序,黄牛就相当于线程,票相当于临界资源(临界资源就是多个线程共同访问的资源)#include <stdio.h>#include <unistd.h>#include <pthread.h>#define THREADCOUNT 4int g_titcks = 100;void* f原创 2021-07-29 11:19:53 · 171 阅读 · 0 评论 -
条件变量的接口
本文主要介绍条件变量的接口条件变量就是:pcb等待队列和一些接口条件变量的类型:pthread_cond_t1.初始化1.1 动态初始化int pthread_cond_init(pthread_cond_t *restrict cond, const pthread_condattr_t *restrict attr);cond: 传入条件变量的地址arrt:条件变量的属性,通常传递NULL,采用默认属性1.2 静态初始化pthr...原创 2020-11-18 23:48:44 · 144 阅读 · 0 评论 -
互斥锁的使用
这里简单介绍互斥锁的使用互斥锁变量类型pthread_mutex_t互斥锁初始化动态初始化int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);参数说明:mutex:传入互斥锁的地址attr:属性,一般传递NULL采用默认属性静态初始化pthread_mutex_t mutex = PTHREAD_MUTEX_I...原创 2020-11-18 11:44:29 · 585 阅读 · 0 评论 -
Linux线程的知识点及基本操作
1.线程的概念 在linux内核中是没有线程这个概念的,而是轻量级进程:LWP,我们所说的线程是C库中的概念,轻量级进程它的本质上仍然是一个进程。 在linux中每一个进程都是都是由task_struct结构体是实现的,轻量级进程也是由task_struct实现的,一个进程至少都会有一个主线程,但是它还可以拥有多个工作线程主线程和工作线程,每个线程都由一个task_struct结构体,它们的内存指针指向了同一块虚拟地址空间,因为它们指向同一块虚拟地址所以共享大部分的数据,但是每个线程在共享...原创 2020-11-16 17:40:33 · 174 阅读 · 0 评论 -
为什么说进程是操作系统分配资源的基本单位,线程是CPU调度的基本单位
进程和线程两个容易混淆,首先在Linux内核中是没有线程这个概念的,我们常说的线程其实是轻量级进程的概念:LWP,线程概念其实是C库中的。我们常说进程是操作系统分配资源的基本单位,线程是CPU调度的基本单位,但这是为什么? 在Linux中每一个进程都是由task_struct结构体来实现的,轻量级进程也就是我们所说的线程它也是一个task_struct结构体实现,当一个程序运行时,操作系用会给这个进程分进程虚拟地址空间,而一个进程中可能存在多个线程来完成不同的事情,把线程的task_struct加.原创 2020-11-16 11:19:33 · 12535 阅读 · 0 评论 -
httplib实现HTTP服务器流程
httplib的应用流程1.实例化一个Server对象2.在Sever对象中注册请求路由 ----- 传入请求资源的路径以及一个回调函数3.开始搭建一个服务器开始监听4.一旦服务器收到对应资源路径的请求,就会在Sever对象的请求路由信息中找到具体对应的处理函数进行执行,完成请求处理httplib搭建一个HTTP服务器的实现思路1.实例化一个Server对象,Server对象中有一个请求路由表,记录各种请求对应的处理函数。2.注册请求路由,告诉httplib,哪个资源请求应该用哪原创 2020-09-06 17:49:16 · 1210 阅读 · 0 评论 -
以太网协议格式解析
网络层描述了数据的起点和终点,但是在传输的过程中还是要经过很多的小路径传输,而链路层就是负责相邻设备之间的数据传输,那么链路层是如何来识别相邻设备的?通过MAC地址来识别相邻设备,MAC地址就是网卡的物理地址,这样就可以进行数据传输。48位的对端MAC地址、48位的源端地址,描述是哪两个相邻设备进行通信 16位的上层协议类型,用于数据分用上层协议的选择 32位的检验和如何得到MAC地址: ARP协议:介于网络层和链路层之间的协议,可以通过ip地址获取到MAC地址广播ARP请求,请求中.原创 2020-07-29 10:07:40 · 566 阅读 · 0 评论 -
什么是数据分片
数据分片:在网络数据传输中,限制数据大小的不仅有网络层的报文长度(报文长度小于64K就可以发送),但是链路层中还有一个限制:MTUMTU:最大传输单元 ---- 链路层限制数据帧的大小原创 2020-07-27 21:51:11 · 2836 阅读 · 0 评论 -
IP协议格式
IP协议是TCP/IP协议族中最重要的协议之一IP协议是不可靠、无连接的 不可靠表示IP协议不能保证IP数据报能成功的到达目的地。IP仅提供传输服务,任何可靠性的要求都必须由上层来提供(如TCP)。如果传输过程发生错误,IP协议简单的丢弃该数据报,然后发送ICMP消息给发送端。 无连接表示IP协议不维护任何关于后续数据报的状态信息,每个数据报都是相互独立的。这也说明,IP数据报可能不是按照发送顺序被接收到的,很有可能后发送的数据被先收到。 4为版本:ipv4 ipv6 ..原创 2020-07-27 16:37:24 · 1172 阅读 · 0 评论 -
TCP的粘包问题
TCP是面向字节流的:有序的、可靠的、双向的、基于连接的字节流传输:以字节为单位,像水流一样的传输大量的数据要发送,不一定非要一次性发送,而是将数据放到发送缓冲区中,系统选择合适的时机,合适的大小进行传输,接受方接收到的数据也会放在接收含缓冲区中,不一定要一次性交付给应用层,优点:传输比较灵活,UDP每次必须进行整条数据的收发,缺点:TCP的粘包问题 ----- 将多条数据当做一条数据处理TCP并不关注数据格式数据边界,因此有可能将多条数据当作一条数据处理,解决方案:粘包的本质是因为原创 2020-07-27 15:38:23 · 97 阅读 · 0 评论 -
TCP如何避免性能损失
快速重传协议:当接收方认为某条数据丢失的时候,则会向发送方发送重传请求,减少等待若接收方接收到的数据并非接受窗口的后沿数据,则认为后沿数据可能丢失,这时候间隔连续发送三条后沿数据的重传请求,要求对方重传后沿数据。为什么要连续发送三条:三条请求时间,肯定小于超时等待的时间 网络中数据有可能延迟到达,因此三次是为了防止延迟到达,捎带应答机制:接收方针对每一条收到的数据都要进行确认回复,每一个确认回复都是一条数据(确认序号),单纯传输一个空报头就有些浪费,如果这时候刚好要给对方发送数据,则确认原创 2020-07-27 15:01:54 · 168 阅读 · 0 评论 -
TCP如何实现的可靠传输
可靠传输:在网络没有问题的情况下保证每个数据都要到达对端TCP能够实现可靠传输是因为这几种机制面向连接 ----------- 前提 确认应答机制 ---------- 确定对方是否收到自己发送数据 超时重传机制 ---------- 发送方等待超时没有,进行数据重传 序号和确认序号 --------- 实现了应答机制,以及进行接收方的包序管理,实现数据有序交付校验和字段 校验和字段 --------- 校验数据一致性,如果不一致则丢弃,对方法发送请求 避免丢包机制超时重传机制seq原创 2020-07-20 14:31:52 · 2307 阅读 · 0 评论 -
TCP协议特性解析(常见问题)
目录握手建立连接为什么是三次挥手断开为什么是四次握手失败时,两端的处理TIME_WATI状态有什么用一台主机上出现了大量的TIME_WAIT是什么原因一台主机上出现了大量的CLOSE_WAIT的原因是什么服务端收到相同客户端的多个SYN请求如何处理TCP:面向连接、可靠、面向字节流、有状态的协议面向连接:连接管理、状态管理、心跳保活管理连接管理:三次握手建立连接、四次挥手断开连接 状态管理:两端通信的过程中状态迁移变化,无论哪一端,在特定的状态下只能干特定的事.原创 2020-07-20 10:06:40 · 324 阅读 · 0 评论 -
TCP/UDP协议格式
UDP协议:无连接,不可靠,面向数据报无连接:通信不需要建立连接,只要知道对方的地址就可以直接传输 不可靠:数据丢了就不管,没有更多的处理丢包机制 面向数据报:无连接,不可靠,固定且有最大长度限制的传输方式 数据长度固定:udp使用sendto发送数据的时候,将数据放到socket发送缓冲区中,数据在缓冲区中不做停留,而是直接取出封装头部 数据最大长度限制:因为udp数据报长度在头部字段中进行了描述,决定了udp报文不能超过64k(包含头部) 64k-8UDP协议格式:16位源..原创 2020-07-16 11:08:15 · 340 阅读 · 0 评论 -
简单HTTP服务器的编写
http.srv.cpp#include "tcpsock.hpp"#include <iostream>#include <sstream>int main(int argc, char*argv[]){ TcpSock lis_sock; lis_sock.Socket(); std::string ip = "0.0.0.0"; uint16_t port = 9000; lis_sock.Bind(ip,port); ...原创 2020-07-16 10:35:15 · 285 阅读 · 0 评论 -
HTTP协议的格式
HTTP协议格式首行 请求首行:包含三个要素 请求方法、URL、协议版本,空格间隔、\r\n结尾 请求方法很多,每种方法负责的功能也是不同的GET :主要用于获取实体数据资源,请求某个数据,也可以将某个数据提交到查询字符串中 HEAD:针对请求,只要响应的头部信息,不要实体资源,响应没有正文 POST:向服务器提交表单数据,提交的数据保存在正文中 URL:统一资源定位符,定位某个服务器上的某个资源 响应首行:包含三个要素 协议版本、响应状态码、状态码描述,空格间隔、...原创 2020-07-16 09:32:35 · 427 阅读 · 0 评论 -
一个完整的URL包含的要素
URL是什么网址URL:统一资源定位符,可以定位网络中的某个服务器上的某个资源一个完整的URL所包含的要素1.协议方案名称 :http / https / fdp ---告诉浏览器本次请求使用什么应用层协议2.用户名密码 : username:password ---早期访问服务器的同时携带认证用户名和密码信息,因为安全度太低了已经不用了3.服务器地址信息(服务器地址与端口)4.资源路径5.查询字符串6.片段标识符...原创 2020-07-15 08:40:48 · 1438 阅读 · 0 评论 -
UDP服务端的思路以及代码
创建套接字 :int socker(地址域,套接字类型,协议类型)地址域:常用 AF_INET套接字类型: SOCK_STREAM 流式(Tcp)/ SOCK_DGRAM 数据报(udp)协议类型: IPPROTO_TCP / IPPTOTO_UDP / 0 int sockfd = socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP); if(socked < 0) { perror("socker error"); return原创 2020-07-08 10:58:59 · 233 阅读 · 0 评论 -
生产者与消费者模型的概念
生产者与消费者模型:一种代码的设计模式,大佬们针对典型场景设计的解决方案应对的场景: 数据的产生以及处理的场景示例:写一个程序,进行网卡流量分析 1.获取网卡流量 2.对流量进行数据分析解决方案:生产者与消费者模型 ----- 一个场所,两种角色,三种关系一个场所描述了一个线程安全的数据/任务队列 一种数据产生获取线程,专门用于获取数据,添加到队列中 一种数据分析处理线程,专门用于数据分析,从队列中获取数据生产者消费者模型的优点:解耦合 支持忙闲不均 支持并发耦...原创 2020-07-07 15:43:43 · 799 阅读 · 0 评论 -
AVL树的旋转 (左单旋)
在向上不断更新的过程中,如果parent平衡因子被更新为2或者-2,即parent的平衡因子违反了AVL树的性质,因此需要对以parent为根的二叉树进行旋转处理左单旋:新节点插入较高右子树的右侧右单旋:新节点插入较高左子树的左侧左右双旋:新节点插入较高左子树的右侧右左双旋:左单旋情况1:1.在树中插入70,根据二叉搜索树的性质新节点应该插入在2.由于树中插入了新的节点,可能会破坏树的平衡性,在检测平衡性发现平衡性被破环,需要向上更新平衡因子3.这时发现某个节原创 2020-07-07 10:55:50 · 593 阅读 · 0 评论 -
线程安全的实现
线程安全: 描述一个线程中的操作是否使安全的,而不会造成数据二义性 在多线程中,会对临界资源进行争抢访问,常常会造成数据二义性或者逻辑异常,线程安全就是为了避免这种情况的发生。如何实现线程安全 通过同步与互斥实现线程安全同步:通过条件判断实现对临界资源访问的合理性 同步的实现:条件变量 --- 提供一个pcb等待队列,提供了两个接口(线程等待 / 线程唤醒),条件变量在实现同步的时候,自身并没有提供条件判断的接口,也就是说,条件变量也不知道什么时候让线程休眠,什么时候唤醒线程,...原创 2020-07-07 09:14:58 · 174 阅读 · 0 评论 -
线程控制—线程分离
线程分离:线程分离就是将线程的属性从joinable状态设置为detach状态处于detach的线程,退出后会自动释放资源,不需要被等待,也不能被等待,(因为资源已经被释放了,获取不到返回值)pthread_detach(pthread_t tid): 分离指定的线程分离一个线程,不一定非要在创建线程后直接分离,也可以在任意位置分离,只要知道指定线程的tid即可,线程分离不过就是设置状态pthread_self() 获取调用线程IDjoinable和detach,两种状态只能二选其一.原创 2020-07-06 15:36:35 · 250 阅读 · 0 评论 -
线程控制—线程等待
为什么需要线程等待?在学习进程的时候了解到僵尸进程,僵尸进程就是子进程先于父进程退出,子进程所占用的资源没有释放,会导致资源泄露,线程也是一样的,已经退出的线程,它所占用的系统资源并没有释放,导致资源泄露线程等待:等待一个指针的线程退出,获取这个退出线程的返回值,并且回收这个退出线程的资源注意:线程默认是joinable状态,join状态的线程退出后,不会自动释放资源,所以需要被其他的线程等待pthread_join函数int pthread_join(pthread_t tid, vo原创 2020-07-06 14:25:48 · 324 阅读 · 0 评论 -
线程控制—线程终止
线程终止退出线程的三个方法:线程入口函数运行完毕,线程就会退出 使用接口pthread_exit(void *retval) --- 任意位置调用都会退出当前调用线程 被动退出,一个线程调用pthread_cancel(pthread_t tid)终止同一个进程中的另一个线程注意:主线程退出,并不会使线程退出,所有的线程都退出了,进程才会退出main函数中的return或调用exit接口推出的都是进程不是线程进程退出会导致所有的线程都退出void pthread_exi(.原创 2020-07-06 10:47:29 · 852 阅读 · 0 评论 -
用户态线程和轻量级进程的关系
轻量级进程也就是我们所说的线程,它和用户态线程就相当于库函数和系统调用接口之间的关系,用户态线程就是轻量级进程在用户态的一些描述,原创 2020-07-06 10:09:32 · 191 阅读 · 0 评论 -
套接字编程 --UDP通信程序的编写流程
套接字--socket编程就是网络通信程序的编写网络通信程序的编写使用的都是套接字接口我们可以把套接字理解为介于操作系统和用户之间网络通信的中间层面,通过这个接口可以访问内核,实现网络通信程序的编写网络通信程序的编写:TCP/IP五层中应用层是面向程序员的一层,应用层的协议都是程序员自己订立的,应用层处理完毕后,都会将数据交给操作系统,进行传输层开始往下的封装。但是传输层提供了两个典型协议:UDP / TCP在通信程序的编写中TCP和UDP的流程不同,下面介绍UDP通信程序的编写:在原创 2020-07-05 15:21:55 · 587 阅读 · 0 评论 -
网络传输基本流程 数据包的封装分用
TCP/IP五层模型:应用层:负责应用程序之间的数据沟通(两个进程之间数据格式);HTTP / FTP传输层:负责应用程序之间的数据传输(传输两端的描述 ---- 端口的描述);TCP/ UDP网络层:负责地址管理与路由选择(通过IP地址描述这条数据的两端主机);IP 路由器数据链路层:负责相邻设备之间的数据传输(通过MAC地址描述两个相邻设备);ETH 交换机物理层:负责物理光电信号的传输;以太网协议,集线器网络传输流程图同一个网段内的两台主机进行文件传输两台计算机通过原创 2020-07-04 15:56:41 · 1574 阅读 · 0 评论 -
网络协议——协议分层
协议网络通信协议:网络通信中数据格式约定网络互连的前提标准----订立网络通信协议标准,所有的设备采用统一网络通信协议,进行通信为什么要有网络通信协议?网络通信协议是一种网络通用语言,为连du接不同操作系统和不同硬件zhi体系结构的互联网络引提供dao通信支持,是一种网络通用语言。协议分层:在网络通信环境中,按照提供的服务,使用的接口,使用的协议,将网络通信环境进行层次化发,便于网络互联的实现OSI七层模型:应用层、表示层、会话层、传输层、网络层、数据链路层、物理层OSI七层原创 2020-07-04 14:38:04 · 449 阅读 · 0 评论 -
Linux网络编程 --- 网络基础1(IP 端口)
ip地址:是一个无符号4个字节的整数,作用是在网络中唯一表示一台主机因为数字没有规律难以记忆,因此才会将每个字节分开来表示:点十分进制的表示方式:192.168.1.1每一条网络中的数据都必须具备:源端的ip地址和对端的ip的地址,网络中的转发设备必须明确这条数据从哪来,到哪去ip地址版本的分类:IPV4:无符号四个字节的整数,不够用:解决:DHCP -- 动态地址分配技术NAT技术---网络地址转换技术 私网---让私网网络内的主机使用同一个对外的ip地址上网IPV..原创 2020-07-04 14:15:39 · 193 阅读 · 0 评论 -
线程控制—线程的创建
在操作系统中并没有提供创建线程的系统调用接口(这也是为什么有人说Linux中没有线程的原因),而是大佬们封装的一套库函数实现线程控制的各个操作在程序中程序员通过库函数创建线程,实际上创建了一个用户态线程,并且伴随在内核中创建了一个轻量级PCB实现线程的调用POSIX线程库:与线程有关的函数构成了一个完整的系列,绝大多数函数的名字都是以“pthread_”打头的 要使用这些函数库,要通过引入头文<pthread.h> 链接这些线程函数库时要使用编译器命令的“-lpthre.原创 2020-07-03 10:31:35 · 172 阅读 · 0 评论 -
多线程之间的独有与共享
线程共享进程数据,但是也拥有自己一部分数据独有:栈 , 寄存器(上下文信息),调度优先级,信号屏蔽字,标识符共享:虚拟地址空间(代码段、数据段),文件描述符,信号处理方式,工作路径,用户组ID/组ID...原创 2020-07-03 09:23:51 · 412 阅读 · 0 评论 -
Linux线程的基本概念(线程的优缺点)
什么是线程: 在刚刚接触Linux时,并没有线程这个概念,而是了解什么是进程,认为pcb是对进程的描述,pcb就是进程,是程序运行的动态描述,通过pcb实现程序运行的调度管理。 在学习线程时,pcb就不再是进程了而是一个轻量级进程,一个进程中可以有多个的pcb,也可以说一个pcb就是一个线程,这样一个进程中就有多个的线程,这样就可以高效处理多任务。为什么可以高效处理多任务:上述说的那么多其实没有表达出线程的本质,线程的本质就是进程中的一条执行流,这就可以解释为什么可以高效处理多任务:..原创 2020-07-03 09:10:37 · 386 阅读 · 0 评论 -
进程信号
信号与信号量的区别:信号是一种事件通知的方式,通知进程发生了每个事件,信号量是进程间通信的一种方式 —— 用来实现进程间的同步与互斥。信号是什么:信号是一种软件中断,是一种事件的通知方式,用于向进程通知发生了某个事件,打断进当前的操作,去处理这个事件。信号的种类: 使用 kill -l 命令查看信号种类 一共有62中。1 ~ 31 : 非可靠信号34 ~ 64:可靠信号信号的生命周期: 进程中注册: 如何让进程知道自己收到了指定信号 在进程pcb中有一个pendin...原创 2020-06-30 09:41:13 · 111 阅读 · 0 评论 -
进程间的通信 --- 共享内存
目录共享内存:用于进程的数据共享,是最快的进程间通信方式接口介绍:实例:两个进程同时访问一块共享内存共享内存特性:共享内存:用于进程的数据共享,是最快的进程间通信方式本质原理:共享内存本质来说就是一块物理内存,多个进程通将同一块物理内存都映射到自己的虚拟地址空间上,通过自己的虚拟地址空间进行访问,数据共享。共享内存创建以后,在内核中是由标识符的,其他进程可以用过同一个标识符打开相同的共享内存,进行映射为什么共享内存是最快的进程间通信方式:共享内存直...原创 2020-05-26 17:27:08 · 372 阅读 · 0 评论 -
Linux---管道的特性总结
进程间的通信 - IPC:操作系统给进程提供的几种通信方式(管道、共享内存、信息队列、信号量)为什么要给进程提供通信:因为每个进程有自己独立的虚拟空间,访问的都是自己的虚拟地址、因此无法直接通信 ,因此需要操作系统给进程间提供通信方式,通信的场景不同所以也提供了多种不同方式。管道、共享内存、信息队列、信号量。原理:操作系统提供了一块所有进程都能访问的空间,就可以通过这块空间实现通信。管道:用于实现进程间的数据传输。本质:内核中的一块缓冲区,多个进程通过访问同一块缓冲区是实现通信。匿名原创 2020-05-25 16:46:52 · 675 阅读 · 0 评论 -
Linux--系统IO接口调用
int open(char* pathfilename,int flag,mode_t mode)flag:指定的打开方式 O_RDONLY 只读、O_WRONLY 只写、O_RDWR 可读可写 O_CREAT 文件不存在则创建、 O_APPEND 追加写 O_TRUNC 清空写mode: 如果使用了O_CREAT,则一定要通过mode参数设置文件权限信息,并且需要考虑文件默认的创建权限掩码的因素文件描述符: open返回的文件操作句柄,是一个非负整数, --- 操作文件原理,是因为这个整.原创 2020-05-13 15:29:14 · 243 阅读 · 0 评论 -
基础IO操作(库函数)
常用的文件操作:fopen(文件名,"打开方式"):打开一个文件打开方式:r - 打开只读文件,文件必须存在r+ -打开可读写的文件,文件必须存在w -打开只写文件,若文件不存在则创建文件,文件存在则清空原文件内容w+ - 打开可读可写文件,若文件不存在则创建文件,文件存在则清空原文件内容a -以附加的方式打开只写文件。若文件不存在,则会建立该文件,如果文件存在,写入的数据会被加到文件尾答,即文件原先的内容会被保留。a+ -以附加方式打开可读写的文件。若文件不存在,则会建立该文件原创 2020-05-11 22:32:45 · 234 阅读 · 0 评论 -
Linux进程控制(进程终止、进程等待)
进程终止 进程终止就是退出一个进程进程退出的三个场景1:正常退出,结果符合预期2:正常退出,结果不符合预期结果3:异常退出进程中退出的方式1:在main函数中return,退出进程2:void _exit(int status),退出进程3:void _exit(int status),退出进程void _exit(int status)与void _ex...原创 2020-04-22 23:37:57 · 386 阅读 · 0 评论 -
Linux——页表的理解
版权声明:本文为CSDN博主「乘梦碧溪」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/zy13651953784/article/details/102611711逻辑地址:是程序编译后,生成的目标模块进行编址时都是从0号开始编址,称之为目标模块的相对地址,即逻辑地址。虚拟地址:计算机处理器的地址有...转载 2020-04-21 15:40:19 · 1075 阅读 · 0 评论 -
Linux中操作系统管理内存的方式(分段式、分页式、段页式)
操作系统管理内存的方式 虚拟地址通过页表映射到物理地址,那么虚拟地址是如何找到物理内存? 分段式 将虚拟地址空间进行分段,(代码段/数据段、堆、栈、参数、环境变量),根据使用一个空间的性质,在不同的分段,分配虚拟地址,有助于编译器的内存管理 虚拟地址的组成:段表 + 段内的偏移量在操作系统中有一个段表,表中包含:虚拟段号、物理内存段起始地址通过虚拟地址中的段...原创 2020-04-21 15:30:43 · 899 阅读 · 1 评论