初识进程(一)——操作系统,进程管理,进程状态

一、冯诺依曼体系结构

目前我们认识的计算机都是由一个个硬件组成

  • 输入单元:键盘,鼠标,扫描仪等
  • 输出单元:显示器,打印机
  • 中央处理器(cpu):含有运算器和控制器

关于冯诺依曼体系,必须强调几点:

  • 存储器是指内存
  • 不考虑缓存的情况,cpu只能对内存进行读写,不能访问外设
  • 外设要输入或输出数据,也只能从内存里读取
  • 所有设备都只能和内存打交道

二、操作系统(operate system)

操作系统是一个基本的程序集合,常见的操作系统有Windows,Linux,Unix,安卓等。操作系统包括

  • 内核:(进程管理,内存管理,文件管理,驱动管理)
  • 其他程序(函数库,shell程序等)

设计os的目的:

  • 与硬件交互,管理所有的软硬件资源
  • 为用户程序(应用程序)提供一个良好的执行环境

定位:操作系统是一款纯正的“搞管理”的软件

  • 对上:提供良好的执行环境
  • 对下:进行资源管理

如何理解操作系统的“管理”?

操作系统的管理即将被管理的对象描述起来,组织起来

  • 管理者:操作系统
  • 被管理者:硬件
  • 管理:通过数据进行
  • 操作系统通过驱动程序获取硬件的数据来管理硬件,操作系统不会直接和硬件打交道

就像一个学校,校长是管理者(os),我们是被管理者(硬件),校长不会直接管理我们,而是通过辅导员等对我们进行管理。校长下达命令,由辅导员来执行(将对象组织起来)。而每个学校的数据库中都存有每个学生的信息,各学期的成绩等(将对象描述起来)

所以操作系统管理硬件就是:

  1. 描述起来,用struct结构体
  2. 组织起来,用链表或其他更高效的数据结构

系统调用和库函数的概念:

  • 在开发角度,操作系统对外表现为一个整体,只会暴露自己的部分接口,供上层开发使用,者部分由操作系统提供的接口,就叫系统调用
  • 系统调用在使用上,功能比较基础,对用户的要求也比较高,所以开发者对部分系统调用进行了适度的封装,从而形成了库。
  • 库是对系统操作的一层封装

vs是集成开发环境,所有的功能全都放在一起

Linux上的每个工具都是独立的一部分,(vim,gcc,gdb)

三、进程:

操作系统对进程的管理,就是将进程描述起来,将进程组织起来

基本概念:

  • 程序的一个执行实例,正在执行的程序
  • 担当分配系统资源(cou时间,内存)的实体

程序——加载到内存(冯诺依曼体系决定)——进程——描述起来(tack_struct)——组织起来(链表)

描述进程——PCB:

  • 进程的相关信息都被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合
  • Linux操作系统下的PCB被叫做task_struct,task_struct是Linux内核的一种数据结构,他会被价值到内存里并且包含着进程的信息

task_struct(进程控制块)的内容:

  1. 标识符:每个进程都有一个标识符,可以看成是标签,用来区分其他进程
  2. 状态:进程当前的任务状态,退出代码,退出信号等
  3. 优先级:相对于其他进程的优先级
  4. 程序计数器(eip):程序中即将被执行的下一条指令的地址
  5. 内存指针:包括程序代码和进程的相关数据的指针,还有其他进程共享的内存块的指针
  6. 上下文数据:进程执行时处理器的寄存器中的数据,
  7. I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
  8. 记账信息:可能包括处理器时间总和,使用的时钟总和,时间限制,记账号等
  9. 其他信息

进程组织:

所有运行在系统里的进程都以task_struct链表( 双链表)的形式存在在内核里

查看进程:

进程信息可以通过/proc系统文件夹查看,在Linux下用 ps -l命令可以查看当前目录下所有进程的部分信息

同样我们也可以使用top和ps这些用户级工具来获取,如获取进程

  • 如:我们要获取PID为1的进程信息,需要查看/proc/1这个文件夹
  • ps aux | grep 6151      或    ps axj | grep 6251
  • top aux | grep 6151

获取进程的标识符:

  • 进程id :PID;getpid();
  • 父进程id:PPID;getppid();
  • 同一个程序,每次调用,进程的pid不同

下面我们通过简单的代码获取进程的标识符

通过系统调用创建进程——fork初识:

  • fork有俩个返回值
  • 成功:子进程返回0,父进程返回子进程的id(子进程只有一个父进程,而父进程可以有多个子进程)
  • 失败:子进程返回errno,并不被创建,父进程返回-1;
  • 父子进程代码共享,数据个开辟一份空间,私有一份(采用写时拷贝)
  • fork之后要有if分流

进程状态:

  • R运行状态:表明程序要么正在运行,要么在运行队列里
  • S睡眠状态:也叫浅度睡眠,可中断睡眠,意味着等待事件完成
  • D磁盘休眠状态:也叫深度睡眠,不可中断睡眠,这个状态的进程退出会等待IO的结束
  • T停止状态:可以通过发送SIGSTOP信号给进程,用来停止该进程,这个被暂停的进程可以使用信号SIGCONT让进程继续进行
  • X死亡状态:这个状态只是一个返回状态,任务列表中看不到这个状态的进程
  • 除此之外还有僵尸进程,孤儿进程等

D状态不执行任务也不能被唤醒的状态,且不能被kill,所以如果内存中有多个D状态的进程,就会使操作系统内存不足,导致系统宕机

可以通过信号修改进程的状态:

信号:共64个

  • 1~31(普通信号)
  • 34~64(实时信号)

一些常用的信号:

  • kill -l:查看所有信号
  • kill -SIGSTOP pid
  • kill -SIGCONT pid
  • kill -SIGKILLpid   //9号信号——SIGKILL(尚方宝剑,可以杀死大多进程)

也可以通过信号的序号使用相应的信号

  • kill -9 6233  //杀死pid = 6233的进程 

猜你喜欢

转载自blog.csdn.net/audience_fzn/article/details/81536716