自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Linux网络相关概念和重要知识(5)(对会话和表示层的理解、网络计算器的实现)

本文在前面TCPServer、线程池、日志已经实现的情况下,以网络计算器的实现为主线,重点理解OSI定义的七层模型,以及理解为什么后面精简到了五层。

2025-04-02 22:57:55 420

原创 Linux网络相关概念和重要知识(4)(序列化和反序列化、TCP协议、会话和守护进程)

json处理后的数据是有效载荷,我们还可以自己给这个有效载荷做一层包装。因为TCP是面向字节流的,有了这一层包装可以进一步保证资源传输完整性。格式:head_length(有效载荷的长度)\r\n + 有效载荷(json处理后的数据)+ \r\n到此为止,我们就实现了一个自己的协议。对于客户端,它需要将发送的数据通过协议里面的包装函数转换成上述格式的字符串传出去,接收端再按照相应的解包函数逆向还原结构化数据,然后调用将这些数据作为参数调用服务,最后再将结果通过协议返回给客户端。

2025-04-02 22:27:20 954

原创 Linux网络相关概念和重要知识(3)(TCP套接字编程、远程命令的实现)

远程命令,即让远程主机返回本地输入的结果。和聊天室的逻辑几乎一致。有的命令很危险,可以通过黑名单(哪些不能执行)和白名单(哪些命令可以执行)来实现保护。

2025-03-22 11:45:05 869

原创 Linux网络相关概念和重要知识(2)(UDP套接字编程、聊天室的实现、观察者模式)

总体bind流程:

2025-03-20 17:21:24 818

原创 Linux网络相关概念和重要知识(1)(网络协议、网络通信)

虽然有七层,但定标准和实现的是不同人。OSI规定了标准,要求其它公司写系统需要遵循该网络协议,这些公司实现时发现不需要这么复杂,就省去了,但必要的接口都是按照标准来的,因此OSI还是实现了它的目标。下面是常见的协议分层(5层)应用层和传输层还存在表示层和会话层,后续用到再说,大部分情况这5层就足够了。

2025-03-02 23:38:35 850

原创 Linux相关概念和易错知识点(33)(基于阻塞队列和环形队列的生产消费模型实现、sem的应用)

1个交易场所(阻塞队列、环形队列等),不同的生产消费模型交易场所不同,可以满足不同需求。,在上篇博客中代码已经表明了。要维护好生产消费模型,3种关系一定要保证,即。(生产者和生产者、消费者和消费者、生产者和消费者)、后续我们的设计一定要满足这“321”原则,缺一不可。wait申请信号量如果成功就会继续执行下面的代码,并且这次我创建了两把锁,因为对于。要实现生产消费模型,无外乎是。于是满足生产消费模型的条件。这就是线程池中的采用的方法。,和mutex一样。这里需要注意的是生产者的。(生产者、消费者)、

2025-03-01 15:29:05 1043

原创 Linux相关概念和易错知识点(32)(互斥锁和条件变量的封装、日志和线程池的实现)

就像老师想关心学生成绩,就直接跑到班上去一个一个问。但万一记错了呢?跑错班了呢?这始终不方便。当封装之后,就形成一个管理一把锁的类。什么叫管理一把锁的类?就是这个。

2025-03-01 13:32:12 1178

原创 C++相关概念和易错语法(34)(C/C++缓冲区同步刷新、IO流)

cin和cout是绑定的,意思是调用cin就会先刷新输出缓冲区,调用cout就会先刷新输入缓冲区,这和前面我们遇到的效率问题类似。

2025-02-26 09:49:01 1007

原创 Linux相关概念和易错知识点(31)(生产者-消费者模型、认识信号量、线程安全)

形象的说法是,申请别人不会释放的资源,并且自己也不释放资源、僵持不下的状态就叫死锁。举个例子,B申请A的锁,并且说它得到A的锁后就会释放自己的锁;与此同时,A也在申请B的锁,并且说它申请到B的锁后才会释放自己的锁。它们两个线程谁也不让谁,这就陷入了死锁。单线程也可能产生死锁,一把锁也可能把自己锁住,如连续两次申请锁。当第二次申请锁时,这个线程的右手想要拿左手正在拿着的锁,左手对右手说它需要执行到unlock才会释放,而右手说它马上就要这把锁,不然不让走。这就陷入了死锁。

2025-02-23 21:17:20 1025

原创 Linux相关概念和易错知识点(30)(线程互斥、线程同步)

导致临界资源出现混乱的原因是。

2025-02-23 18:58:46 1028

