程序员的自我修养笔记之简介(一)

本文深入探讨了操作系统如何将硬件抽象为一系列概念,并详细解释了编译、静态链接、动态链接、运行库和标准库的实现。此外,文章还介绍了线程优先级的改变方式、同步与锁的概念,包括二元信号量、互斥量、临界区、读写锁和条件变量。最后,阐述了可重入与线程安全的概念以及volatile关键字的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.
编译,静态链接到操作系统如何装载程序,动态链接及运行库和标准库的实现
應用程序接口(Application Programming Interface)的提供者是运行库,什么样的运行库提供什么样的API,比如Linux下的Glibc库提供POSIX的API;Windows的运行库提供Windows API;
当成熟的操作系统出现以后,硬件逐渐被抽象成了一系列概念。在unix中,硬件设备的访问形式根访问普通的文件形式一样:在Windows系统中,图形硬件被抽象成了GDI,声音和多媒体设备被抽象成了DirectX对象;磁盘被抽象成了普通文件系统。

二.
在优先级调度的环境下,线程的优先级改变一般有三种方式:
1.用户指定优先级;
2.根据进入等待状态的频繁程度提升或降低优先级;
3.长时间得不到执行而被提升优先级。

三.同步与锁
为避免多个线程同时读写同一个数据而产生不可预料的后果,需要将各个线程对同一个数据的访问同步。同步:在一个线程访问数据未结束的时候,其他线程不得对同一个数据进行访问。同步最常见的方法:锁。
二元信号量是最简单的一种锁。多元信号量简称信号量。
互斥量(mutex)和二元信号量很类似,资源仅同时允许一个线程访问,但和信号量不同的是,信号量在整个系统可以被任意线程获取并释放,即:同一个信号量可以被系统中的一个线程获取后由另一个线程释放。而互斥量则要求哪个线程获取了互斥量,哪个线程就要负责释放这个锁。
临界区(Critical Section)是比互斥量更加严格的同步手段。临界区的作用范围仅限于本进程,其他的进程无法获取该锁。除此之外,临界区和互斥量具有相同的性质。
读写锁。对于同一个锁,读写锁有两种获取方式,共享的(Shared)或独占的(Exclusive)。
    读写锁状态         以共享方式获取         以独占方式获取
          自由                      成功                          成功
          共享                      成功                          等待
          独占                      等待                          等待
条件变量(Condition Variable)。使用条件变量可以让许多线程一起等待某个事件的发生,当事件发生时(条件变量被唤醒),所有的线程可以一起恢复执行。
四.可重入(Reentrant)与线程安全
volatile关键字试图阻止过度优化,volatile基本可以做到两件事情:
1)阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回。
2)阻止编译器调整操作volatile变量的指令顺序。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值