一个线程可以包含多个进程吗

生活 2019-10-03 18:24:12 2402

本文收集整理关于一个线程可以包含多个进程吗的相关议题,使用内容导航快速到达。

内容导航:

  • Q1:一个进程可以包含多个线程,什么线程分配给进程的主存地址空间
  • Q2:多线程运行一个进程不会出现问题吗
  • Q3:在多核的系统中,同一个进程的2个线程可以分别同时运行在不同的核(cpu)上吗?
  • Q4:java中的一个线程包含多个进程这句话对吗,为什么
  • Q5:linux c socket 如何实现一个进程多个线程,每个线程管理多个socket连接?
  • Q6:一个进程最多包含多少个线程
  • Q7:一个进程可以创建多少个线程
  • Q1:一个进程可以包含多个线程,什么线程分配给进程的主存地址空间

    linux下的单进程多线程的程序,要实现每个线程平均分配到多核cpu,主要有2个方法1:利用linux系统自己的线程切换机制,linux有一个服务叫做irqbalance,这个服务是linux系统自带的,默认会启动,这个服务的作用就是把多线程平均分配到CPU的每个核上面,只要这个服务不停止,多线程分配就可以自己实现。但是要注意,如果线程函数内部的有某个循环,且该循环内没有任何系统调用的话,可能会导致这个线程的CPU时间无法被切换出去。也就是占满CPU现象,此时加个系统调用,例如sleep,线程所占的CPU时间就可以切换出去了。2:利用pthread库自带的线程亲和性设置函数,来设置线程在某个CPU核心上跑,这个需要在程序内部实现。同时注意不要和进程亲和性设置搞混淆了int pthread_setaffinity_np(pthread_t thread, size_t cpusetsize,const cpu_set_t *cpuset);int pthread_getaffinity_np(pthread_t thread, size_t cpusetsize, cpu_set_t *cpuset);从函数名以及参数名都很明了,唯一需要点解释下的可能就是cpu_set_t这个结构体了。这个结构体的理解类似于select中的fd_set,可以理解为cpu集,也是通过约定好的宏来进行清除、设置以及判断://初始化,设为空void CPU_ZERO (cpu_set_t *set); //将某个cpu加入cpu集中 void CPU_SET (int cpu, cpu_set_t *set); //将某个cpu从cpu集中移出 void CPU_CLR (int cpu, cpu_set_t *set); //判断某个cpu是否已在cpu集中设置了 int CPU_ISSET (int cpu, const cpu_set_t *set);
    www.YIjI&TAo.cOm

    Q2:多线程运行一个进程不会出现问题吗

    多个线程同时运行一个程序不会出现并发问题吗?
    就是因为会出现同步问题,所以每个操作系统都会采取一系列的线程同步机制啊。两个线程使用一个变量,如果第一个线程修改了该变量,第二个线程再使用,不是就出问题了吗?
    是的,这种情况被称为竞争,操作系统会提供临界区、旋转锁、互斥量、信号量等对象对多个线程竞争的资源进行保护,确保该资源在某一时间只有一个线程对它进行操作。对于一个函数,使用多线程的话,那多个线程也不能同时运行啊,肯定是按照程序代码的顺序依次执行啊?
    由于一个进程的所有线程共享该进程的内存空间,且代码段只读不可写,所以多个线程同时执行一个函数的代码段是可行的,只是系统会为每个线程开辟各自独立的函数栈,所以虽然每个线程可能同时执行一个函数,但拥有一份属于自己的局部变量,互不干扰。

    Q3:在多核的系统中,同一个进程的2个线程可以分别同时运行在不同的核(cpu)上吗?

    得看线程是什么线程,除此之外还要看操作系统的调度策略。内核级线程理论上是可以同时在两个核心上运行的,但是现实情况是线程数远远大于CPU数量或者核心数,所以就是多个线程抢占系统的CPU了。
    wWw.yijitaO∽.CoM

    Q4:java中的一个线程包含多个进程这句话对吗,为什么

    这句话不对,应该是一个进程包含若干个线程,一个线程只能属于某一个进程。

    这里有详细的解答你可以作为参考:网页链接

    Q5:linux c socket 如何实现一个进程多个线程,每个线程管理多个socket连接?

    大家仔细看,楼主的题目还是很有难度的呢,一个进程多个线程容易实现,但是要让这些线程中每个线程都管理多个socket连接,确实比较难~~坐等高手。
    不过一般都是一个线程处理一个socket连接,这种例子是:
    (取自书上,仅供学习,直接编译肯定通不过,少书上其他代码)
    ==================================================
    /* include serv06 */#include"unpthread.h"
    intmain(int argc, char **argv)
    {
    intlistenfd, connfd;
    voidsig_int(int);
    void*doit(void *);
    pthread_ttid;
    socklen_tclilen, addrlen;
    struct sockaddr *cliaddr;if (argc == 2)listenfd = Tcp_listen(NULL, argv[1], &addrlen);
    else if (argc == 3)
    listenfd = Tcp_listen(argv[1], argv[2], &addrlen);
    else
    err_quit("usage: serv06 [ ] ");
    cliaddr = Malloc(addrlen);Signal(SIGINT, sig_int);
    for ( ; ; ) {clilen = addrlen;
    connfd = Accept(listenfd, cliaddr, &clilen);Pthread_create(&tid, NULL, &doit, (void *) connfd);}
    }void *doit(void *arg)
    {
    voidweb_child(int);Pthread_detach(pthread_self());web_child((int) arg);
    Close((int) arg);
    return(NULL);
    }
    /* end serv06 */voidsig_int(int signo)
    {
    voidpr_cpu_time(void);pr_cpu_time();exit(0);
    }
    ================================================================WWW.YIJItaO.Co@m

    Q6:一个进程最多包含多少个线程

    1,在x86平台32位系统,系统占用2GB地址空间,用户方式2GB。如果使用VS,链接程序开关/SACK 或者/F可以设置线程堆栈大小,默认分配一个线程的堆栈大小是1MB,当CreateThread参数的StackSize大小与链接程序设置的不一致时,采用的方法是谁大用谁的,所以用4KB修改当然不会有改变!理论上最大线程数=2GB/1MB=2048。
    实际上这个用户方式的2GB并不会全部用作线程堆栈。首先程序的代码和数据、进程环境块、线程环境块、空指针区域等等也需要占用一定的地址空间;再者2GB只是虚拟内存,如果非分页内存被用完,就无法再创建线程,这个与特定机器有关,所以不同机器上做最大线程数测试得到的数字可能不一样。
    2,操作系统给一个系统进程提供的空间是2GB ,而一个线程堆栈的空间默认在启动的时候是1MB 那么启动完2000后,基本上就有2GB了,你可以减小默认堆栈的大小。
    3,默认情况下,一个线程的栈要预留1M的内存空间而一个进程中可用的内存空间只有2G,所以理论上一个进程中最多可以开2048个线程
    但是内存当然不可能完全拿来作线程的栈,所以实际数目要比这个值要小。你也可以通过连接时修改默认栈大小,将其改的比较小,这样就可以多开一些线程。如将默认栈的大小改成512K,这样理论上最多就可以开4096个线程。即使物理内存再大,一个进程中可以起的线程总要受到2GB这个内存空间的限制。比方说你的机器装了64GB物理内存,但每个进程的内存空间还是4GB,其中用户态可用的还是2GB。如果是同一台机器内的话,能起多少线程也是受内存限制的。每个线程对象都要站用非页面内存,而非页面内存也是有限的,当非页面内存被耗尽时,也就无法创建线程了。
    如果物理内存非常大,同一台机器内可以跑的线程数目的限制值会越来越大。
    在Windows下写个程序,一个进程Fork出2000个左右线程就会异常退出了,为什么?
    这个问题的产生是因为windows32位系统,一个进程所能使用的最大虚拟内存为2G,而一个线程的默认线程栈StackSize为1024K(1M),这样当线程数量逼近2000时,2000*1024K=2G(大约),内存资源就相当于耗尽。
    4,默认每线程1MB堆栈的话,只能开2048线程(如果你的其它系统资源足够的话)。要想开更多线程,只能修改每个线程的堆栈,但实际中是不推荐这样做的,因为如果你的线程因为一些工作因为线程堆栈不够的话,会导致整个进程崩溃.修改堆栈的方法好像只在XP或以上系统有效,windows 2000中不支持。

    w∽wW.YiJITAo.com

    Q7:一个进程可以创建多少个线程

    一个进程可以开启的线程受可用内存限制,如果是32位的机器,那么默认一个进程有2G的可用内存,而每个线程默认分析1M的栈空间,所以这种情况下理论最线程数在2000多个。一个解决办法是创建线程时减少线程栈的大小或是使用64位的系统。64位系统应该可以忽略这个问题了。当然受cpu及磁盘速度及物理内存的限制。不用到达上限值,你的机器应该已经是慢如牛车了。

    相关文章
    线程安全和线程不安全2019-01-20
    java中实现多线程的两种方法2019-02-18
    cpu怎么选择核心和线程2019-02-23
    多线程有几种实现方法2019-02-28
    如何保证线程顺序执行2019-03-18
    java中哪些类是线程安全的2019-06-20
    哪些类是线程安全的2019-07-29
    线程安全的单例模式2019-09-08
    买的香蕉可以种盆栽吗2019-01-09
    加湿器可以加白开水吗2019-01-09