C协程库源码解析

进程vs线程

我们知道,主机上资源有限,一颗 CPU、一块磁盘、一张网卡,如何同时服务上百个请求呢?

多进程模式是最初的解决方案。内核把 CPU 的执行时间切分成许多时间片(timeslice),比如 1 秒钟可以切分为 100 个 10 毫秒的时间片,每个时间片再分发给不同的进程,通常,每个进程需要多个时间片才能完成一个请求。

这样,虽然微观上,比如说就这 10 毫秒时间 CPU 只能执行一个进程,但宏观上 1 秒钟执行了 100 个时间片,于是每个时间片所属进程中的请求也得到了执行,这就实现了请求的并发执行。不过,每个进程的内存空间都是独立的,这样用多进程实现并发就有两个缺点:......

网络编程中的SIGPIPE信号

在极客时间中学习专栏<网络编程实战>中有一个思考题,觉得下面的评论回答的有点浅显,结合工作中排查过的实际问题,想结合自己的理解展开讲下。

源代码(client.c):

#include <stdio.h>

#include <error.h>

#include <stdlib.h>

#include <sys/socket.h>

#include <unistd.h>

#include <errno.h>

#include <string.h>

#include <sys/socket......

Linux添加swap分区,解决内存不足

周末在家打算安装学习下grpc,发现安装到一半oom内存不足,于是有了这篇文章.

Swap 是 Linux 下的交换分区,类似 Windows 的虚拟内存,当物理内存不足时,系统可把一些内存中不常用到的程序放入 Swap,解决物理内存不足的情况。但是如果开始使用 SWAP 的时候系统通常都会变得十分缓慢,因为硬盘 IO 占用的十分厉害,除非是 SSD 的情况下,速度才有可能稍微快一点。

下面是创建使用 SWAP 的方法:

一、创建文件

dd if=/dev/zero of=/swapfile bs=1024 count=8096000

SSH 执行以上命令,创建一个名为 sw......

UNIX/Linux系统管理技术手册

书架上的这块大部头书在5.1的时候终于有时间来学习了,本文将长期更新,记录UNIX/Linux系统管理技术手册学习中的疑问与解答。该书在豆瓣评分颇高,UNIX/Linux系统管理技术手册.勘误表在本文最后,如有疑问欢迎留言讨论。

笔记中实际操作的系统来自于ubuntu,运行在一款古董级的hp笔记本上,在Macbook Pro中运行了一台centos7虚拟机,电脑卡的时候关闭该虚拟机使用hp笔记本中的虚拟机。

leveldb中的LRUCache学习

由于查询内存要远比查询mongo数据库快,为了减少数据库查询压力,提升业务进程处理速度,实现了一个简单的lrucache,笔记链接LRU算法C++实现。内存相对于磁盘永远是奢侈品,但随着时代的发展,现在的服务器动辄32G 64G起步,分出几个G来提高访问速度是必要的。计算机中有个比较有意思的现象,要么以时间换空间,要么以空间换时间,LRU算法则属于后者。

QQ group里听某位大哥说google leveldb中有一套非常经典的lrucache实现,心向往之,周日跑了一天的装修后,晚上一边泡着脚一边github上拉下来代码研究下。

首先是leveldb的安装,网上找了一些安装方法,差不多......

mongoc-c-driver使用教程

ubuntu install MongoDB

Installing the MongoDB C Driver (libmongoc) and BSON library (libbson)

strace命令使用实例

strace命令

strace是Linux上的一个很好用的工具,它可以用来输出程序在运行过程中发生的系统调用以及收到的信号的相关信息,因此在调试和诊断问题时有很大的帮助,特别是在程序没有源码,或是在前期做一些粗略的分析时。strace命令格式如下:

strace [options] command [args]

查看帮助

strace -h

查看版本信息

strace -V

基本使用

举个例子:

[root cprogs2]#strace sleep 300

execve("/bin/sleep", ["sleep", "300"], 0x7ffc2a8576d8......

Linux进程间资源共享

周末整理笔记,发现已经有接近一年的笔记等待整理,主要是Linux进程间资源共享,包括变量、锁、函数,很多笔记中没有记录引用链接,这是个不好的习惯。

Linux内核中是不存在线程的概念的,一切可执行单元都是进程。所谓多线程,其实是一组可以共享内存的进程,即“轻量级进程”。所以应该只要实现内存共享,就能让进程之间互相访问。同一个进程的多个线程天然具有上面的特性。

变量共享

master.c

#include <time.h>

#include <stdio.h>

#include <stdlib.h>

#include <assert.......

rename 函数使用注意事项

看日志中的rename函数的一个报错信息:Invalid cross-device link,花几分钟google搜索之后确定不是问题,记录下相关排查和验证过程。

man手册里的资料:

EXDEV The links named by new and old are on different file systems and the implementation does not support links between file systems.

返回EXDEV这个错误码是由于old和new位于不同的文件系统。为了验证这一观点,我从床底下搬出了我的上古时期的笔记本,......

Linux性能优化实践

本文是学习极客时间《Linux性能优化实战》课程,针对课程中用到的一些命令的学习笔记。

课程信息

ps命令不加参数执行ps

[root ~]#ps

PID TTY TIME CMD

4273 pts/0 00:00:00 bash

9507 pts/0 00:00:00 ps

[root ~]#

结果默认会显示4列信息。

PID: 运行着的命令(CMD)的进程编号

TTY: 命令所运行的位置(终端)

TIME: 运行着的该命令所占用的CPU处理时间

CMD: 该进程所运行的命令

显示所有进程

ps -ax,命令结果可能很长,可以配合les......