select源码分析

select源码分析


select()

函数是从SYSCALL_DEFINE5(select, ...)开始. 可以简单的将SYSCALL_DEFINEx理解为系统定义的系统函数, 如果想了解 SYSCALL_DEFINE 可以看一下.

具体的执行流程是 :

  • 将时间定义从用户空间复制到内核空间中, 进行时间片的设置, 如果为0或不合法就设置为默认值, 否则就设置为传入的时间.
  • 调用core_sys_select函数, 以实现等待消息到来, 轮询等主要操作
  • 调用timeval_compare返回执行完剩余的时间
  • 最后将返回的时间使用copy_to_user复制到用户空间
SYSCALL_DEFINE5(select, int, n, fd_set __user *, inp, fd_set __user *, outp, fd_set __user *, exp, struct timeval __user *, tvp)
{
    s64 timeout = -1;
    struct timeval tv;
    int ret;

    if (tvp)
    {
        // 将数据从用户空间拷贝到内核空间的tv中
        if (copy_from_user(&tv, tvp, sizeof(tv)))
            return -EFAULT;
        ...
    }

    // 设置 fds 结构的参数并且等待消息的到来, 或者时间片没有结束调度程序
    ret = core_sys_select(n, inp, outp, exp, &timeout);

    // 设置时间片
    if (tvp)
    {
        ...
        // 返回执行完后剩余时间
        if (timeval_compare(&rtv, &tv) >= 0)
            rtv = tv;
        if (copy_to_user(tvp, &rtv, sizeof(rtv))) 
        ...
    }
    return ret;
}

core_sys_select

因为select的主要功能都是do_select函数, 这里我们先分析一下关于core_sys_select函数.

  • 获取文件文件描述符表并存放在fdtable
  • fdtable读, 写, 错误分配空间, 并初始化
  • 将select传入的readfds,writefds, errorfds参数从用户空间复制到内核空间的fdtable对应的读, 写, 错误中. 这里需要解释一下, fdselect主要是保存之后要将来的信号返回给用户空间的.
  • 调用do_select, 轮询等待消息的到来, 并
  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MyBatis是一款优秀的Java持久层框架,它封装了JDBC,使开发者无需关注繁琐的连接、驱动加载等细节,只需关注SQL语句本身。它采用ORM思想解决了实体和数据库映射的问题。MyBatis通过XML或注解配置要执行的SQL语句,并将Java对象和SQL的动态参数进行映射生成最终的SQL语句。最后,MyBatis执行SQL并将结果映射为Java对象返回。 总体执行流程如下: 1. 通过getResourceAsReader(String resource)方法读取mybatis.xml配置文件,生成Reader对象。 2. 使用SqlSessionFactoryBuilder的build()方法,通过构建者模式创建SqlSessionFactory对象。 3. 通过openSession()方法获取DefaultSqlSession对象,用于执行数据库操作。 4. 在进行数据库的insert、update、delete、select等操作后,通过sqlSession.commit()提交事务。 5. 最后使用sqlSession.close()关闭连接,释放资源。 解析mapper节点时,首先获取命名空间并将其放入builderAssistant对象中。然后解析cache-ref、cache、parameterMap、resultMap和Sql片段等内容。接下来是解析增删改查的地方,通过上下文构建statement对象。真正解析增删改查的方法是buildStatementFromContext(list, null)。通过构建者模式生成一个statementParser对象,用于解析增删改查标签。通过parseStatementNode()方法解析和设置各个标签的属性。最后使用构建者模式将解析得到的statement对象添加到builderAssistant对象中,用于构建statement对象。重要的是使用addMappedStatement()方法判断是否为select方法,如果是,则构建一个statement对象并将其添加到MappedStatement类型的statement变量中。最终将statement对象放入configuration对象中,将所有增删改查的标签解析为一个statement对象并放入configuration对象中。 在MyBatis底层源码中,使用了build(Reader reader, String environment, Properties properties)方法来构建SqlSessionFactory对象。实际上,该方法内部调用了build(Reader reader)方法。在build(Reader reader, String environment, Properties properties)方法中,声明了一个XMLConfigBuilder对象parser,通过parser.parse()方法解析XML配置文件,最终返回一个builde对象[3]。 总体来说,MyBatis底层源码分析涉及到读取配置文件、创建SqlSessionFactory对象、解析mapper节点、构建statement对象等过程。这些过程都有各自的细节和步骤,用于实现MyBatis的功能和特性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值