首页
首页
文章目录
  1. 进程和线程
    1. 区别联系
    2. 线程调度
    3. 线程切换步骤
    4. 进程通讯( IPC )
    5. 协程
  2. Linux常见命令
  3. 死锁
  4. 内存分页管理与Swap
  5. 任务队列和CPU Load
  6. 拓展知识点
  7. 参考资料

操作系统与计算机网络部分

这个总结是根据拉勾网上面购买的课程进行自行梳理和总结。课程地址

前段时间面试了几家公司,虽然都是考察的基础和项目,但是面试结果不是特别的理想,还是知识的掌握程度不够牢固,好多问题都是看过,但是当被问到时候,有的是立刻想出来,有的是没有说的太深。所以打算购买一个课程,重新总结和梳理一遍。

linux

进程和线程

区别联系

  • 进程是资源分配的基本单位,线程是程序执行的最小单位。

  • 进程有相互独立数据空间,线程分享进程的数据空间。

  • 一个程序最少有一个进程,一个进程最少有一个线程。

线程调度

时间片轮转调度、先来先服务调度、优先级调度、多级反馈队列调度以及高响应比优先调度

*时间片轮转调度 *

  • 时间片(quantum):每个进程被分配一个时间段,即允许该进程在该时间段中运行,如果在时间片结束时该进程还在运行,则将剥夺CPU给下一个进程,如果该进程在时间片结束前阻塞或结束,则CPU立即切换
  • 假设n个就绪进程,时间片q,每个就绪进程得到1/n的CPU时间,任何就绪进程最多等待(n-1)q单位时间
  • 平均周转时间通常优于SJF
  • 响应时间一定优于SJF
  • 性能分析:
    • q如果很大,则FIFO
    • q如果很小,则进程切换,或称上下文切换(context switch)开销太大,所谓上下文切换是:从一个进程切换到另一个进程是需要一定的时间的,所以q必须远远大于上下文切换时间
  • 结论:时间片设得太短会导致过多的进程切换,降低了CPU的效率;而设得太长有可能引起对短的交互请求的响应时间变长,通常将时间片设为20ms~50ms是合理的这种

先来先服务(FCFS:first-come first-served)

  • 容易理解:建立一个队列,选取进程运行时,从队列头部选取,添加进程时,添加到队列的尾部
  • 但是通过例子可以发现,短进程比长进程先执行,平均等待时间会缩短

优先级调度(Priority Schedule)

  • 每个进程都有一个优先数(priority number),通常是整数
  • Scheduler每次会选取就绪队列中,优先级最高的进程执行
  • 当优先级定义为“进程需要的CPU时间”时,SJF算法就是优先级调度
  • 优先级可由系统动态确定,例如:有些进程为I/O密集型,其多数时间在等待I/O操作,当这样的进程需要CPU时,应尽快地给它CPU,已便它能很快地执行完CPU操作然后去等待I/O操作,下一个进程就可以同时进入CPU。如何实现这样的效果呢?一个简单算法:其优先级设为1/f,f为该进程在上一个时间片所占的部分。
  • 进程饥饿(Starvation):优先级较低的进程可能永远得不到CPU
  • 解决:Aging思想,优先级要考虑就绪进程在就绪队列里的等待时间,因此,若一个进程在就绪队列中等待,那它的优先级会单调递增

多级反馈队列(Multilevel Feedback Queue)

  • 基于多级队列,但另外考虑了进程在就绪队列之间可以迁移
  • 定义这样的算法应该着重考虑:
    • 队列个数
    • 每级队列的调度算法
    • 如何将就绪进程升级至高层次队列
    • 如何将就绪进程降低至低层次队列
    • 当一个就绪进程进入就绪队列时,应该去哪一级?

