线程

线程就是我们为了让一个进程能够同时干多件事情而发明的“分身术”。

同一进程中的每个线程在本质上是一样的,即拥有同样的程序文本,但线程执行的上下文不一致。即线程是进程里面的一个执行上下文,或者执行序列。同一个地址空间里面的所有线程就构成了进程。

//线程是CPU切换的最小单位,进程是资源分配的最小单位。

例如:当我们使用Word时,实际上是打开了多个线程。这些线程一个负责显示,一个接受输入,一个定时存盘。这些线程一起运转(同时参与竞争CPU),让我们感觉到输入和屏幕显示同时发生,而不用键入一些字符,等待一会儿才看到屏幕显示。

线程管理

要管理线程就要维持线程的各种信息,存放这些信息的数据结构称为线程控制块。线程共享一个进程空间,因此许多资源是共享的(如地址空间、全局变量、文件等),这些共享资源存放在进程控制块即可。还有一些不被共享的资源和信息(如程序计数器、寄存器等),需要存放在线程控制块里。

线程的实现方式

由谁来管理线程有两种选择:一是让进程自己来管理线程;二是让操作系统来管理线程。由进程自己管理就是用户态线程实现,由操作系统管理就是内核态线程实现。

内核态线程实现

线程是进程的不同执行序列。故线程应该是CPU调度的基本单位。操作系统要管理线程,就要保持维护线程的各种资料,即将线程控制块存放在操作系统内核空间。这样操作系统内核就同时保有进程控制块和线程控制块。

优点:

1,用户编程保持简单。用户程序员在编程的时候无需管理线程的调度,即无需担心线程什么时候会执行,什么时候会挂起。

2,如果一个线程执行阻塞操作,操作系统可以从容地调度另外一个线程执行。因为操作系统能监控所有线程。

缺点:

1,效率较低。因为线程在内核态实现,每次线程切换都需要陷入到内核,由操作系统来进行调度。

2,占用内核稀缺的内存资源。操作系统需要维护线程表,操作系统所占内存空间一旦装载结束后就已经固定,无法动态改变。由于线程的数量大大高于进程的数量,那随着线程数量的增加,操作系统内核空间将迅速耗尽。

3,需要修改操作系统

用户态线程实现

用户自己做线程的切换,自己管理线程的信息,而操作系统无需知道线程的存在。

用户自己写一个执行系统作调度器,即除了正常执行任务的线程外,还有一个专门负责执行线程调度的线程。

由于大家都在用户态下运行,要想取得CPU控制权只能靠大家的自愿合作。一个线程在执行完一段时间后主动把资源释放给别人使用,而在内核态下则无需如此。在用户态下,执行系统的调度器也是线程,没有能力强行夺走控制权,所以必须合作。

优点:

1,灵活性。操作系统不用知道线程的存在,所以在任何操作系统上都能应用。

2,线程切换快。切换在用户态进行,无需陷入到内核态。

缺点:

1,编程很困难。我们在写程序的时候必须仔细斟酌在什么时候应该让出CPU给别的线程使用。

2,一个线程受阻造成整个进程都受阻。如果在执行过程中一个线程受阻,它将无法将控制权交出来(因为受阻后无法执行交出CPU的指令了),这样整个进程都无法推进。操作系统随即把CPU控制权交给另外一个进程。

现代操作系统的线程实现模型

鉴于用户态和内核态都存在缺陷,现代操作系统使用的是将二者结合起来。用户态的执行系统负责进程内部线程在非阻塞时的切换;内核态的操作系统负责阻塞线程的切换,即我们同时实现内核态和用户态线程管理。其中内核态线程数量较少,而用户态线程数量多。每个内核态线程可以服务一个或多个用户态线程。换句话说,用户态线程被多路复用到内核态线程上。

例如,某个进程有5个线程,我们可以将5个线程分成两组,一组3个线程,另一组2个线程。每一组线程使用一个内核线程。这样,该进程将使用两个内核线程。如果一个线程阻塞,则与其同属于一组的线程皆阻塞,但另外一组线程却可以继续执行。

这样,在分配线程时,我们可将需要执行阻塞操作的线程设为内核态线程,而不会执行阻塞操作的线程设为用户态线程。这样我们就可以获得两种态势实现下的优点,而避免其缺点。

从用户态进入内核态

如果在程序运行过程中发生中断或异常,系统将自动切换到内核态来运行中断或异常处理机制。

此外,程序进行系统调用也将造成从用户态进入到内核态的转换。

★例如:一个C++程序调用函数cin。cin是一个标准库函数,它将调用read函数。而read则是由操作系统提供的一个系统调用。其执行过程如下:

1,执行汇编语言里面的系统调用指令(如syscall)

2,将调用的参数存放在指定的寄存器或栈上(事先约定好)

3,当处理器执行到“syscall”指令时,察觉到这是一个系统调用指令,将进行如下操作:

①设置处理器为内核状态

