本文内容整理自西安交通大学软件学院田丽华老师的课件,仅供学习使用,请勿转载

操作系统系列笔记汇总:操作系统笔记及思维导图汇总附复习建议_Qlz的博客-CSDN博客

文章目录

文章目录

  • 文章目录
  • 思维导图
  • Background
    • 进程间的交互关系
  • The Critical-Section Problem (临界区问题)
    • 临界区的访问过程
    • 同步机制应遵守的准测
    • 两进程互斥的软件方法
      • 算法1
        • 缺点
      • 算法2
        • 优缺点
      • 算法3
  • Synchronization Hardware (同步的硬件实现)
    • Test-and-Set指令
    • Swap 指令
    • 优缺点
      • 硬件方法的优点
      • 硬件方法的缺点
  • Semaphores
      • 利用信号量来描述互斥关系
      • 利用信号量来描述前趋关系
        • 方法:前趋图
    • Deadlock and Starvation
    • PV操作讨论
    • 信号量集
      • AND型信号量集
      • 哲学家解法:AND型信号量
      • 生产者消费者:AND型信号量
    • 一般“信号量集”
    • 信号量机制的缺点
  • Classical Problems of Synchronization(经典同步问题)
    • Dining-Philosophers Problem
      • 问题描述
      • 解决方法
    • 生产者-消费者问题
      • 问题描述
      • 问题解决
    • 读者-写者问题
      • 问题描述
      • 问题分析
      • 问题解决
  • Monitors (管程)
    • 基本思想
    • 定义
    • 主要特性
    • 实现管程的三个关键问题
    • 管程的互斥
    • 条件变量
    • 同步
  • Java Synchronization (Java中的同步机制)
    • Java Synchronization
      • synchronized Statement
      • Entry Set
      • 消费者问题
    • wait()
    • notify()
    • Multiple Notifications
    • Java Semaphores

思维导图

进程同步思维导图

Background

  • 对共享数据的并发访问可能导致数据的不一致性
  • 要保持数据的一致性,就需要一种保证并发进程的正确执行顺序的机制
  • Shared-memory solution to bounded-butter problem (Chapter 4) has a race condition on the class data count (解决有界缓冲区问题的共享内存方法在类数据count 上存在竞争条件)
  • race condition竞争条件
    • 若干个并发的进程(线程)都可以访问和操纵同一个共享数据,从而执行结果就取决于并发进程对这个数据的访问次序.
    • 为了保证数据的一致性,需要有同步机制来保证多个进程对共享数据的互斥访问.
  • 进程类型
    • 协作进程
    • 独立进程
  • 进程间资源访问冲突
    • 共享变量的修改冲突
    • 操作顺序冲突
  • 进程间的制约关系
    • 间接制约:有些资源需要互斥使用,因此各进程进行竞争--独占分配到的部分或全部共享资源,进程的这种关系为进程的互斥
    • 直接制约:进行协作--具体说,一个进程运行到某一点时要求另一伙伴进程为它提供消息,在未获得消息之前,该进程处于等待状态,获得消息后被唤醒进入就绪态.进程的这种关系为进程的同步(等待来自其他进程的信息,“同步”)

进程间的交互关系

  • 互斥,指多个进程不能同时使用同一个资源;
  • 同步,进程之间的协作;
  • 死锁,指多个进程互不相让,都得不到足够的资源;
  • 饥饿,指一个进程一直得不到资源(其他进程可能轮流占用资源)

The Critical-Section Problem (临界区问题)

对于临界资源,多个进程必须互斥的对它进行访问

临界区(critical section):进程中访问临界资源的一段代码。

  • 实现进程对临界资源的互斥访问—各进程互斥的进入自己的临界区
  • 当一个进程在临界区中执行时,其他进程都不能进入临界区

如果不和它共享一个临界区的进程可以访问吗,还是说临界区只有一个?

临界区的访问过程

临界区的执行在时间上是互斥的,进程必须请求允许进入临界区

  • 进入区(entry section):在进入临界区之前,检查可否进入临界区的一段代码。如果可以进入临界区,通常设置相应“正在访问临界区”标志。
  • 退出区(exit section):用于将"正在访问临界区"标志清除。
  • 剩余区(remainder section):代码中的其余部分。

