下面我们来讨论线程的实现
那在这里头呢
线程的实现方式呢有这样几种
在最早的时候
实际上在我们的操作系统里呢
并没有多线程的支持
那用户提出了这种需求
那我们首先可以做的方式呢
是用户自己来写函数库
在用户态来实现一个进程
内部的并发性的提高
那这就是我们这里说到的用户线程
在用户空间里通过函数库的形式
来支持线程的创建删除和切换
那 这是我们在几种提供
用户库的方式提供的线程实现
那在用户线程支持
有了一定基础之后
那这个功能呢
也会做到操作系统内核里头
这种做法呢类似于
我们在网络里头做法
网络最开始也不是
写在操作系统里头的
那只是用了一段时间之后呢
它才变成操作系统内部的一个模块
好 那在操作系统内核
实现线程支持呢
它会更自然效果会更好
那我们现在的操作系统呢
基本上都支持内核态的线程
好 在这两种基础之上呢
在SOLARIS里头呢又进行了一种
新的尝试 叫轻权进程
那也就是说在用户态实现的线程
和内核态实现的线程
它俩各有各自的优缺点
那在SOLARIS里头呢
希望把这两种结合起来
就出现了这种轻权进程
那下面我们具体来看
这三种做法它都是怎么来做
用户线程是指说我们在通过一个
用户库来完成线程的管理
这包括线程的
创建 中止 同步和调度
那在这个图里呢我们描述了
系统里的线程库里
实现的基本方法
在操作系统内核里头呢
仍然只有进程控制块来描述
处理机的调度的情况
然后在这里头呢
操作系统并不感知
应用态有多线程的支持
而多线程的支持呢
是用户的函数库支持的多线程
在应用程序内部
通过构造相应的线程控制块
来空置一个进程内部
多个线程的交替执行和同步
好 那用这种方式呢
我们可以很好的支持多线程
那它也有自己的好处
比如说这里它有一些什么样的特征
不依赖操作系统内核
不依赖操作系统内核呢
也就相当于内核
不感知用户线程的存在
那这也是最早
为啥会做这件事情的缘故
就是用于不支持线程的
多进程操作系统
好 那有了这个之后呢
那用户你就会多一些事情
在用户态实现线程
这时候用户要自己来
维护线程控制块
要自己有一个相应的线程库
那 有了这一条之后
它还会带来好处就是
用户态里的线程之间的
切换它速度非常快
没有用户到内核的切换
然后用户也可以自己
来写自己的调度算法
因为我对应用
我应用的开发者更了解
这个多线程如何切换
如何调度 它的性能会更好
当然这种做法也有它的问题
它的问题是什么
由于线程发起系统调用而堵塞
那这时候呢
整个进程就进入等待状态了
因为对于内核来讲
并不知道你上面是多线程
一个线程堵塞的时候
把另一个线程继续运行下去
要做到这一点的话
必须有内核的支持
好 然后不支持
基于线程的处理机抢占
这里指的是什么意思呢
这里指的是说
我们多进程系统里头
通过抢占的方式
让一个进程停下来
然后让另一个进程继续运行
那如果说我们是基于线程
来做这件事情
那这样的话我操作系统
就没有办法让一个线程停下来
然后这一个进程内部的
另一个线程来运行
那这种的必须由
当前的线程主动放弃
我才可以做这种切换
好 那再有一个
就是分配CPU的时间
对于操作系统来说
这个分配是由
操作系统内核来控制的
所以它是以
进程为单位来进行分配
如果你里头有多个线程
那这多个线程
每个线程分配到的时间呢
相对来说就会变少