一个进程(Process)最多可以生成多少个线程(Thread)

一个进程(Process)最多可以生成多少个线程(Thread),第1张

#define MAX_THREADS 50000#include<Windows.h>#include<stdio.h>DWORD WINAPI ThreadProc(LPVOID lpParam){ while(1) { Sleep(100000)} return 0}int main(){ DWORD dwThreadId[MAX_THREADS]HANDLE hThread[MAX_THREADS]void*stack[MAX_THREADS]for(int i = 0i <MAX_THREADS++i) { hThread[i]= CreateThread(0,0, ThreadProc, 0, CREATE_SUSPENDED,&dwThreadId[i])if(0 == hThread[i]) { DWORD e = GetLastError()if(e == 8) { printf("Out of Memory!/n",e)} else { printf("%d/r/n",e)} break} else { printf("%d:%d/r/n",i,hThread[i])} } ThreadProc(0)}程序的运行结果是:2.如何突破2000个限制? 你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。 如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。 如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。 MSDN原文:“The number of threads a process can create is limited by the available virtual memory. By default, every thread has one megabyte of stack space. Therefore, you can create at most 2,048 threads. If you reduce the default stack size, you can create more threads. However, your application will have better performance if you create one thread per processor and build queues of requests for which the application maintains the context information. A thread would process all requests in a queue before processing requests in the next queue.” 可以通过修改CreateThread参数来缩小线程栈StackSize,例如#define MAX_THREADS 50000#include<Windows.h>#include<stdio.h>DWORD WINAPI ThreadProc(LPVOID lpParam){ while(1) { Sleep(100000)} return 0}int main(){ DWORD dwThreadId[MAX_THREADS]HANDLE hThread[MAX_THREADS]void*stack[MAX_THREADS]for(int i = 0i <MAX_THREADS++i) { hThread[i]= CreateThread(0,512 * 1024, ThreadProc, 0,STACK_SIZE_PARAM_IS_A_RESERVATION| CREATE_SUSPENDED,&dwThreadId[i])if(0 == hThread[i]) { DWORD e = GetLastError()if(e == 8) { printf("Out of Memory!/n",e)} else { printf("%d/r/n",e)} break} else { printf("%d:%d/r/n",i,hThread[i])} } ThreadProc(0)}注意上面红色带下划线变化的部分!(0==>512 * 1024,加上了STACK_SIZE_PARAM_IS_A_RESERVATION字段)程序的运行结果是:可以开启的线程数增长了一倍!!服务器端程序设计如果你的服务器端程序设计成:来一个client连接请求则创建一个线程,那么就会存在2000个限制(在硬件内存和CPU个数一定的情况下)。建议如下:The "one thread per client" model is well-known not to scale beyond a dozen clients or so. If you're going to be handling more than that many clients simultaneously, you should move to a model where instead of dedicating a thread to a client, you instead allocate an object. (Someday I'll muse on the duality between threads and objects.) Windows provides I/O completion ports and a thread pool to help you convert from a thread-based model to a work-item-based model.1. Serve many clients with each thread, and use nonblocking I/O and level-triggered readiness notification2. Serve many clients with each thread, and use nonblocking I/O and readiness change notification3. Serve many clients with each server thread, and use asynchronous I/O上面几句哈的核心的思想是:使用异步I/O,和一个线程处理多个客户请求!!

进程和程序区别和联系表现在以下方面:

1)程序只是一组指令的有序集合,它本身没有任何运行的含义,它只是

一个静态的实体。而进程则不同,它是程序在某个数据集上的执行。

进程是一个动态的实体,它有自己的生命周期。它因创建而产生,因

调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被

撤消。反映了一个程序在一定的数据集上运行的全部动态过程。

2)进程和程序并不是一一对应的,一个程序执行在不同的数据集上就成

为不同的进程,可以用进程控制块来唯一地标识每个进程。而这一点

正是程序无法做到的,由于程序没有和数据产生直接的联系,既使是

执行不同的数据的程序,他们的指令的集合依然是一样的,所以无法

唯一地标识出这些运行于不同数据集上的程序。一般来说,一个进程

肯定有一个与之对应的程序,而且只有一个。而一个程序有可能没有

与之对应的进程(因为它没有执行),也有可能有多个进程与之对应(运

行在几个不同的数据集上)。

3)进程还具有并发性和交往性,这也与程序的封闭性不同。

----------------------------------------------------------------------------------------------

进程和线程都是由 *** 作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程同一个进程中的多个线程之间可以并发执行.

----------------------------------------------------------------------------------------------

进程和线程的区别

说法一:进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位.

线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属一个进程的其他的线程共享进程所拥有的全部资源.

一个线程可以创建和撤销另一个线程同一个进程中的多个线程之间可以并发执行

说法二:进程和线程都是由 *** 作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

简而言之,一个程序至少有一个进程,一个进程至少有一个线程.

线程的划分尺度小于进程,使得多线程程序的并发性高。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

