为什么会有进程
进程是一个计算机工程概念,进程包含一个程序运行的所有资源。
进程提供程序的抽象
- 一个独立的逻辑流
- 一个私有的地址空间
逻辑控制流
如果使用调试器调试一个程序,就能看到一些列的(PC),这些PC的序列就是逻辑控制流。
并发流
一个逻辑流的执行在时间上与另一个流重叠,成为并发流,多个流并发地执行的一般现象称为并发。简单理解为同时做多件事。
并行: 一般出现在多个CPU上。
多任务: 一个进程和其他进程轮流运行的概念。
时间片: 一个进程执行他的控制流的每一时间片段。
私有地址空间
进程为每个程序提供一个假象,它好在独立的使用系统的地址空间。
思考
docker虚拟化技术,基于进程的隔离。
进程模型
为什么会存在进程模型?
一个进程就是一个正在运行的程序,进程需要有自己的程序计数器(PC),内存空间以及CPU,真实的情况是在计算机中存在有多个进程,然后多个进程在同一时间只有一个使用CPU,所以需要来回切换,于是需要使用进程模型来管理。
用户模式和内核模式
处理器通常是用某个控制寄存器的一个模式位(mode bit)来提供。进入内核模式
中断、系统错误、系统调用。
上下文切换
创建进程、控制
123456789101112 大专栏 操作系统学习之进程和线程13141516 |
#include "stdio.h"#include <unistd.h> int main() { pid_t pid; int x = 1; pid = fork(); if (pid == 0) { // child printf("child: x=%dn", ++x); exit(0); } printf("parrent: x=%dn", --x); exit(0);} |
为什么返回0的是子进程,而在父进程中返回子进程的进程id?
在这里fork函数返回了2个值。0和子进程的id,一个父进程有多个子进程,但是一个父进程有多个子进程,如果在子进程中,直接通过getParrentPid这种函数直击就能获取子进程的id了。
- 系统初始化
- 进程创建的系统调用
- 用户创建了一个进程
- 批处理作业
进程退出
- 正常退出(自愿)
- 出错退出(自愿)
区别于下面的严重错误,这里面的错误是程序逻辑上抛出的错误,也就是说按照默认的规定返回的不是0 - 严重错误(非自愿)
这里可以理解成我们常说的异常,eg:空指针,除数为0 - 被其他进程杀死(非自愿)
进程的层次结构
Posix系统中,有子进程和父进程的概念,Posix
进程的状态
- 运行态
- 就绪态(和1类似,但是暂时没有CPU分配)
- 阻塞态
进程模型的实现
进程表,由操作系统维护,有的叫做进程控制块。
理解单CPU如何维护多个进程的错觉?
每一个IO关联着一个中断向量的位置,靠近内存底部的固定位置。所有的中断都是从保存寄存器开始,这些会动进程的进程表中获取,然后保存起来。堆栈中删除由寄存器保存起来的信息,然后将堆栈指针跳转到中断向量中的地址,
ps、kill、killall以及proc目录
原文地址:https://www.cnblogs.com/liuzhongrong/p/12272056.html