- 博客(24)
- 收藏
- 关注
原创 高性能服务器项目阅读:Thread类的设计
但这样写有一个问题,就是当主线程创建子线程后,有可能在子线程返回其tid之前就访问tid()了,这个就会导致结果不正确。
2025-05-17 15:49:01
142
原创 epoll机制
epoll是一种I/O事件通知机制,是linux 内核实现IO多路复用的一个实现,,而网络数据包中包含了ip和端口的信息,内核可以通过端口号找到对应的socket。通知机制,就是当事件发生的时候,则主动通知。通知机制的反面,就是轮询机制。当文件描述符关联的内核读缓冲区可读,则触发可读事件。当文件描述符关联的内核写缓冲区可写,则触发可写事件。操作系统如何知道网络数据对应于哪个socket?,然后对其的进行读写操作。,而不是直接操作进程。
2025-05-12 20:07:33
886
原创 C++ 多线程 wait,notifty,mutex 的使用
在 C++ 多线程编程中,线程间的协调是一个经常需要考虑的问题。我们经常需要一个线程等待某个条件满足(例如,等待任务队列非空,或等待某个计算完成),而另一个线程则负责在条件满足时通知等待的线程。所以你可以想象到这样一个场景:每位家庭成员尝试获取抱枕并发言,对于拿到抱枕却又支支吾吾的,他应该立即放下抱枕让给别人。一个很直白的思路就是,对于忙等待(占着cpu又无所事事)的进程,应该让它阻塞。例子:考虑经典的消费者-生产者模型。
2025-04-04 21:14:14
638
原创 C++ 中public,protected,private三种访问权限关键字
参考资料:深入理解C++中public、protected及private用法菜鸟教程
2025-04-03 17:15:04
722
原创 linux中select, poll, epoll三种模型的比较
其实流程和select差不多,主要区别在于将bitmap换成了pollfd结构体,这样就不存在文件描述符个数的限制。总结来说,select函数主要按顺序干了以下几件事情。
2025-04-03 16:30:43
304
原创 聪明的你:源代码文件到底是怎样在机器上运行的
这很容易理解,在链接器将两个目标文件链接之前,main.o并不知道其所调用的func1的具体位置,只有在链接之后才能计算。目标文件未链接(如 .o 文件),外部函数调用的地址会暂时填充为 0x0,而 callq 的相对偏移量会基于下一条指令的地址计算。而在链接阶段,调用外部函数的地址是通过 符号解析(Symbol Resolution)和重定位(Relocation) 确定的。这里,你能看见熟悉的保存上文基址,为局部变量分配栈空间等操作。然而此时的你依然是懵懂的,目标文件到底是个啥?指令对应的二进制码为。
2025-04-02 15:53:05
929
原创 浅析linux中的select函数
0: 当监视的相应的文件描述符集中满足条件时,比如说读文件描述符集中有数据到来时,内核(I/O)根据状态修改文件描述符集。
2025-04-02 11:03:53
365
原创 自己动手写shared_ptr
RAII是什么:RAII(Resource Acquisition Is Initialization)是由c++之父Bjarne Stroustrup提出的,中文翻译为:资源获取即初始化。但是显而易见的是,这并未解决重复释放的问题。由此想到我们给对象加一个计数机制,记录指向这个对象的指针数量。内存泄露:手动分配的内存在程序结束时未得到释放。基于此,你很容易先写出这样的一个包装类;实例,需要它们共享引用计数,故使用。注意:对于指向同一个对象的不同的。的基础上改造一下,修改的是。(可能释放资源的两处)
2025-03-31 19:28:32
779
原创 图解TCP传输过程
考虑这样的情形:客户端向服务器端发送的请求报文由于网络等原因滞留,未能发送到服务器端,此时连接请求报文失效,客户端会再次向服务器端发送请求报文,之后与服务器端建立连接,当连接释放后,由于网络通畅了,第一次客户端发送的请求报文又突然到达了服务器端,这条请求报文本该失效了,但此时服务器端误认为客户端又发送了一次连接请求,两次握手建立好连接,此时客户端忽略服务器端发来的确认,也不发送数据,造成不必要的错误和网络资源的浪费。TCP报文是由TCP头部和数据两部分组成的。怎样理解序列号(seq)和确认号(ack)
2025-03-31 16:30:03
265
原创 聪明的你:操作系统中的分页机制
好的,聪明的你很快就又发现了,这样的寻址方式虽然解决了连续性问题,但是:以32位系统为例,内存大小为4GB,对应4KB大小的页有1M(2^20) 个,那么页基址也就有1M个,那你的页表项也就有1M个。但问题来了0x20001根本就不能是一个合法的页基址,因为页基址是不连续的,0x20000是一个合法的页基址,其下一个页基址在0x21000(因为页大小为4KB,页基址也会相差这么多)好的,聪明的你就发现了,我不直接寻址页基址,而是把线性地址的高20位看作是一个偏移,偏移总该是连续的吧?但是你似乎忘了,你的。
2025-03-30 17:32:27
850
原创 GDT如何编写?
我们已经知道,在x86 16位实模式下,CPU通过段基址<<4+段偏移实现寻址;(段描述符,Segment Descriptor)共64位大小,描述了对应段的基址,大小,权限等信息;(Data Segment Descriptor)(定义数据段的属性和权限)组成。(Code Segment Descriptor)(定义代码段的属性和权限),(Null Descriptor)(用于防止 CPU 错误访问),其次,分别定义代码段和数据段描述符(见标签。分别用于指向代码段和数据段描述符。最后定义两个段选择子(
2025-02-25 20:23:34
398
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人