我们每天刷手机都会接收到各种各样的信息,看到这篇文章时,不知大家有没有思考过,这些信息是如何组织,然后通过服务器发送给我们的呢?

其实也很简单,不就是一条一条请求嘛,服务器根据不同的请求分别去不同的数据库拿数据,然后通过网络返回给用户,但是复杂起来也复杂,对于成百上千的用户请求,服务器是如何去并行处理的呢?

多进程

最简单的一种方法便是利用多进程去并行处理多个请求,在linux操作系统中,我们可以通过fork,exec等系统调用去创建多个进程,可以通过在父进程中接受用户的连接请求,然后通过创建子进程去处理用户请求,就像下图所示


这种方式的优势在于

•编程简单,容易理解•由于各个进程的地址空间相互隔离,因此一个进程的崩溃不会影响其他进程•充分利用多核资源

多进程并行处理的优点很明显,但是缺点同样明显

•各个进程地址空间相互隔离,进程间的通信将会变的很困难•创建进程的开销远比创建线程的开销要大,频繁创建销毁进程会影响系统的性能

有什么解决的方法呢?下面多线程要登场啦

多线程

线程是操作系统中进行调度的基本单位,它从属于进程,由于线程共享同一个进程下的地址空间,所以线程间通信是通过共享内存,线程是轻量级的,创建一个线程的开销也是非常的小

我们对于每个请求,可以单独创建一个线程去进行处理,即使一个线程由于执行某些I/O操作,例如读取数据库而阻塞住,其他线程仍然可以正常执行


但线程就是完美的嘛?并不是的

因为线程之间共享进程的地址空间,线程间通信也成了一个麻烦的问题,正是由于线程间共享地址空间,因此一个线程崩溃会导致整个进程崩溃退出,而线程间通信只需要直接读取内存就可以了,也会出现很多问题,譬如死锁、线程间的同步互斥、等等,这些极容易产生bug,无数程序员宝贵的时间就有相当一部分用来解决多线程带来的无尽问题崩溃

虽然线程也有缺点,但是比多进程来说,线程更有优势,但想单纯的利用多线程就能解决高并发问题也是不切实际的

因为虽然线程创建开销相比进程小,但依然也是有开销的,对于动辄数万数十万的链接的高并发服务器来说,创建数万个线程会有性能问题,这包括内存占用、线程间切换,也就是调度的开销。

于是就有了下面的策略

Event Loop:事件驱动

在GUI编程以及服务器编程中,流行着一种基于事件驱动编程的设计模式 这一种技术需要两种原料:

•event•处理event的函数,这一种函数通常称为event handler

你只需要安静的等待event到来就好,当event到来之后,检查一下event的类型,并根据该类型找到对应的event处理函数,也就是event handler,然后直接调用该event handler就好了。

是不是很装逼,我们可以看到,我们只需要不断的接受event然后处理event,因此我们需要一个循环,而这个循环就称为event loop

event loop要做的事情其实是很简单的,只需要等待event的到来,然后调用相应的event处理函数即可

为什么一个event handler能够处理那么多请求呢?对于web服务器来说,处理一个用户请求时大部分时间其实都用在了I/O操作上,像数据库读写、文件读写、网络读写等。当一个请求到来,简单处理之后可能就需要查询数据库等I/O操作,我们知道I/O是非常慢的,当发起I/O后我们大可以不用等待该I/O操作完成就可以继续处理接下来的用户请求

现在你应该明白了吧,虽然上一个用户请求还没有处理完我们其实就可以处理下一个用户请求了,这也是并行,这种并行就可以用事件驱动编程来处理。这就好比餐厅服务员一样,一个服务员不可能一直等上一个顾客下单、上菜、吃饭、买单之后才接待下一个顾客,服务员是怎么做的呢?当一个顾客下完单后直接处理下一个顾客,当顾客吃完饭后会自己回来买单结账的。看到了吧,同样是一个服务员也可以同时处理多个顾客,这个服务员就相当于这里的Event loop,即使这个event loop只运行在一个线程(进程)中也可以同时处理多个用户请求。这就涉及到多线程的异步执行,感兴趣的朋友可以看看上一篇文章的介绍程序优化-浅谈多任务的异步执行


扫描并关注以下公众号?,我把我的一些技术学习资料都整理好了,涉及算法,计算机网络,Java,数据库,大家需要的可以访问以下链接自取,一起加油

https://github.com/zxhjames/learn_resource


