现在操作系统-第二章读书笔记2.2

2.2THREADS
为什么要有线程:
线程可以让应用变得简单。
同一进程各个线程共享地址空间和数据,而不同进程之间不存在这关系,所以有些线程之间的合作,换成进程就不可行,或者非常繁琐
因为线程的建立和撤销的速度比进程快很多。(不像进程,又要申请地址空间啦,什么的)
可以使进程某一部分阻塞(即某一线程阻塞)而程序其他部分依然继续运行,这样可以加快程序的执行
书中第97页的例子,三个线程一起处理文档,如果换成进程就不行,因为三个进程他们并不共享资源,所以无法对同一文档内容进行改动。
书中第99页的服务器例子中,线程可以增加服务器吞吐量。并且各个处理过程之间不会相互干扰。
可以让一些阻塞的系统调用,逻辑上不阻塞。
线程模型:
核心思想:processes are used to group resources together;threads are the entities scheduled for execution on the CPU (即进程是资源单位,线程是调度单位)
线程之间共享数据(如果不共享,那还搞P啊,和进程不就一样了),且之间没有保护措施,不好实现,也不需要。
但是每个线程也有自己独立的数据,比如程序计数器,寄存器变量,状态(同传统进程状态),栈(因为线程也要调用函数呀)等。
线程也能创建线程,而且和没有父子关系,一个线程可以得到另一线程的退出状态。
线程一些值得考虑的问题:
当进程创建子进程的时候,如何处理多线程?
如果同时有2个线程读取键盘呢?
如果一个线程在读数据,,另一个线程把文件描述符给关掉了呢?
当一个线程在MALLOC ,另一线程,也开始MALLOC呢?
在用户空间实现线程:
核心数据结构: private thread table (is analogous to the kernel's process table)
优点:
1.其中一个优点是可以在一些并不支持多线程的操作系统上实现多线程(因为在内核是看不到线程的)。
2.线程表存在于进程地址空间中,每个进程一个,而进程表依然存放在内核中,内核中不存在线程表。
3.这种实现的线程切换会比内核实现的快。
4.当线程结束之后,调用结束状态查询会非常快,因为根本就不需要系统调用啊,(废话,信息都存在地址空间内,调用个P哦)
5.线程的调度方法可变性高,进程爱怎么算就怎么算,而且由于不是将所有线程给内核管,所以单个进程所能拥有的线程也比较多。
缺点:
1.无法调用阻塞式系统调用,因为一调用,所有线程都阻塞了(阻塞的是整个进程),
2.系统缺页的时候,一样会阻塞所有线程。
3.没有时钟中断,所以如果一个线程不主动放弃运行,其他线程是没有机会运行的。
在内核空间实现线程:
核心思想: 将线程的创建设为系统调用,由内核管理线程表
优点:
1.可以更好的重复利用线程,当线程结束的时候并不摧毁,而是让它不运行
2.可以用阻塞式系统调用,
缺点:
1.太慢了,因为要经常系统调用,比如线程的创建,终止等等的。
2.依然没有解决很多问题,比如,创建的子进程中线程是继承还是不继承呢,比如信号出现时该哪个线程处理呢(信号送往进程,而非线程)
混合实现的线程:
同时实现用户线程和内核线程,一个内核线程对应着好几个用户线程
调度激活机制线程:
调度程序激活机制工作的目标是模拟内核线程的功能,但是为线程包提供通常在用户空间才能实现的更好的性能和更大的灵活性。
实现:
当使用调度程序激活机制时,内核给每个进程安排一定数量的虚拟的处理机,并且让运行时系统将线程分配到处理机上
当内核了解到一个线程阻塞之后,内核通知该进程的运行时系统,并且在堆栈中以参数的形式传递发生的事件的一个描述符,内核通过在一个已知的起始地址启动运行时系统,从而发出通知,进程开始调度
当内核知道原来的线程又可以运行的时候,又一次用上行调用运行时系统,通知它这一事件,进程又一次开始调度。
该实现违反了分层次系统内在的结构概念哦。
弹出式线程:
机制: 一个消息到达导致系统创建一个处理该消息的线程。
好处: 不需要存储一些信息,每个线程完全相同,就可以快速创建他们。
消息到达到处理的时间间隔非常短。
缺点: 如果在内核中运行弹出式线程,可能会因为无法抢占一个运行时间长的线程而产生危险
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值