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之间同步机制相关推荐

  1. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

  2. Redis 数据同步机制分析

    Redis的主从同步机制可以确保redis的master和slave之间的数据同步.按照同步内容的多少可以分为全同步和部分同步:按照同步的时机可以分为slave刚启动时的初始化同步和正常运行过程中的数 ...

  3. 多进程与多线程通信同步机制

    多进程通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 命名管道FIFO:有名管道也是半双工的通信方式,但 ...

  4. Zookeeper同步机制!!!

    优点:解决方案.处理问题能力.架构优化/拓展能力 零.Zookeeper事务 事务id(主从同步Id-每次ack递增+1,64位存储(32位纪元号-leader号,32位自增号)) 每一个操作都将使节 ...

  5. android fence机制,Android中的GraphicBuffer同步机制-Fence

    Fence是一种同步机制,在Android里主要用于图形系统中GraphicBuffer的同步.那它和已有同步机制相比有什么特点呢?它主要被用来处理跨硬件的情况.尤其是CPU.GPU和HWC之间的同步 ...

  6. 01 线程同步机制封装类

    01 线程同步机制封装类 RAII RAII全称是"Resource Acquisition is Initialization",直译过来是"资源获取即初始化" ...

  7. Linux 多线程同步机制:互斥量、信号量、条件变量

    互斥量:互斥量提供对共享资源的保护访问,它的两种状态:lock和unlock,用来保证某段时间内只有一个线程使用共享资源,互斥量的数据类型是pthread_mutex_t 主要涉及函数:pthread ...

  8. Java高级-线程同步机制实现

    2019独角兽企业重金招聘Python工程师标准>>> 前言 我们可以在计算机上运行各种计算机软件程序.每一个运行的程序可能包括多个独立运行的线程(Thread). 线程(Threa ...

  9. 转载--线程同步机制及比较

    转自:http://blog.csdn.net/eulb/article/details/2177500 先来回答第一个问题,线程实际主要应用于四个主要领域,当然各个领域之间不是绝对孤立的,他们有可能 ...

  10. Java线程同步机制synchronized关键字的理解

    由于同一进程的多个线程共享同一片存储空间,在带来方便的同时,也带来了访问冲突这个严重的问题.Java语言提供了专门机制以解决这种冲突,有效避免了同一个数据对象被多个线程同时访问. 需要明确的几个问题: ...

最新文章

  1. Linux的top命令
  2. css背景图根据屏幕大小自动缩放
  3. 蓝牙小电池图标_方寸间、掌握中,omthing小方盒开箱测评
  4. Java入门需掌握的30个基本概念[转]
  5. C/C++ realloc()函数解析
  6. 《智能数据时代:企业大数据战略与实战》一2.3 自我评估、完善度、信息架构...
  7. python处理中文编码问题总结
  8. IDEA 显示Run Dashboard窗口的2种方式
  9. 机器学习第六回(完结篇)
  10. MOOC 浙江大学C语言翁恺(第一、二章 满分答案)
  11. MATLAB代码:计及碳排放交易及多种需求响应的微网/虚拟电厂日前优化调度
  12. 基于springboot的网上零食购物系统
  13. ORB-SLAM3论文翻译
  14. 关于电脑程序无响应的常见原因以及解决办法
  15. iOS 分享 第三方登录 Twitter 注册应用以及读写权限
  16. OutMan——集合对象的内存管理、copy的介绍及使用
  17. pvr格式的用什么打开_cocos2d 查看pvr图片的详细格式
  18. 2007.5 同航驾驶培训公司网站
  19. 超级简单的Python爬虫教程,python爬虫菜鸟教程官网
  20. pythonselenium时间选择_使用pythonselenium选择特定日期(滚动日期)

热门文章

  1. 鱼眼和全向视图的图像深度学习方法
  2. 华为 Mate8 Emui 5.0 安卓 7.0 root 记录
  3. Win11暂存文件夹是什么?Win11在线升级暂存文件夹在哪
  4. 【星门跳跃】解题报告
  5. Substance Designer中Histogram相关节点理解
  6. h5页面如何切图_H5设计稿切图按照什么尺寸,微信公众号版本的
  7. 当年“你说什么,我都能实现”的软件公司,后来都是怎么死的?
  8. “已取消到该网页的导航” chm文件无法显示错误 解决方法
  9. 【2022 ACTF-wp】
  10. MeteoInfo-Micaps绘制色斑图