最短作业优先法(shortest job first)

  • 前提:预知进入就绪队列的进程执行时间
  • 原理:假设有4个进程,其运行时间分别为a,b,c,d,第一个进程在a时刻结束,第二个进程在a+b时刻结束,以此类推,平均周转时间为(4a+3b+2c+d)/4,可以看到a对平均值的影响最大,所以a应该取最小值才好,这样平均周转时间才能取到最小值
  • 抢占式SJF算法:当一个进程进入就绪队列,如果它的CPU时间小于当前拥有CPU的进程的剩余“预估”时间,前者抢占后者的CPU,称为 Shortest-Remaining-Time-First(SRTF),不能实现
  • SJF算法是最优的算法
  • SJF有致命缺陷,如何预估进入就绪队列的进程的执行时间?
    • 不可能准确地预测,比如需要用户输入,这是不可知的
    • 只能根据过去的CPU burst cycle来预测
  • HRN(Highest response Ratio Next)
    • HRN = (W + T)/ T
    • W为等待时间,T代表预估CPU时间

线程切换步骤

先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务。

进程通讯( IPC )

  • 管道(Pipe)及有名管道(named pipe):管道可用于具有亲缘关系进程间的通信,有名管道克服了管道没有名字的限制,因此,除具有管道所具有的功能外,它还允许无亲缘关系进程间的通信;

  • 报文(MessageQueue)队列(消息队列):消息队列是消息的链接表,包括Posix消息队列system V消息队列。有足够权限的进程可以向队列中添加消息,被赋予读权限的进程则可以读走队列中的消息。消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

  • 共享内存:使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。

  • 套接口(UnixSocket):更为一般的进程间通信机制,可用于不同机器之间的进程间通信。起初是由Unix系统的BSD分支开发出来的,但现在一般可以移植到其它类Unix系统上:Linux和System V的变种都支持套接字。

  • 信号(Signal):信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身;linux除了支持Unix早期信号语义函数sigal外,还支持语义符合Posix.1标准的信号函数sigaction(实际上,该函数是基于BSD的,BSD为了实现可靠信号机制,又能够统一对外接口,用sigaction函数重新实现了signal函数);

  • 信号量(semaphore):主要作为进程间以及同一进程不同线程之间的同步手段。

协程

协程更轻量化,是在用户态进行调度,切换的代价比线程上下文切换要低很多

JAVA的框架

Quasar原理

1、利用字节码增强,将普通的java代码转换为支持协程的代码。
2、在调用pausable方法的时候,如果pause了就保存当前方法栈的State,停止执行当前协程,将控制权交给调度器
3、调度器负责调度就绪的协程
4、协程resume的时候,自动恢复State,根据协程的pc计数跳转到上次执行的位置,继续执行

Linux常见命令

linux的常见命令

介绍一下主要的工具:AWK、top、netstat、grep

AWKhttp://www.ruanyifeng.com/blog/2018/11/awk.html

top: top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。

top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.

netstat: netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。

如果你的计算机有时候接收到的数据报导致出错数据或故障,你不必感到奇怪,TCP/IP可以容许这些类型的错误,并能够自动重发数据报。但如果累计的出错情况数目占到所接收的IP数据报相当大的百分比,或者它的数目正迅速增加,那么你就应该使用netstat查一查为什么会出现这些情况了。

grep:Linux grep 命令用于查找文件里符合条件的字符串。

grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。

less和tail:文本查看工具,less是分页显示的工具,tail是从尾部查看文件。

死锁

在多线程时候在整理

内存分页管理与Swap

参考文章

任务队列和CPU Load

拓展知识点

  • 内存屏障

也称内存栅栏,内存栅障,屏障指令等,是一类同步屏障指令,它使得 CPU 或编译器在对内存进行操作的时候, 严格按照一定的顺序来执行, 也就是说在memory barrier 之前的指令和memory barrier之后的指令不会由于系统优化等原因而导致乱序。大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。

  • 指令乱序

谈乱序执行和内存屏障

  • 分支预测

深入理解CPU的分支预测(Branch Prediction)模型

  • CUP亲和性

Linux中CPU亲和性(affinity)

  • netfilter和iptables

[netfilter/iptables 简介]:防火墙

参考资料

操作系统——进程、线程、调度

深刻理解Linux进程间通信(IPC)

linux的top命令参数详解

竹子-博客(.NET/Java/Linux/架构/管理/敏捷)

支持一下
扫一扫,支持一下,爱你。
  • 微信扫一扫
  • 支付宝扫一扫