2017-07-18 12:15
⁄ 工业·编程
⁄ 共 5451字
微信诞生于2011年1月,当年用户规模为0.1亿左右;2013年11月,微信月活跃用户数达到3.55亿,一跃成为亚洲地区拥有最大用户群体的移动终端即时通讯软件。
面对如此体量的提升,微信后台也曾遭遇棘手的窘境;令人赞叹的是技术人及时地做出了漂亮的应对。
这背后有着怎样的技术故事?
此时此刻,你在微信手机端发出的请求,是怎样被后台消化和处理的?这次,我们聚焦微信后台解决方案之协程库libco。该项目在保留后台敏捷的同步风...
libco, 协程, 微信阅读全文
2017-07-11 11:54
⁄ 工业·编程
⁄ 共 1696字
相比std::async,std::thread就原始多了。thread一定会创建新线程(而不是像async那样创建的时候可能不会,后面才创建新线程(std::launch::deferred)),并且创建它的线程还必须指定以何种策略等待新线程。
#include <iostream>
#include <thread>
void task() {
for (int i = 0; i < 10; i++) {
std::cout << "A";
...
并发阅读全文
2017-07-07 07:07
⁄ 工业·编程
⁄ 共 748字
系统架构师的职责具体如下( 来自国家级教材 《系统架构设计师教程》):
1、确认需求
在项目开发过程中,架构师是在需求规格说明书完成后介入的,需求规格说明书必须得到架构师的认可。架构师需要和分析人员反复交流,以保证自己完整并准确地理解用户需求。
2、系统分解
依据用户需求,架构师将系统整体分解为更小的子系统和组...
架构师, 软件之路阅读全文
2017-07-04 11:52
⁄ 工业·编程
⁄ 共 1448字
std::async创建一个后台线程执行传递的任务,这个任务只要是callable object均可,然后返回一个std::future。future储存一个多线程共享的状态,当调用future.get时会阻塞直到绑定的task执行完毕:
#include <iostream>
#include <future>
void task() {
for (int i = 0; i < 10; i++) {
std::cout << "A";
}
...
并发阅读全文
2017-06-28 11:46
⁄ 工业·编程
⁄ 共 2610字
我们知道auto_ptr,unique_ptr构造或者析构后,都会将自身的管理权限转移,那么如何解决这个问题呢,boost库也给我们提供了带引用计数的指针。
1:shared_ptr
shared_ptr是最常用的智能指针,shared_ptr采用了引用计数器,多个shared_ptr中的T *ptr指向同一个内存区域(同一个对象),并共同维护同一个引用计数器。shared_ptr定义如下,记录同一个实例被引用的次数,当引用次数大于0时可用,等于0时释放内存。所以用户可以自由的赋...
智能指针阅读全文
2017-06-21 11:27
⁄ 工业·编程
⁄ 共 3365字
在C++中我们为了避免内存泄漏而引入的智能指针
因为在C++中我们频繁使用堆内存,但是堆内存的申请和释放都由程序员自己管理。程序员自己管理堆内存可以提高了程序的效率,但是整体来说堆内存的管理是麻烦的,C++11中引入了智能指针的概念,方便管理堆内存。我们使用普通指针,容易造成堆内存泄露(忘记释放),二次释放,程序发生异常时内存泄露等问题,使用智能指针能更好的管理堆内存。实际上我们这个智能指针即对象,因为对...
智能指针阅读全文
2017-06-14 11:21
⁄ 工业·编程
⁄ 共 1936字
I/O复用虽然可以同时监听多个文件描述符,但他本身是阻塞的。并且,当多个文件描述符同时就绪时,如果不采用额外的措施,程序就只能按顺序依次处理其中的每一个文件描述符,这样I/O复用看起来就像是串行的,要实现并法就需要用多进程或多线程实现。
select poll epoll 比较
1:事件集
select的参数没有将文件描述符单独与事件绑定,而是用文件描述符的集合fd_set中的每一位代表文件描述符,0/1代表事件是否发...
epoll, IO, poll, 比较阅读全文
2017-06-07 11:13
⁄ 工业·编程
⁄ 共 5905字
epoll内核实现
(1)内核为epoll做准备工作
这个模块在内核初始化时(操作系统启动)注册了一个新的文件系统,叫"eventpollfs"(在eventpoll_fs_type结构里),然后挂载此文件系统。另外还创建两个内核cache(在内核编程中,如果需要频繁分配小块内存,应该创建kmem_cahe来做“内存池”),分别用于存放struct epitem和eppoll_entry。这个内核高速cache区,就是建立连续的物理内存页,就是物理上分配好你想要的size的内...
epoll, IO, 源码阅读全文
2017-05-31 11:11
⁄ 工业·编程
⁄ 共 1259字
应用层调用poll时,内核调用了sys_poll
在sys_poll中首先初始化,判断了nfds是超过struct file支持的最大的fd数(默认256),将传入的timeout时间转化为cpu时钟周期,并且调用了poll_initwait初始化了一个函数指针,用于操作系统异步回调的;
接下来,进行了一个while循环,从0到nfds给每一个struct pollfd对象开辟内存,是以链表节点poll_list大小开辟的(一个链表节点是一个page,链表节点中有struct pollfd结构),然后将用户空...
IO, poll, 源码阅读全文
2017-05-24 10:40
⁄ 工业·编程
⁄ 共 3712字
在一个大的工程中,源文件不计其数,其可能会按类型、功能、模块分别放在若干个目录中,那我们每次去编译的时候就会输入一长串编译命令以及相应的路径,极其麻烦;另外一点就是每次若更改了一个源文件,对于其他没有更改的文件也得重新编译,效率低下。为了解决这些问题,makefile出现了。
makefile
1:makefile关系到整个工程的编译规则(根据你写的依赖关系执行),决定了哪些文件需要先编译,哪些文件需要后编译,哪些文件需...
Makefile阅读全文