
Linux
文章平均质量分 96
Dio夹心小面包
"放弃学习的我们是没有翅膀的雄鹰 不会理智的我们是根茎腐烂的大树"
博客用于复习整理
展开
-
『 实战项目 』Cloud Backup System - 云备份
客户端第一次下载的时候会收到这个响应信息,第二次下载的时候将会把信息发送给服务器,想要让服务器根据这个唯一标识判断资源是否又被修改,如果未被修改则直接使用原先缓存的数据,无需重新下载;与上传文件相似,当服务器检测到一个文件由热点文件变为非热点文件状态后将要对文件进行压缩,压缩后将要与未压缩文件进行区分,将其单独放在一个列表中进行管理;检测一个文件的信息与备份的文件信息是否一致,检测文件是否又被修改,若是文件被修改则需要进行备份;在对一个文件进行压缩后,这个文件压缩后的文件名为原文件名+对应的压缩格式;原创 2025-01-20 16:37:50 · 1152 阅读 · 0 评论 -
『 Linux 』高级IO (四) - Epoll 的工作模式
当然根据不同程序的编码,实际上只能说ET模式的效率普遍高于LT模式的效率,因为实际上两者只是通知方式不同从而使得程序设计者在程序设计方式上不同,当然LT模式也可以编写为类似于ET的方式,即将文件描述符设置为非阻塞模式,并且在每次通知后都循环将本轮的所有数据取走,因此实际上在效率上还是依靠程序的设计;当然ET的IO效率更高的另一个原因为,当ET模式的通知降低频率后所倒逼程序员对每轮数据读取完毕,这意味着TCP将通告一个更大的窗口给对方,在概率上使得对端每次都发送更大窗口大小的数据,提高每次IO的吞吐量;原创 2025-01-08 17:39:22 · 1036 阅读 · 0 评论 -
『 Linux 』高级IO (三) - Epoll模型的封装与EpollEchoServer服务器
当内核就绪队列中已就绪事件大于用户所预设空间时,就绪队列本次只会传递用户预设空间响应数量的就绪事件,余下的就绪事件将继续存放至内核就绪队列当中;其中红黑树用来管理正在被监听的文件描述符,就绪队列用来管理已触发的文件描述符,回调机制用于检测并推送事件触发的结果到就绪队列中;当监听套接字文件描述符事件就绪后,对应的事件将被推送至用户预设空间中,之后才能将监听套接字文件描述符中的新连接进行获取并将新连接。时间到期,没有事件就绪(就绪队列中没有就绪事件,因此不会有就绪事件被推送至用户预设的事件空间中);原创 2025-01-04 23:45:42 · 1249 阅读 · 0 评论 -
『 Linux 』高级IO (二) - 多路转接
其提供了更大范围,甚至是没有上限的数组,因此其需要遍历的范围也将变得更大,就如上述代码而言,每次套接字描述符事件就绪后无非是监听到了新的连接或是某个描述符获取到了新的信息,无论是哪种,实际的处理方式都是对一个描述符进行处理;遍历辅助数组,找到未被占用的地方将新的连接添加到该处,若是辅助数组中所有位置都被占满则表示服务器满载,无法添加新的连接,需要关闭新的连接;最终所返回的结果中就绪的事件不仅仅只有监听套接字获取新连接的事件,同样的还有读写套接字中的可读事件是否就绪,因此需要在。原创 2025-01-04 00:12:39 · 728 阅读 · 0 评论 -
『 Linux 』高级IO (一)
而常常提到的非阻塞IO效率高的原因是在使用非阻塞IO模型时(可能是轮询也可能是信号驱动),在进行等待的过程中进程不会阻塞在原地一直等待至事件就绪,在非阻塞等待事件就绪的这个时间段进程可以去完成一些其他的任务,在总体的效率上提升效率;类型时,其中位图中的位标识对应文件描述符需要关心的对应事件是否就绪,而当该函数因某些文件描述符中的某些事件就绪后而返回,对应的事件类型中的位图将会被修改为事件已经就绪的文件描述符;上述中的模型中除了异步IO外,其他所有的IO模型执行流都将在事件就绪后去进行数据的拷贝操作;原创 2024-12-23 20:36:11 · 653 阅读 · 0 评论 -
『 Linux 』数据链路层 - ARP协议及数据链路层周边问题
由于发出ARP响应的一端在对ARP响应进行封装为MAC帧时对应的MAC地址填充为源发送方的MAC地址,故即使其他设备接收到了该MAC帧也会因为MAC地址不同而丢弃该MAC帧;在确认该ARP报文为响应后,将会检查包含在其中的IP地址和MAC地址,并将ARP响应中的IP地址和MAC地址作为映射关系写入本地的ARP缓存中,通常这个映射信息会有一个。在主机A收到的若干个ARP响应后ARP缓存将会以最先的ARP响应为准,对应的伪造的ARP响应的IP地址为路由器B的IP地址,而对应的MAC地址为主机C的MAC地址;原创 2024-11-30 23:13:01 · 727 阅读 · 0 评论 -
『 Linux 』数据链路层 - MAC帧/以太网帧
在上面的内容中可以了解到,每一个设备都要对所接收到的MAC帧进行检查,确保MAC帧中的MAC地址与本设备的MAC地址相同时才会交付给上层,而真正交付到对应设备时,对应的设备同样的在数据链路层中先进行解包为IP数据包,再由网络层协议如IP协议检查对应的路由表找到下一个设备的IP地址,再交付给数据链路层封装为MAC帧交由下一台设备;在数据传输过程中,通常一个数据若是过大,那么它在网络中需要传输的时间也就更长,因此MAC帧对报文进行了定长的方式,避免过大的报文在网络中进行传输;原创 2024-11-25 23:55:23 · 1567 阅读 · 0 评论 -
『 Linux 』网络层 - IP协议 (二)
通常情况路由器具备了一个非常重要的功能,即构建子网;同时路由器需要实现跨网络通信,说明路由器必须存在两个或以上的IP地址,通常在路由器中可以看到几个接口,分别是一个WAN口和几个LAN口;WAN口IP被称为公网IP,LAN口IP被称为私网IP;其中WAN口对应的IP地址是作为上一层子网,如运营商子网中的其中一个子网IP,而通常一个LAN口则代表一个子网,对于LAN口IP而言,该IP将作为该子网中的第一台设备IP;或者在一些情况下,多个LAN口可以共享同一个子网;原创 2024-11-25 17:03:22 · 1207 阅读 · 2 评论 -
『 Linux 』网络层 - IP协议(一)
通过设置子网掩码可以将一个较大的IP网络划分成若干个更小的网络(子网),这种划分不仅节省IP地址资源,还能提高网络的效率和安全性,对网络进行合理的划分可以减少广播域的大小从而提升网络传输效率;亿左右,而TCP/IP协议规定,每个主机都需要有一个IP地址,虽然采用了DICR缓解了IP地址过于浪费的问题,提高了IP地址的利用率,但实际上IP地址的绝对上限并没有增加;在同一个班级中每个人的号数是独立的,同样的在同一届的专业中,每个班级的班级号也是独立的,但是在不同的班级中可以有相同的班内学号;原创 2024-11-22 22:00:13 · 1218 阅读 · 2 评论 -
『 Linux 』文件与网络套接字的内部关系
假设使用浏览器在线观看视频,网速突然变慢或者是视频数据没有到达时,浏览器将希望从套接字收取更多的数据来显示视频,但由于数据尚未到达,浏览器操作数据的进程可能需要等待,对应的这个浏览器进程将会被添加到该套接字。对应的方法集则是特定于网络协议套接字操作的方法,对应结构体中包含了一系列的函数指针,这些函数指针定义了网络套接字在不同协议栈(如TCP,UDP等)下的行为,包括套接字的创建。方法集在文件指向网络时,主要的操作作用域是对上的,通常情况下在进行网络通信时,数据的生产位置是位于用户层/应用层的,而。原创 2024-11-18 21:05:40 · 951 阅读 · 0 评论 -
『 Linux 』网络传输层 - TCP(四)
但实际上上述的这些策略更多的是考虑网络通信时双端的通信策略,在实际通信过程中所有数据都是需要经过网络的,而网络并不是任何时候的状态都是好的,所以为了保证通信时的可靠性,TCP协议在进行网络通信时也需要对网络进行评估,根据不同的网络健康状态作一定的策略,即。而TCP的连接是和套接字描述符直接相关的,对应的该进程的套接字描述符的生命周期又是伴随进程的,间接来说TCP的连接是与进程的生命周期相关的;原创 2024-11-17 16:41:01 · 973 阅读 · 0 评论 -
『 Linux 』网络传输层 - TCP(三)
通常情况下,已经发出去但是还没有收到应答的报文,需要被TCP暂时保存起来,而实际上这些报文的保存位置通常为发送方的发送缓冲区中,通常情况下无论是由应用层缓冲区发送到TCP中还是TCP缓冲区发送到网络中所用的方式都是以拷贝的方式,即拷贝到对应的位置但仍在原来的位置保留原件,这样可以更加灵活的进行不同策略的实现,如是否进行数据的重发等等;滑动窗口的窗口滑动本质上是以双指针的形式向右动态调整当前窗口的大小,从而拓展滑动窗口大小,与算法中的滑动窗口原理相当,对应的缓冲区的区域划分也是通过这样的原理实现的;原创 2024-11-10 17:04:30 · 1325 阅读 · 0 评论 -
『 Linux 』网络传输层 - TCP(二)
为什么是三次握手三次握手是TCP为了保证双方通信时具有可靠性所定制的一种策略;而三次握手可以确保客户端和服务端至少都向对方发送了一次消息,从而确保连接建立的更为可靠;以朴素的角度来看三次握手实际上也可以被解析成四次握手;但为了提升连接创建的效率,TCP采用捎带应答的策略,在第二次握手中将ACK报文与SYN报文整合成了一个报文,即为SYN+ACK报文;在三次握手中能够确保双端都对对方进行一次消息的发送以及消息的接收来确保连接的稳定,因此三次握手中任何一次握手都不能少;原创 2024-11-01 18:23:17 · 1176 阅读 · 0 评论 -
『 Linux 』网络传输层 - TCP (一)
但对于发送端与接收方处理能力不匹配的情况,如果出现大量的丢包情况则可能降低双方的效率,尤其是对于发送方而言,接收方无法快速处理来自发送方所发来的TCP数据段从而导致接收缓冲区溢出,则每次新的从发送方发来的TCP数据段都将可能被丢弃,导致发送方为了保持数据传输的可靠性而不停重传,大大降低了发送端的效率;的问题,即A端向B端发送字节流,B端回复A端字节流使A端明白刚刚所发的字节流已经被接收,那么B端又如何证明该回复的字节流被A端所接收,A端是否需要对该回复字节流再次进行一次应答?原创 2024-10-27 12:22:10 · 763 阅读 · 0 评论 -
『 Linux 』网络传输层 - UDP
通常情况下,无论是发送方还是接收方,机器中必定会存在大量的UDP报文,发送方的机器中不同的UDP报文可能是不同进程发送的,而接收方的UDP报文可能是由不同的发送端向该端进行发送的,那么当机器中存在大量相同类型的数据时系统必然要对该类数据进行管理维护;接收缓冲区是任何端都必须必备的,因为不同的主机其对数据的处理能力是不同的,UDP协议需要接收缓冲区的主要原因是需要兼顾接收方对数据的处理能力,以防止接收方由于对数据的处理不及时而导致的大量数据丢包;原创 2024-10-25 16:17:27 · 859 阅读 · 0 评论 -
『 Linux 』HTTPS
HTTPS协议是一种在HTTP基础上增加了加密层(SSL或TLS)的协议,确保数据传输的保密性、完整性和可靠性。数据通常分为明文和密文,其中明文未经加密,易被窃听,而密文通过加密算法和密钥难以被破解。加密方式主要有对称加密和非对称加密,对称加密快但密钥管理复杂,非对称加密安全但速度慢。HTTPS结合两者优势,使用CA认证确保公钥的安全性,避免中间人攻击。CA认证通过数字证书验证通信双方身份,保障传输安全。原创 2024-10-22 20:48:14 · 831 阅读 · 0 评论 -
『 Linux 』HTTP(三)
而通信双方若是使用HTTP协议时双方都必须约定所使用的HTTP协议版本,通常情况下该版本的诉求方为客户端,因为通常为客户端向服务端发起请求,在请求中会存在所使用的HTTP版本,对应的在进行服务端开发时应做好不同HTTP版本的开发以应对不同版本客户端所发的请求;的文档文件,通常情况下大部分的浏览器都会直接将其以网页的形式进行解析,但图片文件不同,图片文件由于不存在类似的头部,浏览器无法明确知道该资源的类型,所以需要明确的指出资源的类型;它通过在服务器上存储用户数据,解决了 HTTP 协议的无状态特性;原创 2024-10-19 00:28:38 · 923 阅读 · 0 评论 -
『 Linux 』HTTP(二)
休息了一阵子 已收心包括请求的请求行,请求报头,请求数据等信息,通常情况下浏览器会对响应进行对应的解析,所以只需要根据约定向浏览器发回对应格式的响应即可,但是服务器不同,服务器需要将来自浏览器的请求进行一定程度的解析才能够根据请求中的不同字段与属性给予其客户端一定的访问权限;中对HTTP进行了一个较为简单的介绍,介绍包括域名,URL,URL中关于URL特殊符号的编码以及解码(URLEncode和URLDecode),简单介绍了一下HTTP报文的格式(包括请求于响应),并且编写了一个简易的HTTP服务器;原创 2024-10-15 00:18:50 · 1219 阅读 · 0 评论 -
『 Linux 』HTTP(一)
当服务端接收到来自浏览器的请求时需要对请求行和请求头部进行读取以及分析,而请求头部过后紧接着的是请求数据,也就是请求正文,而为了避免请求头部与请求数据中的混淆,请求头部和请求数据(请求正文)之间将存在一行为空行,这个空行只有行分隔符,当服务端读取至一行只存在行分隔符时则表示请求行和请求头部已经读取完毕,剩下的内容即为请求数据(请求正文),换种说法即为报头与有效载荷进行分离;短语也是状态信息,状态信息是根据状态码变化而变化的,是对状态码的文本描述,虽然状态短语不是严格必要的,但是能够帮助用户理解响应;原创 2024-09-18 20:17:27 · 1923 阅读 · 0 评论 -
『 Linux 』协议的定制
序列化与反序列化部分是属于协议定制的一部分,只需要修改头文件即可;这里为了方便后续的调试,使用条件编译来区别自定义序列化与反序列化和使用JSON进行的序列化与反序列化;// 编码函数,将文本编码成特定格式的字符串// 解码函数,从编码后的字符串提取出原始文本// "len"\n"num1 op num2"\n 或 "len"\n"result code"\n// 移除已提取的报文内容public:public:public:// 序列化请求对象,转为字符串。原创 2024-09-12 20:03:07 · 1423 阅读 · 0 评论 -
『 Linux 』简单TCP英译汉程序
意思是服务端每新创建一个相同的进程实际上在关闭了多余的文件描述符后每个子进程因处理客户端发来的请求的文件描述符是相同的,而多线程中由于同一个进程间的不同线程共享同一个文件描述符表,这表示在多线程版本中不存在多余的文件描述符,但同样的文件描述符是一个有限资源,当服务端中的文件描述符资源被使用完毕后,再次创建线程来进行网络通信时这次的网络通信将会失败;原创 2024-09-04 22:58:07 · 2002 阅读 · 0 评论 -
『 Linux 』利用UDP套接字实现简单群聊
套接字实现一个客户端和一个服务端,客户端向服务端发送数据,服务端进行数据的拼接并返回拼接后的数据,或者是传入一个回调函数,服务端通过调用回调函数调用。函数进行初始化,然后进入一个无限循环,不断从用户获取输入并发送到服务器,并接收服务器的响应;当服务端接收到客户端所发的信息时这个数据包中存放的除了数据以外还包含着客户端的基本信息,如。存放着用户的信息,检查该哈希表中是否存在该用户的信息,有则无行为,无则添加;用于初始化服务器的基本参数,包括套接字文件描述符,端口号,运行标识符;原创 2024-08-19 01:48:21 · 876 阅读 · 1 评论 -
『 C++ 』IO流
流是指数据的有序传输序列,路表示数据从一个地方流向另一个地方的过程,流可以是输入流也可以是输出流,具体取决于数据的流动方向;输入流数据从外部设备(文件,键盘等)流入程序中;输出流数据从程序流向外部设备(如显示器,文件等);IO流是指用于处理输入输出操作的流,C++中的IO流用于程序与外部环境(用户,文件系统,网络等)之间交换数据的机制;IO流通过标准库中的一组类和对象实现允许程序员以统一的方式处理不同类型的输入输出设备;原创 2024-08-17 12:08:37 · 1215 阅读 · 0 评论 -
『 Linux 』利用UDP套接字简单进行网络通信
数据在进行网络传输的时候需要转成标准的网络字节序,本质原因是在数据传输的过程中网络通信的两端的字节序要相同以确保数据发送至对端时出现数据的解析错误;在接收客户端的数据时同样需要一个相同地址族的结构体,与对应的长度信息,两个信息作为输出型参数用于接收客户端发送的套接字信息;这个函数用于在套接字上发起到指定地址的连接,用于将客户端的套接字连接到远程服务器的地址和端口,是客户端编程中的关键一步;这个函数调用成功使返回一个非负整数,这个非负整数是新创建的已连接套接字的文件描述符,新描述符与请求连接的客户端通信;原创 2024-08-15 16:42:50 · 1202 阅读 · 0 评论 -
『 Linux 』网络基础(二)
本质上采用大端字节序作为网络字节序主要是为了标准化,确保在不同系统之间数据能够被正确的解码,若是未指定字节序标准,当大端字节序接受到小端字节序发送的数据时将会解码错误;是面向数据包的协议,将数据划分成一个个独立的数据包,每个数据报在网络上传输时是一个独立的实体且具有边界,通常为单个数据报提供较小的负载;小端字节序中数据的低位字节存储在内存的低地址处,数据的高位字节存储在内存的高地址处,即数据从右往左进行存储;协议规定,多字节数据在传输数据时必须采用大端字节序,这意味着数据的高位字节先传输,低位字节后传输;原创 2024-08-12 18:34:49 · 961 阅读 · 0 评论 -
『 C++ 』特殊类实现与类型转换
这篇文章详细介绍了不同场景下C++类的设计与类型转换方法。通过具体实例,作者讲解了如何设计不能被拷贝的类,确保资源的唯一性,并探讨了只能在堆上或栈上创建对象的类的实现方法。对于不能被继承的类,文章介绍了如何利用final关键字和私有化构造函数来实现。此外,文章还深入解析了C++中的四种主要类型转换运算符:static_cast、dynamic_cast、reinterpret_cast和const_cast,并通过代码示例说明了它们各自的用途和实现细节。最后,作者强调了在进行类型转换时需要注意的安全性问题,原创 2024-08-11 15:17:30 · 1085 阅读 · 0 评论 -
『 Linux 』网络基础 (一)
协议分层是计算机网络中组织和管理网络协议的重要方法。通过将网络通信过程划分为多个层次,每一层负责特定的功能,从而简化设计与实现。常见的协议分层模型包括OSI模型和TCP/IP模型。OSI模型将网络通信分为七层,分别是应用层、表示层、会话层、传输层、网络层、数据链路层和物理层。TCP/IP模型则通常简化为四层:应用层、传输层、网络层和链路层。协议分层的主要优点包括简化设计、模块化、标准化和故障隔离,使得各层可以独立开发与维护,提升了网络的灵活性与可扩展性。原创 2024-08-06 18:44:44 · 971 阅读 · 0 评论 -
『 Linux 』线程安全的单例模式,自旋锁与读写锁
这篇文章主要介绍了计算机编程中的一些重要概念和技术,包括单例模式(懒汉模式和饿汉模式)、自旋锁、读写锁。单例模式讲解了其特点和优点,以及两种加载方式。自旋锁阐述了其机制、初始化、锁定与解锁等。读写锁介绍了其状态、在 POSIX 线程库中的使用,包括初始化、加锁和解锁等。这些内容对理解多线程同步和资源管理有重要意义。原创 2024-08-04 16:39:49 · 865 阅读 · 0 评论 -
『 Linux 』线程池与 POSIX 线程的封装编码实现
这篇文章详细介绍了线程池的概念和实现。文章首先解释了线程池的基本原理,包括资源分配、复用和管理等方面。接着,展示了一个线程池的C++实现,包括线程池类的设计、任务队列的管理、线程同步机制等核心组件。文章还提供了一个简单的任务类和测试代码,用于演示线程池的使用。此外,文章还讨论了线程的封装技术,展示了如何将POSIX线程封装成一个C++类,使线程的使用更加面向对象和便捷。文章通过代码示例和详细注释,清晰地展示了线程池和线程封装的实现细节,包括构造函数、线程启动、任务处理等关键方法。原创 2024-08-02 21:03:51 · 1089 阅读 · 0 评论 -
『 Linux 』POSIX 信号量与基于环形队列的生产者消费者模型
本文介绍了基于环形队列的生产者消费者模型。首先阐述了信号量的概念、类型和操作方法,包括P操作和V操作。然后详细讲解了POSIX信号量的使用,包括初始化、销毁、等待和释放等操作。接着描述了环形队列在生产者消费者模型中的应用,解释了模型的核心要素和工作原理。最后通过具体的C++代码实现,展示了如何使用信号量和互斥锁来构建一个线程安全的环形队列,并通过简单数据和复杂任务两个例子演示了模型的实际应用。整体内容涵盖了理论基础和实践应用,为理解和实现并发编程中的同步机制提供了详细指导。原创 2024-08-02 16:00:45 · 837 阅读 · 0 评论 -
『 Linux 』基于阻塞队列的生产者消费者模型
生产者-消费者模型是一种常见的多线程设计模式,用于协调生产者和消费者线程之间对共享资源的访问。在这个模型中,生产者负责生成数据或任务并将其放入共享缓冲区,而消费者则从缓冲区中取出数据进行处理。关键点在于生产者和消费者通过共享缓冲区进行解耦,允许它们以不同的速率工作。该模型通过互斥锁和条件变量来实现线程同步。互斥锁确保对共享资源的互斥访问,而条件变量则用于线程间的通信和协调。当缓冲区满时,生产者等待;当缓冲区空时,消费者等待。这种设计提高了系统的并发性和效率,特别适合处理生产和消费速率不匹配的场景。原创 2024-08-01 16:37:20 · 1206 阅读 · 0 评论 -
『 Linux 』线程同步问题与条件变量
同步问题涉及多线程环境下,确保访问同一资源时的顺序性和数据安全。互斥锁常用于保护临界资源,防止数据竞争和不一致。条件变量是一种线程同步机制,允许线程在特定条件满足前等待,并在满足时被唤醒。它通常与互斥锁结合使用,确保共享资源的安全访问。生产者-消费者模型是一种多线程设计模式,生产者生成数据放入缓冲区,消费者从缓冲区读取数据处理。通过互斥锁和条件变量,生产者和消费者可以有效地同步和互斥访问共享资源,提高系统效率和稳定性。原创 2024-07-31 21:46:13 · 976 阅读 · 0 评论 -
『 Linux 』多线程互斥锁
文章深入分析了互斥锁的原理及其原子性,阐明了互斥锁在多线程同步中的重要性,并展示了如何封装互斥锁以简化其使用。在实际应用中,通过正确使用互斥锁和其他同步机制,可以确保多线程程序的正确性和高效性。最后,文章深入分析了互斥锁的原理及其原子性,阐明了互斥锁在多线程同步中的重要性,并展示了如何封装互斥锁以简化其使用。在实际应用中,通过正确使用互斥锁和其他同步机制,可以确保多线程程序的正确性和高效性。原创 2024-07-30 17:57:19 · 1069 阅读 · 0 评论 -
『 Linux 』线程的资源共享,分离,以及多线程并发导致资源竞争
在多线程编程中,为确保线程安全和数据一致性,必须注意线程的资源共享和独立数据区。线程共享进程的大部分资源,如全局变量、堆、代码段等,但每个线程也有自己的独立数据区,如线程栈、线程局部存储等。这种共享和独立机制在提升多线程编程效率的同时,也带来了数据竞争问题。当多个线程同时访问和修改共享资源时,可能导致数据不一致的现象。因此,需要通过线程同步机制,如互斥锁、信号量等,来确保对共享资源的访问是原子性的,从而避免数据竞争问题,确保程序的正确性和稳定性。在实际应用中,合理利用这些机制可以有效提高多线程程序的性能和可原创 2024-07-29 21:16:13 · 536 阅读 · 0 评论 -
『 Linux 』线程控制
类型的参数以表示该线程的返回值,通常该值不能是线程栈上开辟的空间中的数据,必须是在非栈上这种共享空间中,因为该线程的生命周期已经结束,若是访问线程栈中的数据将会导致段错误;参数返回时不能直接返回线程栈上开辟空间的数据,因为线程的栈是其独立的,当程序执行完毕后表示该线程的生命周期结束,对应的其栈的空间将会被回收;查看当前对应运行进程中的轻量级进程的基本属性(该命令为内置命令,且Linux中不存在线程概念,所以查看的属性为轻量级进程的基本属性);通常着需要指向一个预先分配好的栈内存区域,并且栈的顶端应该对齐;原创 2024-07-28 20:37:40 · 741 阅读 · 0 评论 -
『 Linux 』线程概念
线程本质上是进程的一个执行分支,用于处理进程中的代码和数据;每个线程都可以执行独立不同的代码片段,这意味着在一个进程中可以同时执行多个任务;同一个进程中的所有线程共享相同的内存地址空间和资源(如全局变量,文件句柄等);使得线程之间的通信和数据共享十分搞笑,因为它们不需要像进程通信那样复杂的机制;在Linux中,线程在进程"内部"执行,线程在进程的地址空间内运行任何执行流要执行的前提是具有资源;进程地址空间是进程的资源窗口,线程在进程"内部"执行意味着其将执行进程代码的一部分;原创 2024-07-27 18:34:58 · 887 阅读 · 0 评论 -
『 Linux 』信号的捕捉及部分子问题
当一个进程在处理一个信号的时候会将对应的信号添加到其信号屏蔽字(阻塞信号集)中以避免信号方法重复调用;当父进程获取到子进程所发的信号时将该信号进行捕获,而后调用自定义动作对已经僵尸的子进程进行等待处理;实际上未决信号集的置零时机为执行信号处理前,即先将未决信号集对应位置置零再执行处理信号的函数;信号时由于上一个相同信号未被处理完成,处于未递达状态,相同的信号被阻塞,停留在未决信号集中;当一个信号在被进行处理时将会把正在处理的信号添加进信号屏蔽字以阻塞下一个相同的信号;原创 2024-07-26 17:45:38 · 711 阅读 · 0 评论 -
『 Linux 』用户态与内核态的转换机制及信号检测时机
本文详细讲解了操作系统中用户态与内核态的概念及其转换机制。通过以printf()函数为例,描述了用户态代码、库函数代码及内核代码的执行过程,重点解释了进程如何通过系统调用从用户态转换为内核态并返回。文章还深入探讨了进程地址空间的结构,包括用户空间和内核空间的划分以及页表的角色和CR3寄存器的作用。最后,文章对信号的处理机制进行了详尽分析,介绍了信号在用户态和内核态之间的处理时机和流程,并提供了多个图示以辅助理解。原创 2024-07-25 20:56:08 · 1473 阅读 · 0 评论 -
『 Linux 』信号的写入与保存
忽略表示已经收到了该信号且已经对信号进行了处理,信号已经递达,其中信号的处理方式为忽略,即不作任何处理;信号递达指已经到达并被处理的信号,当信号处理程序执行完毕后这些信号就会被认定是已抵达的;信号递达表示信号已经被处理,进程将继续其正常执行流程或者根据信号类型执行特定行为;阻塞表示已经收到了该信号但不对信号进行处理,使得信号在取消阻塞前都保持未决状态;被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞才执行递达动作;信号集被传进接口函数并对原有阻塞信号集进行操作时将会将原本的阻塞信号集写入。原创 2024-07-25 14:29:58 · 1278 阅读 · 2 评论 -
『 Linux 』信号概念与信号的产生 ( 万字 )
"信号"一词指用来传达信息或只是的各种形式的提示或标志;在生活中常见的信号例如红绿灯,交通标志,短信通知等在操作系统中,"信号"是一种用于异步通知进程发生特定事件的机制;信号允许操作系统或其他进程向目标进程发送通知以便他们能够相应某些时间或条件;原创 2024-07-22 22:32:29 · 1057 阅读 · 0 评论