-
2019-08-27 19:16:52
单个进程监听多个端口
单个进程创建多个 socket 绑定不同的端口,TCP, UDP 都行
多个进程监听同一个端口(multiple processes listen on same port)
方式1:通过 fork 创建子进程的方式可以实现,其他情况下不行。
当连接到来时,子进程、父进程都可以 accept, 这就是著名的“惊群”问题(thundering herd problem)。
NGINX 的 master/work 处理方法:
Flow of an NGINX worker process
可以设置 ffd 的 close-on-exec flag 避免子进程继承 fd.
方式2:我们都知道socket是网络上两个进程之间的双向通信链路, 即
socket = 《A进程的IP地址:端口号,B进程的IP地址:端口号》
那么有个问题就很有意思了,不同的进程可以监听在同一个IP地址:端口号么?
根据Unix网络编程中的知识可知,服务端监听一个端口会经历:
1、根据套接字类型(Ipv4,Ipv6等)创建套接字socket
2、将套接字bind绑定到具体的网络地址和端口号
3、调用listen开始在这个套接字上进行监听。
Unix提供了一个接口setsockopt()可以在bind之前设置套接字选项,其中就包括REUSEADDR这个选项,表明可以多个进程复用bind函数中指定的地址和端口号。
由此可知多个应用(进程),包括同一个应用多次,都是可以绑定到同一个端口进行监听的。对应地C++、NET等高级语言也都提供了对应的接口。
从一些例子也可以看出,比如有时候你在服务器上执行netstat -ano可能会发现同一个应用程序在同一个端口上有多个监听,这是因为一些服务端应用程序可能会异常退出或者没有完全释放套接字,但是需要在重新启动时还能够再次监听同一个端口,所以需要能够具备重复监听同一个端口的能力,因此也出现上述情形。
在这总结一下多进程端口冲突问题的解决方法:
1、更换端口号,适用于不受设备端口号限制的场景;
2、父进程派生子进程,共享端口资源,适用于linux服务器端;
3、端口复用,根据五元组的唯一性,可以实现,适用于任何场景,但需要绑定不同的IP地址;
4、多进程共享socket,适用于主动发送报文的情况,对于主动接受报文的情景不适用;
5、端口管理进程,由一个端口对该端口的数据收发进行管理,别的进程要使用的话,需要实现本地多进程之间通信;
6、手动管理占用端口的进程(可操作性太差)更多相关内容 -
linux kill命令:(中止一个进程)
2021-05-13 06:03:161.作用kill命令用来中止一个进程。2.格式kill [ -s signal | -p ] [ -a ] pid …kill -l [ signal ]3.参数-s:指定发送的信号。-p:模拟发送信号。-l:指定信号的名称列表。pid:要中止进程的ID号。Signal:...1.作用
kill命令用来中止一个进程。
2.格式
kill [ -s signal | -p ] [ -a ] pid …
kill -l [ signal ]
3.参数
-s:指定发送的信号。
-p:模拟发送信号。
-l:指定信号的名称列表。
pid:要中止进程的ID号。
Signal:表示信号。
4.说明
进程是Linux系统中一个非常重要的概念。Linux是一个多任务的操作系统,系统上经常同时运行着多个进程。我们不关心这些进程究竟是如何分配的,或
者是内核如何管理分配时间片的,所关心的是如何去控制这些进程,让它们能够很好地为用户服务。
Linux操作系统包括三种不同类型的进程,每种进程都有自己的特点和属性。交互进程是由一个Shell启动的进程。交互进程既可以在前台运行,也
可以在后台运行。批处理进程和终端没有联系,是一个进程序列。监控进程(也称系统守护进程)时Linux系统启动时启动的进程,并在后台运行。例
如,httpd是著名的Apache服务器的监控进程。
kill命令的工作原理是,向Linux系统的内核发送一个系统操作信号和某个程序的进程标识号,然后系统内核就可以对进程标识号指定的进程进行操
作。比如在top命令中,我们看到系统运行许多进程,有时就需要使用kill中止某些进程来提高系统资源。系统多个虚拟控制台的作用是当一个程序出错造成
系统死锁时,可以切换到其它虚拟控制台工作关闭这个程序。此时使用的命令就是kill,因为kill是大多数Shell内部命令可以直接调用的。
5.应用实例
(1)强行中止(经常使用杀掉)一个进程标识号为324的进程:
#kill -9 324
(2)解除Linux系统的死锁
在Linux中有时会发生这样一种情况:一个程序崩溃,并且处于死锁的状态。此时一般不用重新启动计算机,只需要中止(或者说是关闭)这个有问题的程序即
可。当kill处于X-Window界面时,主要的程序(除了崩溃的程序之外)一般都已经正常启动了。此时打开一个终端,在那里中止有问题的程序。比如,
如果Mozilla浏览器程序出现了锁死的情况,可以使用kill命令来中止所有包含有Mozolla浏览器的程序。首先用top命令查处该程序的
PID,然后使用kill命令停止这个程序:
#kill -SIGKILL XXX
其中,XXX是包含有Mozolla浏览器的程序的进程标识号。
(3)使用命令回收内存
我们知道内存对于系统是非常重要的,回收内存可以提高系统资源。kill命令可以及时地中止一些“越轨”的程序或很长时间没有相应的程序。例如,使用
top命令发现一个无用 (Zombie) 的进程,此时可以使用下面命令:
#kill -9 XXX
其中,XXX是无用的进程标识号。
然后使用下面命令:
#free
此时会发现可用内存容量增加了。
(4)killall命令
Linux下还提供了一个killall命令,可以直接使用进程的名字而不是进程标识号,例如:
# killall -HUP inetd
*杀死进程最安全的方法是单纯使用kill命令,不加修饰符,不带标志。
首先使用ps -ef命令确定要杀死进程的PID,然后输入以下命令:
# kill -pid
注释:标准的kill命令通常都能达到目的。终止有问题的进程,并把进程的资源释放给系统。然而,如果进程启动了子进程,只杀死父进程,子进程仍在
运行,因此仍消耗资源。为了防止这些所谓的“僵尸进程”,应确保在杀死父进程之前,先杀死其所有的子进程。
——————————————————————————–
*确定要杀死进程的PID或PPID
# ps -ef | grep httpd
——————————————————————————–
*以优雅的方式结束进程
# kill -l PID
-l选项告诉kill命令用好像启动进程的用户已注销的方式结束进程。当使用该选项时,kill命令也试图杀死所留下的子进程。但这个命令也不是总
能成功–或许仍然需要先手工杀死子进程,然后再杀死父进程。
——————————————————————————–
*TERM信号
给父进程发送一个TERM信号,试图杀死它和它的子进程。
# kill -TERM PPID
——————————————————————————–
*killall命令
killall命令杀死同一进程组内的所有进程。其允许指定要终止的进程的名称,而非PID。
# killall httpd
——————————————————————————–
*停止和重启进程
有时候只想简单的停止和重启进程。如下:
# kill -HUP PID
该命令让Linux和缓的执行进程关闭,然后立即重启。在配置应用程序的时候,这个命令很方便,在对配置文件修改后需要重启进程时就可以执行此命
令。
——————————————————————————–
*绝杀 kill -9 PID
同意的 kill -s SIGKILL
这个强大和危险的命令迫使进程在运行时突然终止,进程在结束后不能自我清理。危害是导致系统资源无法正常释放,一般不推荐使用,除非其他办法都无
效。
当使用此命令时,一定要通过ps
-ef确认没有剩下任何僵尸进程。只能通过终止父进程来消除僵尸进程。如果僵尸进程被init收养,问题就比较严重了。杀死init进程意味着关闭系统。
如果系统中有僵尸进程,并且其父进程是init,而且僵尸进程占用了大量的系统资源,那么就需要在某个时候重启机器以清除进程表了。
-
一个c源程序必须包含一个main函数吗
2021-05-20 02:42:54是的,必须包含一个main函数。main函数是程序默认的入口,程序的执行是从main函数开始;如果没有main函数,则编译器不知道程序从哪里开始执行,所以一个c源程序有且仅有一个主函数(main函数)。本教程操作环境:...是的,必须包含一个main函数。main函数是程序默认的入口,程序的执行是从main函数开始;如果没有main函数,则编译器不知道程序从哪里开始执行,所以一个c源程序有且仅有一个主函数(main函数)。
本教程操作环境:windows7系统、c99版本、Dell G3电脑。
main函数,又称主函数,是程序执行的起点,是C程序的入口函数,即程序的执行是从main函数开始,对其他函数的调动也是直接或间接地在main函数中被调用。
一个c程序有且仅有一个main函数,除main函数之外可以有若干个其它的函数,每个函数实现某一特定的操作。
程序执行总是从main函数开始,如果有有其他函数,则完成对其他函数的调用后再返回到主函数,最后由main函数结束整个程序。在执行程序时,由系统调用main函数 。main 函数是在程序启动中完成对具有静态存储期的非局部对象的初始化之后被调用的。它是程序在有宿主 (hosted)环境(亦即有操作系统)中所指定的入口点。自立程序(启动加载器,操作系统内核,等等)的入口点则是由实现定义的。
相关推荐:《C语言视频教程》
-
为什么一个c程序只能有一个main函数
2015-11-29 10:00:20为什么一个c程序只能有一个main函数?如果一个程序有多个功能,那么不能有多个main函数么? -
进程调度实验 用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解。
2010-04-26 17:36:41就绪进程获得CPU后都只能运行一个时间片,运行后已占用CPU时间加1。 如果运行一个时间片后,进程的已占用CPU时间已达到所需要的运行时间,则撤消该进程,如果运行一个时间片后进程的已占用CPU时间还未达所需要的运行... -
一个进程能运行多少线程
2019-04-11 15:22:41对于Linux来说: 我们都知道进程的概念,它是CPU分配资源的载体,是程序运行的实例;也知道线程的概念,它是...(一个cpu内核只能运行一个进程/线程,一台8核cpu的服务器只能同时运行8个进程/线程。只是每个进...转载:https://www.cnblogs.com/wozijisun/p/10370897.html
对于Linux来说:
我们都知道进程的概念,它是CPU分配资源的载体,是程序运行的实例;也知道线程的概念,它是程序执行的最小单元,是进程中的一个实体用来执行程序,一个进程中有多个线程。(一个cpu内核只能运行一个进程/线程,一台8核cpu的服务器只能同时运行8个进程/线程。只是每个进程/线程都会得到一个cpu运行时间,只要cpu速度快,给人的感觉就是服务器在运行成千上万个进程/线程)
既然如此,我们可以想象,一个系统中的进程数量肯定是有上限的,不然系统资源就会不够用了,同样的道理,一个进程中的线程资源也是有上限的。那进程和线程的上限到底是多大呢?
Linux中最多可以有多少个进程?
一.Linux中有一个命令可以帮助我们查看系统中的进程上限[pigff@izbp13yd4r85qvk53t04mbz ~]$ ulimit -u
4096这属于软限制,是可以改变的。也就是说在我的机器上最多可以有4096个进程,但是我可以通过改变这个参数的值来修改对于进程数量的软限制,比如说用下面的命令将软限制改到5120。
ulimit -u 5120
二.我们用pid_t来表示一个进程的pid,因此能表示的进程的范围一定不会超过pid_t类型的大小
[pigff@izbp13yd4r85qvk53t04mbz ~]$ cat /proc/sys/kernel/pid_max
32768pid_t实际上就是一个short类型变量,当然这里能表示的范围只是进程id最多表示到这么多,这只是一个理论值,实际上,由于内存等系统资源的限制,根本不会同时有这么多的进程存在。
一个进程中最多可以有多少个线程?
在上一篇文章Linux中线程占用内存中,我们知道了创建一个线程会占用多少内存,这取决于分配给线程的调用栈大小,可以用ulimit -s命令来查看大小(一般常见的有10M或者是8M)。我们还知道,一个进程的虚拟内存是4G,在Linux32位平台下,内核分走了1G,留给用户用的只有3G,于是我们可以想到,创建一个线程占有了10M内存,总共有3G内存可以使用。于是可想而知,最多可以创建差不多300个左右的线程。因此,进程最多可以创建的线程数是根据分配给调用栈的大小,以及操作系统(32位和64位不同)共同决定的。
---------------------
原文:https://blog.csdn.net/lvyibin890/article/details/82255047
对于Windows来说:
默认情况下,一个线程的栈要预留1M的内存空间
而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。
你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。
如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。
即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。
比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。
如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。
如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。
-
程序,进程,线程的区别和联系
2018-08-26 22:27:18进程和程序区别和联系表现在以下方面: 1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体。而进程则不同,它是程序在...2)进程和程序并不是一一对应的,一个程序执行在不同的数据集上... -
多线程(一)程序,进程,线程的区别与联系
2020-11-18 17:34:18进程是指一个具有一定独立功能的程序关于某个数据集合的一次运行活动,是系统运行程序的基本单位,因此进程是动态的。 线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个... -
一个进程可以执行一个或几个程序,反之同一个程序可能由几个进程同时执行,这句话怎么理解...
2013-03-16 14:32:07百度知道的答案: 比如显示图像的驱动程序,多个程序的显示都是需要他来执行。 我们玩游戏算一个程序,需要显示图像的驱动,声音驱动...然后你在执行一个命令行,顺序调用这两个程序,就会实现一个剪切文件的功能... -
一个父进程创建多个子进程,有些需…
2017-06-21 22:51:16在Linux下我们可以用fork函数创建一个子进程,但是当我们需要在一个父进程下创建多个子进程时,有些需要注意的地方。假设我们用如下代码在一个父进程下创建两个子进程: void main() { pid_t pid1, pid2; pid1 = ... -
程序、进程与线程(一)
2018-10-19 09:33:53一、程序与进程 举个具体的场景,某一天你爸妈不在家,你必须要自己做饭、洗衣服等等。你要做饭首先你得有做饭手册呀,这个手册中包含了做饭所需的各种步骤(比如洗米,把米放到电饭煲中,插上电饭煲电源等等),当... -
操作系统-进程和程序之间的关系(一对一,一对多,多对一,多对多)
2020-02-02 11:23:03进程和程序之间可以形成一对一,一对多,多对一,多对多的关系,分别举例说明在什么情况下会形成这样的关系?...(3)进程是具有独立功能的程序在一个... -
【操作系统】第六话·线程是进程的(宝ᴗ宝)嘛?
2022-03-12 15:23:07从今天开始,我们将要开启一个新的系列【闪耀计划】,没错!这是今年上半年的一整个系列计划!本专题目的是通过百天刷题计划,通过题目和知识点串联的方式,完成对计算机操作系统的复习和巩固;同时还配有专门的笔记... -
如何查询一个进程下面的线程数(进程和线程区别)
2018-07-21 13:30:36进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位. . 线程是指进程内的一个执行单元,也是进程内的可调度实体. 线程是CPU调度和分派的基本单位,它是比... -
使用共享内存实现一个进程写文件,两个进程读文件
2017-08-14 20:04:01),执行后两个或多个读进程可同时读取该文件并在终端打印。 要实现该功能,首先你得了解共享内存的搭建,有四个函数,分别为shmget,shmat,shmdt,shmctl,他们的作用如下: 1、shmget函数 该函数用来创建共享... -
进程同步程序设计---吃水果问题
2021-11-09 18:55:41桌子上有一只盘子,最多可容纳两个水果,每次只能放入或者取出一个水果。爸爸专门向盘子中放苹果,妈妈专门向盘子中放橘子,儿子专门等待吃盘子中的橘子,女儿专门等吃盘子中的苹果。试编程实现爸爸、妈妈、儿子、... -
什么是进程? 进程具有哪些主要特性? 比较进程与程序之间相同点与不同点
2017-10-09 19:54:52进程是具有一定独立功能的程序关于一个数据集合的一次运行活动。进程具有以下主要特性: (1)并发性:可以与其它进程一道在宏观上同时向前推进。 (2)动态性:进程是执行中的程序。此外进程的动态性还体现在如下... -
【java学习】进程、线程、程序
2018-07-27 10:09:47简而言之,一个程序至少有一个进程,一个进程至少有一个线程。 3)进程和程序区别 ①进程是一个动态概念,程序是静态概念。 进程 存在于程序的执行过程中。 ②进程具有并发特性,程序没有。 ③进程间相互制约,而... -
程序、任务、进程和线程的联系与区别
2018-04-13 11:03:39一个任务既可以是一个进程,也可以是一个线程。简而言之,它指的是一系列共同达到某一目的的操作。例如,读取数据并将数据放入内存中。这个任务可以作为一个进程来实现,也可以作为一个线程(或作为一个中断任务)来实现... -
Linux下查看某一进程占用的内存
2021-11-01 14:56:25Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如:ps -ef|grep flink,可以看到flink task这个程序的进程id 已知pid是8678,现在可以使用如下命令查看内存: 这样可以动态实时的看到... -
进程管理(一)--进程管理的基本概念
2021-04-03 23:48:20早期的计算机一次只能执行一个任务,采用批处理的方法,由监督系统完成作业的切换,使得作业一个接一个的被处理,如下图所示 首先,由监督器将磁带上的第一个程序装入内存,并把运行的控制权交给作业 当该作业... -
操作系统中进程的控制和描述(一)【前趋图和程序执行、进程的基本状态转换及进程的创建、终止、阻塞、唤醒、...
2020-08-15 20:27:40进程的描述与控制 操 作 系 统 所 具 有 的 四 大 特 征 也 都 是 基 于 进 程 而 形 成 的 , ...图中的每个结点可用来表示一个进程或程序段,乃至一条语句,结点间的有向边则表示两个结点之间存在的偏序(Partial Orde -
golang调用外部程序,创建进程,守护进程,shell命令
2020-10-11 17:45:06此方法会将在当前进程空间里,用新的程序覆盖掉当前程序,并执行新的程序,它们依然在同一个进程里,只是进程的内容发生了变化。 main11.go package main import ( "fmt" "syscall" ) func mai -
计算机操作系统实验一:进程调度(JAVA代码)
2020-10-12 00:00:15用高级语言编写和调试一个进程调度程序,以加深对进程的概念及进程调度算法的理解. [准备知识] 一、基本概念 1、进程的概念; 2、进程的状态和进程控制块; 3、进程调度算法; 二、进程调度 1、... -
解决多进程或多线程同时读写同一个文件的问题
2016-09-27 22:04:31本文介绍一种在PHP中解决多进程或多线程同时读写同一个文件的问题。 -
进程的初步认识(程序与进程、并发、单道程序设计、多道程序设计、CPU、MMU)
2018-12-23 18:19:59程序和进程 程序:是指编译好的二进制文件,存放在磁盘上,...那么我们可以形象的将程序比作一个剧本,这个剧本就是一张一张的纸组成的,那么就是进程就要演的戏,一出戏上面包括舞台、演员、灯光、道具等等。同一... -
vs调用另一个exe
2019-07-31 11:21:39进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统...即在Windows环境,调用另一个exe文件,就是打开一个新进程。 下面是我的一段代码; bool C... -
操作系统实验报告(一) 进程管理与进程通信
2021-07-18 14:59:15一、 实验目的 1、掌握进程的概念,明确进程的含义。 2、认识并了解进程并发执行的实质,进程的阻塞与唤醒,终止与退出的过程。 3、熟悉进程的睡眠、同步、撤消等进程控制方法...当此程序运行时,在系统中有一个父进程. -
操作系统之进程管理习题
2021-12-11 22:19:54操作系统进程管理习题详解 -
Linux C/C++编程之(十六)进程及进程控制
2020-07-07 11:47:43文章目录一、概述 一、概述