原创 Linux相关概念和易错知识点(29)(线程相关性质和操作、线程封装)

不仅如此,所有线程的属性也都做了上层封装,在struct pthread里面,由pthread.so维护,这是上篇文章提到的。我们接着看LWP,469053和469054,显然前者为主线程,后者是新线程,这个对象调用其成员函数的整个过程都是在主线程中执行的,只是在类域里面执行函数,创建线程还是算作主线程创建的。我们还能发现主执行流的LWP和PID的值一致,新线程的LWP是紧接着的数字。只要理解了线程控制的基本操作,基本的线程封装就很快能写出来了,我简要讲解思路即可。,我们之前因为都是单线程没发现这一点。

2025-02-19 03:05:00 1043

原创 Linux相关概念和易错知识点(28)(线程控制、Linux下线程的底层)

成功返回0,错误返回错误码。

2025-02-17 22:38:02 923

原创 Linux相关概念和易错知识点(27)(认识线程、页表与进程地址空间、线程资源划分)

接着刚才的例子:找到0010110101 0011010111 0000000000对应地址,这就是某一个页框的起始地址。虚拟地址101011010101会作为该页框的偏移量。至此,虚拟地址能够转为物理地址0010110101 0011010111 101011010101。

2025-02-14 17:06:24 781

原创 Linux相关概念和易错知识点(26)(命名管道、共享内存)

总的来说,key由用户层去设置更容易管理,但key怎么设置呢?理论上只要不冲突,就可以随便设。如果冲突,就会出错,需要手动改,如果我们不希望自己去设置,

2025-01-26 20:41:55 978

原创 Linux相关概念和易错知识点(25)(信号原理、操作系统的原理、volatile)

对于OS来说,只要完全没有进程,它就陷在死循环中,但只要有进程,就会一直忙着调度,这是时钟源的中断推着它进行的。我们因此可以说。

2024-12-21 11:53:44 1113

原创 Linux相关概念和易错知识点(24)(认识信号、信号捕捉)

其中利用了回调函数的知识。其返回值是返回先前的handler的值,

2024-12-12 23:01:20 660

原创 Linux相关概念和易错知识点(23)(进程间通信、匿名管道、进程池)

通过进程池的代码,我们能够进一步深入了解进程间通信的原理,其中最难理解的就是数据不一致问题,匿名管道的面向字节流就决定了它不适合多次数据传输,不过我们依然使用它走完了进程池的流程,了解即可。在整个过程中,读写端都将对方当作了文件,都是对pipe文件进行IO,这再次体现出Linux一切皆文件的思想,值得我们体会。

2024-12-05 22:06:09 944

原创 Linux相关概念和易错知识点(22)(ELF格式、可执行程序的加载、共享库)

如果没有逻辑地址的概念,那么编译器会很难办,因为内存的使用都是动态变化的,没有哪一块空间是每时每刻都空闲着的,如果给这个指令编址后,当运行程序时,这个地址被占用怎么办?除此之外,如磁盘上的文件的物理地址,各个section的位置都是以偏移量的形式来保存的。由于section偏移量及其大小属性的存在,程序加载时不一定就要加载数据,可以先根据section的偏移量初始化页表的虚拟地址,当执行时懒加载,当然也可以分批加载。调用库函数的基本逻辑是修改库所在位置的起始地址,加上库方法本来就有的逻辑地址定位。

2024-11-21 09:46:19 1112

原创 Linux相关概念和易错知识点(21)(软硬链接、动静态库)

理解两者的差异,搞清楚为什么要这么做很重要。

2024-11-20 14:44:04 1158

原创 Linux相关概念和易错知识点(20)(dentry、分区、挂载)

系统最开始就要加载根目录到内存中,创建dentry,后续的访问也都是根据根目录文件的内容来逐渐建立dentry多叉树的。当我们cd进入某一个目录里时,有可能我们根本没有进入对应的目录文件(目录文件真实存在),而实际上进入了一个分区,这是通过挂载点进行特殊实现的。我们的dentry讲解中存在一个巨大的漏洞,那就是文件的inode是以分区为界限的。,会按照ext2的格式结合我们文件的大小自动将分区分为不同的块,初始化超级块等操作。问题的根源来自分区的确定,我们只要确定了分区,上面的问题就都能解释了。

2024-11-09 17:59:16 954

原创 Linux相关概念和易错知识点(19)(HDD、Block group)

之后就需要存储内容了。我们需要知道,存储数据时会在GDT找Block Bitmap的空闲块,最后在对应的Data blocks存数据。但如果这个时候Data blocks存满了呢?inode是白白创建了吗?我们需要删掉这个inode,直到找到一个能存数据的组再创建inode并存储吗?

