CS-注意事項OSの研究ノート

プロセスとスレッド

これは、ハイパーリンクである
プロセスがリソース割り当ての最小単位である1
PCBの動作を参照して、プロセス制御ブロック(PCB)の基本的な情報およびプロセスの運転状態、いわゆる失効プロセスを作成するプロセスを記載しています。
2. Aスレッドは、基本的な独立したスケジューリングの単位である
プロセスは、プロセス・リソースを共有する複数のスレッドを持つことができます

区别:
1. 进程是资源分配的最小单位,线程是独立调度的基本单位,线程不拥有资源,线程可以访问隶属进程的资源
2. 线程是独立调度的基本单位,在同一进程中,线程切换不会影响进程切换。
3. 系统开销,由于创建或者撤销进程时,系统都要为之分配或回收资源,如内存空间、I/O设备等,所付出的开销远大于创建或撤销线程时的开销。
在线程切换的时候,只需要保存和设置少量寄存器内容,开销很小
4. 通信方面,线程间可以通过直接读写同一进程中的数据进行通信,但是进程通讯需要借助IPC

进程状态间的切换
就绪状态 运行状态 阻塞状态

只有就绪状态和运行状态可以相互转换
其他都是单向转换,就绪状态通过调度算法获取CPU时间,转为运行状态,而运行状态的进程,在分配给它的CPU时间片使用完成后会变成就绪状态,等待下次调度

阻塞状态是缺少需要的资源从而由运行状态转换而来,但是该资源不包括CPU时间,缺少CPU时间会从运行态转换为就绪态

プロセスのスケジューリングアルゴリズム

批处理系统没有太多的用户操作,在该系统中,调度算法目标是保证吞吐量跟周转时间

1. FCFS 先来先服务
非抢占式调度算法,按照请求的顺序进行调度
有利于长作业,但不利于短作业,因为短作业必须一直等待前面的长作业执行完毕才能执行,而长作业有需要执行很长时间,短作业就得等待
2. 短作业优先(SJF)
非抢占式的调度算法,按估计运行时间最短的顺序进行调度。
长作业有可能被饿死,处于一直等待短作业执行完毕的状态。因为如果一直有短作业到来,那么长作业永远得不到调度
3. 最短剩余时间优先(SRTN)
最短作业优先的抢占式版本,按剩余运行的时间进行调度。当一个新的作业到达时,其整个运行时间与当前进程的剩余时间作比较,如果新的进程需要的时间更少,就挂起当前进程,运行新的进程,否则就新的进程等待

交互式系统有大量的用户交互操作
1. 时间片轮转
将所有就绪进程按FCFS的原则排成一个队列,每次调度时,将CPU时间分配给队首进程,该进程可以执行一个时间片,当时间片使用完毕时,由计时器发出时钟中断,调度程序便停止该进程的执行,并将它送往就绪队列的末尾,同时继续把 CPU 时间分配给队首的进程。
因为进程切换都要保存
进程切换过于频繁,在进程切换上就会花过多的时间
2. 优先级调度
为每个进程分配一个优先级,按照优先级进行调度。
为了防止低优先级的进程永远等不到调度,可以随着时间的推移增加等待进程的优先级
3. 多级反馈队列
一个进程需要执行 100 个时间片,如果采用时间片轮转调度算法,那么需要交换 100 次。多级队列是为这种需要连续执行多个时间片的进程考虑,它设置了多个队列,每个队列时间片大小都不同,例如 1,2,4,8,..。进程在第一个队列没执行完,就会被移到下一个队列。这种方式下,之前的进程只需要交换 7 次。每个队列优先权也不同,最上面的优先权最高。因此只有上一个队列没有进程在排队,才能调度当前队列上的进程。可以将这种调度算法看成是时间片轮转调度算法和优先级调度算法的结合。

プロセス同期

对临界资源进行访问的那段代码称为临界区。
为了互斥访问临界资源,每个进程在进入临界区之前,都需要先进行检查

同步与互斥
同步:多个进程因为合作产生的直接制约关系,使得进程有一定的先后执行关系。
互斥:多个进程在同一时刻只有一个进程能进入临界区

信号量是一个整形变量,可以对其执行down和up操作,也就是常见的P和V操作
down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。
如果信号量的取值只能为 0 或者 1,那么就成为了 互斥量(Mutex) ,0 表示临界区已经加锁,1 表示临界区解锁。

消費者問題 - プロデューサーを達成するためにセマフォを使用します

