自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(109)
  • 收藏
  • 关注

原创 进程守护化

注意,ctrl+z后,该进程进入后台暂停,bash进程会自动的进入前台,然后接受命令!也可以展示bash这个进程以及sid:如果我们执行./process,然后不回收,直接关闭xshell,然后打开会发现他还是存在的,只不过父进程变成了1,被系统领养了。讲个题外话:win+x中有个注销的选项,他的作用就是关闭windows所有的session会话。

2024-07-28 15:18:43 359

原创 tcp协议下的socket函数

在标准 C 库(如 glibc)的早期版本中,inet_ntoa() 确实返回指向内部静态缓冲区的指针,这意味着多次调用 inet_ntoa() 可能会覆盖先前的结果,特别是在多线程环境中。所以有些人说那就轮询啊,但是那又要存储子进程的pid值,但是后面回收还是存在问题,还要数组存储退掉的子进程和没有退掉的子进程。但是在多线程的情况下运行是没有这个情况的,理论上线程是共享内存地址空间的,那么开辟的静态空间也是重复的!但是进程的创建是很大的,所以我们需要用线程来执行方案。我在这篇博客的最后面提到过。

2024-07-19 15:42:20 1134

原创 udp协议模拟远程输入指令控制xshell

不了解udp协议的可以先看一下我之前还写过模拟实现xshell的。

2024-07-12 10:29:16 255

原创 udp协议下的socket函数

但是网络协议出现的肯定是比大小端出现的晚,并且但是大小端当时没有谁有明显的优势,所以也不好替代谁,那么在网络传输时就出现问题了。buf就是接受别人发来数据的缓冲区,len就是buffer的长度,flags默认为0就好了,下面两个就是接受方要知道是谁发来的数据,到时候好发送回给对方。sockfd就是socket的返回值大小,addr则是绑定的ip地址,端口号等等信息,addrlen就是sizeof(addr)就好了。一般人运行上面程序是不会成功的,因为我们没有开放端口号,所以链接不到主机上。

2024-06-13 21:35:23 935

原创 网络基础知识

相同层的协议一定是相同的,但是不同层影响不大,一层协议改变了,不会导致其他层的改变,体现了不同层的低耦合,相同层的高耦合的性质。

2024-06-05 23:33:08 729

原创 树的直径(树的最长路径)

1.任意找一个结点x,找一条最长路径到达u(最长路径的一个端点),再从u出发,找到最长路径。

2024-05-22 21:17:14 267

原创 无向图的双连通分量

2.任意两个双连通分量,一般只有一条边,也称之为桥,如果再加一条边也就变成双连通分量了,就相当于第二种情况。有向图变成强连通分量(每个点都能到达任意点)加的边数==max{q(出度为0),p(入度为0)}无向图变成双连通分量(不存在桥)加的边数[(cnt + 1)/ 2],cnt为度数为1的点个数。1.任意两个强连通分量只要有两条互通的边就可以了,所以一般分来就只有一条边,就相当于第一种情况。

2024-05-20 20:58:28 127

原创 有向图的强连通分量tarjan(塔扬)算法

推荐观看一下bilibili的董晓算法博主中的D14 强连通分量 Tarjan算法,他将函数流程给写出来了,很容易去理解。1.目的就是让一个有向图中将能够相互到达的点分成一组。

2024-05-19 16:32:00 221

原创 最近公共祖先(倍增算法)

