美文网首页Pro___m程序员
操作系统 线程简介

操作系统 线程简介

作者: 金发萌音 | 来源:发表于2014-05-26 20:20 被阅读393次

    线程

    什么是线程?为什么要设立线程?线程的优点有哪些

    • 线程是cup的使用基本单元,它和同属一个进程的其他线程共享一定的资源(代码段,数据段等)

    • 线程包含线程ID 程序计数器 寄存器 和栈 这一点类似于进程

    • 为什么要设立线程?只用进程不行吗?实际上,进程的创建很消耗资源,而且切换进程是又很消耗资源.但又不能只用一个进程来处理十分多的请求这就要求一种可快速建立且类似进程的功能出现,这就是线程.

    • 优点:

    • 响应度高

    • 共享资源

    • 经济

    • 多处理器结构的应用

    线程是如何实现的?实现线程的相关技术有哪些?

    • 线程可分为用户线程和内核级线程,那么用户级线程和内核级线程有何区别?

    • 用户线程的管理是由一个用户级别的线程库来进行的,用户线程被内核支持,这个线程库就可以完成用户线程的创建,中断,joining和调度,不需要内核接入,这样看来用户线程是很高效的,但是一旦一个线程阻塞了,这个进程将被阻塞

    • 内核级线程同样被内核支持,但它也被内核管理.其创建等活动直接由内核所控制,这使得它与用户线程比起来效率更低些,这两者最大的不同在于:系统进程被阻塞后,进程不会阻塞,而会调用其他线程在多cpu环境中,内核级线程可以在多cpu中被调度.而用户线程不可以

    1. 请阐述进程和线程之间的区别和联系。

    2. 用户级线程和内核级线程有何区别?


    多线程模型

    什么是多线程模型,它有什么用?

    • 多线程模型是用来组织用户级线程和内核级线程关系的一种模型

    多线程模型有哪些?他们的特点是什么?

    • 多对一模型

    多个用户级线程对应一个内核级线程,线程管理是由线程库在用户控件进行 效率很高但某个线程阻塞则会导致进程的阻塞,且多个线程不能并行执行在多CPU环境下

    • 一对一模型

    一个用户级线程对应一个内核级线程,线程管理由内核进行,效率相对多对一模型稍低,但是这种模型能提供更好的并行性多个线程可以并行在多个CPU中,且某个线程的阻塞不会造成整个进程的阻塞,windows操作系统采用一对一模型

    • 多对多模型

    多对多模型多路复用了很多内核级线程(数量<=用户线程数)与用户级线程对应,在效率和并行性中找到了比较好的平衡


    线程库

    什么是线程库,他有什么用?

    • 上面两部分很多提到了线程库?什么是线程库?线程库是一组API,通过它程序员可以进行线程管理.

    如何实现线程库?

    • 目前有两种方法:
    1. 在用户空间中提供一个没有内核支持的库,其API调用相当于调用本地函数

    2. 由操作系统支持的内核级的库.其API调用相当于系统调用

    常用的线程库?

    • Pthreads

    • WIN32

    • JAVA

    前两种需要重点理解,结合代码来看可能更轻松,我会在复习或者其他时间用codeBlock来遍两个小程序上上手


    多线程问题

    多线程给我们带来方便的同时同样会给我们带来一定的麻烦,这里会提到几个常见的常见(教科书里提到的)的问题

    fork() 和 exec()问题

    这两个函数在第三章中提到过,fork()使得进程被复制出一个"分支"来执行,而在线程中

    • 如果在线程中执行fork(),那么会使得整个进程被复制还是单独的线程被复制?

    答案是两种都有 UNIX就提供了两种fork()来分别进行两种操作

    • exec()是用制定程序替换整个进程..这这个操作上线程和进程间的擦别并不大

    线程取消问题

    在线程执行完其任务前想让其取消当前操作怎么办?这同样有两种方式

    1. 异步取消,一个线程立即取消目标线程,这样的情况可能出现在多线程搜索上:其中某个线程找到了目标,那么他将取消掉其他所有线程

    2. 延时取消:这使得目标线程不断检查他是否该终止

    这样也有问题,异步取消的很"突然",如果资源已分配给要被取消的线程或者该线程正在更新其他线程共享的数据,那么系统将很难回收资源.

    延时取消因为有了"心里准备"他可以很从容的干完"身后事"吃了断头饭在上路....

    信号处理问题

    • 什么是信号?信号如何产生?

    信号时在UNIX中用来通知一个特定的事件发生

    • 信号是由特定时间的发生产生的

    • 产生的信号要发送到进程

    • 一旦发送.信号必须加以处理

    信号将被信号处理程序(默认的或用户自定义的)

    上文说到信号要发送到进程,如果目标进程黑是个单线程的进程就好说了,直接发给它,但如果目标进程有很多线程怎么办呢?这里也有几个策略

    • 发送到所有线程

    • 发送到信号所应用的线程

    • 发送给固定线程

    • 发送给一个特殊的专门用于接收信号的线程

    具体使用哪种策略要根据信号的种类来决定

    试比较信号机制与中断机制的异同。(摘自百度文库分析信号处理机制与中断的异同)

    相同:

    1. 采用了相同的异步通信方式;

    2. 当检测出有信号或中断请求时,都暂停正在执行的程序而转去执行相应的处理程序;

    3. 都在处理完毕后返回到原来的断点;

    4. 对信号或中断都可进行屏蔽。

    区别:

    1. 中断有优先级,而信号没有优先级,所有的信号都是平等的;

    2. 信号处理程序是在用户态下运行的,而中断处理程序是在核心态下运行;

    3. 中断响应是及时的,而信号响应通常都有较大的时间延迟

    线程池问题

    • 什么是线程池?为什么要引入线程池

    • 进程开始的时候创建一定的线程,放入翅中等待工作,当有请求时,他将唤醒线程池中的一个线程,并将请求传递给它.当他完成请求时在进入池中等待工作.如果没有可用线程,那么请求将等待,知道有空闲线程为止

    • 引入线程池的目的很单纯,方便线程创建和回收,减少线程创建和kill时所需的资源,并限制了线程的数量

    线程特定数据

    这个其实很好理解,所有线程共享进程数据,有时候,线程需要一份数据的副本来为自己服务,这样的数据就称为线程特定数据

    调度程序激活

    解决内核与线程库之间的通信问题

    Scheduler activations provide upcalls - a communication mechanism from the kernel to the thread library


    了解几种系统线程实例

    如linux windows等....

    相关文章

      网友评论

        本文标题:操作系统 线程简介

        本文链接:https://www.haomeiwen.com/subject/xmsdtttx.html