网络编程问题集锦

1. 进程核线程有什么区别?

  • 进程是一个应用程序一次执行过程,可申请和拥有资源,是一个活动的实体。
  • 一个进程可以包含若干线程,通常把进程作为分配资源的基本单位,线程作为独立运行和调度的基本单位。线程调度开销小
  • 子进程和父进程有不同的代码和数据空间,线程则共享数据空间。每个线程有子己执行堆栈和程序计数器为其执行上下文。
  • 进程间相互独立,同一进程的个线程间共享。进程间通信IPC,线程间可直接读写进程数据段来通信。线程切换比进程快。在多线程OS中,进程不是一个可执行的实体。
  • 一个线程可以创建和撤销另一个线程,同进程里的线程可并发执行
  • 一个线程死掉就等于整个进程死掉,多进程比多线程要更有健壮性。进程切换效率相对较低
  • 对于一些要求同时并行又要共享某些变量的并发操作,只能用线程
  • 每个独立的线程有一个程序运行的入口,谁许执行序列和程序的出口。单线程不能独立执行,必须依赖应用程序中。
  • 线程适合在SMP(多处理结构)机器上运行,进程则可以跨机器迁移

2. SMP类型的机器为什么能提高性能?

  • SMP的服务器,一般在每个核心内部,都会集成一个内存控制器,因此,访问内存的带宽远远大于单个CPU时的带宽。
  • 二级缓存容量大
  • 工作负载能够均匀地分配到所有可用处理器之上。

3. 杂谈

1. 轻量级进程

  • 轻量级线程(LWP)是一种由内核支持的用户线程。它是基于内核线程的高级抽象,因此只有先支持内核线程,才能有LWP。每一个进程有一个或多个LWPs,每个LWP由一个内核线程支持。因此每个LWP都是一个独立的线程调度单元。即使有一个LWP在系统调用中阻塞,也不会影响整个进程的执行。需要系统调用。由clone()系统调用创建。

2. 加强版用户线程(用户线程+LWP)

  • 用户线程库还是完全建立在用户空间中,因此用户线程的操作还是很廉价,因此可以建立任意多需要的用户线程。操作系统提供了LWP作为用户线程和内核线程之间的桥梁。LWP还是和前面提到的一样,具有内核线程支持,是内核的调度单元,并且用户线程的系统调用要通过LWP,因此进程中某个用户线程的阻塞不会影响整个进程的执行。用户线程库将建立的用户线程关联到LWP上,LWP与用户线程的数量不一定一致。当内核调度到某个LWP上时,此时与该LWP关联的用户线程就被执行。

3. Linux线程库

  • Linux Thread使用哭空间的线程库,采用线程-进程1对1模型(一个用户线程对应一个轻量级进程)
  • 用户线程阻塞意味着对这个对应的内核轻量级进程的阻塞
  • 将线程的调度等同于进程的调度,调度交由内核完成,而线程的创建、同步、销毁由核外线程库完成(LinuxThtreads已绑定到GLIBC中发行)。在LinuxThreads中,由专门的一个管理线程处理所有的线程管理工作。当进程第一次调用pthread_create()创建线程时就会先创建(clone())并启动管理线程。后续进程pthread_create()创建线程时,都是管理线程作为pthread_create()的调用者的子线程,通过调用clone()来创建用户线程,并记录轻量级进程号和线程id的映射关系,因此,用户线程其实是管理线程的子线程。
  • 真正实现代码数据和地址空间等共享的并不是用户线程,而是和用户线程对应,代替用户线程与内核交互的LWP,顾名思义,用户线程是完全工作在用户空间的,内核完全不知道用户线程的存在,因为用户线程是在用户态完全由进程所创建和管理的。
  • “缺点是一个用户线程如果阻塞在系统调用中,则整个进程都将会阻塞。”这句话的理解是:当不存在LWP的时候,因为kernel并不知道用户线程的存在,而如果用户线程需要系统调用,比如read操作,但是由于内核由于某种原因暂时不能提供被读取的数据,那么该read系统调用的不能进行会导致阻塞,但是由于kernel只对进程作出响应,所以对内核而言,唯一能阻塞的对象只能是发出请求的进程,而请求的线程是通过进程向内核提出系统调用的,那么进程阻塞了,当然属于该进程的其他线程同时也会阻塞。

4. 其他

  • 线程安全:概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。
  • 任务量较大时,多进程比多线程效率高;而完成的任务量较小时,多线程比多进程要快,
  • 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。

你可能感兴趣的:(网络编程,网络编程,线程)