回答了问题2018-08-28
{代码...} 查找这个事,只有比较函数和类型有关,算法逻辑本身和类型无关,所以把比较函数作为一个参数,就可以达到通用算法的效果了。
回答了问题2018-07-04
非阻塞模式下,没有数据返回值是-1,并且错误码是EAGAIN or EWOULDBLOCK。
回答了问题2018-06-13
insmod的时候,会动态解析符号地址,do_fork这个符号时内核没有导出的,所以不会解析成功。内核通过EXPORT_SYMOBL导出的符号,模块才可以使用,可以理解为这是内核提供给模块的“合法”API。
回答了问题2018-06-12
我们就以HTTP请求的处理过程为例,为简化说明,仅考虑网络IO,不考虑文件IO和数据库等其他过程,也不考虑多核系统。考虑采用如下最简模型来处理HTTP请求:
回答了问题2018-06-11
用户对文章的浏览请求,这个是读操作,是可以被Cache缓存(如果有的话)的,并不需要操作数据库。增加浏览量这个操作涉及写数据库,而且通常浏览量并不要求很强的一致性和实时性,可以不必等浏览量增加操作执行完成(数据库写成功)就返回。
回答了问题2018-06-08
想到两个方法: 方法一:如果是比较新的内核版本3.9以上,支持SO_REUSEPORT,那么你可以: 启动一个新的进程,也监听相同的端口。 新的进程启动后给老的进程发个信号。 老的进程收到后停止接收新的连接请求(停止Accept,关闭Listen Socket),等所有已经存在的连接...
回答了问题2018-06-07
getopts或getopt。
回答了问题2018-06-06
sem_timewait 函数会阻塞当前线程直到拿到锁或超时才会返回。阻塞的实现方式就是休眠当前线程,直到锁释放或者超时后唤醒。超时后这个函数返回继续执行后面的代码,后面的代码逻辑决定后面的行为。
回答了问题2018-06-04
不会无穷无尽,因为任何对外提供的服务都是有一个交互的起点。以访问一个网站的主页为例,其起点就是请求DNS,DNS服务器由ISP或大型专业服务公司提供,一般都可以认为这个是100%可靠的。当DNS返回一个地址给用户后,用户请求这个地址,这个地址的可靠性由网站保障,...
回答了问题2018-06-04
RPC(Remote Procedure Call)把进程间(包括跨服务器)的通信过程封装成函数调用方式,隐藏复杂的通信处理细节,方便使用、简化代码;使得调用者可以像调用本地函数那样调用其他进程提供的处理过程。
回答了问题2018-06-03
因为子线程休眠的时候,主线程已经退出了,主线程退出后程序会结束,子线程都会退出,来不及执行打印语句。在主线程可以通过thread.join方法等待所有子线程都退出。
回答了问题2018-06-01
Buffer IO就是IO请求经过缓存子系统处理,例如Linux 上的VFS Cache层;写数据会先写入内存,写入内存后就会返回,不等数据刷到磁盘上。读数据会从先尝试从内存中读取,如果内存中命中,就不需要从磁盘上读取了。Buffer IO会带来读写性能的大幅度提升,这和在数据库前...
回答了问题2018-06-01
一开始写代码,并不需要刻意做这样的优化。提前做这种牺牲代码可维护性、增加复杂度的优化,坏处大于好处。因为它一定会带来一些坏处,但并不确定是否真的带来一些好处。
回答了问题2018-06-01
我们把程序反汇编,如上,可以看到对于 s := []byte("") 这样的语句,编译器会为我们生成 stringtoslicebyte函数进行从string到slice的转换。这个函数定义在:
回答了问题2018-05-30
主要是user用户态占用,可以用perf top看一下热点函数,根据热点函数可以进一步推断可能属于哪个进程或程序。perf工具当前主流的发行版都会有,但如果版本较老可能就没有了。题主最好贴一下系统的版本信息。类似下面这种:
回答了问题2018-05-30
C++标准只规定了编译器可以帮我们把一个{}定义的常量数组转换为一个initializer_list对象,这样接受initializer_list为参数的函数(通常是各种构造函数),就可以接受{},通过这种方式扩展了语法,使我们可以像初始化普通数组那样初始化容器,简化了代码。