自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(118)
  • 问答 (1)
  • 收藏
  • 关注

原创 数据库突击

笛卡尔积是指在两个集合中的所有可能的有序对组合。当应用于数据库表时,它返回参与运算的每个表中的每一行与另一个表中的每一行的组合。如果第一个表有"A"行,第二个表有"B"行,那么笛卡尔积的结果将有"A x B"行。在数据库管理系统中,一个事务是一系列可能要进行的更改,这些更改作为一个单元执行。事务可以看作是一个单一的逻辑工作单元,它自己本身要么完全执行,要么完全不执行(即“所有或无”规则)。在数据库中,视图是一个虚拟表,其内容由查询定义。与包含数据的表不同,视图只包含使用时动态生成的数据的SQL查询。触发器。

2023-10-20 09:26:26 354

原创 《MySQL必知必会》知识点总结

数据库是一个以某种有组织的方式存储的数据集合。简单理解就是将其想象为一个文件柜,此文件柜是一个存放数据的物理位置,不管数据是什么以及如何组织的。数据库:保存有组织的数据的容器。数据库软件DBMS:创建操纵数据库这个容器SQL是结构化查询语言(Structured Query Language)的缩写,SQL是一种专门用来与数据库通信的语言。SQL的优点不是某个特定数据库供应商转悠的语言,几乎所有的数据库都支持SQLSQL简单易学,所有语句都是由描述性很强的英语单词组成。

2023-10-20 09:26:21 683

原创 5.5线程同步机制类封装及线程池实现

线程池是由服务器预先创建的一组子线程,线程池中的线程数据应该与CPU数据差不多。等消耗CPU计算资源的任务)来说,那线程池中的线程数量最好也设置为4(或者+1防止其他因素造成的线程阻塞);对于IO密集型的任务,一般要多于CPU的核数,因为线程间竞争的不是CPU的计算资源而是IO,IO的处理一般较慢,多于cores数的线程将为CPU争取更多的任务,不至在线程处理IO的过程造成CPU空闲导致资源浪费。线程池中的线程数量最直接的限制因素是中央处理器(CPU)的处理器(process/cores)的数量N;

2023-10-02 18:53:26 441

原创 5.4 服务器编程基本框架和两种高效的事件处理模式

虽然服务器种类繁多,但其基本框架都一样,不同之处在于逻辑处理(比如开发Web服务器项目,浏览器客户端向服务端发送http请求,服务器对请求报文进行解析,根据具体请求信息,将资源找到并组装响应报文,将响应报文发送给客户端,客户端解析出响应)。那么在工作线程的角度来看,它们就直接获得了数据读写的结果,接下来要做的只是对读写的结果进行逻辑处理。工作线程处理完客户请求后,调用aio_write函数向内核注册socket上的写完成事件,并告诉内核用户写缓冲区的位置,以及写操作完成时如何通知应用程序。

2023-10-02 18:29:43 286

原创 5.3 Web服务器简介及HTTP协议

一个Web Server就是一个服务器软件(程序),或者是运行这个服务器软件的硬件(计算机)。其主要功能是通过HTTP协议与客户端(通常是浏览器Browser)进行通信,来接收、存储处理来自客户端的HTTP请求,并且对其请求做出HTTP相应,返回给客户端其请求的内容(文件、网页等)或返回一个Error信息。通常用户使用Web浏览器与相应服务器进行通信。在浏览器中键入“域名”或“IP地址:端口号”,浏览器则先将你的域名解析成IP地址或者直接根据你的IP地址向对应的Web服务器发送一个HTTP请求。

2023-10-02 16:19:08 195

原创 【项目】5.1阻塞和非阻塞、同步和异步 5.2Unix、Linux上的五种IO模型

