58 进程和线程(3)

说完进程再说说线程,线程相比于进程其实有更多可说的内容。首先实现线程调用的数据结构是个栈,该栈记录了调用方法的信息这里面也包括了函数调用及返回的地址。线程肯定是属于某个进程,其控制流可以访问这个进程的资源,对于线程而言内存等数据都是共享的。一个进程可以有多个线程的,所以线程之间的通信还是比较方便,因为线程是共享资源的,所以多线程通讯的机制比起IPC机制更为方便。在OS的环境中,我们可以把线程分成用户线程和内核线程。用户线程的理解当放在OS的整体环境中还是比较好理解,你认为它就是OS提供的某个进程机制下的线程就可以了,因为用户线程往往是受到了OS进程下的控制的为用户开放的线程功能。用户级线程的优势就是因为它是为用户级开放的,所以它的切换效率高。相比于用户级的线程,内核级线程就显得更为条条框框和规规矩矩了。由于OS对指令有完全的控制能力,所以内核线程是应用各种算法来处理分配处理器的时间。前一章,我们说到线程有优先级的概念,优先级高的肯定可以先执行,内核线程的好处就是在于它根本就不需要考虑在什么时候把控制权交给其他线程,从不担心自己的处理时间片是否长了导致其它线程无法执行的问题。所以这一部分对于用户是封闭的,内核会很好处理好线程之间与处理器的资源分配问题。还有一点须注意的是,线程是可以从内核模式转向用户模式,用户模式也可以转向内核模式的。但是这种模式的转换是需要开销的,这部分开销也是可以完全接受的。

之前说了进程的调度算法,其实就是轮换,一个进程运行一段时间后歇菜换另一个进程执行。然而线程的调度算法又是怎样了。在之前我们从课本上学过线程调度算法,从一个纯理论的角度还是有一个大概的认识。基本上可以分为三种,一种为时间片轮询调度算法:这个算法很好理解。就是cpu的处理时间被分成许多块,然后采取轮询的方法分配给每个线程,当线程获取到时间片运行后就按照自己的过程方法执行下去,直到时间段完全用完,或者主动放弃执行。OS会在获得时间片控制权后会控制下一个正在等待的线程。这种线程调度的机制是我们理解多线程并发最常见的思维方式,也是最为实用最为公平的调度处理资源的方式。随着硬件越来越强,线程调度和切换的开销也越来越小。另一种算法为优先级调度,原理也比较简单就是赋予每个线程一个优先级的编号,高优先级的总是优先考虑被处理器执行,在处理这个优先级时OS会形成一个优先级的对列表,用来存储满足条件的线程,当一个线程用完了时间片或者主动放弃处理器执行权时,系统会选择优先级高的线程作为下一个要运行的线程。优先级的调度方法实际上只是在轮询的机制上加上了一个优先级编号的。最后一种方法就是先到先服务的算法,这个算法用到了队列的数据结构先进先出的思想。所有的线程组成了一个队列,最先进入队列的线程最先获得处理器的执行,如果执行完则放出队列,如果没有执行完自己又选择暂停则又被放回队列等待执行的。这种算法看似简单,但是对于线程执行任务的时间长短并未作限制。相比之前集中算法,它还是凸显出一些硬伤。windows的调度算法是前面集中方法的组合。可以说它是一个抢占式的,支持多处理器的调度算法。用链表的方式存储每个处理器要处理的线程,不同优先级的线程分别属于不同的链表。当一个线程满足执行条件时,它首先被挂到当前处理器的一个待分配的链表中,然后在适当的时候将其放到某个处理器对应的优先级的链表中。当处理器在选择线程执行时就会根据线程的优先级选择线程。

(未完待续.............)