問題の説明:ストア・アイテムに使用バッファ、唯一のバッファが一杯になっていない、プロデューサーは、アイテムを置くことができ、唯一のバッファが空にされていない、消費者は、アイテムを奪うことができます。

重要なリソースに属しバッファなので、バッファへの排他的アクセスを制御するために、ミューテックスのミューテックスを使用する必要があります。

プロデューサとコンシューマの動作を同期させるために、バッファ内のアイテムの数を記録する必要があります。空のバッファ、フルバッファ数の完全なレコードの空のレコード番号:あなたは必要性の2つのセマフォを使用するには、統計の数にセマフォを使用することができます。これは、空のセマフォが空が0でない場合には、生産者がアイテムを置くことができ、生産工程で使用される、完全なセマフォは、消費者のプロセスで使用され、完全な量はゼロ信号でない場合、消費者それが削除された項目することができます。

バッファが最初にロックされ、その後、セマフォをテストすることができないことに留意されたいです。それは、次に、(空の)ダウン実行する第1のダウン(ミューテックス)を実行することができません。そうでない場合、それが起こることがあります、生産者は、バックバッファロックダウン実行する(空の)動作、それが今回の生産睡眠で、0 =空が見出されました。消費者は、クリティカルセクションに入ることができないバッファの生産者がロックアップしているため、消費者は(空の)操作を実行することはできませんが、常にゼロを空に、永遠に待つように下のプロデューサーで、その結果、ロックを解除するため、消費者はありません私は永遠に待ちます。

#define N 100
typedef int semaphore;
semaphore mutex = 1;
semaphore empty = N;
semaphore full = 0;
void producer() {
    while(TRUE) {
        int item = produce_item();
        down(&empty);
        down(&mutex);
        insert_item(item);
        up(&mutex);
        up(&full);
    }
}

void consumer() {
    while(TRUE) {
        down(&full);
        down(&mutex);
        int item = remove_item();
        consume_item(item);
        up(&mutex);
        up(&empty);
    }
}
管程
管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否则其它进程永远不能使用管程。

管程引入了 条件变量 以及相关的操作:wait() 和 signal() 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来给另一个进程持有。signal() 操作用于唤醒被阻塞的进程。

プロセス間通信

管道pipe,通过调用pipe创建,fd[0]读取
fd[1]用于写

只支持半双工通信
只能在父子进程或者兄弟进程间使用
附上代码
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define INPUT 0
#define OUTPUT 1
/*
只能适用于父子进程之间的通信,无名管道
*/
int main(){
    int fd[2];
    pid_t pid;
    char buf[256];
    int returned_count;
    pipe(fd);
    pid = fork();
    if(pid < 0){
        perror(" error fork \n");
        return 0;
    }else if(pid == 0){
        printf("this is son\n");
        close(fd[INPUT]);
        write(fd[OUTPUT], "hello world", strlen("hello world"));
        return 0;
    }else{
        printf(" this is father\n");
        close(fd[OUTPUT]);
        returned_count = read(fd[INPUT], buf, sizeof(buf));
        printf("the message is %s\n", buf);
    }
    return 0;
}
FIFO
命名管道,去除了管道只能在父子进程中使用的限制
#include <unistd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#define P_FIFO "/tmp/p_fifo"
int main(int argc, char ** argv){
    char cache[105];
    int fd;
    memset(cache, 0, sizeof(cache));
    if(access(P_FIFO, F_OK) == 0){
        execlp("rm", "-f", P_FIFO, NULL);
        printf("access.\n");
    }
    if(mkfifo(P_FIFO, 0777) < 0){
        printf("error fail\n");
        return -1;
    }
    fd = open(P_FIFO, O_RDONLY | O_NONBLOCK);
    while(1){
        memset(cache, 0, sizeof(cache));
        if(read(fd, cache, 100) == 0){
            printf("no data:\n");
        }else{
            printf("yes have data: %s\n", cache);
        }
        sleep(1);
    }
    close(fd);
    return 0;
}
消息队列
消息队列可以独立于读写进程存在,从而避免了FIFO中同步管道的打开和关闭时的困难
避免了FIFO的同步阻塞问题,不需要进程自己提供同步方法
读进程也可以根据消息类型有选择地接受消息,而不是像FIFO那样只能默认地接收

信号量:它是一个计数器,能为多个进程提供共享数据对象的访问

共享存储:允许多个进程共享一个给定的存储区,因为数据不需要在进程之间复制,所以这是最快的一种IPC,需要使用信号量来同步对共享存储的访问,多个进程可以将同一个文件映射到他们的地址空间从而实现共享内存

套接字:socket编程

デッドロック

