教材内容总结
CPU调度
CPU调度 (CPU scheduling):多个进程同时处于内存,当一个进程必须等待时,OS从该进程拿走CPU使用权交给其他进程。
进程执行从一个IO区间(I/O burst)开始,随后进入一个CPU区间(CPU burst)并反复,进程循环地在CPU执行和I/O等待两个状态间切换,直到通过系统请求终止最后一个CPU burst。
这张图可以很好的解释CPU调度:
CPU调度决策发生在4种情况下:
- 进程从运行(running)状态切换到等待(waiting)状态;
- 进程从运行(running)状态切换到就绪(ready)状态;
- 进程从等待(waiting)状态切换到就绪(ready)状态;
- 进程终止
内存管理
内存管理是指软件运行时对计算机内存资源的分配和使用的技术。其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
一个执行中的程式,譬如网页浏览器在个人电脑或是图灵机(Turing machine)里面,为一个行程将资料转换于真实世界及电脑内存之间,然后将资料存于电脑内存内部(在计算机科学,一个程式是一群指令的集合,一个行程是电脑在执行中的程式)。
我还在博客园里找到一些更加详细的资料:https://www.cnblogs.com/huangwentian/p/7487670.html
进程状态
进程状态反映进程执行过程的变化。这些状态随着进程的执行和外界条件的变化而转换。在三态模型中,进程状态分为三个基本状态,即运行态,就绪态,阻塞态。在五态模型中,进程分为新建态、终止态,运行态,就绪态,阻塞态。
文件访问
文件访问有直接访问和顺序访问两种方法。
顺序访问即将文件看做线性结构。这要求按顺序处理文件中的数据。读写操作根据读写的数据量移动当前文件指针。
直接文件访问的文件会被概念性的划分为带编号的逻辑记录。直接访问允许用户指定记录编号,从而把文件指针设置为某个特定的记录。因此,用户可以按照任何顺序读写记录。
磁盘调度
磁盘调度在多道程序设计的计算机系统中,各个进程可能会不断提出不同的对磁盘进行读/写操作的请求。由于有时候这些进程的发送请求的速度比磁盘响应的还要快,因此我们有必要为每个磁盘设备建立一个等待队列,常用的磁盘调度算法有以下四种:
先来先服务算法(FCFS)
最短寻道时间优先算法(SSTF)
扫描算法(SCAN)
问题与解决办法
在做云班课选做作业时,我发现进程状态代码难以理解,我就在简书上找了些资料。然后在其基础之上根据自己的理解做了一些改动。
from state_machine import State, Event, acts_as_state_machine, after, before, InvalidStateTransition
@acts_as_state_machine
class Process:
created = State(initial=True)
ready = State()
running = State()
waiting = State()
terminated = State()
read = Event(from_states=(created,waiting ,running),to_state = ready)
run = Event(from_states=ready,to_state = running)
terminate = Event(from_states=running,to_state = terminated)
wait = Event(from_states=running,to_state = waiting)
def __init__(self, name):
self.name = name
@after('wait')
def wait_info(self):
print('{}entering waiting mode'.format(self.name))
@before('terminate')
def terminate_info(self):
print('{}terminated'.format(self.name))
@after('run')
def run_info(self):
print('{}is running'.format(self.name))
@after('read')
def read_ingo(self):
print('{}is ready'.format(self.name))
def transition(process,event,event_name):
try:
event()
except InvalidStateTransition as err:
print('Error: transition of {} from {} to {} failed'.format(process.name, process.current_state, event_name))
def state_info(process):
print('state of {}: {}'.format(process.name, process.current_state))
def main():
READY = 'ready'
RUNNING = 'running'
WAITING = 'waiting'
TERMINATED = 'terminated'
p1, p2 = Process('process1'), Process('process2')
[state_info(p) for p in (p1, p2)]
print()
transition(p1, p1.wait, WAITING)
transition(p2, p2.terminate, TERMINATED)
[state_info(p) for p in (p1, p2)]
print()
transition(p1, p1.run, RUNNING)
transition(p2, p2.wait, WAITING)
[state_info(p) for p in (p1, p2)]
print()
transition(p2, p2.run, RUNNING)
[state_info(p) for p in (p1, p2)]
print()
[transition(p,p.read, READY) for p in (p1,p2)]
[state_info(p) for p in (p1, p2)]
print()
[transition(p, p.terminate, TERMINATED) for p in (p1, p2)]
[state_info(p) for p in (p1, p2)]
if __name__ == '__main__':
main()
虽然这些代码可以看懂,但是真让我自己写的话还是做不到的。这里面还有许多我没接触过的知识
资料
Python设计模式之状态模式