熬之滴水成石:最想深入了解的内容--windows内核机制(6)的更多相关文章

  1. 熬之滴水成石:最想深入了解的内容--windows内核机制(15)

    66--内存管理(4) 说说在windows中内存空间初始化的事,开始的开始通过处理器的分页机制,预先建立相应足够的页表以便页表来访问物理内存.预先建立的这个物理内存的是windows自己的加载程序, ...

  2. 熬之滴水成石:Spring--精简的J2EE(7)

                                              49--持久性 关于持久性在最早的Delphi单元中,就曾介绍过.持久性是数据库中读取,保存,或删除数据的过程.毫无 ...

  3. 三十四、在SAP的屏幕选择中,将英文替换成我们想要的文本内容

    一.我们在代码中定义了一个选择屏幕,但是对应的显示界面为英文 界面如下 二.我们选择[转到]-[文本元素] 三.默认的文本内容是问号和三个点 四.我们修改成我们需要的,并激活这个文本,如果不激活会丢失 ...

  4. python3 利用正则获取网页中的想保存下来的内容

    需要获取某个网页中表格部分中某个产品的成份 分析在html中成份的元素代码 <a href="/composition/4c3060178d1184935a48c4e51be4f63f ...

  5. 不想停机?快使用Windows Server 2016滚动升级

    [TechTarget中国原创] Windows Server环境中的关键任务工作量总是密集的.工作量会主要集中在Hyper-V部署集群.硬件故障转移集群或者外来集群的顶部.集群中常用的表格都是基于F ...

  6. matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)

    MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...

  7. mysql对查出来的值,在sql里面拼接我们想要拼接的内容

    MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...

  8. 将py文件打包成exe文件

    PyInstaller工具是跨平台的,它既可以在 Windows平台上使用,也可以在 Mac OS X 平台上运行.在不同的平台上使用 PyInstaller 工具的方法是一样的,它们支持的选项也是一 ...

  9. Python如何将py文件打包成exe

    安装pyinstaller 打开cmd窗口,输入pip install pyinstaller,命令行输出successfully表示成功. 生成exe文件 一.单个py文件 在py文件目录下,打开c ...

随机推荐

  1. python 全栈开发,Day106(结算中心(详细),立即支付)

    昨日内容回顾 1. 为什么要开发路飞学城? 提供在线教育的学成率: 特色: 学,看视频,单独录制增加趣味性. 练,练习题 改,改学生代码 管,管理 测,阶段考核 线下:8次留级考试 2. 组织架构 - ...

  2. 《转》Pragma: no-cache 对性能的影响

    做了下go和java的http性能的简单比较服务端直接输出字符串使用JMeterwindows下  2000的并发,测试结果很出乎意料,go不会这么差吧 研究了半小时,原因如下tomcat的servl ...

  3. 第一个Struts2实例之hello world!

    Struts官网:http://struts.apache.org/ Struts2框架预先实现了一些功能    1:请求数据自动封装    2:文件上传的功能    3:对国际化功能的简化    4 ...

  4. (第7篇)灵活易用易维护的hadoop数据仓库工具——Hive

    摘要: Hive灵活易用且易于维护,十分适合数据仓库的统计分析,什么样的结构让它具备这些特性?我们如何才能灵活操作hive呢? 博主福利 给大家推荐一套hadoop视频课程 [百度hadoop核心架构 ...

  5. python学习之基础语法

    一.缩进 学习 Python 与其他语言最大的区别就是,Python 的代码块不使用大括号 {} 来控制类,函数以及其他逻辑判断.python 最具特色的就是用缩进来写模块. 缩进的空白数量是可变的, ...

  6. BZOJ4992 [Usaco2017 Feb]Why Did the Cow Cross the Road 最短路 SPFA

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ4992 题意概括 在一幅n*n的地图上,Amber从左上角走到右下角,每走一步需要花费时间t,每走完 ...

  7. 微信小程序开发--第一个项目

    一:Hello World 1.AppId 2.打开开发者工具 3.显示效果 二:

  8. Ubuntu 18.04安装Codeblocks

    安装步骤: 一:首先安装简版CodeBlocks sudo apt install codeblocks 二:把编译环境,C库.C++库和Boost库装好 sudo apt install build ...

  9. Ubuntu 下常用快捷键

    参考链接:Ubuntu终端以及应用下快捷键大全https://linux.cn/article-3025-1.html 桌面常用快捷键 Alt + F1:聚焦到桌面左侧任务导航栏,可按上下键进行导航 ...

  10. 【Java并发核心五】Future 和 Callable

    默认情况下,线程Thread对象不具有返回值的功能,如果在需要取得返回值的情况下会极为不方便.jdk1.5中可以使用Future 和 Callable 来获取线程返回值. Callable 可以 看成 ...