操作系统相关问题详解-1

操作系统相关问题详解-1

一. 共享内存的实现方式
基础概念:

a 磁盘

b 内存(主内存):

  1. 把应用程序从磁盘加载到内存中运行
  2. 以进程的形式去运行

c 虚拟内存:

  1. 内存 + 外存(swap-对换区)挂起来的进程放入磁盘
  2. 内存的扩充

d 高速缓冲存储器cache,L1, L2(独占), l3(共享)
注意:一般不把寄存器看成存储器(容量太小,处理操作指令)

共享内存:两个或者多个进程能够同时访问同一块物理内存空间的现象

目的:

a, 节省内存空间

b, 实现进程的数据交互,进程通信

  1. 物理内存共享
  • os把同一块物理内存空间分配给不同的进程。
  • 有进程主动发起(shmget())
  • os根据申请空间大小,计算分页数(分页page-物理内存的基本单位1k,4k)
  • shmget() 返回一个共享内存id:shmid,其他可以通过此ID添加到自己的地址空间。

os管理内存(分配/回收)基本单位是分页
操作系统申请内存的单位就是页,需要多少内存,会计算多少页
mysql有innodb设置虚拟空间 data page 16k

  1. 内存映射文件共享
  • os创建一个空文件,把空文件添加到不同进程的分段(主程序段,子程序段,数据段等)中,每个进程都有相同的文件明,指向同一块物理内存。最先创建的线程为主线程,其余为子程序段或者数据段等。(进程-段-页 -> 一对多对多)
  • 该文件对应一段物理内存空间(4k)
  • 文件(进程也是一个文件)就是一个存储空间,一切皆文件。
    对比:
  • 不同点:

a 物理内存:os
注意:从磁盘文件加载到内存中 - os 把同一块物理内存分配给不同的进程。

b 内存映射文件 - os把同一份文件分配给不同的进程。

c 都是tmpfs - 基于内存的临时文件系统。

扫描二维码关注公众号,回复: 14735840 查看本文章
  • 相同点:

a 都是tmpfs - 基于内存的临时文件系统。(一切皆文件).

b 不同进程处理数据不同(类型,格式),采用格式化的数据。

c 都是操作内存,效率相当。

二. 进程间通信方式,种类
a, 共享内存(shared memory)- 最快
  • 按需同步,根据需求而定。
  • 默认不同步
b, 消息传递(message - passing)
基本概念:
  • os提供收发消息的原语(send(), receive())
  • 原语

a, os具有特定功能的程序,os把这些使用频率高的代码段进行封装。
b, 原子操作 - 要么一起成功要么一起失败。
c, 举例:

  • 1,进程状态切换
    1.1 新建(new())
    1.2 就绪 (start())
    1.3 运行 (run())
    1.4 阻塞
    1.5 终止
  • 2, 消息发送(wait notify)
  • 3, 系统调用
直接通讯:

a, 一个进程给另一个进程发消息,点对点通讯;
b, 发到对方消息缓冲区队列中;
c, 什么时候看我的邮箱?不确定,无法保证效率(监听(观察者模式)=高强度轮训);

间接通讯:
  • 发消息进程不直接发给收消息进程,而是发到一个公共的“信箱”(数据结构)(主动打开);
  • 收消息进程轮询信箱(即时);
  • 布告栏;
注意:原语本身是高效的,但是消息通讯机制,不保证效率。
c, 管道通行
  • 管道的本质,是一个固定大小的缓冲区(4k),就是个文件;
  • 管道只支持半双工通讯,全双工需要两个管道;、
  • 操作双方必须是同步的,所以效率不高;
  • 写,追加到队尾,读,从对头取(尾插头读)
d, 信号量 (其它)
  • 同步机制,一般不作为通信机制。
  • 同步锁(如:Java Synchronized):

a 一个进程获取锁,其他进程阻塞;

b 只允许一个进程访问共享资源;

  • 信号量(如:Java Semaphore):

a 一个信号量,里面有“3个锁”,可以同时支持进程访问共享资源。

b 允许多个进程访问共享资源;

e, socket(其它)

不同主机之间的调用的通讯方式,RPC的方式;

三. 进程上下文切换流程
1. CPU在进程和进程之间的切换
2. 切换流程

0 检查是否允许切换 - 原语,正在处理中,临界区或其他原子操作中不允许切换。
1 保存当前进程上下文 - PC(正在执行的指令)等专用寄存器和通用寄存器,保存到PCB中(进程控制块);

  • 流程如下:

IR寄存器:存放指令地址
-> PC程序计数器:存放指令
-> ALU算数逻辑单元
-> psw标志/程序寄存器
-> CU

2 更新PCB信息,比如进程状态;

3 把此进程移入到队列中(就绪队列,或者某种原因的阻塞队列);

4 选择另一个(处于就绪状态)进程执行,更新PCB;

5 更新内存管理的数据结构(段表,页表);

6 恢复所选进程上下文,将CPU执行权交给所选进程;加载文件,读磁盘

以上 保存现场->恢复线程

3. 切换场景
  1. 运行中的进程要求I/O:
    a 读写磁盘
    b 网络通信
  2. 进程状态相关操作
    a 阻塞,唤醒,挂起,激活
    b 新建,销毁
  3. 进程执行完成/结束
  4. 一个高优先级进程申请运行(可剥夺)
  5. 分配给当前进程的时间片用完了
四. 进程与线程状态详解
进程状态(5种状态/2种操作):
  1. 新建
  2. 三种基本状态:就绪(活动就绪,情况:静止就绪转活动就绪),执行,阻塞(I/O操作或者同步没有获取到锁导致不能运行了)
  3. 销毁
  4. 操作:

a 挂起:1.静止阻塞 2.暂时不需要当前进程运行了 3.放到外层(磁盘兑换区)

b 激活:静止就绪

  1. yieId其实只是一种线程调度的一种尝试,让更多的线程获取执行权。(无实用性);
线程状态(6种状态):
  1. New 新建状态(线程刚被创建,start方法之前的状态)
  2. Runnable 可运行状态(得到时间片运行中状态)(Ready就绪,未得到时间片就绪状态)
  3. Blocked 被阻塞状态(如果遇到锁,线程就会变为阻塞状态等待另一个线程释放锁)
  4. Waiting 等待状态(无限期等待)
  5. Time_Waiting 超时等待状态 - 记时等待(有明确结束时间的等待状态)
  6. Terminated 被终止状态(当线程结束完成之后就会变成此状态)
补充:进程-线程-协程,cpu的利用率,相对于进程而言线程更能充分利用CPU闲置时间,CPU运算提高了,协程相较于线程对于CPU的利用率又高了细粒度更加细腻,说白了就是不让CPU闲置。

猜你喜欢

转载自blog.csdn.net/weixin_43869435/article/details/126594043
今日推荐