3.所以倍增加了一个fa[N][K],---->fa[i][j]记录就是第i个结点的第2^j个的祖先,fa[u][0] = father就是一样记录的,然后fa[u][k] = fa[fa[u][k-1][k-1],就相当于u第2^k-1的祖先的2^k-1个的祖先(因为是从root开始记录的,所以不用考虑该节点以上有没有更新的结点)。2.但是他们不同的是:倍增算法在询问两个结点的公共祖先时,往上走的都是次方倍数的,所以我觉得时间复杂度应该是0(log(logn)),暴搜的时间复杂度是0(logn)。

2024-05-18 12:37:56 246

原创 C++差分约束

A-B num,那么就可以直接走B->A====相差num,反过来也一样,A-B>=num,如果进过其他路径是B到AA====相差num。原理其实是一样的,不一样就是dist初始化和判断不同。一个是求最小的dist,一个是最大的dist,其实一开始求的都是临界值,也就相当于=num.这一题你可以发现路径是反过来的,因为如果是正过来的话,1.不能保证源点能够经过所有点。所以我们反过来其实是一样的。

2024-05-16 20:54:49 284

原创 用迭代加深解决加成序列问题

可以看到这个最坏的结果是100层搜索,但是其实1 2 4 8 16 32 64 128,到128的话也只要8,所以大概只需要10几层搜索就可以解决了,这个时候就可以用迭代加深的方法,深度一点点的加,如果大于概深度就舍去。有人说那如果答案的层数很大,那岂不是要将前面的都重新搜索,岂不是很浪费时间。其实怎么想,这种迭代都是指数级往上升的,第10层,要2的11次方 大小其实和2^1 + ...+2^10一样的,所以时间不会浪费太多,反而会节省一开始的时间。

2024-05-12 16:56:10 269

原创 spfa检测负权回路C++

1.负权边回路首先dist数组刚开始初始化是0,(因为是检测回路,那么无论从哪里开始起点都是一样的,所以一开始就会把所有点都加载到队列中,所以就相当于把dist[所有点] = 0);下面就是cnt数组----很多人应该都看过模板长什么样子了,其中的cnt为什么要大于n才算有回路?其实是如果存在负权回路,那么这条路肯定是一直减少的,所以当走过的路大于n条,还是

2024-05-11 14:11:23 194

原创 单例模式,懒汉和饿汉模式的区别以及实现方法

单例模式是一种“经典的,常用的,常考的”。那么什么是设计模式?IT行业这么火,涌入的人很多,俗话说林子大了啥鸟都有,大佬的菜鸟们两极分化越来越严重,为了让菜鸟们不太拖大佬们的后腿,于是大佬们针对一些经典的常见的场景,给定了一些对应的解决方案,这个就是设计模式。单例模式的特点:某些类,只应该具有一个对象(实例),就称之为单例。在很多服务器开发场景中,经常让服务器加载很多的数据(上百G)到内存中,此时往往要用一个单例的类来管理这些数据。

2024-04-26 01:12:04 677

原创 Linux线程池

里面有很有多余的打印,就是因为59行初始化和60行是一样的,没有初始化_cond,所以就一直拍错,展示就保存下来吧,提醒自己!

2024-04-26 00:30:17 238

原创 生产者消费者模型

3中关系(消费者与消费者,生产者与生产者,消费者与生产者),2种角色---生产和消费,1中交易场所---特定结构的内存空间(321原则不是官方的,是作者便于记忆取的名字)

2024-04-18 23:52:16 285

原创 linux线程的同步

死锁的四个必要条件(必须同时满足):1.互斥条件:一个资源每次只能被一个执行流使用(前提)。2.请求与保持条件:一个执行流因请求资源而堵塞时,对已获得的资源保持不放(原则)。3.不剥夺条件:一个执行流已获得的资源,在未使用完之前,不能强行剥夺(原则)。4.循环等待条件:若干执行流之间形循环等待资源的关系(重要条件)。想要破坏死锁就要破坏其中一个条件。注意:只有一个线程也是可以死锁的!(线程1同时申请两次同一个锁)

2024-04-17 22:54:56 214

原创 linux的线程概念

这理解线程,一定要理解进程的原理。我们先来简单看一下进程的原理图:地址空间是进程的资源窗口,那如何理解线程呢?线程:是进程内的一个个的执行分支。线程的执行粒度要比进程更细!而这些线程都是执行流,因为cpu只有调度执行流的概念。所以在linux中的执行流可以说是轻量级的进程:线程

2024-04-15 16:20:11 736

原创 一个简单的整数问题2(区间加减+区间求和问题)

2024-04-07 22:59:53 133

原创 并查集----格子游戏

不明白的可以拿纸自己先演示一番,find函数不仅能找到他们的祖先数,而且同时也能更新路径的子结点都等于祖先,然后以后寻找时会更加的方便!

2024-03-31 14:44:02 315

原创 Dijkstra 和 spfa 的本质区别

1.首先,网上最多说的就是Dijkstra是不能求权边带负数的,而spfa可以。但是下降到代码层面来解释这一原因就是,dijkstra中就只能入队一次(dijkstra可以用堆优化来当队列看),但是spfa那个点如果出队了,就还可以入队,他只是保证了当前队列这个点只能出现一次。

2024-03-30 18:09:49 437 1

原创 linux中进程的页表如何映射

2^20bit(叶框的起始地址) 约等于3字节,权限就当 1字节,相当于二级页表占4字节 * 1024个,就是4kb,4kb*1024个也目录数量 + 1字节*1024 约等于4MB。但是想想,算一个内存2^32 * (4(物理内存) + 4(虚拟内存) + 2(权限,凑个整2字节)),相当于40GB,哥们一个进程要开40GB空间,有点开玩笑了!我一开以为页表就是简单的一一映射的关系。

2024-03-17 15:18:43 358

原创 C++算法题---数独

然后inline int get(x, y){row[i]& col[j]&cell[i/3][j/3]}就是获得可以填的值了,然后这是可以通过map[lowbit(get(x,y))]不断循环就可以了。当然每次进入递归时,可以找最少解的空填进入,这样就能少一个根的递归了!用row[i], col[j], cell[i/3][j/3]记录[i, j]中可以用哪一个数字,当然使用位图的方式记录,9个bit位。

2024-03-16 10:42:28 380

原创 linux信号的概念

信号产生的方式:无论信号如何产生最终一定是谁发送给进程的?OS!为什么?OS是进程的管理者!

2024-03-10 19:40:34 1028

原创 优先权的不同特征性质

目录1.强占式,静态优先权,动态优先权2.先来服务算法,高响应比优先算法,时间片轮转算法,非抢占式短任务优先

2024-03-09 13:54:24 370

原创 就绪态,运行态,堵塞态

2024-03-09 13:16:41 421

原创 IPC资源在linux内核中如何管理

然后何如拜访上面三个结构体呢?当然就是强转:((struct shmid_ds*)addr)->?当然OS肯定在ipc_perm中存储了如何区分指针指向的内存,然后分别强转类型。其实管理他们的是一个数组,和open返回的fd差不多,shmid,msqid,semid的大小都是这个数组的下标。那数组的结构是什么呢?这其实不就是C++中的多态吗?ipc_perm是基类,上面三个是子类。

2024-03-03 15:42:06 368

原创 Linux中systemv共享内存

进程间通信的本质就是:让不同的进程看到同一份资源。(和匿名通道和命名通道一样的道理)共享内存一样需要内核结构体描述它,再组织。

2024-03-01 23:18:24 1085

原创 Leetcode202. 快乐数中为什么一定会循环?

相当于我就当它10个9,那么通过一次变换变成了81*10 = 810,所以他以后最后的范围也只能在[0,810]之间,810是最大的,然后任意一个数x,通过810次变换都不重复,那么811次变换那一定会重复的!

2024-02-27 21:23:32 476

原创 Linux命名管道

这上面叫的是匿名管道,不要将两者搞混,匿名管道说的是两个有血缘关系的进程相互通信,但是命名管道就是两个没有关系的管道相互通信。

2024-02-27 20:46:24 489

原创 Linux匿名管道

由于进程具有独立性,要两个进程进行通信是要代价的,所以其本质是让不同的进程看到同一份资源!管道也可以看成文件!

2024-02-09 15:19:35 623

原创 动态库是怎么被加载的?

其实这个0x112233是逻辑地址(偏移量),这就是为什么我上面说1.exe中的逻辑地址和虚拟地址是有区别的,但是先那样理解的原因,因为中间的转换其实有点复杂的。而动态库就存储在共享区段:(系统在运行存在多个动态库的时候,操作系统会先描述(创建结构体)再组织的,将这些库管理起来,所以所有库的加载情况,OS会非常的清楚,动态库只会加载一遍到物理内存中)那么进程找到动态库的内容就会变得容易的多,我们就可以随意的加载动态库到共享区中了!首先,得知道上面这个问题,我们才能知道动态的地址是如何映射的!

2024-02-05 11:09:21 577

原创 静态库和动态库

通过上面的讲解,我们知道一件事:所以,如果很多个进程如果要使用同一个静态库,那么内存中会同时存在很多个相同的数据与代码,因此会很浪费空间,而动态库则可以直接共享,只加载一遍到内存中就可以了!这就是静态库和动态库的区别!

2024-02-03 13:46:11 1124

原创 软连接和硬链接

软连接是一个独立的文件,有独立的inode,也有独立的数据块,它的数据块里面保存的是指向的文件路径-------相当于windows的快捷方式删除一个软连接。

2024-01-31 11:07:07 393

原创 磁盘的硬件结构

1.磁盘被访问的最基本单元是扇区‘,值得注意的是每条磁道的扇区个数是一样的,所以扇区的大小有大有小。所以我们就可以把磁盘看作由无数个扇区构成的存储介质。2.要把数据存到磁盘中,第一个解决的问题就是定位一个扇区:哪一个面,哪一个磁道(柱面),哪一个扇区?Cylinder(柱面),Header(磁头),Sector(扇区)------>CHS寻址。

2024-01-31 10:41:24 410

原创 Liunx中用户缓冲区

为什么说C语言具有可移植性, 就比如fopen()这个还是,在liunx中是用open系统调用的,在window是用其他系统调用函数,但语言层面都是fopen这个函数。只不过到时候选库的时候裁剪就好了。

2024-01-24 15:50:45 412

原创 文件处理的重定义,dup2函数

可以在我上面的博客中了解到,文件其实是被进程以数组的形式存储起来的,而这些oldfd和newfd就这调用这个函数的当前进程中管理这些文件的下标为多少。现在再看这两个参数的关系:newfd被oldfd复制,所以最后存下来的是oldfd。

2024-01-20 22:47:17 414

原创 C中系统调用接口中的open

1.我们学C语言一定学过fopen这个函数,那为什么要讲open函数呢?其实就是从系统调用的层面将文件打开,有点脱离C语言,让对文件处理有更一步的了解。

2024-01-19 15:33:55 642

原创 模拟实现简单的shell

现在已经有初步的形状了。

2024-01-18 14:52:25 407

原创 进程程序替换-exec系列函数

从上面可以看出,after那句话是没有打印的,说明代码是直接替换掉的。(其实吧,我自己理解觉得即使没有完全替换掉,本身执行ls -a -l 这个进程时也是有返回值的,直接返回了,也没有后面什么事情了,也许是我学的还是有点浅显吧。下面就是简单的一个原理再看一下下面的代码和现象:从中我们可以看出子进程在替换前后的pid都是没有发生改变的。说明程序替换中不创建新的进程,只进行进程的程序代码和数据的替换工作。

2024-01-14 22:43:47 439

原创 Makefile中如何同时执行两个可执行文件

makefile

2024-01-14 21:48:35 512

空空如也

空空如也

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

TA关注的人

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