线程是一个轻量级级进程,它是一个基本的CPU执行单元,也是程序执行流的最小单元,由线程id,程序计数器,寄存器集合,堆栈组成,线程是进程中的一个实体,是被系统独立调度和派发的基本单位
目的
引入线程的目的是为了更好地使用多道程序并发执行,提高资源利用率和系统吞吐量,而引入线程的目的则是为了减小程序在并发执行时候所付出的开销,提高操作系统的并发性能。
效果
引入线程之后,进程的内涵发生了改变,进程除了作为CPU外的系统资源的分配单元,而线程作为处理机的分配单元,由于一个进程内部有多个线程,若线程切换发生通一个进程内部,则只需要很少的时间开销。
下面是一个线程的基本结构
C
typedef __darwin_pthread_t pthread_t;
struct _opaque_pthread_t {
long __sig;
struct __darwin_pthread_handler_rec *__cleanup_stack;
char __opaque[__PTHREAD_SIZE__];
};
struct __darwin_pthread_handler_rec {
void (*__routine)(void *); // Routine to call
void *__arg;
// Argument to pass
struct __darwin_pthread_handler_rec *__next;
};
线程与进程比较
调度: 在传统的操作系统中,拥有资源和独立调度的基本单位都是进程,而在引入线程的操作系统中,线程是独立的调度单位,进程是拥有资源的基本单位,同一进程中,线程的切换不会引起进程的切换; 在不同的进程中进行切换线程,会引起继承的切换
拥有资源: 不论在传统的操作系统还是设置有线程的操作系统,进程都是拥有资源的基本单位,而线程不拥有系统资源,它只是能共享所在进程的资源
并发性: 都拥有
地址空间和其它资源(如打开文件): 同一进程下的线程共享资源,不同进程的线程不能共享
系统开销: 切换线程只需要保存和设置少量的寄存器内容,开销很小,同一个进程內的线程通信开销小,甚至无需操作系统的干预
通信方面: 进程通信(IPC)需要进程同步和同步手段辅助,保证数据的一致性,而线程可以直接读写数据段来进行通信
线程状态
创建,阻塞,就绪,运行,销毁
线程的实现方式
用户级别线程(User-Level Thread, ULT)
内核级别线程(Kernel-Level)
多线程模型
多对一: 将多个用户级线程映射到一个内核级线程, 容易阻塞
一对一: 创建线程开销大,影响程序性能
多对多: 综合方案
处理机调度概念
多道程序操作系统的基础,操作系统设计的核心问题
调度层次
作业调度: 内存与辅存之间的调度
中级调度: 内存调度,其作作用是提高系统的吞吐量,暂时不用而不运行的进程调至室外等待,把此时的进程挂起,当他们具有已经运行的条件的时候,同时内存有空闲的时候再调度回来,修改PCB状态为就绪状态,挂在等待队列上
进程调度: 按照某种方法和策略,从就绪队列汇总选取一个进程,将处理机分配给他。