②保存当前寄存器(栈指针、程序计数器、通用寄存器)

③将栈指针设置指向内核栈地址

④将程序计数器设置为一个事先约定的地址上。该地址上存放的是系统调用处理程序的起始地址。(所有的系统调用都由系统调用处理程序来处理)

4,系统调用处理程序执行系统调用,并调用内核里面的read函数。

这样,就实现了从用户态到内核态的转换,并完成系统调用所要求的功能。

转载于:https://www.cnblogs.com/riasky/p/3431036.html

正襟危坐说--操作系统(肆):线程相关推荐

  1. java 线程 操作系统线程_线程基础:线程(1)——操作系统和线程原理

    1.概述 我在写"系统间通信技术专栏"的时候,收到很多读者的反馈.其中有一部分读者希望我抽空写一写自己关于对Java线程的使用经验和总结.巧的是,这个月我所在的技术团队也有很多同事 ...

  2. 【操作系统】—线程概念和多线程模型

    [操作系统]-线程概念和多线程模型 本章节学习内容如下 一.什么是线程,为什么要引入线程 线程是一个基本的CPU执行单元,也是程序执行流的最小单位 二.引入线程机制后,有什么变化? 三.线程的属性 线 ...

  3. linux操作系统之线程

    (1)线程(LWP)   可使用命令查看指定线程的LWP号:  ps  -Lf pid 1)light weigh process(轻量级进程),本质上仍然是进程 进程:独立的地址空间,拥有PCB,最 ...

  4. 正襟危坐说--操作系统(伍):进程间通信

    进程(线程)间通信 -----------关于进程间通信,以后会有专门的一个专题,故在此简单介绍. 两个进程在不同的地址空间中,它们之间如何通信?1,通过main函数传入参数.传递的消息只能是文本消息 ...

  5. 操作系统之线程和进程

    文章目录 一. 什么是操作系统 二. 进程和线程 1. 进程 2. 线程 3. 进程的管理 3.1 PBC中的一些属性 3.2 并发和并行 3.3 进程的调度 3.4 内存管理 3.5 进程间的通信 ...

  6. ZUCC_操作系统_Lab4线程的创建与管理

    Lab 4线程的创建与管理 代码在页底 一."hello world"单线程 #include<stdio.h> int main(void){p_msg(" ...

  7. 操作系统——Threads 线程

    目录​​​​​​​ 1. Overview 2. Multicore Programming 多核编程 2.1 Concurrency vs. Parallelism 并发vs.并行 2.2 Prog ...

  8. java线程与操作系统其他线程共享时间片_Java多线程(一)

    ***********************第14章 多线程 ********************************** 一.why 想让 两段代码 同时执行 的时候使用多线程 publi ...

  9. 【译】操作系统:线程

    为什么80%的码农都做不了架构师?>>>    1 概述 线程是CPU基本操作单元,由程序计数器.栈和一些的寄存器组成(当然包括一个线程ID) 传统(重量级的)进程控制着单一的线程- ...

最新文章

  1. mysql年月分表_MySQL之按月拆分主表并按月分表写入数据提高数据查询速度
  2. 深入理解分布式技术 - ServiceMesh 服务网格
  3. C#实现Office文档转Pdf的方法
  4. sde表空间无法导入数据和编辑
  5. mysql sql优化与调优机制详解_MySQL之SQL优化详解(一)
  6. 交流电机数字控制系统_敲黑板!新型变频调速控制系统对交流电动机设计的特殊要求...
  7. 关于myeclipise注册机run.bat运行失败的解决方法
  8. Ng第一课:引言(Introduction)
  9. python 移动平均法_移动平均法详解
  10. 聊聊面试培训机构学员的感受
  11. IOS开发之——音乐播放器-音乐播放列表(04)
  12. 桌面美化:自定义桌面 Rainmeter
  13. AngularJS总结
  14. 检测点云中的目标(ROS2 Tao-PointPillars)
  15. 阿里云短信校验注册完整版
  16. 解答千古难题:路由器到底用不用定期关闭?
  17. C语言二进制、八进制、十进制、十六进制深入探究
  18. 深入浅出CChart 每日一课——第五课 回到折线图,苦逼屌丝之万丈高楼平地起
  19. springMVC的扩展与接管
  20. 消息模板占位符的使用

热门文章

  1. Error:Expected linebreaks to be ‘LF‘ but found ‘CRLF‘ linebreak-style
  2. 用JS实现一个随机点名系统(五)
  3. 为什么现在还有很多人喜欢在银行存定期?
  4. 第一批“绿牌”汽车终于要换电池了,看到价格后,你还要买吗?
  5. 退休后你和原工作单位还有联系吗?
  6. 想要改变自己,请先突破这3个自我限制
  7. 月入1万的工作,招不到人,怎么办?
  8. 网络安全未来发展趋势怎么样,学习难度大吗?
  9. 3g造就了电商,4g推动了微商,5g物联网的时代,能够成就什么?
  10. go使用makefile