操作系统
文章平均质量分 65
记录操作系统相关知识
盼兮猫
长亭外 古道边 芳草碧连天
展开
-
I/O 多路复用技术概述
最开始,传统的 socket 模型效率极差,下面我通过伪代码描述整个过程: // 创建网络套接字 s = socket(); // 绑定端口及其它配置信息 bind(s); // 开启监听 listen(s); // 循环建立连接 while (true) { // 建立连接 c = s.accept(listenfd); // 读取数据 int data = read(s, buf); // 处理数据 doSomethind(buf); // 断开连接 close(s); } ...原创 2021-08-18 23:09:55 · 166 阅读 · 0 评论 -
从操作系统层面理解同步、异步、阻塞、非阻塞
同步和异步描述调用者会不会主动等待函数的返回值,举个例子: public void method() { int result = otherMethod(); } 像上面这种形式就叫同步,result 会一直等待 otherMethod() 方法执行完毕并拿到返回值 public void method() { new Thread(() -> { int result = otherMethod(); }); } 像上面这种形式就叫异步,主线程不会等待 otherMethod() 方原创 2021-08-18 11:00:05 · 506 阅读 · 1 评论 -
上下文切换
上下文切换是指内核在 CPU 上对进程或者线程进行切换:进程和线程从操作系统层面理解实际就是 CPU 分配的时间片,当一个任务的时间片用完后,就需要切换到另一个任务。 举个例子:CPU 对 任务1 和 任务2 分别分配了各自的占用时间: 任务1时间片用完后,CPU 保存任务1的状态方便下次接着运行 任务2占用CPU,CPU加载任务2的状态,接着上次停顿的点运行 这里任务的状态实际就是上下文,上下文包含寄存器和程序计数器的内容,也就是代码运行的地址和操作数 上下文切换就是保存和切换的过程。这里有更官方的名词原创 2021-06-08 17:28:00 · 452 阅读 · 0 评论 -
操作系统死锁
死锁:多个进程因竞争资源而造成的僵局(互相等待),若无外力作用,这些进程都将无法向前推进 死锁产生的直接原因主要有以下两种: 系统资源的竞争 进程运行推进顺序不合适 宏观产生死锁的四个必要条件: 互斥条件:一个资源每次只能被一个进程使用,即在一段时间内资源仅为一个进程所占有。此时若有其他进程请求该资源只能等待 请求与保持条件:进程请求新资源时不会放弃自己已获得的资源 不可剥夺条件:进程已占有的资源只能自己来释放,不能被其它进程强行夺走 循环等待条件:若干进程间形成首尾相接循环等待资源的关系 死锁避免原创 2021-08-13 16:25:21 · 68 阅读 · 0 评论 -
进程的通信方式
进程间常见的通信方式有以下几种: 管道 信号量 消息队列 信号 共享内存 套接字 管道分为以下两种: 普通管道(PIPE):单向传输,只能在有亲缘关系的进程之间 命名管道(FIFO):单向传输,可以在没有亲缘关系的进程之间 管道是一块受内核管理的缓冲区,一端连接进程的输入,进程调用 pipe_wrtie() 方法向管道中写入数据,另一端连接另一个进程的输出,进程调用 pipe_read() 方法从管道中读取数据。为了保证两个进程对管道的操作同步,内核使用了锁、等待队列和信号等同步机制: 每次写操原创 2021-06-15 17:32:08 · 91 阅读 · 0 评论 -
进程、线程、协程
进线和线程的区别(API 方便理解) 进程是资源分配的最小单位,线程是 CPU 调度的最小单位 进程拥有独立的地址空间,进程中的线程共用同一块地址空间 创建线程开销更小,线程占用的资源相比进程小 CPU 切换线程花销更小 进程实际上是 CPU 工作时间段的描述,任何任务的执行都需要 CPU 的参与,寄存器提供计算能力,CPU 调度具体哪条指令、哪块内存通过寄存器计算。为了多个进程并发执行,CPU 依照某种规则分配给每个进程时间片,此时执行过程可以看做: 加载进程 A 的上下文,执行 A,保存 A 的原创 2021-04-29 18:30:13 · 109 阅读 · 0 评论