说法三:多线程共存于应用程序中是现代 *** 作系统中的基本特征和重要标志。用过UNIX *** 作系统的读者知道进程,在UNIX *** 作系统中,每个应用程序的执行都在 *** 作系统内核中登记一个进程标志, *** 作系统根据分配的标志对应用程序的执行进行调度和系统资源分配,但进程和线程有什么区别呢?

进程和线程都是由 *** 作系统所体会的程序运行的基本单元,系统利用该基本单元实现系统对应用的并发性。进程和线程的区别在于:

线程的划分尺度小于进程,使得多线程程序的并发性搞。

另外,进程在执行过程中拥有独立的内存单元,而多个线程共享内存,从而极大地提高了程序的运行效率。

线程在执行过程中与进程还是有区别的。每个独立的线程有一个程序运行的入口、顺序执行序列和程序的出口。但是线程不能够独立执行,必须依存在应用程序中,由应用程序提供多个线程执行控制。

从逻辑角度来看,多线程的意义在于一个应用程序中,有多个执行部分可以同时执行。但 *** 作系统并没有将多个线程看做多个独立的应用,来实现进程的调度和管理以及资源分配。这就是进程和线程的重要区别。

进程(Process)是最初定义在Unix等多用户、多任务 *** 作系统环境下用于表示应用程序在内存环境中基本执行单元的概念。以Unix *** 作系统为例,进程是Unix *** 作系统环境中的基本成分、是系统资源分配的基本单位。Unix *** 作系统中完成的几乎所有用户管理和资源分配等工作都是通过 *** 作系统对应用程序进程的控制来实现的。

C、C++、Java等语言编写的源程序经相应的编译器编译成可执行文件后,提交给计算机处理器运行。这时,处在可执行状态中的应用程序称为进程。从用户角度来看,进程是应用程序的一个执行过程。从 *** 作系统核心角度来看,进程代表的是 *** 作系统分配的内存、CPU时间片等资源的基本单位,是为正在运行的程序提供的运行环境。进程与应用程序的区别在于应用程序作为一个静态文件存储在计算机系统的硬盘等存储空间中,而进程则是处于动态条件下由 *** 作系统维护的系统资源管理实体。多任务环境下应用程序进程的主要特点包括:

●进程在执行过程中有内存单元的初始入口点,并且进程存活过程中始终拥有独立的内存地址空间;

●进程的生存期状态包括创建、就绪、运行、阻塞和死亡等类型;

●从应用程序进程在执行过程中向CPU发出的运行指令形式不同,可以将进程的状态分为用户态和核心态。处于用户态下的进程执行的是应用程序指令、处于核心态下的应用程序进程执行的是 *** 作系统指令。

在Unix *** 作系统启动过程中,系统自动创建swapper、init等系统进程,用于管理内存资源以及对用户进程进行调度等。在Unix环境下无论是由 *** 作系统创建的进程还要由应用程序执行创建的进程,均拥有唯一的进程标识(PID)。

说法四:应用程序在执行过程中存在一个内存空间的初始入口点地址、一个程序执行过程中的代码执行序列以及用于标识进程结束的内存出口点地址,在进程执行过程中的每一时间点均有唯一的处理器指令与内存单元地址相对应。

Java语言中定义的线程(Thread)同样包括一个内存入口点地址、一个出口点地址以及能够顺序执行的代码序列。但是进程与线程的重要区别在于线程不能够单独执行,它必须运行在处于活动状态的应用程序进程中,因此可以定义线程是程序内部的具有并发性的顺序代码流。

Unix *** 作系统和Microsoft Windows *** 作系统支持多用户、多进程的并发执行,而Java语言支持应用程序进程内部的多个执行线程的并发执行。多线程的意义在于一个应用程序的多个逻辑单元可以并发地执行。但是多线程并不意味着多个用户进程在执行, *** 作系统也不把每个线程作为独立的进程来分配独立的系统资源。进程可以创建其子进程,子进程与父进程拥有不同的可执行代码和数据内存空间。而在用于代表应用程序的进程中多个线程共享数据内存空间,但保持每个线程拥有独立的执行堆栈和程序执行上下文(Context)。

基于上述区别,线程也可以称为轻型进程 (Light Weight Process,LWP)。不同线程间允许任务协作和数据交换,使得在计算机系统资源消耗等方面非常廉价。

线程需要 *** 作系统的支持,不是所有类型的计算机都支持多线程应用程序。Java程序设计语言将线程支持与语言运行环境结合在一起,提供了多任务并发执行的能力。这就好比一个人在处理家务的过程中,将衣服放到洗衣机中自动洗涤后将大米放在电饭锅里,然后开始做菜。等菜做好了,饭熟了同时衣服也洗好了。

需要注意的是:在应用程序中使用多线程不会增加 CPU 的数据处理能力。只有在多CPU 的计算机或者在网络计算体系结构下,将Java程序划分为多个并发执行线程后,同时启动多个线程运行,使不同的线程运行在基于不同处理器的Java虚拟机中,才能提高应用程序的执行效率。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12016621.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存