服务器不知别内存_程序优化浅谈服务器实现高并发的原理相关推荐

  1. 什么是proxy服务器代理?怎么设置代理服务器?浅谈服务器代理与VPN的区别

    服务器 服务器是计算机的一种,它比普通计算机运行更快.负载更高.价格更贵.服务器在网络中为其它客户机(如PC机.智能手机.ATM等终端甚至是火车系统等大型设备)提供计算或者应用服务.服务器具有高速的C ...

  2. 服务器不知别内存_图文版 许迎果第63期 选购和使用内存需要注意的点

    其实要说清楚内存的方方面面还是要颇费一番功夫的. 内存的起源和发展历程估计要讲一期,内存厂商,颗粒,品牌也需要单独讲一期,内存超频也要单独讲一期.内存看似简单,但要说的内容却是很多的. 所以为了节省各 ...

  3. mysql 提高电脑配置_Mysql配置优化浅谈

    Mysql配置优化浅谈安装MySQL后,配置文件my.cnf在MySQL 安装目录/share/mysql目录中,该目录中还包含多个配置文件可供参考,有my-large.cnf ,my-huge.cn ...

  4. MYSQL优化浅谈,工具及优化点介绍,mysqldumpslow,pt-query-digest,explain等

    MYSQL优化浅谈 msyql是开发常用的关系型数据库,快速.稳定.开源等优点就不说了. 个人认为,项目上线,标志着一个项目真正的开始.从运维,到反馈,到再分析,再版本迭代,再优化- 这是一个漫长且考 ...

  5. 浅谈服务器http并发数的影响因素

    目录 浅谈服务器http并发数的影响因素 一.问题的提出 1.1.讨论此问题的假设(基本条件) 1.2.计量时间 二.讨论影响因素 2.1.首先要评估客户端应用(下文统称App)本身 2.2.单位时间 ...

  6. 微博服务器又炸了,快来看看如何一步步构建高并发的网站

    如何构建高并发的网站 昨天的微博服务器又炸了,心疼微博三秒钟 .虽然网上各种嘲讽谩骂渣浪的,不过作为程序员细细想想感觉新浪还是很不容易的,毕竟它也没法知道哪个明星突然就出啥事了,面对突如其来的多出好几 ...

  7. 浅谈WEBGIS运用栅格地图实现原理[更新:Google Maps带来的新型WebGIS设计模式]

    为什么要取这样的一个题目呢?主要是因为今天去了一家公司和他们谈了谈,本来是指望做兼职的,谈到最后当然是不成了.去谈的是地图制作(可兼职)一职,要求是地图制图经验,最后加了个有WEBGIS开发经验.本来 ...

  8. 程序员修神之路--高并发系统设计负载均衡架构

    点击上方"蓝字"关注,酷爽一夏 菜菜哥,上次你给我讲的分库分表策略对我帮助很大 有帮助就好,上次请我的咖啡也很好喝~ 呵呵,不过随着访问量的不断加大,网站我又加了nginx做负载均 ...

  9. 【JVM调优】JVM内存管理调优浅谈

    什么是JVM Java Virtual Machine,Java虚拟机 Java虚拟机有自己完善的硬件架构,如处理器.堆栈等,还具有相应的指令系统. Java虚拟机本质上就是一个程序,当它在命令行上启 ...

最新文章

  1. CVPR 2021|三维视觉相关论文汇总
  2. 在CentOS上用yum安装redis
  3. WebApplicationContext初始化
  4. JavaFX UI控件教程(十)之Scroll Bar
  5. C语言申请内存时堆栈大小限制
  6. 用计算机三级处理文件,【题目】计算机三级题目,献给为计算机三级挣扎的同学们...
  7. 动态规划应用--搜索引擎拼写纠错
  8. java基于文件的map实现_Mybatis中返回Map的实现
  9. Ubuntu安装常用软件
  10. 微信iOS版上线新功能:输入文字又变得容易一点了
  11. Java设计模式学习总结(4)——创建型模式之单例模式
  12. windows 远程连接mongo_MongoDB 在windows服务器安装部署与远程访问配置
  13. AnyLogic 建立谢林模型
  14. Windows下使用C++(Win32SDK)编程无需提权读取硬盘序列号
  15. 数据库mysql基本查询语句_数据库mysql基础查询语句实录
  16. 网易公开课APP如何修改视频缓存地址
  17. “跳出内卷”ROttKRON乐旷陶瓷耳机的新视野,“形、质、声”打开耳机新话题
  18. 织梦套用html模板文件,织梦CMS套模板建站流程
  19. python erp源码_分享|值得考虑的 9 个开源 ERP 系统
  20. kubeadm构建k8s之Prometheus-operated监控(0.18.1)

热门文章

  1. ASN.1 compiler asn1c
  2. Unity 简易音乐播放系统
  3. 奥的斯服务器显示nosc0,西子奥的斯OH-CON8501FOVF货梯电气原理图.pdf
  4. 管理者的角色修炼-第三课-赢在执行
  5. GPS从入门到放弃(三) --- GPS坐标系
  6. 华为HYBRID的配置
  7. HTML5新特性详解
  8. 在Python中优雅的格式化字符串的两种方式
  9. 自由开发者的收入来源(程序员)
  10. 更改window下的谷歌浏览器默认安装路径