当前位置: 首页 > news >正文

操作系统复习第二篇

进程间的通信方式有匿名管道命名管道消息队列共享内存,大部分进程间通信的方式都是依靠内核缓存区来进行的,因为内核缓冲区天然虚拟转物理是相同的,但是用户空间不一样,如果手动实现在用户空间你会面临写实拷贝的问题
匿名管道用于具有血缘关系的进程间通信,命名管道可以让两个没有血缘关系的进程进行通信,它们的数据传输方式都是字节流,共享内存就是实现在物理空间,让不同的进程物理空间指向同一块,会带来共享资源带来的竞争问题,需要用户自己来维护。
信号量可以用来保护共享资源,PV操作是具体的实现,PV操作都是原子的,信号是异步机制的,进程对信号的处理方式有三种,对应的是存储在PCB里面的三张表,分别是执行默认操作,捕捉信号,忽略信号,有的信号是天然不能被捕捉的,防止不死不灭的进程出现!世间的万物都有寿命,植物,动物,人类,等等万物都会归于沉寂,如果意识不到时间的有限性,如何做到珍惜时间呢?
SOCKET通信方式,可以用于不同主机间的进程通信。


 在CPU执行任务的过程中,它是一个一个线程进行调度的,这里就可以知道进程是资源分配的基本单位,为什么,因为创建进程,你需要为它创建页表,创建映射关系,还需要创建PCB,创建内存管理资源等等,而同一个进程下的线程是共享页表等这些资源的,所以线程是CPU调度的基本单位,操作系统一个CPU在任一时刻只能处理一个线程,但是给我们造成在处理多个线程的假象是CPU的调度机制,大O(1)调度队列,一个活跃队列一个过期队列,根据时间片和时钟中断来进行并发的公平的调度算法。由于公平调度的线程这一做法,自然就有一个问题,对于共享资源的访问会出现问题,i++自增来两个线程就会发现问题的出现,为了解决对共享资源的修改导致数据错乱的这一问题,我们需要使用锁来进行对共享资源的访问,对共享资源的访问我们叫做竞争条件,将访问共享资源的代码片段称为临界区,我们希望这段代码是互斥的,保证在同一时刻只能有一个线程进来访问。
知道了互斥,我们还需要知道同步,同步说人话就是让线程执行有一定的顺序性,当你饿了,你让妈妈做菜,但是你得等待饭好了才能吃,饭做好你才能吃,这就叫顺序,锁和信号量可以实现互斥与同步。
生产者消费者模型也来介绍一下,所谓的生产者就是生产任务的,所谓的消费者,就是消费任务的,好像说的是废话,生产者把生产好的任务放到缓冲区里,消费者从缓冲区里拿任务,访问缓冲区的代码就是临界区,生产者放任务的时候消费者不能来拿,生产的过程和消费的过程是独立的,只有放任务的时候和拿任务的过程是需要保护的,因为它们都访问同一个缓冲区!


如何避免死锁呢?
死锁必须满足互斥条件,持有并等待,不可剥夺条件,环路等待条件,一般选择破坏环路等待的条件来避免死锁,即让不同的线程申请锁的顺序相同,避免互相持有。A线程和B线程都是先获得A资源再获得B资源,然后每个资源都加锁,不活的A资源就无法获得B资源。

加锁的目的是为了在同一时间了,只让一个线程进来访问共享资源,互斥锁获得锁失败后,线程会释放CPU,给其他线程。自旋锁说不,我就不释放,我会一直等,知道你把锁给我!
互斥锁是一种独占锁,当线程A加锁成功后,在线程A没有释放锁之前,线程B来申请锁,它会失败,失败后,线程B就放掉了CPU,B线程就被阻塞了。这个过程是内核来保证的,用户只需要调用对应的接口来调用就可以。
加锁失败后,内核会将线程设置为休眠状态,内核会在合适的时机唤醒线程,当获得锁后就可以继续执行了。
所以线程加锁失败后,会从用户陷入内核,让内核帮助我们切换线程,有成本。运行到休眠休眠到运行队列的切换不需要成本m ?
线程的上下文切换是切换什么,由于虚拟内存共享,所以只需要切换独有的数据,寄存器等不共享的数据,切换的开销是几十纳秒,如果你的代码过于短小,你执行代码的时间还没有切换的开销大,那你不是杀鸡用牛刀吗?资源浪费,这个时候你应该使用自旋锁。
下面来说明一下为什么互斥锁竞争锁会陷入内核,因为你把这个线程从运行列入阻塞队列是谁能操作,谁来操作,只有内核,当你的锁被释放,把等待的线程列入运行队列,谁来,谁能来,只有内核有这个权限。内核说,我来你们都不行。
什么是自旋锁?自旋锁是CPU提供的CAS函数来实现的,在用户态实现加锁和解锁,不会主动产生线程上下文切换的开销,加锁的过程一般是查看锁的状态,然后拿过来变成自己的,自旋锁把这两个步骤合二为一,变成原子的,自旋锁在单核CPU上不断地进行时钟中断,不然自旋锁一直占用CPU。它不会主动放弃CPU的资源。
说白了互斥锁是你追女神,女神拒绝了你,你就寻找下一个女神了,自旋锁就是你追女神,女神拒绝了你,你还要去追,直到追到为止,时钟中断就是强迫你不追了,但是你回来之后还是要追,犟驴。