异步表示A向B请求调用一个网络IO接口时(或者调用某个业务逻辑API接口时),向B传入请求的事件以及事件发生时通知的方式,A就可以处理其他逻辑了,当B监听到事件处理完成后,会用事先约定好的通知方式,通知A处理结果。非阻塞IO执行系统调用总是立即返回,不管事件是否已经发生,若事件没有发生,则返回-1,此时可以根据errno区分着两种情况,对于accept,一个典型的网络接口调用,分为两个阶段,分别是“数据就绪”和“数据读写”,数据就绪阶段分成阻塞和非阻塞,表现得结果就是,阻塞当前线程或是直接返回。

2023-10-02 14:57:43 599

原创 【项目 计网12】4.32UDP通信实现 4.33广播 4.34组播 4.35本地套接字通信

向子网中多台计算机发送消息,并且子网中所有的计算机都可以接收到发送方发送的消息,每个广播消息都包含一个特殊的IP地址,这个IP中子网内主机标志部分的二进制全部为1.b、客户端需要绑定服务器广播使用的端口,才可以接收到广播消息。本地套接字实现流程和网络套接字类似,一般采用TCP通信流程。本地套接字的作用:本地的进程间通信。a、只能在局域网中使用。没有关系的进程间的通信。有关系的进程间的通信。

2023-09-10 21:04:43 455

原创 【项目 计网11】4.29 epoll API介绍 4.30 epoll 代码编写 4.31 epoll的两种工作模式

epoll_create实例在内核区,创建了一个eventpoll结构体。这个函数的返回值是一个文件描述符,通过这个fd去操纵eventpoll//创建一个新的epoll实例。在内核中创建了一个数据,这个数据中有两个比较重要的数据,一个是需要检测的文件描述符的信息(红黑树),还有一个是就绪列表,存放检测到数据发送改变的文件描述符信息(双向链表)。-参数:size:目前没有意义了,随便写一个数,必须大于0-返回值:-1:失败>0:文件描述符,操作epoll实例的void *ptr;

2023-09-10 19:24:11 165

原创 【项目 计网10】4.28 poll API介绍及代码编写

int fd;//委托内核检测的文件描述符//委托内核检测文件描述符的什么事件//文件描述符实际发生的事件-参数:-fds:是一个struct pollfd结构体数组,这是一个需要检测的文件描述符的集合-nfds:这是第一个参数数组中最后一个有效元素的下标+1-timeout:阻塞时长0:不阻塞-1:阻塞,当检测到需要检测的文件描述符有变化,解除阻塞>0:阻塞的时长,单位毫秒-返回值:-1:失败>0:成功,返回n表示检测到集合中有n个文件描述符发生变化myfd.fd=5;

2023-09-03 21:56:51 227

原创 【项目 计网9】4.25 IO多路复用简介 4.26select API介绍 4.27 select代码编写

输入输出:以内存为主体读写:以程序为主体程序要往内存里写数据,对于内存而言就是输入。IO多路复用使得程序能同时监听多个文件描述符,能够提高程序的性能,Linux下实现IO多路复用的系统调用主要有select、poll和epollaccept不阻塞,所有用于收发数据的fd都放在一个集合里。然后遍历集合里能用的fd,依次收发数据。这中轮询效率极低。主旨思想:1、首先构造一个关于文件描述符的列表,将要监听的文件描述符添加到该列表中。

2023-09-03 21:27:33 194

原创 【项目 计网8】4.23 TCP状态转换 4.24半关闭、端口复用

当 TCP 链接中 A 向 B 发送 FIN 请求关闭,另一端 B 回应 ACK 之后(A 端进入 FIN_WAIT_2状态),并没有立即发送 FIN 给 A,A 方处于半连接状态(半开关),此时 A 可以接收 B 发送的数据,但是 A 已经不能再向 B 发送数据。主动关闭方重新发送的最终 ACK 并不是因为被动关闭方重传了 ACK(它们并不消耗序列号,被动关闭方也不会重传),而是因为被动关闭方重传了它的 FIN。注意:一旦一二次挥手成功,A就只能回复B的消息收到了,而不能再给B发送新的报文。

2023-09-02 20:56:54 894

原创 【项目 计网7】4.20 多进程实现并发服务器 4.22 多线程实现并发服务器

