Socket和Sock之间同步机制
Socket和Sock之间同步机制
基于linux-2.6.18-400.el5内核代码整理应用层和内核层报文任务的通告同步机制。
改造同步机制需要先理清现有的机制,覆盖各个同步场景。
通告接口
sock使用以下接口在不同情况下,通告应用层用层socket:
/* 在sock_init_data函数中进程初始化,函数在socket()过程中被调用 */sk->sk_state_change = sock_def_wakeup;sk->sk_data_ready = sock_def_readable;sk->sk_write_space = sock_def_write_space;sk->sk_error_report = sock_def_error_report;sk->sk_destruct = sock_def_destruct;
以sock_def_readable函数为例,该接口唤醒睡眠在sk->sk_sleep等待队列,调用等待在其上的任务回调,根据回调处理返回结果进行任务唤醒或继续阻塞等待:
static void sock_def_readable(struct sock *sk, int len)
{read_lock(&sk->sk_callback_lock);if (sk_has_sleeper(sk))wake_up_interruptible(sk->sk_sleep);sk_wake_async(sk,1,POLL_IN);read_unlock(&sk->sk_callback_lock);
}
sk->sk_sleep成员指向socket的wait成员,在服务器端监听sock进行连接accept时,执行sock_graft函数:
static inline void sock_graft(struct sock *sk, struct socket *parent)
{write_lock_bh(&sk->sk_callback_lock);/* parent 是代表客户端连接的socket实例,sk是代表客户端连接的sock实例 */sk->sk_sleep = &parent->wait;parent->sk = sk;sk->sk_socket = parent;security_sock_graft(sk, parent);write_unlock_bh(&sk->sk_callback_lock);
}
函数sk_wake_async 调用sock_wake_async,根据实际情况判断选择是否通过信号(SIGIO/SIGURG)异步通告应用进程,如应用进程接收到信号,应用所注册的sig_handler即可获调用。
/*
socket->flags 标志位,如下:
SOCK_ASYNC_NOSPACE: 标识该套接口的发送队列是否已满。
SOCK_ASYNC_WAITDATA:标识应用程序通过recv调用时,是否在等待数据的接收。
SOCK_NOSPACE: 标识非异步的情况下该套接口的发送队列是否已满。
SOCK_PASSCRED: 用于标识是否设置了SO_PASSCRE套接口选项。
SOCK_PASSSEC: 用于标识是否设置了SO_PASSSEC选项。*/ int sock_wake_async(struct socket *sock, int how, int band)
{/* 存在异步任务 */if (!sock || !sock->fasync_list)return -1;switch (how) {case 1:/* 如果用户进程在等待数据,不需要信号通告 */if (test_bit(SOCK_ASYNC_WAITDATA, &sock->flags))break;goto call_kill;case 2:if (!test_and_clear_bit(SOCK_ASYNC_NOSPACE, &sock->flags))break;/* fall through */case 0:call_kill:__kill_fasync(sock->fasync_list, SIGIO, band);break;case 3:__kill_fasync(sock->fasync_list, SIGURG, band);}return 0;
}
接口调用汇总
集中IPV4/IPV6网络连接部分对接口的调用汇总,藉此可覆盖每个通告交互场景。
- sk_state_change接口调用汇总
54 2905 net/ipv4/tcp_input.c <<tcp_fin>>sk->sk_state_change(sk);55 4301 net/ipv4/tcp_input.c <<tcp_rcv_synsent_state_process>>sk->sk_state_change(sk);56 4527 net/ipv4/tcp_input.c <<tcp_rcv_state_process>>sk->sk_state_change(sk);57 4587 net/ipv4/tcp_input.c <<tcp_rcv_state_process>>sk->sk_state_change(sk);
- sk_error_report接口调用
13 394 net/ipv4/ip_sockglue.c <<ip_recv_error>>sk->sk_error_report(sk);14 234 net/ipv4/raw.c <<raw_err>>sk->sk_error_report(sk);15 1803 net/ipv4/tcp.c <<tcp_disconnect>>sk->sk_error_report(sk);17 2828 net/ipv4/tcp_input.c <<tcp_reset>>sk->sk_error_report(sk);18 449 net/ipv4/tcp_ipv4.c <<tcp_v4_err>>sk->sk_error_report(sk);19 477 net/ipv4/tcp_ipv4.c <<tcp_v4_err>>sk->sk_error_report(sk);20 50 net/ipv4/tcp_timer.c <<tcp_write_err>>sk->sk_error_report(sk);21 400 net/ipv4/udp.c <<udp_err>>sk->sk_error_report(sk);22 374 net/ipv6/datagram.c <<ipv6_recv_error>>sk->sk_error_report(sk);23 294 net/ipv6/raw.c <<rawv6_err>>sk->sk_error_report(sk);24 439 net/ipv6/tcp_ipv6.c <<tcp_v6_err>>sk->sk_error_report(sk);25 449 net/ipv6/tcp_ipv6.c <<tcp_v6_err>>sk->sk_error_report(sk);
- sk_data_ready 接口
54 1203 net/ipv4/tcp_blnc_sk.c <<tcp_blnc_established>>srv_sk->sk_data_ready(srv_sk, 0);55 3220 net/ipv4/tcp_input.c <<tcp_data_queue>>sk->sk_data_ready(sk, 0);56 3766 net/ipv4/tcp_input.c <<tcp_urg>>sk->sk_data_ready(sk, 0);57 3847 net/ipv4/tcp_input.c <<tcp_dma_try_early_copy>>sk->sk_data_ready(sk, 0);58 3851 net/ipv4/tcp_input.c <<tcp_dma_try_early_copy>>sk->sk_data_ready(sk, 0);59 4085 net/ipv4/tcp_input.c <<tcp_rcv_established>>sk->sk_data_ready(sk, 0);60 668 net/ipv4/tcp_minisocks.c <<tcp_child_process>>parent->sk_data_ready(parent, 0);
- sk_write_space接口
12 460 net/core/sock.c <<sock_setsockopt>>sk->sk_write_space(sk);13 1051 net/core/sock.c <<sock_wfree>>sk->sk_write_space(sk);14 1659 net/core/sock.c <<sock_init_data>>sk->sk_write_space = sock_def_write_space;...17 547 net/ipv4/inet_connection_sock.c <<inet_csk_clone>>newsk->sk_write_space = sk_stream_write_space;18 3615 net/ipv4/tcp_input.c <<tcp_new_space>>sk->sk_write_space(sk);19 1328 net/ipv4/tcp_ipv4.c <<tcp_v4_init_sock>>sk->sk_write_space = sk_stream_write_space;20 1484 net/ipv6/tcp_ipv6.c <<tcp_v6_init_sock>>sk->sk_write_space = sk_stream_write_space;
未完待续…
连接状态通告
错误通告
接收可读通告
发包队列变动通告
未完待续…
Socket和Sock之间同步机制相关推荐
- Linux内核同步机制之(四):spin lock【转】
转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...
- Redis 数据同步机制分析
Redis的主从同步机制可以确保redis的master和slave之间的数据同步.按照同步内容的多少可以分为全同步和部分同步:按照同步的时机可以分为slave刚启动时的初始化同步和正常运行过程中的数 ...
- 多进程与多线程通信同步机制
多进程通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 命名管道FIFO:有名管道也是半双工的通信方式,但 ...
- Zookeeper同步机制!!!
优点:解决方案.处理问题能力.架构优化/拓展能力 零.Zookeeper事务 事务id(主从同步Id-每次ack递增+1,64位存储(32位纪元号-leader号,32位自增号)) 每一个操作都将使节 ...
- android fence机制,Android中的GraphicBuffer同步机制-Fence
Fence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步.那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况.尤其是CPU.GPU和HWC之间的同步 ...
- 01 线程同步机制封装类
01 线程同步机制封装类 RAII RAII全称是"Resource Acquisition is Initialization",直译过来是"资源获取即初始化" ...
- Linux 多线程同步机制:互斥量、信号量、条件变量
互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t 主要涉及函数:pthread ...
- Java高级-线程同步机制实现
2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...
- 转载--线程同步机制及比较
转自:http://blog.csdn.net/eulb/article/details/2177500 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能 ...
- Java线程同步机制synchronized关键字的理解
由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: ...
最新文章
- Linux的top命令
- css背景图根据屏幕大小自动缩放
- 蓝牙小电池图标_方寸间、掌握中,omthing小方盒开箱测评
- Java入门需掌握的30个基本概念[转]
- C/C++ realloc()函数解析
- 《智能数据时代:企业大数据战略与实战》一2.3 自我评估、完善度、信息架构...
- python处理中文编码问题总结
- IDEA 显示Run Dashboard窗口的2种方式
- 机器学习第六回(完结篇)
- MOOC 浙江大学C语言翁恺(第一、二章 满分答案)
- MATLAB代码:计及碳排放交易及多种需求响应的微网/虚拟电厂日前优化调度
- 基于springboot的网上零食购物系统
- ORB-SLAM3论文翻译
- 关于电脑程序无响应的常见原因以及解决办法
- iOS 分享 第三方登录 Twitter 注册应用以及读写权限
- OutMan——集合对象的内存管理、copy的介绍及使用
- pvr格式的用什么打开_cocos2d 查看pvr图片的详细格式
- 2007.5 同航驾驶培训公司网站
- 超级简单的Python爬虫教程,python爬虫菜鸟教程官网
- pythonselenium时间选择_使用pythonselenium选择特定日期(滚动日期)
热门文章
- 鱼眼和全向视图的图像深度学习方法
- 华为 Mate8 Emui 5.0 安卓 7.0 root 记录
- Win11暂存文件夹是什么?Win11在线升级暂存文件夹在哪
- 【星门跳跃】解题报告
- Substance Designer中Histogram相关节点理解
- h5页面如何切图_H5设计稿切图按照什么尺寸,微信公众号版本的
- 当年“你说什么,我都能实现”的软件公司,后来都是怎么死的?
- “已取消到该网页的导航” chm文件无法显示错误 解决方法
- 【2022 ACTF-wp】
- MeteoInfo-Micaps绘制色斑图