操作系统相关知识罗列
easterling

内容来自网络,非原创

操作系统

一、进程线程协程

线程在进程下行进(单纯的车厢无法运行)

一个进程可以包含多个线程(一辆火车可以有多个车厢)

不同进程间数据很难共享(一辆火车上的乘客很难换到另外一辆火车,比如站点换乘)

同一进程下不同线程间数据很易共享(A车厢换到B车厢很容易)

进程要比线程消耗更多的计算机资源(采用多列火车相比多个车厢更耗资源)

进程间不会相互影响,一个线程挂掉将导致整个进程挂掉(一列火车不会影响到另外一列火车,但是如果一列火车上中间的一节车厢着火了,将影响到所有车厢)

进程可以拓展到多机,进程最多适合多核(不同火车可以开在多个轨道上,同一火车的车厢不能在行进的不同的轨道上)

进程使用的内存地址可以上锁,即一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。(比如火车上的洗手间)-”互斥锁”

进程使用的内存地址可以限定使用量(比如火车上的餐厅,最多只允许多少人进入,如果满了需要在门口等,等有人出来了才能进去)-“信号量”

二、进程

操作系统会以进程为单位,分配系统资源(CPU时间片内存等资源),进程是资源分配的最小单位。

在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。

在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。

三、线程

是操作系统调度(CPU调度)执行的最小单位

线程作为调度和分配的基本单位

线程不拥有系统资源,但可以访问隶属于进程的资源。

生命周期

新建,就绪,运行,阻塞以及死亡image

四、协程

五、进程状态

在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。

在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。

(1)运行(running)态:进程占有处理器正在运行。

(2)就绪(ready)态:进程具备运行条件,等待系统分配处理器以便运行。

(3)等待(wait)态:又称为阻塞(blocked)态或睡眠(sleep)态,指进程不具备运行条件,正在等待某个事件的完成。

通常,一个进程在创建后将处于就绪状态。每个进程在执行过程中,任意时刻当且仅当处于上述三种状态之一。同时,在一个进程执行过程中,它的状态将会发生改变。引起进程状态转换的具体原因如下:

(1)运行态一一等待态:等待使用资源或某事件发生,如等待外设传输;等待人工干预。

(2)等待态一一就绪态:资源得到满足或某事件己经发生,如外设传输结束;人工干预完成。

(3)运行态一一就绪态:运行时间片到,或出现有更高优先权进程。

(4)就绪态一一运行态:CPU空闲时被调度选中一个就绪进程执行。

六、进程通信

管道(Pipe)、命名管道(FIFO)、消息队列(Message Queue) 、信号量(Semaphore) 、共享内存(Shared Memory);套接字(Socket)。

七、锁

悲观锁

总是假设最坏的情况,每次去拿数据(修改)的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。悲观锁的实现,往往依靠数据库提供的锁机制 。

乐观锁

总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。

乐观锁一般会使用版本号机制或CAS算法实现。

 Comments
Comment plugin failed to load
Loading comment plugin