2024-11-09 08:24:39 855

原创 Linux相关概念和易错知识点(18)(重定向、语言级缓冲区)

用户级(语言级)缓冲区是为了减少系统调用的次数,减少系统调用的开销;系统级缓冲区是为了减少IO次数,减少和硬件访问的次数。语言级缓冲区的设计原则就是:尽量少的调用系统接口。我们能意识到C语言的语言级缓冲区的设计非常注重效率。C++文件流里面也有缓冲区,是类似的。我们平时其实也都需要遵循这个原则。如申请内存一般都是一次申请比较多的空间,用空间换时间。

2024-10-29 12:42:47 977

原创 Linux相关概念和易错知识点(17)(文件、文件的系统调用接口、C语言标准流)

这显然需要每个进程的共同作用。并且还有一些文件相关的属性等也都需要单独维护,这就是files_struct干的事情了。

2024-10-28 21:15:00 752

原创 Linux相关概念和易错知识点(16)(Shell原理、进程属性和环境变量表的联系)

这样做的好处是子进程执行失败完全不会影响父进程的安全性,如果直接让父进程执行所有命令,那么如果出了一个较严重的错误,父进程就直接被挂掉了,这显然不是我们希望看到的。获取的环境变量是从我们自己拷贝得到的环境变量表中取,而不是在该进程原本的环境变量表中取。,我们可以在函数里定义string,然后返回它,这样做不会出现和数组那样的野指针问题,会自动初始化一个新的string。,但事实上修改cwd后PWD依然不变,cwd和PWD都只是数据而已,并没什么大不了的,因此我们需要手动putenv。但程序中还有一个变量。

2024-10-22 23:19:55 875 1

原创 Linux相关概念和易错知识点(15)(exec系列函数)

fork函数内部会为我们拷,数据和代码,创建PCB,当走到最后return语句时两个进程分别返回,之后父子进程保持独立。但当execl成功时,它是没有返回值的,因为execl是对进程的代码数据进行完整地替换,当execl成功时,它自己也被覆盖了,自然不存在返回值这种说法。这中间涉及到子进程原有代码和数据的回收,硬盘导入新的代码和数据到内存中,修改页表和进程地址空间,修改一些PCB属性等操作。如execlp("ls", "ls", "a", NULL),虽然第一个和第二个参数同,但含义却不同。

2024-10-10 16:47:33 1134

原创 Linux相关概念和易错知识点(14)(进程终止、进程退出、退出信息)

我们通过status可以得到退出相关信息,但是上图所示似乎不太对劲,每一次打印都是得到6144,而进程的退出码应该都是24才对。我们之前讲过当父进程退出而子进程还在工作时,子进程就会变成孤儿进程并被系统领养,孤儿进程会被自动移到后台运行。并且有的时候我们想要创造孤儿进程,不想让父进程一直等着一个相当长时间不会退出的子进程,父进程wait子进程除了避免僵尸或孤儿,还想要知道子进程任务完成的怎么样,也就是子进程的退出码。注意,如果这个父进程是系统相关的进程,我们就无需担心,它会自己wait。

2024-10-10 09:27:47 1185

原创 Linux相关概念和易错知识点(13)(进程地址空间、页表、虚拟地址)

编译器、用户访问、进程管理,你能想到的一切操作,它们都只能拿着虚拟地址进行访问和操作,这些操作都会传到页表的手上,一切对物理空间的访问都需要页表来管理。我们new出来的堆区空间本质上也不是在开辟物理空间,而只是在进程地址空间里做文章,这个空间本质是虚拟的,最终是靠页表帮我们创建的物理空间。,且不同的系统、编译器存在不同程度的优化,因此我们要接受理论和实践上的差别。我们先来认识常见的划分方式。,也就意味着无论我们修改数据,实际指向的代码大概率是不会被拷贝的,就算被拷贝,只要内容不变,也不影响上述结论,同时。

2024-10-08 11:11:36 1061

原创 Linux相关概念和易错知识点(12)(命令行参数、环境变量、本地变量)

当我们理解清环境变量的内存级属性,以及它和bash之间的关系之后,我们对环境变量又有了一个新的认识,也对之前的进程的属性的认识更上一层楼。同时bash也是一个进程,这个进程也有自己的cwd,它会使用类似chdir()的操作设置自己的cwd,这个cwd就是刚刚读取到的配置文件中HOME的路径,即家目录。,虽然我们可以进行内存级修改,但毕竟环境变量是程序启动的根基,所以一般都是以读的形式访问,这和本地变量有很大区别。PWD也是环境变量的一种,它指向了我们当前的工作目录,指令pwd就是读取该环境变量。

