简短声明方式来单独为一个变量重复声明, := 左侧至少有一个新变量,才允许多变量的重复声明:
|
|
简短声明方式来单独为一个变量重复声明, := 左侧至少有一个新变量,才允许多变量的重复声明:
|
|
|
|
在阻塞I/O下,一个线程只能处理一个流的I/O事件,这个流的处理卡住会阻塞整个线程。如果想同时处理多个流,要么多进程fork,要么多线程。很不巧两种方法效率都不高,这时I/O复用就诞生了。
首先定义流的概念,一个流可以是文件、socket、pipe等可以进行I/O操作的内核对象。所以不管你是文件,套接字还是管道我们都可以把他们看做流
要完成I/O复用要完成以下几件事情
1.用户态怎么将fd传递到内核态
2.内核态如何判断fd可读可写
3.内核怎么通知监控者fd可读可写
4.监控者这如何找到可读可写的fd并传递给用户态程序
5.继续循环时监控者这怎么重复上述步骤?
下面以fd来代表表示所有流
Linux kernel 2.2之前,(如图)读写数据基本都是使用read系统调用和write系调用,以nginx来说如果一个请求建立,从磁盘的文件到网络连接之间会通过硬件(DMA)—-内核层—-用户层多次读写系统来完成文件数据的复制传输:从内核层用read系统调用读到用户层,再从用户层用write系统调用写到内核层,每一次用户层到内核层的进行一次上下文转换,这种代价是非常昂贵的。甚至在没有数据变化时这种复制尤其显得多余。如果nginx接受大量并发请求,这种系统调用就会非常频繁,服务器的性能就会下降。
Docker容器本质上是宿主机上的进程。
Docker通过namespace实现了资源隔离,通过cgroups实现了资源限制,通过写时复制(copy-on-write)实现了高效的文件操作。
|
|
相比C字符串,SDS具有以下优势:
二进制安全: 二进制数据在写入时是怎么样的,读取时就是怎么样,那么就是二进制安全的