Everyday sentence

11-29: I don’t like rasins. They used to be fat and jucy, and now they are twisted. They had their lives stolen. They taste sweet, but really they are humiliated grapes.

12-1: We all fear death and question our place in the universe. The artist’s job is not to succumb to despair, but to find an antidote for the emptiness of existence.

12-2: You know the only thing that has made the whole thing worthwhile…has been those… few times that I’ve been able to really, truly connect with another human being.

12-3: We are made of dreams, and dreams are made of us.

12-5: Funny, how just when you think life can’t possibly get any worse it suddenly does.

12-6: 美丽的梭罗河/ 我为你歌唱 / 你的光荣历史 / 我永远记在心上 / 旱季来临 / 你轻轻流淌 / 雨季时波涛滚滚 / 你流向远方

进程

操作系统最核心的概念就是进程,它是对正在运行中的程序的一个抽象。在许许多多道程序系统中,CPU会在进程之间快速切换,使每个程序运行几十或者几百毫秒,在某一个瞬间,CPU只能运行一个进程(伪并行)。

只有多处理器的情况下才能实现真正的并行,但每个核也只能一次运行一个进程。在进程模型中,所以计算机上运行的软件,包括操作系统,都被组织味若干顺序进程(sequential process)。

进程就是一个正在执行的程序的实例,包括程序计数器,寄存器和变量的当前值。

进程的创建:

进程的终止:正常退出,错误退出,严重错误或者被其他进程杀死

fork函数

把某个进程下的资源全部复制一遍,给父进程返回其子进程的pid,给子进程返回0

进程体系

unix的进程之间有进程树一样的层级结构

windows没有层次的概念,唯一类似于层次结构的是在创建进程的时候,父进程会得到一个句柄,该句柄可以用来控制子进程。然而,这个令牌可能会移交给别的操作系统。

进程状态

进行态,就绪态,阻塞态

比如命令行cat chapter1 chapter2 chapter3 | grep tree。第一个进程是cat,将三个文件级联并输出,第二个进程是grep,它从输入中选择具有包含关键字tree的内容。

进程的实现

为了执行进程间的切换,会维护着一张表格,这张表就是进程表。每个进程占用一个进程表项,包括程序计数器,堆栈指针,内存分配状况,所打开文件的状态,账号和调度信息,以及其他在进程状态转换的信息。(总的来说就包含进程管理,存储管理和文件管理的表)

与每一个I/O类相关联的是一个称作中断向量的位置,在程序中断的时候,硬件作出保存反应,然后调用一个C程序来处理剩下的工作并调用调度程序运行其他进程,将控制权转移给一段汇编语言代码,为当前的进程装入寄存器值以及内存映射并启动该进程运行。

线程

在传统的操作系统中,每个进程都有一个地址空间和一个控制线程。但许多情况下,存在同一地址空间中运行多个控制线程的情形。这些线程就像是分离的进程。

多线程之间会共享同一块地址空间和所有可用数据的能力。这是进程所不具备的。线程也更轻量级。而且当存在大量的计算和I/O处理的时候,拥有多个线程能在这些活动中彼此重叠运行,加快应用程序的执行速度。

高速缓存

客户端发送请求给服务器,如果服务器有web页面高速缓存,就可以把大量访问的页面保存在内存中,而避免到磁盘中去调入这些页面。

线程和进程的区别

进程是资源分配的最小单位,线程是CPU调度(程序执行)的最小单位。线程是进程的实体。

进程可以类比成火车,线程可以类比成车厢去理解很多现象。

进程有自己独立的地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护。线程是共享进程中的数据的,使用相同的地址空间,线程之间的通信也更方便,但要处理好同步与互斥的关系。

但是多线程程序中只要有一个线程死掉,整个进程也会死掉。

进程是在一定的环境下,把静态的程序代码运行起来,通过使用不同的资源,来完成一定的任务。线程作为进程的一部分,扮演的角色就是怎么利用中央处理器去运行代码。这其中牵扯到的最重要资源的是中央处理器和其中的寄存器,和线程的栈(stack)。强调的是,线程关注的是中央处理器的运行,而不是内存等资源的管理。

当只有一个中央处理器的时候,进程中只需要一个线程就够了。随着多处理器的发展,一个进程中可以有多个线程,来并行的完成任务。比如说,一个web服务器,在接受一个新的请求的时候,可以大动干戈的fork一个子进程去处理这个请求,也可以只在进程内部创建一个新的线程来处理。线程更加轻便一点。线程可以有很多,但他们并不会改变进程对内存(heap)等资源的管理,线程之间会共享这些资源。

僵尸进程

一个进程使用fork创建子进程,如果子进程退出,而父进程没有调用wait或者waitpid获取子进程的状态信息,那么子进程的进程描述符等一系列信息还保存在系统中的情况。ps命令运行的时候,状态栏为defunct,由于进程表的容量是有限的,所以僵尸进程不仅占用系统的内存资源,影响系统的性能,如果实在太多的时候会瘫痪系统。

孤儿进程

还是前面fork了子进程的状态,如果此时把父进程杀死,但是子进程还在运行的情况。它会被init进程收养。