读写锁:读写锁顾名思义,跟共享资源的读取和写入有关系,读锁就是多个线程可以访问同一个公共资源,多个线程可以持有一个锁,当有一个线程持有写锁的时候,所有读线程都要阻塞,而且其他线程也不可以再获得写锁!
写锁是独占锁,智能一个线程持有,读锁是共享锁,可以多个线程同时持有。
根据这些特性,可以发现,读写锁可以在读多写少的情况下发挥出作用。
根据读锁的特性它的期望是让多个线程同时获得读锁,而不是频繁的去写,所以根据这一特性,当有写线程要获得写锁,但是还有读线程持有读锁的时候,写锁是不会被获得的,只有当所有的读线程退出,写锁才能被写线程获取。这个方式叫读优先锁。
同样的还有一种锁叫写优先锁,写优先就是当写线程要获得锁,但是有别的线程持有读锁,其它线程还想要获取的时候就不让它获取,只要现有的读取锁全部被释放,写线程就会立即获得写锁。


我们还需要熟悉锁和条件变量的概念并进行具体的代码开发,实践与理论相结合,才能更好的理解锁。对于加锁和解锁的理解是你要限制线程对于一个共享资源的访问,你就给这个线程加锁,有几个共享资源,你就加几个锁。
// 生产者:添加消息
void put_message(const std::string& msg) {
pthread_mutex_lock(&mutex);
messages.push(msg);
std::cout << "Produced: " << msg << std::endl;

// 通知消费者有新消息
pthread_cond_signal(&cond);
pthread_mutex_unlock(&mutex);
}

    // 消费者:获取消息
std::string get_message() {
pthread_mutex_lock(&mutex);

// 等待直到有消息或关闭
while (messages.empty() && !shutdown) {
std::cout << "Consumer waiting for message..." << std::endl;
pthread_cond_wait(&cond, &mutex);进入等待队列
}

if (shutdown && messages.empty()) {
pthread_mutex_unlock(&mutex);
return "SHUTDOWN";
}

std::string msg = messages.front();
messages.pop();
std::cout << "Consumed: " << msg << std::endl;

pthread_mutex_unlock(&mutex);
return msg;
}


下面还有悲观锁和乐观锁,看字面意思,联想一下,悲观就是认为这个共享资源天然的有多线程进行访问,会引发激烈的竞争。乐观锁就是认为共享资源不会引发激烈的竞争。

进行总结:我们知道了什么?知道了互斥锁自旋锁,读锁写锁,悲观锁乐观锁
互斥锁就是当线程尝试去获得锁的时候,发现锁没有了,就会进行线程切换,不管你的时间片有没有到,直接剥离,把你列入阻塞队列里去,当拿锁的线程释放锁的时候告诉OS,操作系统再把你列入到运行队列里,OS进行线程切换有开销,如果你的代码内容还没开销大,你就别切了,你干脆稍微等一下,等到持有锁的线程把这个锁释放了,这个就叫自旋锁。
读写锁基于互斥锁和自旋锁实现,但是还没见过具体的代码,读写锁有读优先锁和写优先锁,读就是倾向于读线程,写就是倾向于写,但是这两种方式都容易造成线程饥饿的问题,所以我们还有公平的调度读写锁。
接下来是悲观锁和乐观锁,悲观锁是先拿到锁再修改数据,乐观锁是先修改数据再进行查看。

http://www.dtcms.com/a/443564.html

相关文章:

  • 网站互动优化甘肃城乡建设部网站首页
  • 卖童书的网站该怎么做c 网站开发用的人多吗
  • 【Leetcode】11. 盛最多水的容器
  • 房地产开发建设网站温州网站建
  • 上海单位建设报建网站内蒙古城乡建设部网站首页
  • 网站关键词词库怎么做p2p提供网站建设违法
  • wordpress 文档制作主题中山seo技术
  • 智慧物流赛项的技术平台与环境建设:打造虚实融合的竞技舞台
  • 中卫市住房建设局网站山西长治做网站公司有哪些
  • Python 日历记事本完整开发教程(自绘日历版)
  • 【ROS2学习笔记】DDS(数据分发服务)
  • 网站开发公司徐州三明seo培训
  • 做品牌 需要做网站吗网站建设运营期末考试
  • id注册网站wordpress访问不了
  • 阿克苏网站建设咨询logo图案大全
  • 百度网站建设电话网站seo优化技巧
  • 龙华品牌网站建设石景山区公司网站建设
  • 河南省建设网站电力建设期刊网站投稿
  • 北京做网站公司排名浩森宇特江苏省建设档案网站
  • 给网站添加百度地图本地电脑做服务器 建网站
  • wordpress govpress 汉化北京网站推广优化公司
  • 网站安全防护方案北京微信网站建设电话咨询
  • 优秀网站架构网站seo什么意思
  • 个人可以做电视台网站吗怎么做网络营销
  • Python 题目练习 Day1.2
  • 做宣传网站需要多少钱中山移动网站建设报价
  • 网站开发开题报告怎么写北京室内设计公司排名
  • 向量数据库 Milvus 的高可用
  • 轻量级、高性能的RPC框架——Dubbo
  • 预约网站模板出境旅游哪个网站做的好