一、进程
1.1概念
一个已经加载到内存中的系统,叫做进程(任务)/正在运行的程序。
1.2、理解
一个操作系统,不仅仅只能运行一个进程,可以同时运行多个进程。
——>因此,操作系统必须把进程管理起来,那么如何管理?先描述,再组织(增删查改)
——>任何一个进程,在加载到内存时,形成真正的进程时,操作系统要先创建描述进程的结构体对象——PCB(Process control block)(进程控制块)
PCB本质上就是struct结构体:
- 进程编号
- 进程状态
- 优先级
- 相关的指针信息(找到代码和数据)
- struct PCB* next(再组织管理所有进程的PCB,所有PCB就成为了一个单链表)
- …
根据进程的PCB类型,为该进程创建对应的PCB对象。
那么进程是什么?
想象一下你高考完大学把你录取了,首先把你的档案从高中调过去,这是你的个人信息,再等你暑假结束,你到了学校。学校里的保安室这个学校里的学生吗?显然不是,虽然保安是在学校里,但其并没有在教务在线中存有相应的数据。
由此可见:存在内存里的代码和数据 和管理内存和代码的PCB内核数据结构才叫做一个进程。而操作系统直接对PCB进行管理。
在操作系统中,对进程进行管理,就是对单链表进行增删查改。
描述进程-PCB
- 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。
- 课本上称之为PCB,Linux操作系统下的PCB是:task_struct。
task_struct:PCB的一种
- 在Linux中描述进程的结构体叫做task_struct。
- task_struct是Linux内核的一种数据结构(聚合类型),它会被装载到RAM内存里并且包含着进程的信号。
task_struct内部分类
- 标示符:描述本进程的唯一标示符,用来区别其他进程。
- 状态:任务状态,退出代码,退出信号等。
- 优先级:相对于其他进程的优先级。
- 程序计数器:程序中即将被执行的下一条指令的地址。
- 内存指针:包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
- 上下文数据:进程执行时处理器的寄存器中的数据
- I/O状态信息:包括显示的I/O请求,分配给进程的I/O设备和被进程使用的文件列表
- 记账信息:可能包含处理器时间总和,使用的时钟数总和,时间限制,记账号等
- 其他信息
Linux中是如何组织进程的?——>Linux内核中,最基本的组织进程task_struct方式,采用双向链表组织的。
查看进程的相关指令
ps ajx | head -1 &&ps ajx | grep file_name
先创建一个myprocess.c文件
touch myprocess.c
touch Makefile
vim process.c
myprocess.c文件
1 #include<stdio.h>
2 #include<unistd.h>
3
4 int main()
5 {
6 while(1)
7 {
8 printf("我是一个进程啦...\n");
9 sleep(1);
10 }
11 return 0;
12 }
Makefile文件
1 myprocess:myprocess.c
2 gcc -o $@ $^
3 .PHONY:clean
4 clean:
5 rm -f myprocess.
执行myprocess后
查看进程
ps ajx | head -1 &&ps ajx | grep myprocess
PID:显示的是进程中唯一的ID值。
**注意:**这里的grep --color=auto myprocess为grep启动的进程。此时的PID为1618
ls ./proc
proc目录当中,它包含是系统当中动态运行的所有进程的相关信息。
ls /proc -l
这里的黑色字体是普通文件,这些蓝色字体是目录。而图二的数字都是PID。
如果我们此时干掉myprocess这个进程。此时再进去就会发现没有响应的文件。
我们再启动该进程,查看该进程的PID,再查看该进程在./proc目录下的相关属性。
这里着重查看两个属性:exe 、cwd
exe——链接文件
这里指向的是/home/user1/Test-lesson1/myprocess,也即自己当前正在运行的myprocess进程。
cwd——current wrok dir(当前进程的工作目录)
顾名思义,存储的是自己当前的文件目录,也是因此,touch命令创建文件时产生进程,而进程是依靠cwd去找到相应的文件路径。就比如说调用fopen()时,是自动把cwd拼接到创建的文件名前。
例:fopen(“log.txt”,“w”); 即创造的文件路径为cwd/log.txt,也即/home/user1/Test-lesson1/log.txt。