同步机制应遵守的准测

  • Mutual Exclusion. If process Pi is executing in its critical section, then no other processes can be executing in their critical sections(互斥。假定进程Pi在其临界区内执行,其他任何进程将被排斥在自己的临界区之外).
  • Progress. If no process is executing in its critical section and there exist some processes that wish to enter their critical section, then the selection of the processes that will enter the critical section next cannot be postponed indefinitely(有空让进。临界区虽没有进程执行,但有些进程需要进入临界区,不能无限期地延长下一个要进入临界区进程的等待时间).
  • Bounded Waiting. A bound must exist on the number of times that other processes are allowed to enter their critical sections after a process has made a request to enter its critical section and before that request is granted(有限等待。在一个进程提出进入临界区的请求和该请求得到答复的时间内,其他进程进入临界区的次数必须是有限的).

另一种说法:

  • 空闲则入:其他进程均不处于临界区;
  • 忙则等待:已有进程处于其临界区;
  • 有限等待:等待进入临界区的进程不能"死等";
  • 让权等待:不能进入临界区的进程,应释放CPU(如转换到阻塞状态)

两进程互斥的软件方法

算法1

设立一个两进程公用的整型变量 turn:描述允许进入临界区的进程标识,有两个进程Pi, Pj,如果turn==i, 那么进程Pi允许在其临界区执行

  • 在进入区循环检查是否允许本进程进入:
  • turn为i时,进程Pi可进入;
  • 在退出区修改允许进入进程标识:
  • 进程Pi退出时,改turn为进程Pj的标识j;

缺点

强制轮流进入临界区,没有考虑进程的实际需要。容易造成资源利用不充分:在进程1让出临界区之后,进程2使用临界区之前,进程1不可能再次使用临界区;

算法2

设立一个标志数组flag[]:描述进程是否准备进入临界区,初值均为FALSE,先申请后检查。可防止两个进程同时进入临界区

优缺点

  • 优点:不用交替进入,可连续使用;
  • 缺点:两进程可能都进入不了临界区
    • Pi和Pj在切换自己flag之后和检查对方flag之前有一段时间,如果都切换flag,都检查不通过

算法3

  • turn=j;描述可进入的进程(同时修改标志时)

  • 在进入区先修改后检查,并检查并发修改的先后:

    • 检查对方flag,如果不在临界区则自己进入--空闲则入
    • 否则再检查turn:保存的是较晚的一次赋值,则较晚的进程等待,较早的进程进入--先到先入,后到等待

Synchronization Hardware (同步的硬件实现)

  • Uniprocessors–could disable interrupts 单处理器能够禁止中断

    • Currently running code would execute without preemption 当前执行的指令不被抢占
    • Generally too inefficient on multiprocessor systems 但对多处理器不适用
  • 特殊硬件指令--原子地执行,因而保证读写操作不被中断:
    • Test-and-Set (TS)指令
    • SWAP指令

Test-and-Set指令

为每个临界资源设置一个公共布尔变量lock,初值为FALSE;lock表示资源的两种状态:TRUE表示正被占用,FALSE表示空闲,该指令读出标志后设置为TRUE

boolean TS(boolean *lock) {boolean old;old = *lock;  *lock = TRUE;return old;
}

在进入区利用TS进行检查:有进程在临界区时,重复检查;直到其它进程退出时,检查通过;在退出区置lock为FALSE

Swap 指令

利用Swap实现进程互斥:每个临界资源设置一个公共布尔变量lock,初值为FALSE。每个进程设置一个私有布尔变量key

void SWAP(int *a, int *b) {int temp;temp = *a;  *a = *b;  *b = temp;
}

优缺点

硬件方法的优点

  • 适用于任意数目的进程,在单处理器或多处理器上
  • 简单,容易验证其正确性
  • 可以支持进程内存在多个临界区,只需为每个临界区设立一个布尔变量

硬件方法的缺点

  • 等待要耗费CPU时间,不能实现"让权等待"
  • 可能"饥饿":从等待进程中随机选择一个进入临界区,有的进程可能一直选不上

Semaphores

