Linux

操作系统

Posted by Bug1024 on March 28, 2017

Cgroup

  • 计算资源
  • 内存资源
  • IO资源
  • 网络资源

进程

  • 具有独立功能的程序,关于某个数据集合的一次运行过程
  • 进程 = 程序 + 数据+ PCB
  • 3个基本状态:ready(就绪等cpu)/running(运行)/waiting(等待事件的发生)
  • PCB:进程存在的唯一标志
  • 调度:状态转换时发生调度,IO密集型/CPU密集型,进程树,overhead(系统消耗)
  • IPC:管道/共享内存(生产者/消费者)/消息传递(send/recv)/信号量/套接字,busy waiting

CPU调度

  • FCFS(First-Come First-Served)
  • SJF(Shortest-Job-First),preemptive(抢占式)
  • Priority Scheduling
  • Round Robin
  • Multilevel Queue Scheduling
  • Multilevel Feedback Queues

进程同步

  • entry section, critical section, exit section, remainder section
  • 临界区使用原则:互斥(忙则等待),空闲让进,有限等待,让权等待
  • semaphore: wait()用于申请资源, signal()用于释放资源
  • 生产者消费者问题,读者写者问题,哲学家进餐问题
  • 管程

进程间通信

  • 管道
  • 文件和文件锁
  • 共享内存
  • 信号量
  • 消息队列

死锁

  • 两个或两个以上的进程由于竞争资源导致系统无法推进
  • 产生必要条件:互斥,占有必等待,非抢占,循环等待
  • 银行家算法(allocation,max,available)

内存管理

  • swapping, paging, segmentation
  • 单CPU需要两个寄存器(基础+界限)
  • 逻辑地址 物理地址 重定位寄存器
  • 连续分配:固定分区,可变分区
  • 离散分配:分页(页=>页框),分段,段页

虚拟存储

  • demand paging
  • page replacement
  • allocation of frames
  • thrashing(抖动)

监控指标

  • load 特定事时间间隔内运行队列中的平均线程数
  • user time CPU执行用户进程所占用的时间
  • system time CPU在内核所花费的时间
  • nice time 系统在调整进程优先级的时候所花费的时间
  • idle time 系统空闲等待进程运行的时间
  • waiting time CPU在等待IO操作所花费的时间
  • hard irq time 系统处理硬件中断所占用的时间
  • soft irq time 系统处理软件中断所占用的时间
  • steal time 被强制等待虚拟机CPU的时间,占比较高表示当前虚拟机与该宿主其他虚拟机争用CPU频繁
  • 磁盘剩余空间 使用df和du命令查看
  • 网络traffic 使用sar命令查看 sar -n DEV 1 1
  • 磁盘IO 使用iostat命令查看 iostat -d -k
  • 内存使用 使用free命令查看
  • swap IO 使用vmstat命令查看

同步异步阻塞非阻塞

  • 同步与异步关注的是消息通信机制 (synchronous communication/ asynchronous communication)
  • 阻塞与非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态,主要是从CPU消耗上来说的
  • 同步阻塞 最常用,IO性能较差,CPU大部分处于空闲
  • 同步非阻塞 在网络IO是长链接且传输数据较小时可以有效提升性能
  • 异步阻塞 在分布式数据库中常用,写一份记录通常会有一个是同步阻塞,而其他几份会采用异步阻塞方式写入其他机器
  • 异步非阻塞 比较复杂,通常在集群间同步消息使用,例如cassandra,适合同时要传多份相同数据到不同机器,数据量不大但是异常频繁

僵尸进程与孤儿进程

在unix/linux中,正常情况下,子进程是通过父进程创建的,子进程再创建新的进程。子进程的结束和父进程的运行是一个异步过程,即父进程永远无法预测子进程到底什么时候结束。 当一个进程完成它的工作终止之后,它的父进程需要调用wait()或者waitpid()系统调用取得子进程的终止状态。

  • 僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
  • 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。 不管进程如何终止,最后都会执行内核中的同一段代码,它为相应进程关闭所有描述符,释放使用的存储器。一个由init进程收养的进程终止时是不会变成僵死进程的,因为init被编写成无论何时只要有一个子进程终止就会调用wait函数取得其终止状态。