网络编程问题集锦
来源:互联网 发布:oracle sql优化技巧 编辑:程序博客网 时间:2024/05/22 02:00
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. 其他
- 线程安全:概念比较直观。一般说来,一个函数被称为线程安全的,当且仅当被多个并发线程反复调用时,它会一直产生正确的结果。
- 任务量较大时,多进程比多线程效率高;而完成的任务量较小时,多线程比多进程要快,
- 多线程是为了同步完成多项任务,不是为了提高运行效率,而是为了提高资源使用效率来提高系统的效率。
0 0
- 网络编程问题集锦
- vc编程问题集锦
- PHP编程问题集锦
- OpenCV 编程问题集锦
- 编程问题集锦
- Xcode编程问题集锦
- 网络与通讯编程集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- spring入门编程问题集锦
- 万众创业,其实是骗局
- 反转部分单向链表
- poj 1364 King(差分约束)
- linux 配置SELINUX 允许外部访问
- 【Python】进阶
- 网络编程问题集锦
- Manage Space for schema object
- github上传文件时,目录、文件的创建、复制、删除和移动等操作
- mysql读写分离和主从复制的基本原理
- hdu5745 La Vie en rose (字符串)
- Swift基础(十三)UILabel
- Leetcode: N-Queens
- 第三方登陆
- linux shell常用命令总结