2024-10-07 01:01:04 700

原创 Linux相关概念和易错知识点(11)(进程调度、Linux内核链表)

比如假定bitmap[0]是5,根据101B,我们得到PCB* queue[140]的第0位和第2位有进程,其余30位都没有进程,可以直接跳过。当nr_active == 0时,active和expired的指针交换,这个时候我们就发现expired(原来的active)空了,active(原来的expired)满了。runqueue中active、expired、array[2]存在的意义很明确,没有它们就构不成整个调度的流转,上述的过程就是它们存在的意义。,链入规则和前面一样,都遵循哈希算法。

2024-10-02 18:33:36 1154

原创 Linux相关概念和易错知识点(10)(进程优先级、进程切换)

在ir保存指令且eip更新完成之后,CPU就会执行ir里面的指令,之后ir再次导入eip指定位置的指令,eip更新,CPU处理,以此类推......此外,还有。进程是基于时间片来进行调度轮转的,当一个进程在时间片到的时候,不一定执行完了,但此时为了公平性它不能再执行了,CPU必须切换开始执行下一个进程的任务。优先级(建立在已经有权限的基础之上,就是谁先谁后的问题),权限(能还是不能的问题),没权限一定没有优先级的概念。进程的优先级竞争的是CPU资源。,包括NI的修改是有限的,也是基于这个原则来限制的。

2024-09-30 17:06:44 1025

原创 Linux相关概念和易错知识点(9)(父进程、子进程、进程状态)

(如杀毒软件,常驻内存进程),对于那些进程而言如果不及时释放数据,确实会一直增加内存占用,但那种一跑起来就退的进程有点内存泄漏其实不影响。进程的创建遵循树状结构,(时刻注意bash的本质是命令行解释器的进程,并且是因为它最早出现,所有进程都是在它的界面下启动的,因此才成为用户的父进程)这样整个进程都被阻塞了,如果是代码也不会继续执行了,因为CPU需要进程的PCB才能操作,而此时PCB在设备队列里。对于由系统父进程创建的子进程而言,Z状态基本上就是一瞬间的事,但对于我们自己创建的进程,情况就有些不一样了。

2024-09-30 14:03:16 1247 1

原创 Linux相关概念和易错知识点(8)(操作系统、进程属性)

这些任务列表会根据并行的处理方式交给CPU每个核心处理,CPU的每个核心都配有一个调度器,任务列表会先交给调度器,由调度器决策如何并发处理,适时将对应的PCB交给运算器进行处理。包括生活中,上层对我们的管理也是面向对象的思想,他们不需要和我们见面,他们只需要拿到我们的描述信息,一天里干了什么没干什么,再通过传话就可以实现对我们的管理。,每一种硬件都要有自己的驱动程序(操作系统自带或需要自己安装),驱动程序不可或缺,因为不同硬件功能不同,实现不同,迭代速度快,在硬件层面,有文件系统对磁盘数据进行管理,而。

2024-09-26 07:52:04 849

原创 Linux相关概念和易错知识点(7)(git、冯诺依曼体系结构)

因为硬盘和CPU比起来太慢了,会受到木桶效应限制,而内存是读取速度稍快,价格稍低的硬件,可以说DRAM极大降低了计算机的价格,是冯诺依曼体系结构中很重要的一环。换句话说,就算哪一天Gitee和Gitub突然出问题,远端仓库全部销毁了,git管理的本地仓库依然有全套数据和修改,我们换一个能提供远端仓库的服务器就好了。隐藏的目录.git中,可以找到这个index暂存区,index是一个特殊编码的文件,使用git自己的编码格式。我们可以只建立一个本地的仓库,然后用git管理,这样也省去我们自己手动管理的时间。

2024-09-24 13:08:17 1118

原创 Linux相关概念和易错知识点(6)(make、makefile、gdb)

当我们执行make时,就会根据makefile在当前目录下找test.c文件,类似函数的参数,目标生成的文件就是test。在makefile我们可以写很多指令,实现不同功能,不同功能的指令都需要先声明依赖关系,再执行依赖方法。我们发现,目标文件是a,没有依赖文件,但是实际执行指令时用到了test.c,生成的文件又是test,和目标文件a完全不沾边,这应当如何解释?在很多情况下依赖文件和目标文件是一种建议,是一种规范,规范必定带来好处,其中有一个就是自动推导。当make时,会根据目标文件和依赖文件入栈出栈,

