熬之滴水成石:最想深入了解的内容--windows内核机制(6)
58 进程和线程(3)
说完进程再说说线程,线程相比于进程其实有更多可说的内容。首先实现线程调用的数据结构是个栈,该栈记录了调用方法的信息这里面也包括了函数调用及返回的地址。线程肯定是属于某个进程,其控制流可以访问这个进程的资源,对于线程而言内存等数据都是共享的。一个进程可以有多个线程的,所以线程之间的通信还是比较方便,因为线程是共享资源的,所以多线程通讯的机制比起IPC机制更为方便。在OS的环境中,我们可以把线程分成用户线程和内核线程。用户线程的理解当放在OS的整体环境中还是比较好理解,你认为它就是OS提供的某个进程机制下的线程就可以了,因为用户线程往往是受到了OS进程下的控制的为用户开放的线程功能。用户级线程的优势就是因为它是为用户级开放的,所以它的切换效率高。相比于用户级的线程,内核级线程就显得更为条条框框和规规矩矩了。由于OS对指令有完全的控制能力,所以内核线程是应用各种算法来处理分配处理器的时间。前一章,我们说到线程有优先级的概念,优先级高的肯定可以先执行,内核线程的好处就是在于它根本就不需要考虑在什么时候把控制权交给其他线程,从不担心自己的处理时间片是否长了导致其它线程无法执行的问题。所以这一部分对于用户是封闭的,内核会很好处理好线程之间与处理器的资源分配问题。还有一点须注意的是,线程是可以从内核模式转向用户模式,用户模式也可以转向内核模式的。但是这种模式的转换是需要开销的,这部分开销也是可以完全接受的。
之前说了进程的调度算法,其实就是轮换,一个进程运行一段时间后歇菜换另一个进程执行。然而线程的调度算法又是怎样了。在之前我们从课本上学过线程调度算法,从一个纯理论的角度还是有一个大概的认识。基本上可以分为三种,一种为时间片轮询调度算法:这个算法很好理解。就是cpu的处理时间被分成许多块,然后采取轮询的方法分配给每个线程,当线程获取到时间片运行后就按照自己的过程方法执行下去,直到时间段完全用完,或者主动放弃执行。OS会在获得时间片控制权后会控制下一个正在等待的线程。这种线程调度的机制是我们理解多线程并发最常见的思维方式,也是最为实用最为公平的调度处理资源的方式。随着硬件越来越强,线程调度和切换的开销也越来越小。另一种算法为优先级调度,原理也比较简单就是赋予每个线程一个优先级的编号,高优先级的总是优先考虑被处理器执行,在处理这个优先级时OS会形成一个优先级的对列表,用来存储满足条件的线程,当一个线程用完了时间片或者主动放弃处理器执行权时,系统会选择优先级高的线程作为下一个要运行的线程。优先级的调度方法实际上只是在轮询的机制上加上了一个优先级编号的。最后一种方法就是先到先服务的算法,这个算法用到了队列的数据结构先进先出的思想。所有的线程组成了一个队列,最先进入队列的线程最先获得处理器的执行,如果执行完则放出队列,如果没有执行完自己又选择暂停则又被放回队列等待执行的。这种算法看似简单,但是对于线程执行任务的时间长短并未作限制。相比之前集中算法,它还是凸显出一些硬伤。windows的调度算法是前面集中方法的组合。可以说它是一个抢占式的,支持多处理器的调度算法。用链表的方式存储每个处理器要处理的线程,不同优先级的线程分别属于不同的链表。当一个线程满足执行条件时,它首先被挂到当前处理器的一个待分配的链表中,然后在适当的时候将其放到某个处理器对应的优先级的链表中。当处理器在选择线程执行时就会根据线程的优先级选择线程。
(未完待续.............)
熬之滴水成石:最想深入了解的内容--windows内核机制(6)的更多相关文章
- 熬之滴水成石:最想深入了解的内容--windows内核机制(15)
66--内存管理(4) 说说在windows中内存空间初始化的事,开始的开始通过处理器的分页机制,预先建立相应足够的页表以便页表来访问物理内存.预先建立的这个物理内存的是windows自己的加载程序, ...
- 熬之滴水成石:Spring--精简的J2EE(7)
49--持久性 关于持久性在最早的Delphi单元中,就曾介绍过.持久性是数据库中读取,保存,或删除数据的过程.毫无 ...
- 三十四、在SAP的屏幕选择中,将英文替换成我们想要的文本内容
一.我们在代码中定义了一个选择屏幕,但是对应的显示界面为英文 界面如下 二.我们选择[转到]-[文本元素] 三.默认的文本内容是问号和三个点 四.我们修改成我们需要的,并激活这个文本,如果不激活会丢失 ...
- python3 利用正则获取网页中的想保存下来的内容
需要获取某个网页中表格部分中某个产品的成份 分析在html中成份的元素代码 <a href="/composition/4c3060178d1184935a48c4e51be4f63f ...
- 不想停机?快使用Windows Server 2016滚动升级
[TechTarget中国原创] Windows Server环境中的关键任务工作量总是密集的.工作量会主要集中在Hyper-V部署集群.硬件故障转移集群或者外来集群的顶部.集群中常用的表格都是基于F ...
- matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)
MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...
- mysql对查出来的值,在sql里面拼接我们想要拼接的内容
MySQL中concat函数使用方法:CONCAT(str1,str2,…) 返回结果为连接参数产生的字符串.如有任何一个参数为NULL ,则返回值为 NULL. 注意:如果所有参数均为非二进制字符串 ...
- 将py文件打包成exe文件
PyInstaller工具是跨平台的,它既可以在 Windows平台上使用,也可以在 Mac OS X 平台上运行.在不同的平台上使用 PyInstaller 工具的方法是一样的,它们支持的选项也是一 ...
- Python如何将py文件打包成exe
安装pyinstaller 打开cmd窗口,输入pip install pyinstaller,命令行输出successfully表示成功. 生成exe文件 一.单个py文件 在py文件目录下,打开c ...
随机推荐
- 性能测试三十五:jvm垃圾回收-GC
垃圾回收-GC 三个问题 哪些内存需要回收? 什么时候回收? 如何回收? YoungGC和FullGC: 新生代引发的GC叫YoungGC 老年代引发的GC叫FullGC FullGC会引起整个Jvm ...
- python 全栈开发,Day66(web应用,http协议简介,web框架)
一.web应用 web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是用户很容易访问应用程序,用户只需要有浏览器即可,不需要再安装其他软件.应用程序有两种模式C/S.B/S.C/S是客户端 ...
- 判断iframe加载完成、用于当ifame加载完成时执行一些操作
window.frames["iframec"].addEventListener( "load", function(){ window.frames[&qu ...
- Java 使用Jedis连接Redis数据库(-)
redis 安装: Linux 安装redis 1)下载jar包: 使用Jedis需要以下两个jar包: jedis-2.8.0.jar commons-pool2-2.4.2.jar 2)测试red ...
- oneinstack如何安装ssl证书和配置Let's Encrypt免费SSL证书教程汇总(转)
OneinStack包含以下组合:lnmp(Linux + Nginx+ MySQL+ PHP) LNMP安装SSL安全证书 部署HTTPS:https://www.gworg.com/ssl/309 ...
- Compoer的应用
composer总结 composer常用命令 composer list 列出所有可用的命令composer init 初始化composer.json文件(就不劳我们自己费力创建啦),会要求输入一 ...
- 【Java】 剑指offer(40) 最小的k个数
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 输入n个整数,找出其中最小的k个数.例如输入4.5.1.6.2.7 ...
- python下sqlite增删查改方法(转)
sqlite读写 #coding=utf-8 import sqlite3 import os #创建数据库和游标 if os.path.exists(' test.db'): conn=sqli ...
- IPV4闪退
如果出现这种状况,在安全模式下重注册dll 运行->输入cmd->输入 for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1 ...
- Luogu
dalao们的博客a http://hzwer.com //Orz %%% https://oi-wiki.org //Orz https://www.cnblogs.com/-guz/p/9 ...