要实现TCP通信服务器处理并发的任务,使用多线程或者多进程来解决。3、子进程:完成通信,接受一个客户端连接,就创建一个子进程用于通信。2、父进程负责等待并接受客户端的连接。1、一个父进程,多个子进程。

2023-08-27 20:02:18 615

原创 【项目 计网6】 4.17 TCP三次握手 4.18滑动窗口 4.19TCP四次挥手

滑动窗口(滑动窗口)是一种流量控制技术.早期的网络通信中,通信双方不会考虑网络的拥挤情况直接发送数据.由于大家不知道网络拥塞状况,同时发送数据,导致中间节点阻塞掉包,谁也发不了数据,所以就有了滑动窗口机制来解决此问题.滑动窗口协议是用来改善吞吐量的一种技术,即容许发送方在接收任何应答之前传送附加的包.(接收方告诉发送方在某一时刻能送多少包(称窗口尺寸)。当滑动窗口为0时,发送方一般不能再发送数据报。5、第10次,服务端告诉客户端:发送的6K数据已经收到,存储在缓冲区,缓冲区已经处理了2K,窗口大小是2K。

2023-08-24 22:21:29 431

原创 【项目 计网5】 4.15 TCP通信实现(服务器端)4.16 TCP通信实现(客户端)

【代码】【项目 计网5】 4.15 TCP通信实现(服务器端)4.16 TCP通信实现(客户端)

2023-08-23 21:36:23 258

原创 【硬件突击 电路】

电容器由两个导体板之间的绝缘介质隔开,当电容器连接到电源时,正极板积累正电荷,负极板积累负电荷,从而在两板之间产生电场。当电流停止流动时,电感释放储存的能量,产生一个电动势,试图维持电流的流动,这有助于平滑电路中的电流变化。当谈到RC、RL和RLC电路时,我们实际上在讨论不同类型的电路,这些电路使用了电阻、电容和电感器(L,Inductor)的组合。总的来说,RC、RL 和 RLC 电路的结构和工作原理都涉及到电阻、电容和电感器的组合,可以用于实现各种电路功能,如滤波、延时、相移、共振和振荡等。

2023-08-13 09:20:04 1251 1

原创 【项目 计网4】4.11 socket地址 4.12 IP地址转换函数 4.13TCP通信流程 4.14socket函数

这个结构体不仅提供了足够大的空间用于存放地址值,而且是内存对齐的。

2023-08-10 20:19:31 215

原创 【项目 计网3】Socket介绍 4.9字节序 4.10字节序转换函数

所谓 socket(套接字),就是对网络中不同主机上的应用进程之间进行双向通信的端点的抽象。一个套接字就是网络上进程通信的一端,提供了应用层进程利用网络协议交换数据的机制。从所处的地位来讲,套接字上联应用进程,下联网络协议栈,是应用程序通过网络协议进行通信的接口,是应用程序与网络协议根进行交互的接口。socket 可以看成是两个网络应用程序进行通信时,各自通信连接中的端点,这是一个逻辑上的概念。

2023-08-06 01:30:34 229

原创 【项目 计网2】4.4网络模型 4.5协议 4.6网络通信的过程

现在 Internet(因特网)使用的主流协议族是 TCP/IP 协议族,它是一个分层、多协议的通信体系。TCP/IP协议族是一个四层协议系统,自底而上分别是数据链路层、网络层、传输层和应用层。每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务TCP/IP 协议在一定程度上参考了 OSI 的体系结构。OSI 模型共有七层,从下到上分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。但是这显然是有些复杂的,所以在 TCP/IP 协议中,它们被简化为了四个层次。

2023-08-05 23:52:43 479

原创 【项目 计网1】4.1 网络结构模式 4.2MAC地址、IP地址、端口

即 Client - Server(C/S)结构。C/S 结构通常采取两层结构。服务器负责数据的管理,客户机负责完成与用户的交互任务。客户机是因特网上访问别人信息的机器,服务器则是提供信息供人访问的计算机。客户机通过局域网与服务器相连,接受用户的请求,并通过网络向服务器提出请求,对数据库进行操作。服务器接受客户机的请求,将数据提交给客户机,客户机将数据进行计算并将结果呈现给用户。

2023-08-05 19:57:40 216

原创 【项目 线程4】3.12生产者消费者模型 3.13条件变量 3.14信号量 C++实现生产者消费者模型

若容器已空,则消费者阻塞,通知生产者去生产。生产者信号量初始化为8,每调用一次sem_wait(&psem),生产者信号量-1,每生产一个,消费者信号量加一,当生产者信号量为0时,阻塞。消费者部分:每调用一次sem_wait(&csem),消费者信号量-1,每消费一个,生产者信号量加一,当消费者信号量为0时,阻塞。2、如果内容为空,则阻塞,同时释放互斥锁(这就完成了拿去和释放动作),无论有几个消费线程抢到锁,都会阻塞在这里。信号量,信号灯,灯亮则表示资源可用,灯灭则表示资源不可用。条件变量、信号量等。

2023-08-05 17:22:33 150

原创 【项目 线程3】3.8 线程同步 3.9互斥锁 3.10死锁 3.11读写锁

原因:三个线程并发执行去抢占线程资源,A进来休眠6000微秒的时候,B、C也可能进来。多个线程同时处理一个共享资源,出现线程同步问题,操作必须是原子性的。restrict : C语言的修饰符,被修饰的指针,不能由另外的一个指针进行操作。上述代码产生死锁:线程1获得锁1且申请锁2,线程2获得锁2且申请锁一。读写锁比互斥锁效率要高一点,读的时候是并发执行,而互斥锁是串行。问题:卖第0张、第-1张门票,三个线程买同一张门票等等。线程同步会带来一定的效率问题,但是是必要的。是不可以通过mutex1去操作xxx的。

2023-08-04 23:44:30 126

原创 【项目 线程2】3.5 线程的分离 3.6线程取消 3.7线程属性

命令查看线程属性pthread_attr_ 的相关函数:man pthread_attr_ 不要回车 按两次tab。核心在于:取消线程后,不会立马终止该线程。默认分配线程栈的大小为8388608。

2023-08-04 19:43:51 133

原创 【项目 线程 1】 3.1线程概述 3.2创建线程 3.3终止线程 3.4连接已终止的线程

并发:两队人用同一个咖啡机(本质上同一时刻只有一个进程在运行,但是切换非常快,所以看起来是好几个进程同时进行)并行:两队人用两个咖啡机查看指定进程的线程:ps -Lf pid(进程号)

2023-08-04 17:01:28 143

原创 【项目 进程14】2.30 守护进程(1) 2.31 守护进程(2)

控制终端默认是后端进程。在子进程中再创建子进程,就变成进程组。id100创建一个新会话,新会话中有进程组id100,进程id100,与原先会话冲突。若使用子进程id101创建新会话,则新会话中的进程组id为101,进程id为101,100的进程放在一个进程组中,进程组id为100,100也为会话的id。若当前进程创建会话,当前进程产生进程组,进程组的组长不能和会话组长为同一进程。创建会话的进程不能为进程的组长,不能为进程的首进程。同一时刻,只能有一个前台进程组,只有前台进程组才能享有控制终端的操作权力。

2023-08-03 23:51:43 85

原创 【项目 进程13】2.28共享内存(1) 2.29共享内存(2)

被标记销毁以后,key被置0,但是因为还有绑定,所以暂时还没被销毁。直到所有绑定都解除,ipcs -m就查不到它了。buf:需要的操作cmd不同,buf的作用不同。在标记销毁的时候,buf没有用,所以直接置NULL就可以。IPC_RMID:只是标记共享内存需要被删除。要到没有进程和这块内存绑定了,这块共享内存才会被真的删除。at:attach (在虚拟内存的用户区 的 共享区;新的问题:两个进程同时写数据,一个进程读数据,涉及进程同步问题。shmaddr是虚拟地址空间刚刚绑定的地址。分离和销毁是不同的。

2023-08-03 21:10:12 264

原创 【项目 进程12】2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

未决信号集中SIGALRM信号为1,若处理myalarm函数,则未决信号集中SIGALRM信号为0,如果一直在处理,又产生一个SIGALRM信号,则它的未决信号标志位变成1,阻塞在那,不会执行回调函数。当上一次的回调函数执行完,第二个信号的回调函数才会被执行,它的未决信号标志位再次变成0。在myalarm回调函数使用的过程当中,SIGALARM信号自动被屏蔽,不许我们设置,为系统行为,当回调函数执行结束,SIGALARM信号不被屏蔽。2、执行回调函数时使用临时阻塞信号集,当回调结束使用内核当中的信号集。

2023-08-03 17:01:12 155

原创 【项目 进程11】2.23 signal信号捕捉函数 2.24 信号集及相关函数

的信号集进行操作。

2023-08-02 23:49:28 255

原创 【项目 进程10】2.21 alarm函数 2.22setitimer定时器函数

seconds: 倒计时的时长,单位:秒。如果参数为0,定时器无效(不进行倒计时,不发信号)。取消一个定时器,通过alarm(0)。-> 返回9,返回之前的定时器剩余的时间,但是定时器被覆盖,从此时开始 5s后发送信号。SIGALARM :默认终止当前的进程,每一个进程都有且只有唯一的一个定时器。函数调用,开始倒计时,当倒计时为0的时候,alarm(100) -> 该函数是不阻塞的,可以继续执行其他的代码。-> 返回0,之前没有定时器。-之前有定时器,返回之前的定时器剩余的时间。-之前没有定时器,返回0。

2023-08-02 21:52:45 257

原创 【项目 进程 9】2.19 信号概述 2.20 kill、raise、abort函数

共62种信号。SIGKILL:所有进程不包括僵尸进程SIGSTOP:暂停。不是结束。

2023-08-02 18:45:17 283

原创 【项目 进程8】 2.17 内存映射(1) 2.18内存映射(2)

遇到这个字符时,它会认为字符串已经结束,所以不会读取之后的内容,而与空格无关。是映射区的起始地址,这个地址是在进程的虚拟地址空间内的,不是文件在磁盘或者内存上的实际物理地址。当你访问这个地址区间时,操作系统负责将你的访问请求转换为对应文件在磁盘上的位置的访问。由于映射区域是映射到物理内存的文件。),所以当父进程读取字符串时,它只会读取到 “nihao a, son!当你访问这个地址时,你实际上是在访问一块物理内存,操作系统负责为你管理这个过程。函数返回的还是在进程的虚拟地址空间中的一个地址,而这个。

2023-08-02 14:36:57 93

原创 【项目 进程7】 2.15 有名管道介绍及使用 2.16有名管道实现简单版聊天功能

有名管道也可用于具有亲缘关系的进程之间,底层数据结构也是环形队列、循环队列。

2023-07-23 21:05:16 142

原创 【项目 进程6】 2.13 匿名管道通信案例 2.14管道的读写特点和管道设置为非阻塞

读管道:管道中有数据,read返回实际读到的字节数。管道中无数据:写端被全部关闭,read返回 0 (相当于读到文件的末尾)写端没有完全关闭,read阻塞等待,如果设置成非阻塞,read返回值为 - 1 写管道:管道读端全部被关闭,进程异常终止(进程收到SIGPIPE信号)管道读端没有全部关闭:管道已满,write阻塞管道没有满,write将数据写入,并返回实际写入的字节数。

2023-07-23 18:25:42 132

原创 【项目 进程5】 2.10 进程间通信简介 2.11匿名管道概述 2.12父子进程通过匿名管道通信

GUI:图形用户 接口 graphic user interfaceIDE:集成开发环境API:应用程序接口同步和异步看医生一个一个去,异步是好几个人一起。异步容易产生安全问题。每个进程的内核有文件描述符表,其中0 1 2分别代表标准输入、标准输出、标准错误。标准输入输出的文件就是输出,是从内存角度来看的。输出就是从内存输出到文件(写)。管道即改变了两个进程的输出和输入对象ls获取一个目录中文件的列表,“|”创建管道服务,wc统计文件数目。ls是一个列出目录内容的命令。

2023-07-23 14:55:46 104

原创 【项目 进程4】 2.8 wait函数 2.9waitpid函数

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2023-07-19 22:24:13 59

原创 【项目 进程3】2.6 exce函数族 2.7 进程退出、孤儿进程、僵尸进程

有点像C++的函数重载,是一系列功能相似的函数exec函数族的作用是根据指定的文件名找到可执行文件,并用它来取代调用进程的内容,在调用进程内部执行一个可执行文件。exec函数族的函数执行成功后不会返回,因为调用进程的实体,包括代码段、数据段和堆栈都已经被新的内容取代,只留下进程ID等一些表面上的信息仍保持原样,“三十六计”中的“金蝉脱壳”。看上去还是旧的躯壳,却已经注入了新的灵魂。只有调用失败了,它们才会返回-1,从原程序的调用点接着往下执行。

2023-07-18 22:44:49 663

原创 【项目 进程2】2.3 进程创建 2.4父子进程虚拟地址空间 2.5GDB多进程调试

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档。

2023-07-17 23:09:18 189 1

原创 【项目 进程1】2.1 进程概述 2.2 进程状态转换

程序是包含一系列信息的文件二进制格式标识:每个程序文件都包含用于描述可执行文件格式的元信息。内核利用此信息来解释文件中的其他信息。(ELF可执行连接格式)机器语言指令:对程序算法进行编码程序入口地址:标识程序开始执行时的起始指令位置数据:程序文件包含的变量初始值和程序使用的字面量值(比如字符串)符号表及重定位表:描述程序中函数和变量的位置及名称。这些表格有多重用途,其中包含调试和运行时的符号解析(动态链接)

2023-07-11 22:42:19 149

原创 【项目一】IO库对比、文件操作

0120000 后四个0代表八进制,012此时是一个八进制整体 012不能直接转成000 001 010,而是0+8+2 = 10,转换成4位二进制是:1010,所以这一串的整体是:1010 000 000 000 000。Linux系统,一切皆文件。文件描述符:在进程内核区,内核其实就是一个程序,其中有一个结构体叫做PCB(Process Control Block),其中就管理着文件描述符表。但是如果用stat函数读b.txt得到的会是a的文件信息,直接vim b.txt其实打开的也是a文件。

2023-07-10 23:45:22 193

原创 【项目一】GCC(gcc,g++)、静态库、动态库、MakeFile、GDB调试

静态库实际上是将.c文件们打包。这些.c文件定义的函数,都在.h文件中申明。-c 生成目标代码 test.o,test.o 不是一个可执行程序。如果下一步需要继续链接成可执行程序,需要输入指令 gcc test.o -o test.out(src目录下:gcc -c add.c div.c mult.c sub.c 是要报错的,因为找不到.h文件。所以整个直接 gcc test.c 包含了预处理,编译,汇编,链接成可执行文件4步。如果gcc xx.c -o app不加-o,只有gcc xx.c。

2023-06-06 08:51:06 1622

原创 【小林计网笔记】 IP篇

为了在TCP/IP网络中正确通信,每一台设备都需要一个正确的IP号。IP 地址(IPv4 地址)由 32 位正整数来表示,IP 地址在计算机是以二进制的方式处理的。而人类为了方便记忆采用了点分十进制的标记方式,也就是将 32 位 IP 地址以每 8 位为组,共分为 4 组,每组以「.」隔开,再将每组转换成十进制。那么,IP 地址最大值也就是但实际上,IP 地址并不是根据主机台数来配置的,而是以网卡。像服务器、路由器等设备都是有 2 个以上的网卡,也就是它们会有 2 个以上的 IP 地址。

2023-06-06 08:50:12 513

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除