OS可从进程管理者的角度来处理互斥的问题,**信号量**就是OS提供的管理公有资源的有效手段

1965年,由荷兰学者Dijkstra提出(所以P、V分别是荷兰语的test(proberen)和increment(verhogen)),是一种卓有成效的进程同步机制。用于保证多个进程在执行次序上的协调关系的相应机制称为进程同步机制

  • Semaphore S – integer variable(信号量S – 整型变量,代表可用资源实体的数量)

    • can only be accessed via two indivisible (atomic) operations(除了初始化之外,仅能通过两个不可分割的[原子]操作访问,)
    • 这种经典的定义下CPU存在忙等——自旋锁:进程在等待锁时自旋
P (S):  while S<=0 do no-op;S--;V(S): S++;
  • Synchronization tool that does not require busy waiting(一种不需要忙等待的同步工具)
 P (S): S--; if  S< 0 do block;       V(S): S++;if S<=0 then wakeup;
  • S是与临界区内所使用的公用资源有关的信号量
  • 在信号量经典定义下,信号量S的值不可能为负
    • S≥0 可供并发进程使用的资源数
    • S<0 其绝对值就是正在等待进入临界区的进程数
  • 信号量只能通过初始化和两个标准的原语来访问--作为OS核心代码执行,不受进程调度的打断
  • 初始化指定一个非负整数值,表示空闲资源总数

利用信号量来描述互斥关系

利用信号量来描述前趋关系

  • 前趋关系:并发执行的进程P1和P2中,分别有代码C1和C2,要求C1在C2开始前完成;
  • 为每个前趋关系设置一个同步信号量S12S_{12}S12​,其初值为0

方法:前趋图

  • 若图中存在结点S1指向结点S2的有向边,表示进程P1中的程序段S1应该先执行,而进程P2中的程序段S2后执行。设置一个信号量s,初值为0,将V(s)放在S1后面,而在S2前面先执行P(s)。
  • 进程P1的语句序列为:S1;V(s)
  • 进程P2的语句序列为:P(s);S2

Deadlock and Starvation

  • Deadlock – two or more processes are waiting indefinitely for an event that can be caused by only one of the waiting processes(死锁 – 两个或多个进程无限期地等待一个事件的发生,而该事件正是由其中的一个等待进程引起的).
  • Let S and Q be two semaphores initialized to 1(S和Q是两个初值为1的信号量)
  • Starvation – indefinite blocking. A process may never be removed from the semaphore queue in which it is suspended(饥饿 – 无限期地阻塞。进程可能永远无法从它等待的信号量队列中移去).

PV操作讨论

  • 信号量的物理含义:

    • S>0表示有S个资源可用
    • S=0表示无资源可用
    • S<0则| S |表示S等待队列中的进程个数
    • P(S):表示申请一个资源
    • V(S):表示释放一个资源。
    • 信号量的初值应该大于等于0
  • PV操作必须成对出现,有一个P操作就一定有一个V操作

    • 当为互斥操作时,它们处于同一进程
    • 当为同步操作时,则不在同一进程中出现
    • 对于前后相连的两个P(S1)和P(S2) ,顺序是至关重要的:同步P操作应该放在互斥P操作前,而两个V操作顺序则无关紧要

信号量集

信号量集用于同时需要多个资源时的信号量操作;

AND型信号量集

AND型信号量集用于同时需要多种资源且每种占用一个时的信号量操作;

  • 一段处理代码需要同时获取两个或多个临界资源――可能死锁:各进程分别获得部分临界资源,然后等待其余的临界资源,“各不相让”
  • 基本思想:在一个原语中,将一段代码同时需要的多个临界资源,要么全部分配给它,要么一个都不分配。称为Swait(Simultaneous Wait)。在Swait时,各个信号量的次序并不重要,虽然会影响进程归入哪个阻塞队列,但是由于是对资源全部分配或不分配,所以总有进程获得全部资源并在推进之后释放资源,因此不会死锁。
