-
2019-06-10 12:24:53
1.端口号的作用
端口号可以用来标识同一个主机上通信的不同应用程序,端口号+IP地址就可以组成一个套接字,用来标识一个进程2.端口号的应用场景
在TCP/IP协议中,用“源IP地址”,“目的IP地址”,“源端口号”,“目的端口号”,协议号(IP协议的协议号为4,TCP的协议号为6)这样的一个五元组来标识一个通信,通信的双方在发送消息时,消息的头部会带着这样的五元组3.端口范围划分
(1)0~1023:知名端口号,是留着备用的,一把都是用于协议,例如HTTP、FTP、SSH
(2)1024~65535:是操作系统动态分配的端口号,客户端程序的端口号,就是由操作糸统从这个范围来分配的,在TCP与UDP的套接字通信中,客户端的端口号就是在此范围中4.知名的端口号与端口号对应的服务器
HTTP服务器:80
FTP服务器:21ps:FTP有一个控制连接和一个数据连接,所以FTP是有两个端口号的,控制连接的端口号是21,数据连接的端口号是20,但是如果FTP的端口号默认是21,如果指明FTP有两个端口号的话,那就是21和20,否则FTP服务器的端口号就是21
TELNET服务器:23
SSH服务器:22
HTTPS:443
WEB服务器:255.在linux中如何查看知名端口号?
cat /etc/services6.一个进程是否可以bind多个端口号?
可以因为一个进程可以打开多个文件描述符,而每个文件描述符都对应一个端口号,所以一个进程可以绑定多个端口号
7.一个端口号是否可以被多个进程绑定?
不可以ps:如果进程先绑定一个端口号,然后在fork一个子进程,这样的话就可以是实现多个进程绑定一个端口号,但是两个不同的进程绑定同一个端口号是不可以的
---------------------
作者:dangzhangjing97
来源:CSDN
原文:https://blog.csdn.net/dangzhangjing97/article/details/80958819
版权声明:本文为博主原创文章,转载请附上博文链接!更多相关内容 -
进程 vs 线程 :一个进程可以包含多个线程
2016-09-18 21:15:50进程(process)和线程(thread)是操作系统的基本概念,但是...vs 线程 :一个进程可以包含多个线程" title="进程 vs 线程 :一个进程可以包含多个线程" style="border:0px; max-width:602px; height:auto; ma进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。
最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。
1.
计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。
2.
假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。
3.
进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。
4.
一个车间里,可以有很多工人。他们协同完成一个任务。
5.
线程就好比车间里的工人。一个进程可以包括多个线程。
6.
车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。
7.
可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。
8.
一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。
9.
还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。
10.
这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。
不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。
11.
操作系统的设计,因此可以归结为三点:
(1)以多进程形式,允许多个任务同时运行;
(2)以多线程形式,允许单个任务分成不同的部分运行;
(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。
(完)
-
一个进程最多可以创建多少个线程?
2021-07-15 09:19:09大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。 其实他看这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。 因为不同的...大家好,我是小林。
昨天有位读者问了我这么个问题:
大致意思就是,他看了一个面经,说虚拟内存是 2G 大小,然后他看了我的图解系统 PDF 里说虚拟内存是 4G,然后他就懵逼了。
其实他看这个面经很有问题,没有说明是什么操作系统,以及是多少位操作系统。
因为不同的操作系统和不同位数的操作系统,虚拟内存可能是不一样多。
Windows 系统我不了解,我就说说 Linux 系统。
在 Linux 操作系统中,虚拟地址空间的内部又被分为内核空间和用户空间两部分,不同位数的系统,地址 空间的范围也不同。比如最常⻅的 32 位和 64 位系统,如下所示:
通过这里可以看出:
- 32 位系统的内核空间占用 1G ,位于最高处,剩下的 3G 是用户空间;
- 64 位系统的内核空间和用户空间都是 128T ,分别占据整个内存空间的最高和最低处,剩下的中
间部分是未定义的。
接着,来看看读者那个面经题目:一个进程最多可以创建多少个线程?
这个问题跟两个东西有关系:
- 进程的虚拟内存空间上限,因为创建一个线程,操作系统需要为其分配一个栈空间,如果线程数量越多,所需的栈空间就要越大,那么虚拟内存就会占用的越多。
- 系统参数限制,虽然 Linux 并没有内核参数来控制单个进程创建的最大线程个数,但是有系统级别的参数来控制整个系统的最大线程个数。
我们先看看,在进程里创建一个线程需要消耗多少虚拟内存大小?
我们可以执行 ulimit -a 这条命令,查看进程创建线程时默认分配的栈空间大小,比如我这台服务器默认分配给线程的栈空间大小为 8M。
在前面我们知道,在 32 位 Linux 系统里,一个进程的虚拟空间是 4G,内核分走了1G,留给用户用的只有 3G。
那么假设创建一个线程需要占用 10M 虚拟内存,总共有 3G 虚拟内存可以使用。于是我们可以算出,最多可以创建差不多 300 个(3G/10M)左右的线程。
如果你想自己做个实验,你可以找台 32 位的 Linux 系统运行下面这个代码:
由于我手上没有 32 位的系统,我这里贴一个网上别人做的测试结果:
如果想使得进程创建上千个线程,那么我们可以调整创建线程时分配的栈空间大小,比如调整为 512k:
$ ulimit -s 512
说完 32 位系统的情况,我们来看看 64 位系统里,一个进程能创建多少线程呢?
我的测试服务器的配置:
- 64 位系统;
- 2G 物理内存;
- 单核 CPU。
64 位系统意味着用户空间的虚拟内存最大值是 128T,这个数值是很大的,如果按创建一个线程需占用 10M 栈空间的情况来算,那么理论上可以创建 128T/10M 个线程,也就是 1000多万个线程,有点魔幻!
所以按 64 位系统的虚拟内存大小,理论上可以创建无数个线程。
事实上,肯定创建不了那么多线程,除了虚拟内存的限制,还有系统的限制。
比如下面这三个内核参数的大小,都会影响创建线程的上限:
- /proc/sys/kernel/threads-max,表示系统支持的最大线程数,默认值是
14553
; - /proc/sys/kernel/pid_max,表示系统全局的 PID 号数值的限制,每一个进程或线程都有 ID,ID 的值超过这个数,进程或线程就会创建失败,默认值是
32768
; - /proc/sys/vm/max_map_count,表示限制一个进程可以拥有的VMA(虚拟内存区域)的数量,具体什么意思我也没搞清楚,反正如果它的值很小,也会导致创建线程失败,默认值是
65530
。
那接下针对我的测试服务器的配置,看下一个进程最多能创建多少个线程呢?
我在这台服务器跑了前面的程序,其结果如下:
可以看到,创建了 14374 个线程后,就无法在创建了,而且报错是因为资源的限制。
前面我提到的
threads-max
内核参数,它是限制系统里最大线程数,默认值是 14553。我们可以运行那个测试线程数的程序后,看下当前系统的线程数是多少,可以通过
top -H
查看。左上角的 Threads 的数量显示是 14553,与
threads-max
内核参数的值相同,所以我们可以认为是因为这个参数导致无法继续创建线程。那么,我们可以把 threads-max 参数设置成
99999
:echo 99999 > /proc/sys/kernel/threads-max
设置完 threads-max 参数后,我们重新跑测试线程数的程序,运行后结果如下图:
可以看到,当进程创建了 32326 个线程后,就无法继续创建里,且报错是无法继续申请内存。
此时的上限个数很接近
pid_max
内核参数的默认值(32768),那么我们可以尝试将这个参数设置为 99999:echo 99999 > /proc/sys/kernel/pid_max
设置完 pid_max 参数后,继续跑测试线程数的程序,运行后结果创建线程的个数还是一样卡在了 32768 了。
当时我也挺疑惑的,明明 pid_max 已经调整大后,为什么线程个数还是上不去呢?
后面经过查阅资料发现,
max_map_count
这个内核参数也是需要调大的,但是它的数值与最大线程数之间有什么关系,我也不太明白,只是知道它的值是会限制创建线程个数的上限。然后,我把 max_map_count 内核参数也设置成后 99999:
echo 99999 > /proc/sys/kernel/max_map_count
继续跑测试线程数的程序,结果如下图:
当创建差不多 5 万个线程后,我的服务器就卡住不动了,CPU 都已经被占满了,毕竟这个是单核 CPU,所以现在是 CPU 的瓶颈了。
我只有这台服务器,如果你们有性能更强的服务器来测试的话,有兴趣的小伙伴可以去测试下。
接下来,我们换个思路测试下,把创建线程时分配的栈空间调大,比如调大为 100M,在大就会创建线程失败。
ulimit -s 1024000
设置完后,跑测试线程的程序,其结果如下:
总共创建了 26390 个线程,然后就无法继续创建了,而且该进程的虚拟内存空间已经高达 25T,要知道这台服务器的物理内存才 2G。
为什么物理内存只有 2G,进程的虚拟内存却可以使用 25T 呢?
因为虚拟内存并不是全部都映射到物理内存的,程序是有局部性的特性,也就是某一个时间只会执行部分代码,所以只需要映射这部分程序就好。
你可以从上面那个 top 的截图看到,虽然进程虚拟空间很大,但是物理内存(RES)只有使用了 400 多M。
好了,简单总结下:
- 32 位系统,用户态的虚拟空间只有 3G,如果创建线程时分配的栈空间是 10M,那么一个进程最多只能创建 300 个左右的线程。
- 64 位系统,用户态的虚拟空间大到有 128T,理论上不会受虚拟内存大小的限制,而会受系统的参数或性能限制。
絮叨絮叨
小林在 CSDN 写了很多图解网络和操作系统的系列文章,很高兴收获到很朋友的认可和支持,正好最近图解网络和操作系统的文章连载的有 20+ 篇了,也算有个体系了。
所以为了方便大家阅读,小林把自己原创的图解网络和图解操作系统整理成了 PDF,一整理后,没想到每个图解都输出了 15 万字 + 500 张图,质量也是杠杠的,有很多朋友特地私信我,看了我的图解拿到了大厂的offer。
图解系统 PDF 开源下载:图解系统 PDF 下载地址(点击)
图解网络 PDF 开源下载:图解网络 PDF 下载地址(点击)
我是小林,今天的你,比昨天更博学了吗?
-
【Linux】Linux可以运行多少进程,一个进程可以开多少线程
2019-05-26 17:49:29既然如此,我们可以想象,一个系统中的进程数量肯定是有上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程资源也是有上限的。 Linux中最多可以有多少个进程? 一.Linux中有一个命令可以帮助...目录
说明
进程:系统分配资源的载体,是程序运行的实例;
线程:程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。
既然如此,我们可以想象,一个系统中的进程数量肯定是有上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程资源也是有上限的。
Linux中最多可以有多少个进程?
软限制
一.Linux中有一个命令可以帮助我们查看系统中的进程上限
[pigff@izbp13yd4r85qvk53t04mbz ~]$ ulimit -u 4096
这属于软限制,是可以改变的。也就是说在我的机器上最多可以有4096个进程,但是我可以通过改变这个参数的值来修改对于进程数量的软限制,比如说用下面的命令将软限制改到5120。
ulimit -u 5120pid_t类型限制
二.我们用pid_t来表示一个进程的pid,因此能表示的进程的范围一定不会超过pid_t类型的大小
[pigff@izbp13yd4r85qvk53t04mbz ~]$ cat /proc/sys/kernel/pid_max
32768
pid_t实际上就是一个short类型变量,当然这里能表示的范围只是进程id最多表示到这么多,这只是一个理论值,实际上,由于内存等系统资源的限制,根本不会同时有这么多的进程存在。一个进程中最多可以有多少个线程?
文件描述符数限制
一、ulimit -n可以查看一个进程最多可以打开多少文件描述符数;
内存限制(线程堆栈内存*n)
Linux中线程占用内存中,取决于分配给线程的调用栈大小,可以用ulimit -s命令来查看大小(stack size (kbytes,-s)表示线程堆栈大小,一般常见的有10M或者是8M)。
我们还知道,一个进程的虚拟内存是4G,在Linux32位平台下,内核分走了1G,留给用户用的只有3G,于是我们可以想到,创建一个线程占有了10M内存,总共有3G内存可以使用。于是可想而知,3G/10M=最大线程数,最多可以创建差不多300个左右的线程。 但实际会比这个数小一点,因为程序本身占内存,还有些管理线程。64位系统的不一样,64系统的线程数并不是简单是用 内存/线程栈 ,
因此,进程最多可以创建的线程数是根据分配给调用栈的大小,以及操作系统(32位和64位不同)共同决定的。
可以使用ulimit -s来设置stack size,设置的小一点开辟的线程就多。
同时,/usr/include/bits/local_lim.h中的PTHREAD_THREADS_MAX限制了进程的最大线程数
/proc/sys/kernel/threads-max中限制了系统的最大线程数查看公司的服务器:
限制数为: 2^19
实际测试结果:2^16三、最靠谱的方法还是自己写程序测试的结果
#include<unistd.h> #include<stdlib.h> #include<pthread.h> #include<stdio.h> void* foo(void* param) { } int main() { int i = 0; pthread_t thread; while (1) { if (pthread_create(&thread, NULL, foo, NULL) != 0) break; i ++; } printf("i = %d\n", i); }
编译命令如下:
g++ main.cpp -o main -lpthread
执行结果:
[root@localhost]# ./main
i = 32747
原文:
-
端口号 & 一个端口号是否可以被多个进程绑定?& 一个进程是否可以bind多个端口号?
2018-07-08 13:42:58端口号可以用来标识同一个主机上通信的不同应用程序,端口号+IP地址就可以组成一个套接字,用来标识一个进程 2.端口号的应用场景 在TCP/IP协议中,用“源IP地址”,“目的IP地址”,“源端口号”,“目的端口... -
网络-一个进程是否能拥有多个端口
2019-03-05 09:26:361.端口理解 其它网友的观点 ... 博文中打的比喻个人觉得很形象,特此引用一下。...其它网友也有相同的问题,大部分人认为一个进程可以拥有多个端口。 端口 下面是引用别人博客的话,同样觉得挺形象。socke... -
一个进程(process)最多可以开辟多少个线程(thread)
2019-02-22 11:06:24进程与线程的关系 简单复习一下:一个”进程“代表中计算机中实际跑起来的一个程序,在现代操作系统...因此一个进程至少得有一个线程,我们把这个线程称之为”主线程“,也就是说,一个进程至少要有一个主线程。 ... -
Android多进程实现,一个APP多个进程
2019-07-30 10:03:06相关文章: Android IPC机制(一)开启多进程(文章1:刘望舒大神的文章,1.3w阅读量,20赞) Android IPC机制(二)用Messenger进行...Android中,默认一个APK包就对应一个进程。 Android平台对每个进程有内存限... -
单个进程监听多个端口及多个进程监听同一个端口
2018-02-21 19:23:57单个进程监听多个端口单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行多个进程监听同一个端口(multiple processes listen on same port)方式1:通过 fork 创建子进程的方式可以实现,其他情况下不行。... -
一个父进程创建多个子进程
2018-08-07 20:59:49循环方式 #include #include #include #include ...#define child 10 ...int main(int argc, char const *argv[]) ... ++i)//创建子进程个数 ... //如果在此位置,就是一个父进程创建多个子进程 } } -
一个CPU就可以同时运行多个进程
2020-07-06 20:56:33 -
Linux下多个进程可以同时打开同一个文件吗?文件描述符与打开文件的关系?
2019-01-15 13:03:23一:结论 1.两个进程中分别产生生成两个独立的fd 2.两个进程可以任意对文件进行读写操作,操作系统并不保证写...6.一个进程对文件长度和内容的修改另外一个进程可以立即感知 二:文件描述符与打开文件的关系? 内核... -
写一个僵尸进程
2021-03-02 23:03:39ps aux 查看进程信息,可以看到,wait.out 克隆出一个子进程,父子进程均处于 S(interruptible sleep, 可中断睡眠状态))状态。 2 秒钟之后再次运行 ps aux 查看进程状态 $ ps aux USER PID %CPU %MEM VSZ RSS TTY ... -
操作系统第二章进程的描述与控制题目
2018-05-15 20:37:591-1. 下面对进程的描述中,错误的是 。...而进程是程序的一次执行,是动态的,有生命周期的。1-2. 分配到必要的资源并获得处理机时的进程状态是 ()A. 就绪状态 B. 执行状态 C. 阻塞状态 D. 撤消... -
如何多个进程监听同一个端口
2020-06-03 11:13:52一个进程监听端口,经验告诉我们,如果多次启动一个进程会报错:“Address already in use!"。这是由于bind函数导致的,由于该端口号已经被第一个进程监听了。有哪些方法可以实现多个进程监听同一个端口呢? 2. ... -
一个应用程序有多少个进程
2019-12-16 21:55:42一个程序几个进程在于这个程序的开发者的设置,可以是1个,也可以是多个的。...2.一个程序只有一个进程但被开启很多个 启动多个同一应用程序,每个应用程序都是单进程。这个场景有些应用程序会禁用掉,有些是可以的... -
如何在linux中关闭一个进程
2021-09-15 10:43:35如何在linux中kill一个进程 刚开始学习Linux的时候,总是直接点击×来关闭程序。虽然知道这是关闭整个终端程序,但是奈何如此简单的事情对于新手来说都是很困难的。???? 在 Linux 里中止程序 后来知道,在linux中... -
进程和线程的区别(超详细)
2019-10-03 21:57:46每个进程都有自己独立的一块内存空间,一个进程可以有多个线程,比如在Windows系统中,一个运行的xx.exe就是一个进程。 线程 进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程... -
一个进程最多能包含多少线程
2012-10-20 16:22:34实验蛮简单的,但是,我不由想到了,一个进程最多能包含多少个线程。 在网上查了查,貌似也没找到多少这方面的资料。大部分都是关于服务器多线程链接sever的,关于本机可执行exe的进程数倒是没有什么涉及。 我觉得... -
两个进程同时访问同一个文件
2019-04-08 09:06:06对于多个进程打开同一文件的情况,每个进程都有它自己的文件表项(file对象),其中有它自己的文件位移量,所以对于多个进程读同一文件都能正确工作。但是,当多个进程写同一文件时,则可能产生预期不到的结果。... -
【操作系统】第六话·线程是进程的(宝ᴗ宝)嘛?
2022-03-12 15:23:07从今天开始,我们将要开启一个新的系列【闪耀计划】,没错!这是今年上半年的一整个系列计划!本专题目的是通过百天刷题计划,通过题目和知识点串联的方式,完成对计算机操作系统的复习和巩固;同时还配有专门的笔记... -
多个进程能否监听同一个端口号
2019-05-31 14:03:17那么有个问题就很有意思了,不同的进程可以监听在同一个IP地址:端口号么?根据Unix网络编程中的知识可知,服务端监听一个端口会经历:1、根据套接字类型(Ipv4,Ipv6等)创建套接字socket2、将套接字bind绑定到具体的... -
Linux进程管理
2022-03-19 14:07:43关于进程,环境变量和程序地址空间的学习 -
Linux命令行下杀死一个进程
2018-08-22 14:03:11top命令:可以实时动态地查看系统的整体运行情况,是一个综合了多方信息监测系统性能和运行信息的实用工具。通过top命令所提供的互动式界面,用热键可以管理。 输入top后可以看到如下的界面,实时显示进程情况。 ... -
经典进程同步与互斥问题
2018-06-18 08:13:41设进程A、B是两个相互合作的进程,它们共享一个缓冲区,进程A向其中写入数据,进程B从中读出数据。producer:生产者进程,consumer:消费者进程。当缓冲区不空时,消费者便可以读数据;当缓冲区为空时,生产者便可以... -
Linux 第一个进程
2018-08-27 21:28:29它是内核运行后的第一个进程. 它的作用你可以在网上查一下. 总的来说功能很多.包括 runlevel, 驱动, 启动服务啥地都会做,感觉事情很多. pid=2 :kthreadd:用于内核线程管理。 pid=3 :migration,用于进程在不同的... -
【随心笔录】Android多进程实现,一个APP多个进程
2017-07-24 21:28:27Android多进程实现,一个APP多个进程 -
Linux C/C++编程之(十六)进程及进程控制
2020-07-07 11:47:43文章目录一、概述 一、概述 -
linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗?
2018-10-14 11:08:14Linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗?...任何一个进程删除该文件时,另外一个进程不会立即出现读写失败 5.两个进程可以分别读取文件的不同部分而不会相互影响 6.一... -
Java中main方法启动的是一个进程还是一个线程
2019-05-28 18:57:59Java中main方法启动的是一个线程也是一个进程,一个java程序启动后它就是一个进程,进程相当于一个空盒,它只提供资源装载的空间,具体的调度并不是由进程来完成的,而是由线程来完成的。一个java程序从main开始之后...