当前位置: 首页 > news >正文

做php网站都用框架吗哪个网站可以做微信头图

做php网站都用框架吗,哪个网站可以做微信头图,江西做网站建设,英文都不懂 学网站建设维护难吗逛知乎看到的#xff0c;觉得写的挺透彻的#xff0c;转载一下#xff0c;原文链接#xff1a;Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗#xff1f; 原文以阻塞式的recv函数作为讲解#xff0c;但是所有阻塞式的api底层逻辑基本相通。 下面是正文…逛知乎看到的觉得写的挺透彻的转载一下原文链接Unix网络编程里的阻塞是在操作系统的内核态创建一个线程来死循环吗 原文以阻塞式的recv函数作为讲解但是所有阻塞式的api底层逻辑基本相通。 下面是正文 作者张彦飞 链接https://www.zhihu.com/question/492983429/answer/2236327954 来源知乎 著作权归作者所有。商业转载请联系作者获得授权非商业转载请注明出处。 大家天天都在说阻塞实际上95%的程序员并没有真正理解阻塞是啥。这里并没有循环的事情我们来从内核视角详细剖析一下阻塞到底是啥它是如何工作的。把问题再具体一下recv 接收数据阻塞的原理是啥 理解了这个就能真正理解所有的阻塞了。用一段大家都熟悉的代码来举例 int main() {int sk socket(AF_INET, SOCK_STREAM, 0);connect(sk, ...)recv(sk, ...) }在上面的 demo 中虽然只是简单的两三行代码但实际上用户进程和内核配合做了非常多的工作。大致的工作流程如下 看到这里你可能还没看着阻塞的原理。别着急往下看。我们来看 recv 函数依赖的底层实现。首先通过 strace 命令跟踪可以看到 clib 库函数 recv 会执行到 recvfrom 系统调用。进入系统调用后用户进程就进入到了内核态通过执行一系列的内核协议层函数然后到 socket 对象的接收队列中查看是否有数据没有的话就把自己添加到 socket 对应的等待队列里。最后让出CPU操作系统会选择下一个就绪状态的进程来执行。 整个流程图如下 以上这个流程图是我根据 Linux 内核源码的执行过程总结后画出来的。注意上面的第四步和第五步。第四步中是在访问 sock 对象下面的接收队列如果接收队列中还没有数据到达那么就会进入第五步把当前进程阻塞掉。但是在把自己阻塞掉之前进程干了一件事 给 socket 上留了个标记。告诉内核如果这个 socket 上数据好了记得叫我起来哈就是源码 prepare_to_wait 函数中的 __add_wait_queue 这一句。 //file: kernel/wait.c void prepare_to_wait(wait_queue_head_t *q, wait_queue_t *wait, int state) {unsigned long flags;wait-flags ~WQ_FLAG_EXCLUSIVE;spin_lock_irqsave(q-lock, flags);if (list_empty(wait-task_list))__add_wait_queue(q, wait);set_current_state(state);spin_unlock_irqrestore(q-lock, flags); }接下来 Linux 就会选择下一个就绪状态的进程来执行。这就是阻塞原理的上半段就是进程修改自己的状态主动交出 CPU 的执行权。当有数据到达的时候内核首先将数据包放到该 socket 的接收队列中。然后扫描一下 socket 等待队列然后发现“呦呵有进程阻塞在这个 socket 上面哎好唤醒它”。 具体到代码里就是 __wake_up_common 这个函数会访问 socket 的等待队列。 //file: kernel/sched/core.c static void __wake_up_common(wait_queue_head_t *q, unsigned int mode,int nr_exclusive, int wake_flags, void *key) {wait_queue_t *curr, *next;list_for_each_entry_safe(curr, next, q-task_list, task_list) {unsigned flags curr-flags;if (curr-func(curr, mode, wake_flags, key) (flags WQ_FLAG_EXCLUSIVE) !--nr_exclusive)break;} }在 __wake_up_common 中找出一个等待队列项 curr然后调用其回调函数 curr-func来完成进程的唤醒。不过要注意的是这个唤醒只是把相应的进程放到可运行队列里而已。真正的执行还得等其它进程主动释放 CPU 或者是时间片到了之后内核把其它进程拿下以后才能真正获得 CPU 并开始执行。 参考图解 | 深入理解高性能网络开发路上的绊脚石 - 同步阻塞网络 IO说到这里你可能还会问了。内核是如何接收包的毕竟唤醒用户进程是它干的。难道它不是一个死循环么是的并不是。 网卡上收到数据包的时候是通过硬中断唤醒内核进程处理硬中断会触发软中断。有了软中断请求以后ksoftirqd 内核线程才开始执行。来从网卡上取包处理放到接收队列然后唤醒用户进程。 参见图解Linux网络包接收过程 究其根源是由网卡的硬中断来触发的。如果一段时间内没有网络包处理那么没有死循环来消耗 CPU 的。对网络底层还有啥不理解的来看看我的公众号「开发内功修炼」 或许可以帮你解开一些困惑。 Github: GitHub - yanfeizhang/coder-kung-fu: 开发内功修炼 哦对了想理解多路复用来看看我的这一篇吧也是从源码角度深入分析的。图解 | 深入揭秘 epoll 是如何实现 IO 多路复用的
http://www.zqtcl.cn/news/441344/

相关文章:

  • 哪些网站可以做画赚钱宁波模板建站定制
  • 昆明门户网站建设wordpress权限设置
  • 设计网站建设图片wordpress博客置顶
  • 网站上海网站建设网站数据建设涉及哪些内容
  • 3d效果图教程网站宁波网站建设慕枫科技
  • 视频结交网站怎么做想创建一个网站
  • 电商网站销售数据分析上海企业信息登记号查询
  • 网站建设规划设计公司排名无锡网站建设 君通科技
  • 徐州网站开发要多少钱给个人网站做百度百科
  • 法语网站建设免费网站为何收录比较慢
  • 品牌网站推广软件seo内链优化
  • 广东律师事务所东莞网站建设做网站 怎么备案
  • shopnc本地生活o2o网站源码wordpress文章内多页效果
  • 深圳全国网站制作哪个好页面设计有哪几种风格
  • 网页设计作业网站素材和效果图夏天做啥网站致富
  • 利用帝国软件如何做网站网站友链交换平台
  • 简述网站开发技术深圳网站设计合理刻
  • wordpress网站名称寻找销售团队外包
  • 一浪网站建设网页qq邮箱
  • 做网站需要注册公司吗夫唯seo系统培训
  • 沈阳人流哪个医院好安全百度关键词优化怎么做
  • 1688网站怎么做分销高质量的网站内容建设
  • 网站建设公司济宁网站转跳怎么做
  • 镇江网站设计多少钱企业网络部署方案
  • 建网站的公司浩森宇特wordpress登录缓存
  • 便宜建站空间战队头像在线制作免费
  • 做招聘网站赚钱吗厦门网站建设哪里好
  • 新乡网站建设哪家公司好阿里巴巴做国际网站多少钱
  • 怎么在悉尼做网站dede做手机网站
  • 企业网站模板免费下载品牌建设专家库推荐表