> 文章列表 > Linux——进程

Linux——进程

Linux——进程

进程介绍及其使用

  • 1、认识冯诺依曼体系
  • 2、操作系统
    • 如何理解操作系统对硬件做管理?
  • 3、进程
    • 如何创建进程
    • 进程状态

1、认识冯诺依曼体系

在计算机的硬件结构中,有着图灵和冯诺依曼俩位举足轻重的人物。对于计算机的发展来说有着十分重要的意义。冯诺依曼结构也是现在大多数计算机的硬件结构。
输入、输出设备都是外设。外设数据传输时比较慢,例如磁盘相较于内存来说速度就比较慢。为了防止木桶效应。计算机为了兼顾这些外设运行速度就不得不说到存储器,这里的存储器就是特指内存。因为CPU计算速度十分快,所以内存可以帮我们对于数据进行预加载。这样CPU进行数据访问时就不需要访问外设,直接在内存中就可以的得到数据。所以在数据层面上一般CPU不会直接和外设沟通,而是直接和内存打交道。与外设进行数据层面沟通一般是内存。
Linux——进程
在硬件层面上,单机和跨主机之间数据流向是通过一台冯诺依曼体系结构的输入设备输入进入内存,内存被CPU访问后。通过控制器进行数据输出到内存,再由内存输出到输出设备。中间还有一些其他设备在中间进行传输到另外一台冯诺依曼体系。进行相同方法数据的读取及其访问。

2、操作系统

任何计算机系统都包含一个基本的程序集合,称为操作系统(OS)。笼统的理解,操作系统包括:内核(进程管理,内存管理,文件管理,驱动管理)其他程序(例如函数库,shell程序等等)

本质就是一款对于软硬件资源管理的软件。

如何理解操作系统对硬件做管理?

在理解上软件、硬件本就是不同概念。所以比较形象理解就是领导对于公司给出决策。策划对于决策执行,员工实现策划给出的方案。实施后数据好坏都会被统计,反馈。但是对于整个方案实施。领导只是给了决策对于方案实施并没有参与,但是通过数据分析后就可以对于公司作出管理。对于满勤员工进行奖金发放,缺勤的员工进行惩罚。并没有直接和员工进行面对面交流沟通。只是通过保安对于每天员工打卡数据的进行一个管理。就可以实现公司管理。每一个员工在公司中的职位、工资,名字……进行一个结构体或者类的定义,这样就方便管理。所以管理就是建模,是对于管理对象数据的管理。

管理本质:先描述,在组织

在操作系统软件中就是通过计算机语言描述,用单链表或者更加高效的数据结构来进行组织管理。

3、进程

程序的一个执行实例,正在执行的程序等。内核观点:担当分配系统资源(CPU时间,内存)的实体。在操作系统中就是PCB,linux中是task_struct。

平时使用应用和运行一个可执行程序就会有得到一个进程。可以在我们电脑的任务管理器中查看自己当前运行的进程。当我们关闭一个应用时是不会影响我们其他应用的。所以进程是独立的。不会相互影响。在linux中也可以使用命令

ps axj

对于当前用户还可以使用命令

top -u 用户名//查看当前运行任务

对于每一个进程操作系统要进行管理,毕竟内存空间是有限的。冯诺依曼体系就决定了进程使用就需要用内存进行数据预加载。将文件的内容加载内存,不同进程管理就需要不同的pcb进行进程管理。对于pcb中会保存进程的基本属性。linux中task_struct属性基本就是

标示符: 描述本进程的唯一标示符,用来区别其他进程。
状态: 任务状态,退出代码,退出信号等。
优先级: 相对于其他进程的优先级。
程序计数器: 程序中即将被执行的下一条指令的地址。
内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针上下文数据: 进程执行时处理器的寄存器中的数据[休学例子,要加图CPU,寄存器]。
I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
其他信息

如何创建进程

在程序中使用fork函数。函数返回值

子进程返回0;父进程会返回子进程的pid。返回-1就是创建失败。

函数执行数据代码可以是共享的,也可以在不同进程中对数据,因为使用函数后对于产生不同的输出流。对于数据会发生写时拷贝
Linux——进程

会对不同属性进程的优先级作出判断方便进程调度。在linux下可以验证进程独立

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>int main(void) {pid_t ret=fork();if(ret==0){while(1){printf("这是子进程,我的pid:%d,父进程ppid:%d\\n",getpid(),getppid());}sleep(1);}else if(ret>0){while(1){printf("这是父进程,我的pid:%d,父进程ppid:%d\\n",getpid(),getppid());}sleep(1);}return 0;
}

Linux——进程
然后进行对于一个进程使用kill命令
Linux——进程
进程的pid每一次运行是不同,根据os的每次调用来进行分配。也可以理解是对于同一所学校报考后。入学会产生一个学号。但是一旦休学后在进入学校学习后有新的学号。可以通过进程的pid来识别不同进程。os对于内存进行管理也会在进程较多时,接近于宕机时对于部分进程进行kill命令来减缓内存压力。

进程状态

首先是阻塞状态,还有挂起状态。

阻塞:进程因为等待某些条件就绪,而导致的一种不推进状态。

对于常见进程阻塞就是在启动多个应用时,造成的系统卡顿。就是多个应用启动时都会使用同一份资源比如说是网卡,对于多个应用同时需要向外界发送信息时。资源就比较紧缺。CPU就会对于进程的先后顺序进行排队使用。等前面使用完资源后,资源再被自己使用。但是当CPU要处理单机的进程时,对于还没有得到资源的进程就会处于挂起状态。挂起后的进程代码和数据被放置在磁盘中的,内存中只有进程的pcb,当CPU再次调度该进程时,数据和代码才会被预加载进入内存。
常见状态

R运行状态(running): 并不意味着进程一定在运行中,它表明进程要么是在运行中要么在运行队列里。
S睡眠状态(sleeping): 意味着进程在等待事件完成(这里的睡眠有时候也叫做可中断睡眠(interruptible sleep))
D磁盘休眠状态(Disk sleep)有时候也叫不可中断睡眠状态(uninterruptible sleep),在这个状态的
进程通常会等待IO的结束。
T停止状态(stopped): 可以通过发送 SIGSTOP 信号给进程来停止(T)进程。这个被暂停的进程可
以通过发送 SIGCONT 信号让进程继续运行。

Linux——进程
对于上面代码运行后后发现状态不是R状态,而是S状态。这是因为CPU运行速度大于外设运行速度。通过printf函数向显示器打印数据。所以在CPU看来就是大多时候是在进程挂起状态。还有状态后面有一个‘+’。这是用于区分状态在前台运行还是在后台运行的标志。可以使用

kill -19 进程pid//暂停进程
kill -18 进程pid//恢复进程

Linux——进程
再次恢复后,'+'消失。但是再次使用Ctrl+c就会发现无法终止进程,只能终止前台运行的进程。需要kill -9命令来终止进程(后台、前台进程都可以终止)。D状态暂时没有遇见过,但是对于系统的危害极大,会造成内存泄漏。可以直接断电终止该状态。但是数据会丢失。还有就是等待它自己恢复。