熬之滴水成石:最想深入了解的内容--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 ...
随机推荐
- bzoj3224 splay板子
开始学习新知识:splay——tree 是个板子题,学习splay可以看博客 https://blog.csdn.net/Clove_unique/article/details/50630280 # ...
- Linux学习笔记:使用shell脚本实现ftp的自动上传下载
在 Linux 下可以利用 Shell 实现 ftp 文件的自动上传和下载,封装至 crontab 更可实现定时调度. 1.ftp自动登录批量下载文件 ##### 从ftp服务器上的/home/dat ...
- jQuery中的CSS(二)
一:获取样式和设置样式
- [转] 学会fetch的用法
fetch是web提供的一个可以获取异步资源的api,目前还没有被所有浏览器支持,它提供的api返回的是Promise对象,所以你在了解这个api前首先得了解Promise的用法.参考阮老师的文章 那 ...
- Codeforces Round #469 (Div. 2)
Codeforces Round #469 (Div. 2) 难得的下午场,又掉分了.... Problem A: 怎么暴力怎么写. #include<bits/stdc++.h> #de ...
- Unity 之 插件下载
Inventory Pro2.3.1: https://mega.nz/#!MIIx1bqI!_nTHyvT1IJsAxOtSEp_cSnc2OL9pqF3EBXS_N143_X8 NGUI 3.11 ...
- Java中的Lambda表达式
Lambda来源于希腊字母入,发音为 /'læmdə/对高数有所了解的人都知道λ用于声明一个数学逻辑系统,表示根据XX的输入参数,会返回某个Y结果.这正是编程语言中函数(方法)的意思.因此Lambd ...
- ubuntu server 18.04 lts 终端中文显示为乱码的解决方案
.最近安装ubuntu server 18.04 lts版本发现系统自带的终端下无论是编辑中文,还是显示中文均出现乱码,还是老毛病, 今天无意中发现通过ssh,远程访问,在windows中安装开源的p ...
- 【*】Redis实战场景中相关问题
一.Redis简介 redis主要解决的问题 分布式缓存是分布式系统中的重要组件,主要解决高并发.大数据场景下,热点数据访问的性能问题,提供高性能的数据快速访问. 使用缓存常见场景 项目中部分数据访问 ...
- 【原创】ABP之IConventionalDependencyRegistra接口分析
类图: 作用: abp中默认把对象的注册分为5中约定注册方式: 1.AbpAspNetCoreConventionalRegistrar public class AbpAspNetCoreConve ...