これはハイパーリンクです

四の要件:
1.相互に排他的:各リソースがプロセスに割り当てられた、または利用可能である
。2.待機中で占め:プロセスは、リソースが、新しいリソースを要求することができますされている
3は、押収することはできません。すでに強制的に先取りされないようにリソースを割り当てるプロセスは、それが唯一のは、明示的に解放するプロセスによって占有することができます
。4.待機ループを:ループで構成される二つ以上のプロセスが、ループが2ですか、各プロセスには、いくつかのリソースを共有し、次の処理を待っています

アプローチ:
1.ダチョウポリシー
砂の中に頭を埋め、問題が発生していないふりをします。そのため、デッドロックの問題を解決するためのコストが高いので、より高い性能を実現するプログラムのこのタスクのダチョウの政策を取ることはありません。デッドロックの発生確率ユーザーに大きな影響を引き起こす、またはデッドロックが発生しませんが非常に低い場合、あなたはダチョウのポリシーを採用することができます。Unixでは、LinuxとWindows、デッドロックの問題へのアプローチを含めたほとんどのオペレーティングシステムは、それを無視します。
前記デッドロック検出とデッドロック回復が
デッドロックを防止しようとしていない検出するたびに、デッドロックが回復するポリシー取る、発生
1)リソースの種類ごとに存在または不在リングを検出することにより、デッドロック検出である有向グラフました達成。アクセスノードがマークされている場合は起動は、深さ優先探索ノード、訪問標識されたノードによって実行される、それはすなわち、デッドロックの存在を検出する、図フープの存在を示します。
2)デッドロック検出の各タイプの複数のリソース
CSの基準GitHubの-ノート
3.デッドロック回復
つかむために回復を使用して、殺すことによって、回復処理をロールバック回復を使用

デッドロック防止
1.損傷ミューテックス条件
待ち条件2.破壊の再生
3.条件破壊プリエンプション
4.待ちループの破壊

銀行家のアルゴリズム:リファレンスCS-ノート

メモリ管理

これは、ハイパーリンクである
仮想メモリの
プログラムはより多くの空きメモリを取得することができ、より多くの論理メモリを許可するように拡張され、物理メモリ、仮想メモリの目的で
メモリを管理し、より良いするためには、オペレーティングシステム意志抽象メモリアドレス空間、各プログラムは、アドレス空間は、ブロックの数、ページと呼ばれるそれぞれのブロックに分割され、独自のアドレス空間を持ちます。これらのページは、物理メモリにマッピングされていますが、すべてのページが物理メモリになければならない必要はありませんが、連続した物理メモリにマップする必要はありません。プログラム参照されたページが物理メモリにない場合、物理メモリの欠落部分がロードされ、失敗した命令を再実行し、必要なマッピング・ハードウェアを行います。以上の説明からわかるように、仮想メモリは、各ページのアドレス空間のないプログラムが物理メモリにマッピングされていることを可能にするプログラムが大規模な実行するために、限られたメモリを行っており、実行するためにメモリにすべてを必要としないことを意味可能プログラム。例えば、コンピュータは、16ビットのアドレスを生成してもよいし、プログラムのアドレス空間は、0〜64Kです。コンピュータが唯一の32キロバイトの物理メモリ、仮想メモリは、コンピュータがプログラムの64Kサイズを実行することができます。
システム・アドレス・マップページング
メモリ管理ユニット(MMU)は地図の変換されたアドレス空間と物理空間、前記ページテーブルはページ(プログラムアドレス空間)とページ・フレーム(物理メモリ空間)を管理
基準githubの上にCS-注意
ページ交換用のアルゴリズム
あなたはメモリにページがないように、メモリページフォルトが発生したアクセスしたい場合は、プログラムは、ページが実行されています。メモリに空き容量がない場合は、この時点では、システムは、メイク室にディスクスワップ領域にメモリからページを転送する必要があります。
ページ置換アルゴリズムとキャッシュ制圧戦略は、メモリに似ているディスクキャッシュとして見ることができます。キャッシングシステムでは、キャッシュの限られたサイズ、新しいバッファは、それが新しいキャッシュ・データのための部屋であるように、既存のキャッシュの一部を除去する必要が到着したとき。
主な目的は、ページ置換アルゴリズムページ置換最低周波数を(も最低のページフォルト率と言うことができる)ようにすることです。
OPTアルゴリズムは、理論的には最高です
LRUアルゴリズムはLRU、メモリ内のすべてのページのリストを維持する必要性を達成するためには、少なくとも最近使用されています。ページがアクセスされると、ページは、リスト・ヘッダに移動されます。リンク一覧ページの最後には、少なくとも最近アクセスされ、この保証します。LRUの高コストがこの方法で達成ように、各アクセスリストは、更新する必要があるため。
R及びM、ページは、アクセスされたページが変更されたM = 1に設定されて設けられたR = 1ページ:NRUは、各ページには2つのステータスビットを有するアルゴリズム。ここでRビットが定期的にクリアされます。ページには、次の4つのカテゴリに分けることができます。

