10-线程
一、按顺序排列的流程执行模式¶
1,Sequential Process Execution Pattern
顺序进程有单个执行线程。也就是说,该进程一次只执行从程序中的一个特定点检索到的指令,并按顺序执行它们。
流控制指令,如循环、选择语句和过程调用或外部事件,会导致进程在需要时跳转到代码的其他部分,但单个线程进程一次只能做一件事
2, Process Control Block Structure
Overhead Cost:使用fork()创建进程会占用处理器时间来分配和初始化许多结构, 并占用内存资源使用方面的持续成本。
3,顺序过程内存空间组织
Sequential Process Memory Space Organisation
malloc()从堆中分配动态数据结构的内存,并返回一个指向它的指针;
free()释放它
运行时堆栈是一个内存区域,它本质上与处理器指令相链接,用于管理调用/返回机制和其他与执行相关的目的。 该堆栈包含与当前执行流相关的上下文信息
¶
¶
4,与进程执行上下文关联的数据的子集
Subset of Data Associated with a Process Execution Context¶
进程的当前执行上下文由一个小的特定信息子集表示。 CPU程序计数器的当前状态。
各种CPU寄存器可用于缓存其他数据。
运行时堆栈存储方法调用和其他临时数据的参数和链接。
二、多线程进程Multi-threaded Processes¶
1,现代操作系统支持单个进程环境的模型,支持在流程代码中的不同点独立执行的多个控制线程。
2,优点
这些轻量级线程结构共享包含进程的环境,
因此可以快速创建,并且可以由内核作为可调度的实体进行管理。
提高了多核体系结构上的程序性能,并提高了对基于GUI的应用程序的响应能力
由于服务器响应性,网络协议的问题更少
并行性的简单概念,便于程序员理解,将线程分配给模块化任务
3,Implementing Thread Support 在任何操作系统上的并行性 线程机制可以在内核内部或普通用户空间进程中(例如JavaVM)或两者都实现,其中用户线程映射到内核线程上。
任何语言中的平行论 多线程代码可以用任何有线程程序库和运行时可以链接的编程语言编写
Multi-threaded Processes
分为User Space Threads和Kernel Space Threads
三、User Space Threads和Kernel Space Threads
1,User Space Threads
优点
此实现不需要对线程的任何操作系统支持。
调用库中的函数来创建或销毁线程或调度线程可以作为用户空间中的本地函数调用来快速处理,
它操作本地数据结构来控制用户定义的线程以及程序在给定时刻正在做什么。
缺点 上下文切换到内核会阻止进程中的所有线程, 因为内核不知道存在在应用程序上下文中操作的单独线程抽象。 此外,由用户空间线程库对线程的调度也不是先发制人的。 而且,该应用程序也不能从多核处理中获益。
2,Kernel Space Threads 优点 在内核空间中实现线程提供了更大的灵活性和效率。 发出系统调用的线程不一定会阻止该进程中的所有其他线程。 线程可以安排到提供真正应用程序并发性的多处理器系统上的单独CPU上。 线程在CPU周期的同等基础上竞争,它们可能很容易被硬件计时器抢占
缺点
3,Kernel Multithreaded Design设计 为了实现更大的响应能力,内核本身可以作为一个多线程进程来实现。E.g.调度程序、IPC和I/O处理都可以是单独的线程。
这样,在系统调用进行中时,内核并不会阻止需要内核服务的所有进程。
这需要仔细设计内核数据结构和算法,以允许多线程活动的同步。这是一个必要的内核设计,特别是当底层硬件具有多处理器架构时。
4,Unix-POSIX接口中的线程管理 POSIX标准的开发目的是通过跨所有Unix系统品种制定系统调用标准来提供操作系统服务的通用抽象或虚拟化,从而增强代码的可移植性。
POSIXp线程API是适用于线程管理的接口的组件。
还有Windows系统的pthied库实现。
pthread Thread Creation pthread_create()函数创建新线程。该函数包含四个参数:- 属于pthread_t类型的线程管理结构的标识符
新线程的属性将包括堆栈大小和调度属性。
新线程将在哪里开始在程序中执行
要传递给线程将执行的函数的参数的列表
5,Thread Management in Unix – POSIX Interface
Thread Termination & Collecting Results
线程在函数结束时隐式终止。
分离一个线程并清理已分配的结构