2024-09-23 22:42:51 939

原创 Linux相关概念和易错知识点(5)(权限的修改、时间属性)

4会减掉r,实际减掉r,所以这就是为什么54处理后没有区别,多出来的1本来就没有,会被抛弃。当合作时,由于拥有组和所属组只能由两个用户当,大部分人都会是other,要保证共享目录编辑还必须开放目录中other的w权限,这就会导致一些误删的情况出现。也就是说,002就是减掉other中和2对应的权限w,因此我们会发现最终权限表示中目录和文件的other都少了w权限。当我们使用chmod时,属性被修改了,但内容没有被修改,于是只有Change被修改, 而Modify不会被修改。在Linux中划分了三个组,

2024-09-21 17:54:28 921

原创 Linux相关概念和易错知识点(4)(自举、vim)

这三个按键有细微区别,i是进入插入模式后什么都不做,a是如果后面有一个字符光标就会向后跳一位(不能创建空格,后面没有字符时什么都不做),o就是进入后光标换行(可创建空格,后面没有字符时也可以提行)。先用汇编写出第一代C语言编译器,再用C语言自举,写出第二代编译器,我们的第二代编译器可以实现更多的功能,只要第一代编译器没有问题,我们就能不断以较低成本维护和更新语法。我们无需担忧怎么用一门语言写自己的编译器,这是语言设计者应当考虑的,设计的语言逻辑必须完备且自洽,是能够对自己的词法语法进行处理的。

2024-09-19 18:23:44 1030

原创 Linux相关概念和易错知识点(3)(yum、gcc、动静态库)

国内也有相应的云服务器,我们也可以自己换成国内的镜像网址(下载yum源后mv掉原来的,清理原来的配置文件,最后配置新的yum),了解流程即可。,第一次使用时会根据里面的URL到网站里获取信息版本号等信息,所以我们会发现第一次使用会等几秒,但是第二次使用就没这个问题了,因为这些软件信息会缓存到本地,这些软件的信息就叫元数据缓存。,这些东西构成了操作系统的生态,yum就是操作系统生态的体现,它背后是无数开发者向往开源精神的结晶,这一切也与商业并行,如此才能稳定。,像安卓开源也是这样,建立了很强大的生态优势。

2024-09-19 08:37:44 1114

原创 Linux相关概念和易错知识点(2)(用户、文件和目录、inode、权限)

有人会想,目录中不仅可以存文件,还可以存目录,事实上,刚刚的解释完全适用于这种嵌套结构,因为不管是目录还是文件,它们在上层目录的内容中就只是名字+inode编码的键值对而已。张三是人的名字,领导是该人的身份,他所拥有权限取决于这个人的身份,,就像张三在公司是领导,回家就是丈夫。它的权限甚至可以直接删除整个系统,即使有的文件正在使用无法删除,但root会将能删的都删了,当退出系统后,剩余的文件也一并带走。也就是说,rm并不能删除有w权限的文件,因为删除一个文件的前提就是要先删掉它的inode和文件名。

2024-09-08 22:44:39 1178

原创 Linux相关概念和易错知识点(1)(交互方式、存储结构、定位方式)

我们日常使用的Windows、iOS、Android都是操作系统,用户都是和操作系统打交道的。但是像Android就是开源的,开源我们可以简单理解为源代码对外开放,我们可以随时修改它,也可以借助它来写一个新的系统。Linux的开源也为它迎来了很多用户。几乎没有区别,/root和/root/都意味着选中该目录,在不同指令下起到不同作用,cd就是切换工作目录到已选中的目录,目录是可以嵌套的,所有的目录都是嵌在根目录以下的。,我们输入我们的需求,内核处理后再和硬件沟通,最后将结果返回到外壳程序,让我们看见。

2024-09-08 11:32:14 1303

原创 C/C++数据结构重要知识点(11)(哈希表、unordered_map和unordered_set封装)

线性探测是把这个坑占了去找挨着的下一个,二次探测是是按照第一次走1^2,如果这个位置也被占了就走2^2,以此类推,三次探测也一样。这里的K就是key的类型,专门为string写了一个特化,其实库里面也是这么做的,string毕竟还是太常见了。,当我们扩容对原来的数据进行重映射时,我们自然希望继续利用好我们的空间,也就是直接将指针交给新的位置保管而不是。如果我们想要找到这个数据,我们只需要再次映射,先找到本来该待的位置,比较数据是否一样,一样就找到了,我们试想,如果我们按照取模的的思想,

2024-09-07 20:56:09 621

空空如也

空空如也

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

TA关注的人

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