DAY04

今天继续用boss投简历,只要hr处于在线状态我就投,自己开了两个号,一天能沟通200个hr;

没有复习八股文,昨天的TCP和UDP的区别,TCP是面向连接的,字符流,而且TCP有接收缓冲区和发送缓冲区,拥有拥塞阻塞机制且支持点对点通信。而UDP是无连接,面向数据包,只有接收缓冲区,支持一对多,多对多,一对一。

自旋锁和互斥锁的区别,互斥锁涉及到上下文切换,而自旋锁通过CAS机制来判断,如果内存中的值和保留的快照相同,就修改否则就放弃修改,再用户态进行加锁和解锁。

TCP的四次挥手,客户发送FIN给服务器,停止向服务器发送数据,但是可以接收到服务器发来的数据。服务器发送ACK,客户端从FIN_WAIT1跳转到FIN_WAIT2,当服务器发来FIN客户端接收到数据也发送ACK就进入了倒计时,2MSL是一个TCP报文传输的最大生命周期,是为了确保服务器一定会接收到ACK,如果客户端又接收到了服务器的FIN说明客户端的ACK丢失了,计时器又可以重置了。

函数重载的原理,就是编译器的名字改编,根据参数的类型,个数或者顺序给函数进行命名,例如add(int,int) -----> addii                  add(float,int) -----> addfi

今天的重头戏还是skynet的架构,该架构的核心actor模块,其包含三个数据结构,虽然源码中有10个数据成员,但是真正核心的只有消息队列,回调函数以及lua虚拟机。首先lua虚拟机是为了确保actor模块能像进程一样,拥有独自的资源,防止别的actor访问自己占有的资源。消息队列放置的是epoll监听到的就绪事件,例如网络连接(分配套接字给客户端用于通信),数据处理(连接上的数据),actor之间的通信等等。将这些事件和某个actor绑定在一起,然后设置一个该事件的回调函数以及其它上下文,包装成一个新的结构体(消息),添加到指定的actor的消息队列中。既然是网络模型,和recator一样肯定会有一个线程池。

这个线程池专门从消息队列中取出数据,但是这个消息队列是一个二级队列,其中每个结点是每个活跃的actor(消息队列中有消息的actor)的消息队列链接而成,就像链表的Node节点一样,属于actor的消息队列中都有一个next指针。通过这个指针将每个消息队列链接成一个二级消息队列。

线程池会从这个二级队列中取出一级队列然后出队一级队列的一个消息从而将该消息当作回调函数的参数去调用就实现了recator差不多的事件处理逻辑。不过skynet底层使用c写的,业务逻辑是用lua写的。对于c是怎么调用lua的回调这一点我还不是很多。公平调度倒是懂一些。

今天学到了一个看skynet架构的思路,先从线程池的入口函数看起,然后看线程都执行那些类型的消息,再从消息回溯看actor结构,然后去看actor是如何和事件进行绑定的,即客户端的连接绑定一个actor,进而到epoll监听到事件然后到注册了哪些事件类型,再去main.lua看哪些事件被执行了,这样看下来整个架构会清晰很多。

明天继续理清思路,今天的主要耽搁在skynet的配置环境上面,首先lua的头文件包含就出错了再到make linux的编译是因为其3rd下面的一个目录的缺失,需要去GitHub上自己下载再填充上,再到配置文件的单词拼写错误搞了大概三个小时,才跑起来了最简单的main.lua。

明天会更好

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值