第二篇:进程原理篇
进程模型
- 从物理内存分配来看,进程就是内存中的某片空间
- 在任意时刻,cpu上只能执行一条指令,因此在cpu上执行的进程只有一个。
- 而cpu到底执行哪条指令由物理程序计数器指定,也就是说在物理层面,所有进程共用一个程序计数器
进程的层次结构
- 进程在执行过程中可以通过系统调用创建新的进程,这个新创建的进程就是子进程,创建进程的称为父进程。这种子子孙孙的创建下去所有的进程称为进程树,unix称为进程组。
- windows没有进程组的概念,所有的进程地位均等
进程的状态
- 执行 :进程在运行状态
- 就绪:进程运行时间太长,操作系统将其挂起,则转换为就绪状态,或者阻塞的进程在等待资源到达之后,就可以随时执行,进入就绪状态
- 阻塞:执行过程中如果执行了某种阻塞操作,则进入阻塞状态
进程管理
- 当一个进程创建时,操作系统就要为其创建记录。
- 维护进程记录的结构就是进程表或者进程控制块(PCB)
- 维护的信息一般包括:寄存器、程序计数器、状态字、栈指针、优先级、进程ID、信号、创建时间、所耗CPU时间、当前持有的各种句柄
- 这个进程表保持在操作系统所在的内核空间里
进程的创建过程
创建进程的步骤如下:
- 分配进程控制块 :PCB
- 初始化机器寄存器
- 初始化页表
- 将程序代码从磁盘读进内存
- 将处理状态设置为用户态
- 跳转到程序的起始地址
进程的调度
进程调度的算法
- 先来先服务调度算法
- 时间片轮转算法
- 短任务优先算法
进程通信:管道、记名管道、套接字
管道
- 根本来说,管道是一个线性数组,类似文件,可以使用文件读写的方式进行访问,但却不是文件,因为通过文件系统看不到管道的存在。
- 一个进程向这片存储空间的一端写入信息,另一个进程从存储空间另一端读取信息。
- 管道所占的空间可以是内存也可以是磁盘
- 创建管道
- 在shell中是符号 ‘|’
- 在程序里面,需要使用系统调用 popen()或者pipe()
- 管道一个重要的特点是使用管道两个进程之间必须存在某种关系;如使用popen需要提供另一端的文件名,使用pipe的两个进程则分别隶属于父子进程
记名管道
- 如果两个不相关的进程之间进行管道通信,则需要记名管道
- 命名管道是一个有名字的通信管道,于文件系统共用一个名字空间,即在文件系统中可以看到命名管道,因此不能和文件系统的任何文件名重名
- ls -l 查看命名管道
- 一个进程创建一个记名管道后,另一个进程可以使用open来打开这个管道,(无名管道则不能使用open操作)
你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。
套接字
套接字分类
套接字可以分为本地套接字和网域套接字,而网域套接字根据其提供的数据传输特性分为几大类
- 数据流套接字:提供双向、有序、可靠、非重复数据通信
- 电报流套接字:提供双向消息流,数据不一定按序到达
- 序列包套接字:提供双向、有序、可靠性,包有最大限制
信号
- 能够迫使一方对我们的通信立即做出回应
- 不需要事先建立任何连接,可以临时突然与某个进程通信
- 信号是一个内核数据结构。发送方将数据结构的内容填好,指明该信号的目标进程,发出特定的软件中断。
- 操作系统受到特定的中断请求后,到特定的内核数据结构里查找信号接收方,进行通知
- 接到通知的进程则对信号进行处处理,如果对方选择不处理,则被操作系统终止运行
信号量
- 信号量实际上是一个简单整数
- 一个进程在信号变为0或者1的情况下运行,并且将信号变为1或者0来防止别的进程推进。当进程完成后,则将信号量再改为0或者1,从而允许其他进程执行
- 信号量不只是一种通信机制,更是一种同步机制
共享内存
- 共享内存就是两个进程共同拥有一片内存,对于这片内存的区域,二者均可访问。
- 要使用共享内存,一个进程首先要创建一片内存空间专门进行通信,其他进程则将该片内存映射到自己的(虚拟)地址空间。
- 共享内存的两个进程必须放在一台物理机上
消息队列
- 一列具有头和尾的消息排列;新来的消息放在队列尾部,读取的消息则从队列头部开始。