操作系统——进程

进程概述

进程是为了操作系统进行并发操作而引入的概念,是程序运行的过程,也可以看成是进程实体的运行过程,是资源分配和调度的独立单位。

结构、组织方式和特征

进程的结构就可以看成是进程实体的结构:
PCB:进程的唯一标识。
代码段:内存中存放应用程序代码的地方
数据段:内存中存放应用程序要处理或执行后产生的数据的地方。
PCB的内容:
进程描述信息:进程标识符PID(创建时产生,唯一),用户标识符UID。
资源分配清单:进程分配到的资源,比如程序段指针、数据段指针、键盘、鼠标等。
进程控制信息:进程的状态与优先级
处理机状态:CPU寄存器里的信息,如程序计数器保存的程序执行到哪里的信息。

进程的组织方式:

  • 链接方式:按照进程状态将PCB分在不同的队列里,选择相应状态的指针指向队列:
  • 执行指针:指向包含当前正在执行的进程,如果是单核CPU,那么队列里只有一个PCB。
  • 就绪状态指针:指向处于就绪状态的进程,通常会把优先级高的放在前面。
  • 阻塞状态指针:指向处于阻塞状态的进程,还会根据阻塞原因不同分为不同的阻塞队列。
    索引方式:给处于相同状态的进程创建一个索引表,不同的状态指针指向不同的索引表。

进程的特征:

  • 动态性:最基本的特征
  • 并发性
  • 独立性
  • 异步性:需要进程同步机制处理异步产生的问题
  • 结构性

进程的状态

进程的基本状态:
新建态:进程被创建时处于的状态,等待系统分配资源、初始化PCB。
就绪态:获得了需要的各种资源,如摄像头等,但CPU被其他进程占据,需要等待获取CPU执行权。
运行态:占有CPU资源,在CPU上运行,单核CPU只有一个进程可以处于这个状态。
阻塞态:当进程需要等待某个事件时,如等待系统分配打印机,这是为了提高CPU的利用率,就会让进程暂停运行。
终止态:系统撤销进程的过程,回收进程占有的资源,撤销PCB。

进程的状态切换:从运行态切换到阻塞态,是进程主动发起的请求,所以只有在运行态的进程才可以进入阻塞态。从阻塞态不能直接回到运行态,要先进入进入就绪态。

进程控制

通过原语让线程进入某个状态或切换状态,就是进程控制。原语使用关中断指令后,CPU再收到中断信号就会被忽略,原语使用开中断指令后,就退出了原语程序的执行。
进程控制的基本操作:
更新PCB的信息:修改进程状态标志;如果要放弃CPU控制权,就要保存CPU环境;再开始运行前,恢复CPU环境。
将PCB插入到合适的队列
分配/回收资源。

开始线程的过程:
申请空白PCB
分配资源
初始化PCB
将PCB插入到就绪队列。
终止线程的过程:
从队列中找到相应的PCB
若进程正在运行,剥夺进程的CPU控制权,分配给其他进程。
终止所有子进程。
回收线程占用的资源给父进程或系统。
撤销PCB。
阻塞进程的过程:
从队列中找到相应的PCB。
保存进程的CPU环境,将PCB状态信息修改为“阻塞态”,剥夺进程的CPU控制权,分配给其他进程,从运行队列中删除PCB。
将PCB插入到相关事件的等待序列。
唤醒进程的过程:
从队列中找到相应的PCB。
将PCB状态信息修改为“就绪态”,从等待队列中删除PCB。
将PCB插入到就绪队列。

进程通信

每个进程都有一个独立的内存地址,是不能直接互相访问对方的内存空间,但有时进程之间必须要交换信息,比如你在手机上把图片分享到朋友圈,就需要把图片从图库的进程传到微信的进程,操作系统中实现进程间交换信息的功能就称为进程通信。
进程通信的方式主要有共享存储、管道通信、消息传递。
共享存储:操作系统为各个线程提供可以公共访问的数据资源。基于数据结构:各个线程只能存放特定的数据结构,如长度为100的数组,效率很低。基于存储区:操作系统提供共享内存空间,但数据的形式、存放的地址有进程控制,是一种高级通信方式。
管道通信:可以连接读写进程的共享文件,又叫pipe文件。
半双工通信,读的时候就不能写。要实现全双工,就得设置两条管道。
只有写满后才允许读,这时写进程就会被阻塞。只有读空后才允许写,这时读进程就会被阻塞。
因为数据一旦被读取后就从管道内被删除,所以读进程只能有一个,避免读错数据,写进程可以由多个。

消息传递:进程有一个消息缓存队列,接受其他进程发来的格式化消息。格式化消息类似于网络报文,由信息头和信息体组成。信息头主要包括发送进程的ID、接受进程的ID、类型、长度等信息。提供发送/接受原语来实现消息的发送与接受。
消息传有两种方式:
直接通信方式:直接发到接受进程的消息缓存队列,
间接通信方式:先传到一个中间实体,再传给接受进程。类似于先传给信箱,所以也叫信箱通信方式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,进程调度算法是操作系统中非常重要的一部分。常见的进程调度算法有先来先服务(FCFS)、短作业优先(SJF)、高响应比优先(HRRN)、时间片轮转(RR)等。下面是这些算法的 Python 实现: 1. 先来先服务(FCFS): ```python def FCFS(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 2. 短作业优先(SJF): ```python def SJF(processes): processes = sorted(processes, key=lambda x: x['burst_time']) waiting_time = 0 turn_around_time = 0 completion_time = 0 for process in processes: completion_time += process['burst_time'] turn_around_time += completion_time - process['arrival_time'] waiting_time += turn_around_time - process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 3. 高响应比优先(HRRN): ```python def HRRN(processes): waiting_time = 0 turn_around_time = 0 completion_time = 0 for i, process in enumerate(processes): if i == 0: completion_time = process['burst_time'] else: response_ratio_list = [] for j in range(i): response_ratio = (completion_time - processes[j]['arrival_time'] + processes[j]['burst_time']) / processes[j]['burst_time'] response_ratio_list.append(response_ratio) max_response_ratio_index = response_ratio_list.index(max(response_ratio_list)) selected_process = processes.pop(max_response_ratio_index) completion_time += selected_process['burst_time'] turn_around_time += completion_time - selected_process['arrival_time'] waiting_time += turn_around_time - selected_process['burst_time'] return waiting_time / len(processes), turn_around_time / len(processes) ``` 4. 时间片轮转(RR): ```python def RR(processes, time_slice): waiting_time = 0 turn_around_time = 0 completion_time = 0 while processes: for i in range(len(processes)): if processes[i]['burst_time'] > time_slice: completion_time += time_slice processes[i]['burst_time'] -= time_slice else: completion_time += processes[i]['burst_time'] turn_around_time += completion_time - processes[i]['arrival_time'] waiting_time += turn_around_time - processes[i]['burst_time'] processes.pop(i) break return waiting_time / len(processes), turn_around_time / len(processes) ``` 这里的 `processes` 是一个列表,其中每个元素是一个字典,表示一个进程的信息,如下所示: ```python processes = [ {'name': 'P1', 'arrival_time': 0, 'burst_time': 8}, {'name': 'P2', 'arrival_time': 1, 'burst_time': 4}, {'name': 'P3', 'arrival_time': 2, 'burst_time': 9}, ... ] ``` 在这个列表中,每个进程一个名称、到达时间和执行时间。你可以根据自己的需要修改这些信息,来测试这些进程调度算法的实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值