操作系统学习之进程和线程

不问归期 提交于 2020-02-07 12:07:07

为什么会有进程

进程是一个计算机工程概念,进程包含一个程序运行的所有资源。
进程提供程序的抽象

  • 一个独立的逻辑流
  • 一个私有的地址空间

    逻辑控制流

    如果使用调试器调试一个程序,就能看到一些列的(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目录

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!