Linux内核之内核同步(一)——内核同步基础
内核同步缘起何处?
提到内核同步,这还要从操作系统的发展说起。操作系统在进程未出现之前,只是单任务在单处理器cpu上运行,只是系统资源利用率低,并不存在进程同步的问题。后来,随着操作系统的发展,多进程多任务的出现,系统资源利用率大幅度提升,但面临的问题就是进程之间抢夺资源,导致系统紊乱。因此,进程们需要通过进程通信一起坐下来聊一聊了进程同步的问题了,在linux系统中内核同步由此诞生。
实际上,内核同步的问题还是相对较复杂的,有人说,既然同步问题那么复杂,我们为什么还要去解决同步问题,简简单单不要并发不就好了吗?凡事都有两面性,我们要想获得更短的等待时间,就必须要去处理复杂的同步问题,而并发给我们带来的好处已经足够吸引我们去处理很复杂的同步问题。先提两个概念:
临界资源:
各进程采取互斥的方式,实现共享的资源称作临界资源。属于临界资源的硬件有打印机、磁带机等,软件有消息缓冲队列、变量、数组、缓冲区等。 诸进程间应采取互斥方式,实现对这种资源的共享。
临界区:
每个进程中访问临界资源的那段代码称为临界区。显然,若能保证诸进程互斥地进入自己的临界区,便可实现诸进程对临界资源的互斥访问。为此,每个进程在进入临界区之前,应先对欲访问的临界资源进行检查,看它是否正被访问。如果此刻该临界资源未被访问,进程便可进入临界区对该资源进行访问,并设置它正被访问的标志;如果此刻该临界资源正被某进程访问,则本进程不能进入临界区。
说到此处,内核同步实际上就是进程间通过一系列同步机制,并发执行程序,不但提高了资源利用率和系统吞吐量,而且进程之间不会随意抢占资源造成系统紊乱。
为了防止并发程序对我们的数据造成破坏,我们可以通过锁来保护数据,同时还要避免死锁。这里给出一些简单的规则来避免死锁的发生:
- 注意加锁的顺序
- 防止发生饥饿
- 不要重复请求同一个锁
- 设计锁力求简单
我们知道了可以用锁来保护我们的数据,但我们更需要知道,哪些数据容易被竞争,需要被保护,这就要求我们能够辨认出需要共享的数据和相应的临界区。实际上,我们需要在编写代码之前就设计好锁,所以我们需要知道内核中造成并发的原因,以便更好的识别出需要保护的数据和临界区。内核中造成并发的原因:
- 中断
- 内核抢占
- 睡眠
- 对称多处理
为了避免并发,防止竞争,内核提供了一些方法来实现对内核共享数据的保护。下面将介绍内核中的原子操作、自旋锁和信号量三种同步措施。
Linux内核之内核同步(一)——内核同步基础相关推荐
- 内核同步机制-RCU同步机制
转自http://www.360doc.com/content/09/0805/00/36491_4675691.shtml 目录 [隐藏] 1 RCU同步机制 1.1 RCU介绍 1.2 RCU A ...
- 线程同步--事件内核对象
现实程序中有时候我们需要对线程执行顺序更加严格的要求. 前面讲到的关键代码段就不适用了. 关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态.从而减少了进入内核所用的时间. 所以如果 ...
- linux环境编程从应用,linux环境编程:从应用到内核
<UNIX环境高级编程>(简称APUE)几乎是Linux领域程序员人手必备的一本书.但在掌握和理解APUE的内容后,又该如何继续提高自己的技能,如何更深入地理解Linux环境编程及其背后的 ...
- linux系统是微内核结构,内核体系结构---微内核与宏内核比较
内核体系结构---微内核与宏内核比较 内核按照体系结构分为两类:微内核(microkernel)与宏内核(macrokernel). 微内核的系统有WindowNT,Minix,Mach,etc.宏内 ...
- Linux中文件描述符1,linux内核中的文件描述符(一)--基础知识简介
原标题:linux内核中的文件描述符(一)--基础知识简介 Kernel version:2.6.14 CPU architecture:ARM920T Author:ce123(http://blo ...
- linux查看安装的所有内核,Linux怎么查看系统已安装内核
当我们需要在Linux系统中安装一些软件而去下载安装文件时,一般都需要确认到底下载哪个版本的安装包,这就需要我们知道自己的Linux系统到底是什么版本.什么内核,下面跟着学习啦小编一起来了解一下Lin ...
- 【Linux 内核 内存管理】优化内存屏障 ③ ( 编译器屏障 | 禁止 / 开启内核抢占 与 方法保护临界区 | preempt_disable 禁止内核抢占源码 | 开启内核抢占源码 )
文章目录 一.禁止 / 开启内核抢占 与 方法保护临界区 二.编译器优化屏障 三.preempt_disable 禁止内核抢占 源码 四.preempt_enable 开启内核抢占 源码 一.禁止 / ...
- 【Linux 内核】Linux 内核体系架构 ( 硬件层面 | 内核空间 | 用户空间 | 内核态与用户态切换 | 系统调用 | 体系结构抽象层 )
文章目录 一.Linux 内核体系架构 二.内核态与用户态切换 ( 系统调用层 ) 三.体系结构抽象层 一.Linux 内核体系架构 Linux 内核最初的源码不足一万行 , 当前的 Linux 内核 ...
- linux netlink 编程示例(一)内核端
Netlink是一种内核层与应用层通信的一种机制,比如说在做一个内核模块的时候,往往会需要应用层提供一些配置信息,这时候就可以使用netlink.netlink包括内核层和应用层,内核层注册一个net ...
- 十天学Linux内核之第九天---向内核添加代码
原文:十天学Linux内核之第九天---向内核添加代码 睡了个好觉,很晚才起,好久没有这么舒服过了,今天的任务不重,所以压力不大,呵呵,现在的天气真的好冷,不过实验室有空调,我还是喜欢待在这里,有一种 ...
最新文章
- .NET开发环境MonoDevelop 2.2 发布
- 【放置奇兵】算法 小恶魔大冒险
- Just enough(刚刚好)的软件开发文档什么样?
- U3D-FSM有限状态机的简单设计
- 分析cocos2d-x中的CrystalCraze示例游戏
- Blazor 基础入门
- 网络安全初创公司SafeBreach获1500万美元A轮融资
- UITablView索引列表
- sdcv: 在Ubuntu中使用命令行查询离线英文词典
- Establishing SSL connection without server's ident
- 基于人脸识别的课堂签到管理系统(六)---删除,查询用户组以及人脸的添加,删除,更新
- centos下卸载php,centos如何完全卸载php
- Js之History对象
- Maple 教程 何青,科学出版社
- C语言复习 -- 知识点总结(全)
- 作为程序员,常用的工具软件之搜索引擎
- 如何在Linux中克隆一个分区或者硬盘驱动器
- java 调用autoit_java和autoit连接
- C语言/C++常见习题问答集锦(十九)之C语言与漫天飞雪
- Gitee码云注册和提交代码
热门文章
- 解决DataList控件无缝滚动图片(转)
- 利用Bandwidth Splitter限制带宽
- Confluence 6 其他需要备份和恢复的地方
- 窗体内元素遍历-通用方法(DevExpress 中BarManager的遍历)
- 【有上下界网络流】【ZOJ】2314 Reactor Cooling
- 不可不知的Python模块: collections
- 【Android游戏开发二十三】自定义ListView【通用】适配器并实现监听控件!
- Visual Studio 2005 Professional Released
- MySQL批量SQL插入性能优化
- 最新maven插件的安装