R=0,M=0
R=0,M=1
R=1,M=0
R=1,M=1
当发生缺页中断时,NRU 算法随机地从类编号最小的非空类中挑选一个页面将它换出。

NRU 优先换出已经被修改的脏页面(R=0,M=1),而不是被频繁使用的干净页面(R=1,M=0)。

FIFO算法,先进先出
第二次机会算法,参考github CS-Notes

セグメント化された
仮想メモリのページング技術が採用され、即ち、アドレス空間を固定サイズのページに分割され、各ページは、メモリにマッピングされます。
一次元のアドレス空間ページング・システムは、ダイナミックな成長特性はカバレッジの問題につながる場合を示し、以下の複数のテーブルのコンパイル時に作成したコンパイラ、4つのテーブルは、ダイナミックな成長がされています。
アプローチは、各テーブルがセクション、別個のアドレス空間を構成する1セクションに分割されたセグメントです。各セグメントの長さは異なっていてもよく、動的に拡張することができます。

ページの段落
プログラムのアドレス空間は、セグメントの独立したアドレス空間を複数に分割し、各セグメントのアドレス空間は、両方が共有セグメント及び保護システムを持っているように、同じサイズのページに分割するだけでなく、仮想メモリページングシステムを有しています機能

ページングとセグメンテーションの比較
プログラマ透明の透明タブは、明示的にセグメントに分割され、各セグメントにプログラマを必要とします。

地址空间的维度:分页是一维地址空间,分段是二维的。

大小是否可以改变:页的大小不可变,段的大小可以动态改变。

出现的原因:分页主要用于实现虚拟内存,从而获得更大的地址空间;分段主要是为了使程序和数据可以被划分为逻辑上独立的地址空间并且有助于共享和保护。  

デバイス管理

これは明らかにハイパーリンクです

ディスク構造:
ディスク(プラッター):複数のディスクを有するディスク、
トラック(トラック):ディスク上の円形の帯状領域、ディスクが複数のトラックを有することができ、
セクタ(トラック部門):トラック上の円弧、トラックの複数のセクタがあってもよい、それが最小の物理記憶装置、512バイトであり、2つのサイズの4 Kが主に存在する、
ヘッド(ヘッド):非常に近いディスクの表面に、磁界は、ディスク上の電気信号に変換することができます(リード)、又は磁気ディスク(書き込み)に電気信号を変換し、
ブレーキアーム(アクチュエータアーム):トラック間ヘッドを移動するために使用される、
主軸(スピンドル):ディスク全体を回転させます。

ディスクスケジューリングアルゴリズム:
時間ライトディスクブロックに影響を与える要因である:
(ヘッドが適切なセクタに移動させるようにスピンドル回転ディスク)回転時間
ヘッドを適切なトラックに移動させるように、(ブレーキアームの動きを求めます)
実際のデータ伝送時間
の最長時間を求める前記ので、主な目標は、最短の平均シーク時間、ディスク・スケジューリング・ディスクを作成することです。

1.先来先服务
FCFS按照磁盘请求的顺序进行调度
优点是公平和简单,缺点也很明显,因为未对寻道做任何优化,使得平均寻道时间可能较长
2. 最短寻道时间优先SSTF
优先调度与当前磁头所在磁道举例最近的磁道,虽然平均寻道时间比较低,但是不够公平。如果新到达的磁道请求总是比一个在等待的磁道请求近,那么在等待的磁道请求会一直等待下去,也就是出现饥饿现象。具体来说,两端的磁道请求更容易出现饥饿现象。
3. 电梯算法SCAN
电梯总是保持一个方向运行,直到该方向没有请求为止,然后改变运行方向。
电梯算法(扫描算法)和电梯的运行过程类似,总是按一个方向来进行磁盘调度,直到该方向上没有未完成的磁盘请求,然后改变方向。
因为考虑了移动方向,因此所有的磁盘请求都会被满足,解决了 SSTF 的饥饿问题。

リンク

これは明らかにハイパーリンクです

おすすめ

転載: www.cnblogs.com/qq136155330/p/12582459.html