当客户端接收到了第二次握手包后,就进入第三次握手判断阶段,此时客户端处于SYN_SENT
阶段
linux 系统可以创建的进程数可以通过ulimit -u
查看
rxsi@VM-20-9-debian:~$ ulimit -u
15147
当然如果把这个数调大接近无限,也不代表就可以无限制的创建进程,因为每一个进程都需要有pid
,因此也会受到系统pid
上限的控制
rxsi@VM-20-9-debian:~$ cat /proc/sys/kernel/pid_max
32768
可以通过ulimit -n
查看
rxsi@VM-20-9-debian:~$ ulimit -n
1024
使用lsof -p 进程号
可以查看目标进程当前开启的套接字
rxsi@VM-20-9-debian:~/learncpp$ lsof -p 30165
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
blocking_ 30165 rxsi 0u CHR 136,2 0t0 5 /dev/pts/2
blocking_ 30165 rxsi 1u CHR 136,2 0t0 5 /dev/pts/2
blocking_ 30165 rxsi 2u CHR 136,2 0t0 5 /dev/pts/2
blocking_ 30165 rxsi 3u IPv4 2553317 0t0 TCP *:3000 (LISTEN)
在 linux 系统底层实现中,线程是与其他进程共享数据的进程,也是由task_struct
结构体表示,因此在 linux 系统线程又被称为轻量级进程。
在 linux 中,一个进程/线程能够拥有的栈空间的大小是由系统参数设定的。通过ulimit -s
命令可知,系统给线程(一个进程中的多个线程有独立的栈空间,而共享堆空间)分配的栈空间的最大大小为8MB
,注意系统分配的是虚拟内存,而实际内存只有在被占用时才会因为缺页中断而发生分配。
rxsi@VM-20-9-debian:~$ ulimit -s
8192
已知 linux 系统会为每一个线程分配8MB
的虚拟内存,而 32 位系统中,系统最大内存是 4GB,用户区被分配了 3GB 空间,因此理论上可以创建的线程总数为3GB / 8MB ≈ 300
。而在 64 位系统中,系统最大内存为 264,用户区占用了 128TB,所以理论上可以创建的线程数是无限的(1000多万),不过我们实际装机的物理内存一般也就是几十G,所以首先物理内存方面就不支持创建那么多的线程。
线程的创建实际还受到几个内核参数的限制:
rxsi@VM-20-9-debian:~$ cat /proc/sys/kernel/threads-max
30295 // 表示系统最大支持的线程数
rxsi@VM-20-9-debian:~$ cat /proc/sys/kernel/pid_max
32768 // 全局pid数值,因为需要给每个进程/线程分配ID,所以用完的话就会分配失败。僵尸进程会占用该值,因此要避免僵尸进程的产生
rxsi@VM-20-9-debian:~$ cat /proc/sys/vm/max_map_count
65530 // 一个进程可以拥有的VMA的数量