目录
1.操作系统(OS)
2. 进程
2.1 基本概念
2.2 task_struct 内的属性字段
2.3 查看进程
2.4 查看进程的PID及PPID
2.5 杀死进程
2.6 以文件的方式查看进程
2.7 查看退出码
2.8 上下文数据
下面介绍两个较为方便的快捷键:
Linux
冯诺依曼体系结构大家可以看下:
冯诺依曼体系结构
在学习进程之前,首先来简单了解下操作系统:
操作系统是指控制和管理整个计算机系统的硬件和软件资源,并合理的组织调度计算机工作
和资源的分配,已提供给用户和其他软件方便的接口和环境,它是计算机系统最基本的系统
软件。
总的来说,可以概括为以下三点:
1. 负责管理和协调硬件、软件等计算机资源等工作;
2. 为上层用户、应该程序提供简单易用的服务;
3. 是一种系统软件。
那操作系统是如何为上层用户提供服务的呢?
操作系统会为用户提供一系列的系统调用接口,通过此接口用户可以与操作系统进行一定的
交互,但与操作系统直接交互,一是存在安全隐患,二是对接口的使用太过复杂。
在此接口之上,一些大佬们又对接口进行了软件封装,以第三方库的形式呈现,也就是形我
们现在使用的一些库函数,比如C/C++/JAVA/Python库函数:printf()
那操作系统是如何管理计算机软硬件资源的呢?
先拿生活中的一个例子来说吧!
在学校中,校长可以称得上是一位管理者,学生则是被管理者,除此之外,在管理者和被管
理者之间还有一位执行者,这个角色由辅导员来担任。
校长不直接对学生进行管理,而是发号施令由辅导员来执行,完成对学生的管理。
每一位学生是一个复杂的个体,我们得先用我们已知的数据结构将学生先进行描述,再进行
管理。
例如一个struct结构体来进行描述,单链表、顺序表等组织起来方便管理。
操作系统也一样,在操作系统内部,也是先描述,再组织;
将对目标的管理,转化成为对数据的管理。
先描述,再组织:这是放在整个操作系统都适用的准则。
们平常都说加载在内存中的程序就叫做进程,但这个解释是不够全面的。
仅仅是将磁盘中的程序加载到内存中就叫做进程了吗?
其实不是
操作系统遵循先描述再组织的原则,任何一个进程在形成之前,操作系统会自动为该进程创建PCB
(进程控制块)对它进行描述,这个PCB里面包含进程的所有属性信息。
因此一个进程 = 程序文件内容 + 与进程相关的数据结构(PCB)
在Linux系统中,PCB 通常用 task_struct 来描述,它是Linux内核的一种数据结构,所有运行在系
统里的进程都以 task_struct 链表的形式存在内核里,在程序运行时会被加载到内存中。
有了 task_struct 之后,我们对进程的管理都是通过 task_struct 完成的。
- 标示符: 描述本进程的唯一标示符,用来区别其他进程。
- 状态: 任务状态,退出代码,退出信号等。
- 优先级: 相对于其他进程的优先级。
- 程序计数器: 程序中即将被执行的下一条指令的地址。
- 内存指针: 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据: 进程执行时处理器的寄存器中的数据。
- I/O状态信息: 包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表。
- 记账信息: 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
- 其他信息
ps axj | head -1 && ps axj | grep 进程名
//head -1 显示标题
//ps axj 显示正在运行的进程
//grep 对进程进行过滤
示例:
编写了一个test.c程序:
PID和PPID是进程的标识符
上述例子已进行演示。
kill -9 PID
示例:
原本左边运行的进程被杀死了。
如果不是强制要杀死的话,我们可以使用ctrl c:退出进程
上面蓝色的文件对应的是一个进程的PID
进程创建时,蓝色文件(PID)自动创建,进程退出时自动消失
2. 查看具体进程属性
我们平常在一个目录touch创建目录,直接创在当前目录下,正是因为有上述记录信息:
我们平常写程序时总是 return 数字;其实 return 的这个数字称为退出码,程序正常运行完毕后会
被它的父进程拿到
我们可以使用如下命令输出最近执行命令的退出码:
echo $?
其实在此我们可以看到,不止运行的程序是一个进程,其实每一条命令的执行也是一个进程。
在CPU内部其实是存在一定的调度准则的,比如时间片轮转原则,一个进程上处理机运行几秒钟然
后下处理机换另一进程上处理机,那么便存在这一问题,如果进程还没运行完便被迫下处理机,等
下次上处理机的机会,那么它的上下文数据(运行到哪条指令了...临时数据)便要被保存起来,再此上处理
机时,便要将上下文进行恢复。
1. 批量化注释:
2. 批量化取消注释:
坚持打卡!