OS线程笔记

Posted by qioqio on November 9, 2017

线程

win linux 既有进程也有线程的概念 但是很多嵌入式系统只有线程的概念

线程是使用CPU的基本单元,由线程ID、程序计数器PC,寄存器组和栈构成

优点

响应度高
交互程序采用多线程,在多数情况下,即使部分阻塞,其他部分仍能够执行
资源共享
线程默认共享他们所属进程的所有资源
经济快捷
(1)多进程比多线程消耗资源更多;
(2)线程切换只需切换少量现场(寄存器、栈),速度快很多
方便多CPU处理
线程由用户(程序员)编写,能够充分考虑任务的有效分离,同时执行序列隶属于同一个进程的地址空间,因此可以充分利用多CPU处理

线程有2种实现方法

(1)用户层的用户线程(受内核支持,但不需内核管理)
(2)内核层的内核线程(由操作系统直接支持和管理)

这两种方式的线程都是由用户程序创建的,但操作系统的机制可以创建对应的数据结构对这些线程直接进行管理,并以线程为调度单位;也可以完全不“感知”线程的存在,仍然以进程为管理和调度单位,线程的管理与调度完全由用户级程序来完成(当然也可能由编程语言提供用户级的库函数支持即线程库)—前者为内核线程,后者为用户线程

用户线程机制和内核线程机制存在一种关联关系,具体反映在线程模型的实现上 多对一模型、一对一模型、多对多模型

多对一模型(用户级线程模型)

管理是由线程库在用户空间进行的,内核并无感知 任何时刻只有一个线程能访问内核(如果需要的话) 同一进程的线程不能运行在不同的CPU上 若一个线程执行了阻塞系统调用,则整个进程会被阻塞 线程间占用CPU等协调工作由用户程序自行解决

一对一模型(内核级线程模型)

用户创建的就是内核级线程!(通过系统调用) 一个线程执行阻塞系统调用时,允许CPU切换给其他线程,因此 具有更好的并发能力 一个进程的不同线程可运行在不同的CPU上,实现多CPU的并行处理 但创建内核线程的数量会影响系统性能,OS会限制线程总量

多对多模型(混合线程模型)

内核级线程是由用户通过系统调用使用内核完成线程的创建、调度等工作 保存现场的时候保存在内核栈 用户级线程则是用户自己来进行创建和调度工作 保存的线程保存在用户栈

线程库

为程序员提供的用来创建和管理线程的API

有两种方法实现线程库

用户线程库:

在用户空间中提供一个没有内核支持的线程库,其所有代码和数据结构都存在于用户空间中 调用库中的一个函数只是导致了用户空间中的一个本地函数调用,而不是系统调用 编程语言提供的库函数

内核线程库:

由操作系统直接提供的线程库。其所有代码和数据结构存在于内核空间中 调用库中的一个API函数通常会导致对内核的系统调用 操作系统提供的API

目前使用的线程库主要有3类

POSIX Pthread线程库
只是一种规范而不是具体实现
Pthread是POSIX标准的扩展,可以提供用户级或内核级的线程库
Win32线程库:
Win32线程库是应用于Windows OS的内核级线程库
Java线程库:
Java线程库允许在Java程序中直接创建和管理线程
Java线程库跟随JVM运行在宿主OS中
Java线程库使用宿主OS支持的线程库实现的

根据进程与线程的设置对os进行划分 1 单进程,单线程 MS-DOS 2 多进程,单线程 多数的unix系统 3 多进程多线程 linux win 4 单进程多线程 某些嵌入式操作系统,进程之间共享内存