
Linux
文章平均质量分 96
Linux
搬砖狗(●—●)
这个作者很懒,什么都没留下…
展开
-
Linux(进程地址空间)
接下来我们就可以理解最开始我们所提出的问题了,fork()以后,子进程产生,它包含了父进程的大部分属性,其中他们的虚拟地址就可以是一样的,此时的子进程与父进程共享物理内存中的代码与数据,而如果我们此时需要更改子进程的数据,会将父进程的数据拷贝一份,并不会影响父进程,子进程的页表会重新映射子进程在物理内存中的数据,这就是为什么我们更改了数据,但是地址并没有发生改变的原因。我们需要知道的是,我们平时所打印出来的地址,其实都不是物理地址,而是虚拟地址,是由操作系统进行管理的,我们是看不到的。原创 2023-08-09 11:05:03 · 317 阅读 · 0 评论 -
Linux(环境变量)
因为系统就是通过环境变量PATH来找到ls命令的,可以看到环境变量PATH当中有多条路径,这些路径由冒号隔开,当你使用ls命令时,系统就会查看环境变量PATH,然后默认从左到右依次在各个路径当中进行查找。而我们的mytest并不在此路径下。现在我们来说说main函数的前两个参数,main函数的第二个参数是一个字符指针数组,数组当中的第一个字符指针存储的是可执行程序的位置,其余字符指针存储的是所给的若干选项,最后一个字符指针为空,而main函数的第一个参数代表的就是字符指针数组当中的有效元素个数。原创 2023-08-06 09:03:59 · 406 阅读 · 0 评论 -
Linux(进程)
优先级实际上就是获取某种资源的先后顺序,而进程优先级实际上就是进程获取CPU资源分配的先后顺序,就是指进程的优先权(priority),优先权高的进程有优先执行的权力。原创 2023-08-06 08:54:50 · 450 阅读 · 0 评论 -
Linux常见指令
用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中。mv命令是move的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命令,经常用来备份文件或者目录。cp -f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在。cp -R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理。原创 2023-07-14 09:51:08 · 126 阅读 · 0 评论 -
Linux(权限)
可以再linux系统下做任何事情,不受限制。:在linux下做有限的事情。超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。:su [用户名]:切换用户。例如,要从root用户切换到普通用户user,则使用 su user。要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。原创 2023-07-16 10:44:35 · 107 阅读 · 0 评论 -
Linux(进程控制)
也就是说,在return之前,子进程就已经创建完成了,return就需要父进程子进程都执行,而return的本质就是对id的写入,父进程返回一个id,子进程返回一个id,对于父子进程返回的id程序都需要进行执行,所以此时就会有两个返回值。上述例子中,我们可以发现,当子进程未退出时,父进程一直就在等待子进程,其他什么事都没有做,此时进程父进程就会进入阻塞状态,当子进程运行完毕,父进程立马被唤醒,接收子进程pid,此时状态就叫做阻塞状态。在status的低16比特位当中,高8位表示进程的退出状态,即退出码。原创 2023-08-15 16:18:33 · 1001 阅读 · 0 评论 -
Linux(基础IO)
我们知道C,C++中存在各类文件操作,但是我们需要理解,并不是C,C++直接去访问这些文件的,他们通过系统所提供的的接口进行访问,然后进行各种操作。OS接口只有一套,但是不同语言文件访问接口不一样,所以就需要对系统接口进行封装,因为一旦都使用系统接口,编写文件代码,就无法在其他平台运行,不具备跨平台性了,所以这也是我们学校系统文件接口的主要原因,更好的理解C,C++文件操作的底层结构。原创 2023-09-04 16:11:55 · 593 阅读 · 0 评论 -
Linux之进程间通信
进程间通信简称IPC(Interprocess communication),进程间通信就是在不同进程之间传播或交换信息。原创 2023-10-01 15:40:45 · 304 阅读 · 0 评论 -
Linux之线程池
并且我们会发现这3个线程在处理时会呈现出一定的顺序性,因为主线程是每秒push一个任务,这3个线程只会有一个线程获取到该任务,其他线程都会在等待队列中进行等待,当该线程处理完任务后就会因为任务队列为空而排到等待队列的最后,当主线程再次push一个任务后会唤醒等待队列首部的一个线程,这个线程处理完任务后又会排到等待队列的最后,因此这3个线程在处理任务时会呈现出一定的顺序性。:指的就是一个类只能创建一个对象,该模式可以保证系统中该类只有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享。原创 2023-10-27 16:27:42 · 818 阅读 · 1 评论 -
网络编程套接字(一)
户端运行之后提示我们进行输入,当我们在客户端输入数据后,客户端将数据发送给服务端,此时服务端再将收到的数据打印输出,这时我们在服务端的窗口也看到我们输入的内容。对于同一台主机上,数据存储的方式一样,所以无论是大端存储还是小端存储,并不会出现问题,但是涉及到网络传输以后,在多台机器之间进行数据传输,可能一台机器存储方式为大端存储,另一台机器的存储方式为小端存储,在进行数据传输以后原本大端存储的是数据会被按小端方式识别出来,而原本小端存储的是数据会被按大端方式识别出来,导致数据识别出现错误;原创 2023-10-31 15:27:49 · 137 阅读 · 0 评论 -
网络编程套接字(二)
我们知道,子进程创建成功以后,父子进程共享一个文件描述符表,但是父进程创建子进程后,由于进程间独立性,父子进程之间并不会相互影响,所以,父进程文件描述符的变化并不会影响子进程,就像匿名管道一样,父进程先调用pipe函数得到两个文件描述符,一个是管道读端的文件描述符,一个是管道写端的文件描述符,此时父进程创建出来的子进程就会继承这两个文件描述符,之后父子进程一个关闭管道的读端,另一个关闭管道的写端,这时父子进程文件描述符表的变化是不会相互影响的,此后父子进程就可以通过这个管道进行单向通信了。原创 2023-11-03 22:36:44 · 307 阅读 · 0 评论 -
Linux信号量
我们可以让生产者不停的进行生产,而消费者每隔一秒进行消费,此时由于生产者生产的很快,运行代码后一瞬间生产者就将环形队列打满了,此时生产者想要再进行生产,但空间资源已经为0了,于是生产者只能在space_sem的等待队列下进行阻塞等待,直到由消费者消费完一个数据后对space_sem进行了V操作,生产者才会被唤醒进而继续进行生产。当执行流在申请信号量时,可能此时信号量的值为0,也就是说信号量描述的临界资源已经全部被申请了,此时该执行流就应该在该信号量的等待队列当中进行等待,直到有信号量被释放时再被唤醒。原创 2023-10-24 16:04:11 · 130 阅读 · 0 评论 -
Linux线程安全
首先,我们得理解,单纯的加锁并不存在什么什么问题,但是由于各个线程之间的竞争能力有所差异,可能就会存在某一个线程频繁地申请锁和释放锁,假设此时我们有一个线程A和B,线程A需要写入数据,线程B需要读取数据,此时线程A的能力强一点,他就会一直申请锁和释放锁。增加这个规则之后,下一个获取到锁的资源的线程就一定是在资源等待队列首部的线程,如果有十个线程,此时我们就能够让这十个线程按照某种次序进行临界资源的访问,这就叫做同步,引入同步后该问题就能很好的解决。原创 2023-10-10 16:04:08 · 1386 阅读 · 0 评论 -
Linux认识协议
上面服务端代码包含了许多细节类的问题,因为我们需要进行结构化数据的传输,所以我们的服务端接收数据的过程是将序列化数据反序列化,因为我们服务端是要进行计算的,我们的网络计算器底层是以TCP来实现的,就存在字节流->结构化的转换问题,就像我们在读取数据的过程中,此时单纯的recv已经不能满足我们的需求,所以我们在接下来定制协议的过程,就需要考虑数据完整性的问题。因此客户端最好把这些结构化的数据打包后统一发送到网络当中,此时服务端每次从网络当中获取到的就是一个完整的请求数据,客户端常见的“打包”方式有以下两种。原创 2023-11-06 16:51:46 · 268 阅读 · 0 评论 -
Linux进程信号
此时,在换上另一个进程的代码和数据,当另一个进程代码和数据运行完毕后,此时需要运行我们刚才进程的时候,在唤醒我们刚刚放入寄存器中的进程代码和数据,继续运行刚刚的进程,如此,就完成了进程间切换。但如果待处理信号是自定义捕捉的,即该信号的处理动作是由用户提供的,那么处理该信号时就需要先返回用户态执行对应的自定义处理动作,执行完后再通过特殊的系统调用sigreturn再次陷入内核并清除对应的pending标志位,如果没有新的信号要递达,就直接返回用户态,继续执行主控制流程的代码。原创 2023-10-06 10:04:21 · 841 阅读 · 0 评论 -
Linux生产者消费者模型
生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消费者不找生产者要数据,而是直接从阻塞队列里取,阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。对应到生产者消费者模型中,函数传参实际上就是生产者生产的过程,而执行函数体实际上就是消费者消费的过程,但生产者只负责生产数据,消费者只负责消费数据,在消费者消费期间生产者可以同时进行生产,因此生产者消费者模型本质是一种松耦合。我们仍然让生产者生产的快,消费者消费的慢。原创 2023-10-19 15:44:40 · 197 阅读 · 0 评论 -
Linux网络基础
此时局域网1内的数据要发送到局域网2时,路由器接收到局域网1发送的数据以后,会先对以太网的报头进行解包,将剩下的数据交付给网络层,此时网络层在进行一系列的操作以后,再将数据向下交付给链路层,此时数据就会添加令牌环相应的报头信息,然后再将信息发送至局域网2,此时该数据就能够在令牌环网当中传输了。我们有了这样的约定后,当甲计算机向乙计算机发送类似于{1, 0x1234}的数据时,乙计算机识别到code的值是1,于是就知道了甲计算机是让自己将data的值存储进数据库,这是一种纯软件的约定方案。原创 2023-10-29 10:09:29 · 350 阅读 · 0 评论 -
Linux之多线程
在一个程序里的一个执行路线就叫做线程(thread)。更准确的定义是:线程是“一个进程内部的控制序列”;一切进程至少都有一个执行线程;线程在进程内部运行,本质是在进程地址空间内运行;在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化;透过进程虚拟地址空间,可以看到进程的大部分资源,将进程资源合理分配给每个执行流,就形成了线程执行流。原创 2023-10-08 10:12:11 · 160 阅读 · 0 评论 -
HTTP协议
HTTP(Hyper Text Transfer Protocol)协议又叫做超文本传输协议,是一个简单的请求-响应协议,HTTP通常运行在TCP之上。原创 2023-11-10 09:59:28 · 141 阅读 · 0 评论 -
传输层协议-TCP协议
比如此时有两个人小花和小红,两个人在面对面进行交流,对方说话两个人都能听见,但是两个人相隔50米以后,此时再说话,对方也就无法听见了,这也就造成消息的不可靠性,其实本质上就是距离变长了,因此,要进行设备间的通信,就必须引入可靠性,如果要进行通信的各个设备相隔千里,,传输数据时出现错误的概率也会大大增高,此时要保证传输到对端的数据无误。网好的时候重传的时间可以设置的短一点,网卡的时候重传的时间可以设置的长一点,也就是说超时重传设置的等待时间一定是上下浮动的,因此这个时间不可能是固定的某个值。原创 2023-11-19 14:42:34 · 229 阅读 · 0 评论 -
传输层协议-UDP协议
应用层中的每一个网络进程都会绑定一个端口,对于客户端进程来说,端口是操作系统动态进行分配的,而服务端就需要我们显示的绑定端口,UDP就是通过报头当中的目的端口号来找到对应的应用层进程的。如果UDP中不存在接收缓冲区,上层在接收数据是就需要及时的将UDP读取到的报文给读取上去,否则就会出现上一个报文还没有被读取,下一个报文已经来了,此时刚从底层获取的报文就会被丢弃。需要注意的是,UDP协议报头当中的UDP最大长度是16位的,因此一个UDP报文的最大长度是64K(包含UDP报头的大小)。原创 2023-11-14 21:19:25 · 276 阅读 · 0 评论 -
Epoll服务器(ET工作模式)
如果我们传输的单纯是一个字符串,直接发送到网络中就可以了,但是如果是一些结构化的数据,比如实现一个计算器,他会存在左操作数,右操作数,操作符等,如果一个一个进行发送,就需要一个一个进行接收,此时服务端还需要纠结这些数据如何组合,所以我们可以将这些结构化数据打包。未来我们除了要添加_listensock以外,还需要需要添加大量的sock,所以我们的AddConnection函数就需要就需要将读回调,写回调,异常回调全部考虑在内,在进行_listensock添加时将写回调,异常回调设置为空即可;原创 2023-12-09 15:09:08 · 160 阅读 · 0 评论 -
Linux之高级IO
进行异步IO需要调用一些异步IO的接口,异步IO接口调用后会立马返回,因为异步IO不需要你进行“等”和“拷贝”的操作,这两个动作都由操作系统来完成,你要做的只是发起IO,当IO完成后操作系统会通知应用程序,因此进行异步IO的进程或线程并不参与IO的所有细节。当我们输入数据以后,此时read函数就会检测到底层的数据已经就绪了,就会将缓冲区中的数据拷贝到我们的buffer数组中,并且将读取到的数据输出到显示器上面,最后我们就看到了我们输入的字符串。原创 2023-11-27 10:46:03 · 1333 阅读 · 0 评论 -
DNS/ICMP协议、NAT技术
域名是用来识别主机名称和主机所属的组织机构的一种分层结构的名称,例如www.baidu.com。com:一级域名,表示这是一个工商企业域名。同级的还有.net(网络提供商)和.org(开源组织或非盈利组织)等。baidu:二级域名,一般对应的就是公司名。www:只是一种习惯用法,之前人们在使用域名时,往往命名成类似于ftp.xxx.xxx/www.xxx.xxx这样的格式,来表示主机支持的协议。应用层的作用:负责应用程序间沟通,完成一系列业务处理所需服务。原创 2023-11-25 16:31:37 · 305 阅读 · 0 评论 -
HTTPS协议
数据指纹(数据摘要),其基本原理是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数据摘要。数据指纹并不是一种加密机制,但可以用来判断数据有没有被篡改;摘要常见方法:MDS、SHA1、SHA256、SHA512等,算法把无限的映射成有限,因此可能会有碰撞(两个不同的信息,算出相同的摘要,但是概率非常低);摘要特征:和加密算法的区别是,摘要严格意义上说不是加密,因为没有解密,只不过从摘要很难反推原信息,通常用来进行数据对比。原创 2023-11-12 15:47:46 · 137 阅读 · 0 评论 -
I/O多路转接之select/poll/epoll
虽然当前的select服务器是一个单进程的服务器,但它却可以同时为多个客户端提供服务,根本原因就是因为select函数调用后会告知select服务器是哪个客户端对应的连接事件就绪了,此时select服务器就可以读取对应客户端发来的数据,读取完后又会调用select函数等待某个客户端连接的读事件就绪。此时如果select监视的文件描述符上有事件就绪,那么select函数的返回值就是大于0的,如果select监视的文件描述符上没有事件就绪,那么select的返回值就是等于0的。原创 2023-12-01 10:56:33 · 180 阅读 · 1 评论 -
网络层协议-IP协议
分片就是将一个比较大的报文,拆成多个小的,满足条件的报文,分片的行为是网络层做的,同样,组装的行为也是对端网络层做的,对于TCP/UDP,将数据传输给下层以后,他其实并不关心下层是怎么将数据发送的(我将一个完整的数据发送给你,就必须传输回来的数据也是完整的,至于怎么实现,就是网络层的事情)。双方进行网络间通信,不仅仅是需要将数据发送出去的,还需要将数据向上交付,我们知道TCP/UDP发送给网络层是一个完整的数据,那么我们在进行数据向上交付的时候,也需要一个完整的数据,这就需要我们对分片的报文进行组装了。原创 2023-11-23 15:23:00 · 203 阅读 · 0 评论 -
数据链路层-以太网协议
所以在同一个网段内,我们需要通过IP地址得到对方的MAC地址,这就叫做ARP协议。在进行局域网通信时,就算只知道对方的IP地址,而不知道对方的MAC地址,也可以以广播的方式将数据发送到局域网当中,此时局域网当中的主机也能够在IP层比对目的IP地址与自己是否相符,来判断收到的这个数据是否是发送给自己的。在IP层中,不仅仅源端主机会进行数据的分片,数据在路由的过程中也会进行分片,因为不同的网络MTU可能是不一样的,如果传输路径上的某个网络MTU要比源端主机上的MTU小,数据在路由的过程中就可能会产生分片。原创 2023-11-24 17:28:11 · 649 阅读 · 0 评论