线程同步的方式有哪些

互斥量、读写锁、自旋锁、线程信号、条件变量

互斥锁:线程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存,保证公共资源不会被多个线程同时访问

信号量:进程使用的内存地址可以限定使用量,控制同时时刻访问此资源的最大线程数量

事件(信号):通过通知操作的方式来保持多线程同步,还可以方便地实现多线程优先级的比较操作

进程同步有哪几种机制

进程同步是一种目的,为了控制多个进程按照一定顺序执行。为了达到这个目的,需要进程通信,

无名管道、有名管道、信号、共享内存、消息队列、信号量

管道:

系统IPC(消息队列,信号量,共享存储):

Socket(套接字):用于不同机器之间的通信

什么是缓冲区溢出,有什么危害

是指当计算机向缓冲区填充数据时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。

这样程序会崩溃,或者跳转并执行一段恶意代码

一般是由于程序没有仔细检查用户输入造成的

什么是死锁,死锁产生的条件

在两个或者多个并发系统中,如果每个进程持有某种资源,而又等待其他进程释放它或他们现在保持着的资源,在未改变这种状态之前都不能向前推进,则称这一组进程产生了死锁。(两个或者多个进程无限期的阻塞,相互等待的一种状态)

死锁产生的四个条件:

死锁的处理基本策略和常用方法

预防死锁(破坏条件,但以性能为损失)

避免死锁(银行家算法,允许进程动态申请资源)

检测死锁(为资源和进程指定唯一的号码,建表)

解死锁(剥夺资源,撤销进程策略)

进程有哪几种状态

就绪状态:进程已获得除处理机以外的所需资源,等待分配处理机资源

运行状态:占用处理机资源运行,处于此状态的进程数小于等于CPU数

阻塞状态:进程等待某种条件,在满足之前无法执行

分段和分页有什么区别

段是信息的逻辑单位,它是根据用户的需要划分的,用于存储保护和信息的共享,因此段是对用户可见的

页是信息的物理单位,是为了管理主存的方便而使用的,页的保护和共享受到限制,但对用户是透明的

段的大小不固定,由它所完成的功能决定;页的大小固定,由系统决定

段向用户提供二维地址空间,页向用户提供的是一维地址空间

操作系统中进程调度策略有哪几种

批处理系统:FCFS(先来先服务),短作业优先

交互式系统:优先级调度(抢占式和非抢占式)(高响应比优先)

时间片轮转(雨露均沾),多级反馈队列(多个优先级的队列拥有不同的时间片,片内FCFS,并且实行抢占式)

并发和并行

并发是一段时间内同时运行多个程序,并行是同一时刻运行多个指令。操作系统通过引入线程和进程,使得程序能够并发运行。并行需要硬件支持,如多流水线,多核处理器和分布式计算系统

共享

系统中的资源可以被多个并发进程共同使用,分为互斥共享和同时共享

虚拟

虚拟技术把一个物理实体转换为多个逻辑实体

分为时分复用技术和空分复用技术,多个进程能在同一个处理器上并发执行使用了时分复用技术,让每个进程轮流占有处理器,每次只执行一个小时间片并快速切换。

虚拟内存使用了空分复用技术,它将物理内存抽象为地址空间,每个进程都有各自的地址空间,地址空间的页被映射到物理内存,地址空间的页不需要全部在物理内存中,当使用到一个没有物理内存的页时,执行页面置换方法,将该页置换到内存中

异步

进程不是一次性执行完毕,而是走走停停,以不可知的速度向前推进

系统调用

如果一个进程在用户态需要使用内核态的功能,就进行系统调用进入内核,由操作系统代为完成

大内核是将操作系统功能作为一个紧密结合的整体放到内核,微内核是将一部分操作系统功能移出内核,移出的部分根据分层原则划分若干服务,相互独立,操作系统被划分成小的,定义良好的模块

中断类型

外中断是由CPU执行指令以外的事件。如I/O完成中断,时钟中断,控制台中断

异常是由CPU执行指令的内部时间引起。如非法操作码,地址越界,算术溢出

陷入是由用户程序中的系统调用引起的

生产者消费者问题

用一个缓存区来保存物品,只有缓冲区没满的时候,生产者才可以放入物品;缓冲区不为空的时候,消费者才可以拿走物品。

用互斥量来控制对缓冲区的互斥访问,用信号量统计缓冲区的物品数量

所谓管程,是把控制的代码独立出来的写法

读者-写者问题

允许多个进程同时对数据进行读操作,但是不允许读和写,写和写同时发生

用一个整型变量count记录进程数量,用互斥量对count加锁,另一个互斥量对读写的数据加锁

哲学家进餐问题

一张圆桌五个哲学家,每个哲学家可以吃饭和思考,当一个哲学家吃饭的时候,需要拿起自己左右两边的两根筷子,并且一次只能拿起一根筷子

为了防止死锁的发生,可以设置必须同时拿起左右两根筷子,只有在两个邻居都没有进餐的情况下才允许进餐

内存管理机制: 分页

分页表保存虚拟页和物理地址的关系