Swait(S1, S2, …, Sn) //P原语;
{while (TRUE){if (S1 >=1 && S2 >= 1 && … && Sn >= 1){   //满足资源要求时的处理;for (i = 1; i <= n; ++i)  --Si;  //注:与wait的处理不同,这里是在确信可满足//全部资源要求时,才进行减1操作;break;}else{   //某些资源不够时的处理;进程进入第一个小于1信号量的等待队列Sj.queue;阻塞调用进程;}}
}Ssignal(S1, S2, …, Sn)
{for (i = 1; i <= n; ++i){++Si;        //释放占用的资源;for (each process P waiting in Si.queue){  //检查每种资源的等待队列;从等待队列Si.queue中取出进程P;if (判断进程P是否通过Swait中的测试)//注:与signal不同,这里要进行重新判断;{  //通过检查(资源够用)时的处理;进程P进入就绪队列;}else{  //未通过检查(资源不够用)时的处理;进程P进入某等待队列;}}}
}

哲学家解法:AND型信号量

Var chopstick array[0,…,4] of semaphore :=(1,1,1,1,1);ProcessiReeat think;Swait (chopstick[(I+1) mod 5],chopstick[I]);Eat;Ssignal (chopstick[(I+1) mod 5],chopstick[I]);
Until false;

生产者消费者:AND型信号量

Swait(empty, mutex),
Ssignal(full, mutex),

一般“信号量集”

一般信号量集用于同时需要多种资源、每种占用的数目不同、且可分配的资源还存在一个临界值时的处理;

  • 一次需要N个某类临界资源时,就要进行N次wait操作--低效又可能死锁
  • 基本思想:在AND型信号量集的基础上进行扩充:进程对信号量Si的测试值为ti(用于信号量的判断,即Si >= ti,表示资源数量低于ti时,便不予分配),占用值为di(用于信号量的增减,即Si = Si - di和Si = Si + di)
Swait(S1, t1, d1; ...; Sn, tn, dn);
Ssignal(S1, d1; ...; Sn, dn);
  • 一般“信号量集”的几种特殊情况:

    • Swait(S, d, d)表示每次申请d个资源,当少于d个时,便不分配;
    • Swait(S, 1, 1)表示互斥信号量;
    • Swait(S, 1, 0)作为一个可控开关
      • 当S>=1时,允许多个进程进入临界区;
      • 当S=0时,禁止任何进程进入临界区;
  • 一般信号量集未必成对使用Swait和Ssignal:如:一起申请,但不一起释放;

信号量机制的缺点

  • 同步操作分散:信号量机制中,同步操作分散在各个进程中,使用不当就可能导致各进程死锁(如P、V操作的次序错误、重复或遗漏)
  • 易读性差:要了解对于一组共享变量及信号量的操作是否正确,必须通读整个系统或者并发程序;
  • 不利于修改和维护:各模块的独立性差,任一组变量或一段代码的修改都可能影响全局;
  • 正确性难以保证:操作系统或并发程序通常很大,很难保证这样一个复杂的系统没有逻辑错误;

Classical Problems of Synchronization(经典同步问题)

Dining-Philosophers Problem

问题描述

5个哲学家围绕一张圆桌而坐,桌子上放着5支筷子,每两个哲学家之间放一支;哲学家的动作包括思考和进餐,进餐时需要同时拿起他左边和右边的两支筷子,思考时则同时将两支筷子放回原处。如何保证哲学家们的动作有序进行?如:不出现相邻者同时要求进餐;不出现有人永远拿不到筷子;

Semaphore chopStick[]  = new Semaphore[5];// Philosopher(i)
Repeat思考;取chopStick[i];取chopStick[(i+1) mod 5];进食;放chopStick[i];放chopStick[(i+1) mod 5];
Until false;

可能会出现死锁,五个哲学家每人拿起了他左边的筷子

解决方法

  • 最多允许四个哲学家同时就坐

  • 同时拿起两根筷子

  • 非对称解决

生产者-消费者问题

问题描述

若干进程通过有限的共享缓冲区交换数据。其中,"生产者"进程不断写入,而"消费者"进程不断读出;共享缓冲区共有N个;任何时刻只能有一个进程可对共享缓冲区进行操作。

问题解决

采用信号量机制:

  • full是"满"数目,初值为0,empty是"空"数目,初值为N。实际上,full + empty == N
  • mutex用于访问缓冲区时的互斥,初值是1
  • 每个进程中各个P操作的次序是重要的:先检查资源数目,再检查是否互斥――否则可能死锁

读者-写者问题

问题描述

  • 对共享资源的读写操作,任一时刻“写者”最多只允许一个,而“读者”则允许多个

    • “读-写”互斥,
    • “写-写”互斥,
    • "读-读"允许

问题分析

  • 如果读者来:

    • 无读者、写者,新读者可以读
    • 有写者等,但有其它读者正在读,则新读者也可以读
    • 有写者写,新读者等
  • 如果写者来:
    • 无读者,新写者可以写
    • 有读者,新写者等待
    • 有其它写者,新写者等待

问题解决

采用信号量机制:

  • 信号量Wmutex表示"允许写",初值是1。
  • 公共变量Rcount表示“正在读”的进程数,初值是0;
  • 信号量Rmutex表示对Rcount的互斥操作,初值是1。

Monitors (管程)

  • 管程是把所有进程对某一临界资源的使用进行集中控制,以提高可靠性。相比之下,管程比信号量好控制。
  • 管程是管理进程间同步的机制,它保证进程互斥地访问共享变量,并方便地阻塞和唤醒进程。
  • 管程可以函数库的形式实现。

基本思想

把信号量及其操作原语封装在一个对象内部。即:将共享变量以及对共享变量能够进行的所有操作集中在一个模块中。

引入管程可提高代码的可读性,便于修改和维护,正确性易于保证。采用集中式同步机制。一个操作系统或并发程序由若干个这样的模块所构成,一个模块通常较短,模块之间关系清晰

定义

管程是关于共享资源的数据结构及一组针对该资源的操作过程所构成的软件模块

  • 管程是对提供线程安全机制的高度抽象
  • 任一时刻在管程中只有一个线程是能运行的,所以程序员不必去实现互斥算法,而由管程本身实现

主要特性

  • 模块化:一个管程是一个基本程序单位,可以单独编译
  • 抽象数据类型:管程是一种特殊的数据类型,其中不仅有数据,而且有对数据进行操作的代码
  • 信息封装:管程是半透明的,管程中的过程(函数)实现了某些功能,至于这些功能是怎样实现的,在其外部则是不可见的

实现管程的三个关键问题

  • 互斥

    • 并发进程需要互斥地进入管程
  • 条件变量
    • 管程引入了条件变量,不同的条件变量,对应不同原因的进程等待队列。
  • 同步
    • 在管程中必须设置两个同步操作原语wait和signal

管程的互斥

  • 当进程需要访问管程中的临界资源的时候,可调用管程中的有关入口过程。但当几个进程都需调用某一管程的同一个或不同的入口过程时,仅允许一个进程调用进入管程,而其他调用者必须等待
  • 入口等待队列:当一个进程试图进入一个已被占用的管程时它应当在管程的入口处等待,因而在管程的入口处应当有一个进程等待队列,称作入口等待队列

条件变量

  • 在管程机制中引起等待的原因很多,为了区别它们,引入了条件变量.
  • 当进入管程的进程因资源被占用等原因不能继续运行时使其等待。
  • 每个条件变量表示一种等待原因,对应一个等待队列
  • 每个条件变量都需要在管程中说明
condition x, y;
  • 调用x.wait的线程将一直等待到有另一个线程 调用x.signal

同步

  • 针对条件变量的两个同步操作原语:
C.wait(c)//执行此操作的进程排入c队列尾部
C.signal(c)//如果c队列为空,则相当于空操作,执行此操作的进程继续;否则唤醒第一个等待者
  • 当进程通过管程请求访问共享数据而未能满足时,调用wait原语在有关的条件变量上等待,当另一进程访问完该共享数据且释放后,调用signal原语,唤醒在有关的条件变量上等待的首进程

Java Synchronization (Java中的同步机制)

  • synchronized, wait(), notify() statements(同步化,wait(), notify()语句)
  • Multiple Notifications(多重声明)
  • Block Synchronization(大块程序的同步化)
  • Java Semaphores(Java信号量)

Java Synchronization

在JAVA中,每个对象都与一把锁相关联。当一个方法声明为“同步的”,那么调用这个方法就需要拥有该对象的锁。如果对象的锁已被别的线程拥有,那么调用同步方法的线程进入该对象锁的入口等待队列中。当锁变为可用了,则等待的线程就可以拥有这把锁,调用同步方法。当这个线程退出这个方法时,释放锁。

synchronized Statement

  • Every object has a lock associated with it(每个对象都有与之相关联的锁).
  • Calling a synchronized method requires “owning” the lock(调用同步方法需要拥有这把锁).
  • If a calling thread does not own the lock (another thread already owns it), the calling thread is placed in the wait set for the object’s lock(如果主调线程没有这把锁,[而其他线程有了],主调线程就会进入该物体的等待集)
  • The lock is released when a thread exits the synchronized method(当线程退出了同步化方法时锁就会释放).

Entry Set

消费者问题

// enter()
public synchronized void enter(Object item) {while (count == BUFFER_SIZE)Thread.yield();++count;buffer[in] = item;in = (in + 1) % BUFFER_SIZE;
}// remove()
public synchronized Object remove() {Object  item;while (count == 0)Thread.yield();--count;item = buffer[out];out = (out + 1) % BUFFER_SIZE;return item;
}
  • 在共享有界缓冲区的生产者-消费者问题中:

    • 有界缓冲区这个对象有一把锁,生产者必须先获得这把锁才能调用它的enter(),修改count的值
    • 当生产者拥有这把锁时,想要调用remove()的消费者阻塞,直到生产者退出enter(),释放了锁
    • 保证了任何时刻只能有一个线程进入enter()和 remove()
  • 但锁的引入带来了另外一个问题:如果缓冲区满了,而且消费者处于sleeping状态,生产者可以获得锁进入enter() ,但当它进入之后发现缓冲区是满的,于是它调用yield(),让出CPU,但它仍然拥有锁。之后,如果消费者醒来了要调用remove(),但由于锁被生产者拥有,它无法调用。这样又形成了死锁。
  • 由上述可见:引入锁,防止了对于共享变量count的竞争条件,但由于yield(),又引入了另一种死锁。

解决方法

  • 引入wait()notify()方法。每个对象除了锁之外,再设置一个等待集。
  • 例:当生产者拥有了锁进入了enter()方法,发现缓冲区已满,它会调用wait()方法,释放锁,进入等待集。直到消费者调用了remove()方法后,再调用notify()方法将生产者唤醒,使其从阻塞态变为runnable状态,进入入口队列,于是生产者可以和入口队列中的其它线程去竞争锁的使用。

wait()

  • 当线程调用wait()时,会产生以下动作

    • 该线程释放对象锁
    • 线程状态置为阻塞
    • 线程进入等待集

notify()

  • 当线程调用notify()时,会产生以下动作

    • 任意从等待集中选出一个线程T
    • 将T置入入口集
    • 设置T为可运行状态
  • 此时,T又能竞争使用对象锁了

Multiple Notifications

  • notify()从等待集中任意选取一个线程。这可能导致所选的线程并不是你想要的
  • Java不容许你指定想要选取的线程
  • notifyAll()将等待集中所有的线程移至入口集。这就可以由他们自己决定让谁接着运行
  • notifyAll()是较保守的策略,只有在多线程可能在等待集的时候最有效

Java Semaphores

Java不提供信号量,但是可以用Java同步机制来建构基本信号量

public class Semaphore {public Semaphore() { value = 0; }public Semaphore(int v) { value = v; }public synchronized void P() { while (value <= 0) {try {wait();}catch (InterruptedException e) { }}value --;}public synchronized void V() {++value;notify();}   private int value;
}

操作系统第七章笔记---进程同步相关推荐

  1. 基本IO接口技术——微机第七章笔记

    基本I/O接口技术--微机第七章笔记 文章目录 基本I/O接口技术--微机第七章笔记 前言 MindMap 并行通信和串行通信 通信 基本方法 并行通信 优点 串行通信 特点 并行接口概述 硬件结构( ...

  2. C语言学习-翁凯(第七章笔记)

    C语言学习-翁凯(第七章笔记) 第七章 7.1.1初见函数 素数求和 int m,n;int i;int cnt=0;int sum=0;scanf("%d %d",&m, ...

  3. C++对象模型-在对象模型的尖端 第七章笔记

    读完C++对象模型书后,做一个笔记整理 第一章-关于对象 第二章-构造函数语义学 第三章-Data语义学 第四章-Function语义学 第五章-构造拷贝解析语义学 第六章-执行期语义学 第七章-在对 ...

  4. 鸟哥Linux私房菜:第七章笔记

    第七章:Linux磁盘与文件系统管理 7.1 认识Linux文件系统 文件系统特性 Linux的Ext2文件系统 1. data block 2. inode table 3. Superblock ...

  5. Python程序设计基础第七章笔记:字符串

    Python程序设计基础笔记 目录 Python程序设计基础笔记 第七章:文本处理(一):字符串 7.1 字符串编码格式简介 7.2 转义字符与原始字符串 7.3 字符串格式化 7.3.1 使用 % ...

  6. 软件项目管理第七章笔记---人力资源管理

    以下图片及内容整理自西安交通大学软件学院宋永红老师的ppt(课堂回放)中,仅供学习使用,请勿转载或他用 笔记汇总:软件项目管理笔记汇总_Qlz的博客-CSDN博客 第七章 人力资源管理 人力资源是第一 ...

  7. 汤晓丹的第四版计算机操作系统--第七章总结概述

    第七章 文件管理 文件类型 按照用途分类:系统文件,用户文件,库文件. 按照形式分类:源文件,目标文件,可执行文件. 按存取控制属性分类:只执行文件,只读文件,读写文件. 按组织形式和处理方式分类:普 ...

  8. 操作系统第四章笔记---进程

    本文内容整理自西安交通大学软件学院田丽华老师的课件,仅供学习使用,请勿转载 操作系统系列笔记汇总:操作系统笔记及思维导图汇总附复习建议_Qlz的博客-CSDN博客 文章目录 文章目录 文章目录 Pro ...

  9. 操作系统第五章笔记---线程

    本文内容整理自西安交通大学软件学院田丽华老师的课件,仅供学习使用,请勿转载 操作系统系列笔记汇总:操作系统笔记及思维导图汇总附复习建议_Qlz的博客-CSDN博客 文章目录 文章目录 文章目录 Ove ...

最新文章

  1. Android KTV
  2. 关于java中Math的一些用法
  3. SAP ECC6.0-中建信息版
  4. MobileNet-SSD
  5. 编译时“-nostdlib”的使用
  6. 爬虫请求库 requests
  7. 设计模式(面向对象)设计的七大原则
  8. 日本画风超级“诡异”毕业典礼上线,网友:有被吓到,谢谢!
  9. 电子信息工程跨考计算机武大,往届从材料跨考武大085208电子与通信工程初试303分 - 考研 - 小木虫 - 学术 科研 互动社区...
  10. SQL 中存放 varbinary型数据
  11. 题解——洛谷P2827 NOIP提高组 2016 蚯蚓
  12. [iOS]分析Mach-O文件
  13. 图层重命名快捷键_Principle快捷键大全
  14. moviepy第2天|对视频添加圆圈渐变大小的结尾及文字
  15. 这种国家的外贸不做也罢
  16. iOS证书及描述文件制作流程
  17. 跨考西电计算机科学与技术研究生经验贴,西安交通大学912计算机133分经验分享...
  18. 大牛证券解析恒指大跌800点+全球股市大跌
  19. 元宇宙链接现实与虚拟 IPFS扮演着怎样的角色?
  20. 工业企业数字化转型中的数据治理

热门文章

  1. 笔记本wifi模块消失问题解决方法(win10,当你使用校园网客户端时)
  2. Html 所有触发事件
  3. 数据库应用——MySQL数据管理
  4. 操作系统中文件系统-文件的分类
  5. python for循环语句1到100_python——循环语句
  6. 毕业设计-基于机器学习的短期负荷预测算法
  7. 汇编--子程序设计(1)--非压缩bcd码和十进制的转换
  8. Linux安装wine以及运行Windows程序
  9. Windows下Chcp命令的用法
  10. Spring框架学习笔记,超详细!!(4)