其他分享
首页 > 其他分享> > 阅读笔记—计算机心智操作系统之哲学原理

阅读笔记—计算机心智操作系统之哲学原理

作者:互联网

基础原理篇

操作系统构成

操作系统发展阶段

内核态与用户态

系统调用

系统调用分为三个阶段,分别是:

CPU管理——进程

进程

进程表示进展中的程序,操作系统通过进程表来管理,在任何时候,进程占有的所有资源,包括分配给进程的内存、内核数据结构和软资源形成一个进程核(Core),核快照(Core Image)代表进程的某一特定时刻的状态。

进程创建

  1. fork,创建一个与自己完全一样的新进程。
  2. exec,将新进程的地址空间用另一个程序的内容覆盖,然后跳转到新程序的起始地址,完成新程序的启动。

线程

线程是进程的一个执行序列,同一进程下的线程共享进程的地址空间、文件、信号、全局变量等,而线程间的独享资源有:程序计数器、寄存器、栈、状态字。

线程管理

线程既然是进程的构成部分,则通过进程自己管理还是操作系统管理可以分为用户态线程实现(进程自己管理)和内核态线程实现(操作系统管理)。

线程何时从用户态进入内核态

进程通信

进程同步

线程同步

操作系统之所以能够构建锁之类的同步源语,原因就是硬件已经为我们提供了一些原子操作:中断禁止和启动、内存加载和存入、测试与设置指令。有了这些硬件原子操作,我们便能够构建软件原子操作:锁、睡眠与叫醒、信号量等。

上述三种实现方式中测试和设置相对来说更为简单实现锁机制,此外该方法可以适用于多CPU环境而中断启用和禁止则不能。

死锁

死锁的4个必要条件:

死锁应对

允许发生死锁

假装没看见,不予理睬
死锁检测与修复

哲学家就餐问题

#define N 5  /*哲学家人数*/
#define LEFT(i) ((i+N-1)%N) /*哲学家i左边的哲学家*/
#define RIGHT(i)((i+N-1)%N) /*哲学家i右边的哲学家*/
#define THINGKING 0 /*思考状态*/
#define HUNGRY 1 /*饥饿状态*/
#define EATING 2 /*吃饭状态*/
typedef int semaphore;
int state[N]; /*记录每个哲学家当前状态的数组*/
semaphore mutex = 1; /*互斥信号量*/
semaphore s[N]; /*每个哲学家等待一个单独信号量*/

void philosopher(int i){
    while(TRUE){
        think();
        take_forks(i); /*同时获得两根筷子,否则阻塞等待*/
        eat();
        put_forks(i); /*同时放下两根筷子*/
    }
}

void take_forks(i){
    down(&mutex);
    state[i] = HUNGRY;
    test(i); /*试图拿起两根筷子*/
    up(&mutex);
    down(&s[i]); /*如果没有拿起筷子,则阻塞等待*/
}

void put_forks(i){
    down(&mutex);
    state[i] = THINKING;
    test(LEFT(i)); /*测试左面的哲学家是否可以吃饭*/
    test(RIGHT(i)); /*测试右面的哲学家是否可以吃*/
    up(&mutex);
}

void test(i){
    if(state[i]==HUNGRY&&state[LEFT(i)]!=EATING&&state[RIGHT(i)]!=EATING){
        state[i] = EATING;
        up(&s[i]);
    }
}

内存管理——虚拟内存

内存管理目标

虚拟地址

物理地址 = 虚拟地址 + 程序所在区域的起始地址

由此我们只需要记录两个端值:基址和极限,即可达到地址翻译和地址保护的目的,这两个端值可以由寄存器来存放,分别称为基址寄存器和极限寄存器。

if(虚拟地址 > 极限){
    陷入内核
    停止进程(core dump)
}else{
    物理地址 = 虚拟地址 + 基址
}

交换

交换就是将一个进程从内存倒出到磁盘上,再将其从磁盘上加载到内存中来的过程。这种交换的主要目的是为程序找一片更大的空间,从而防止一个程序空间不够而崩溃。交换的另一个目的是实现进程切换,就是将一个程序暂停一会,让另一个程序运行。不过这样使用交换成本高,一般不这么做。

闲置空间管理

内存管理

分页内存管理

分页系统的核心是将虚拟内存空间和物理内存空间皆划分为大小相同的页面,并以页面作为空间分配的最小单位,一个程序的一个页面可以存放在任意一个物理页面里。这样将不会产生外部碎片。同时,由于一个虚拟页面可以存放任何一个物理页面里,空间增长也容易解决,只需要分配额外的虚拟页面,并找到一个闲置的物理页面存放即可。

地址翻译

缺页中断过程

页面置换算法

段式内存管理

分段即将程序分为多个段,每个段使用一个虚拟地址空间,这样克服了分页的缺点——只能使用一个虚拟地址空间。事实上,基本内存管理的一段式管理称为纯粹分段,而一个程序分为多个段的分段管理称为逻辑分段。分段使用的段表,记录了每个段的基址。段页式管理则段表中记录了次级页表的地址,通过段表得到页表,再来定位段内的页地址。

外存管理——文件系统

文件系统目标

文件类型

大部分操作系统支持多种文件,根据文件的内容是用户数据还是文件系统本身数据,文件可分为三种:目录、一般文件、块文件。

为什么要分区

文件系统布局

文件的实现

文件的实现,归根结底,就是要把文件的内容存放到合适的地方,并能够在需要的时候很容易读出这些数据。这样,文件的实现要解决的就是如下的三个问题:

上述三点均需要了解数据在磁盘上存放方式:

设备管理——I/O

输入输出目的

物理I/O模式

根据CPU与设备控制器的沟通以及与内存的不同关系,可以分为:

根据CPU在输入输出过程中的涉入程度来分:

逻辑I/O模式(软件I/O模式)

I/O软件的目的

I/O软件的分层

标签:操作系统,程序,地址,哲学原理,心智,死锁,线程,内存
来源: https://www.cnblogs.com/weiweng/p/12485813.html