熬之滴水成石:最想深入了解的内容--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 ...
随机推荐
- BOM下的属性和方法---上
-------------BOM------------------------------------------------ 三个系统对话框 浏览器可以通过alert().confirm()和 ...
- python 全栈开发,Day101(redis操作,购物车,DRF解析器)
昨日内容回顾 1. django请求生命周期? - 当用户在浏览器中输入url时,浏览器会生成请求头和请求体发给服务端 请求头和请求体中会包含浏览器的动作(action),这个动作通常为get或者po ...
- 安装httpd过程,将网站部署到httpd过程
1,配置DNSvi /etc/resolv.conf 加入以下代码 nameserver 192.168.0.1 nameserver 8.8.8.8 nameserver 8.8.4.4 2.输入y ...
- 解决git仓库从http转为ssh所要处理的问题
https://www.cnblogs.com/lusecond/p/7607198.html 为了方便,一般我们克隆仓库的时候会选择http或者https协议 git clone https://g ...
- 带信号灯的最短路dijkstra问题(阿里巴巴2018校园招聘算法题)
题目描述 现在城市有N个路口,每个路口有自己的编号,从0到N-1,每个路口还有自己的交通控制信号,例如0,3表示0号路口的交通信号每3个时刻变化一次,即0到3时刻0号路口允许通过,3到6时刻不允许通过 ...
- Flink(二)CentOS7.5搭建Flink1.6.1分布式集群
一. Flink的下载 安装包下载地址:http://flink.apache.org/downloads.html ,选择对应Hadoop的Flink版本下载 [admin@node21 soft ...
- BZOJ3673 可持久化并查集 by zky 可持久化 并查集
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3673 题意概括 n个集合 m个操作操作:1 a b 合并a,b所在集合2 k 回到第k次操作之后的 ...
- drupal笔记
$app_root :网站根目录 安装 汉化:1将汉化包放置drupal8\sites\default\files\translations下安装:2极简版的话需要在extend(扩展)中安装Inte ...
- 教程:在 Visual Studio 中开始使用 Flask Web 框架
教程:在 Visual Studio 中开始使用 Flask Web 框架 Flask 是一种轻量级 Web 应用程序 Python 框架,为 URL 路由和页面呈现提供基础知识. Flask 被称为 ...
- poj2184 Cow Exhibition【01背包】+【负数处理】+(求两个变量的和最大)
题目链接:https://vjudge.net/contest/103424#problem/G 题目大意: 给出N头牛,每头牛都有智力值和幽默感,然后,这个题目最奇葩的地方是,它们居然可以是负数!! ...