1.什么叫进程
答:一个已经加载到内存的程序,叫进程(任务);
1.1 一个操作系统可以运行多个进程,可以跑多个任务;
1.2任何一个进程,在加载到内存的时候,形成真正的进程,操作系统要先创建描述进程的结构体对象——PCB,process ctrl block——进程控制块(进程属性的集合)——struct 结构体
1.3 进程:1.存在进程控制块(即操作系统里有进程控制块);2.存在该进程的代码和数据;两者合起来才叫进程;
所谓的进程:内核pcb数据结构对象(描述这个进程的所有属性值) + 自己的代码和数据;所谓的管理,其实就是对PCB数据结构对象做管理;
操作系统中,对进程进行管理,变成了对单链表的增删查改(比如进行了一个进程,又添加一个进程)
1.4描述进程 -PCB 进程信息被放在一个叫做进程控制块的数据结构中,可以理解为进程属性的集合。 课本上称之为 PCB ( process control block ), Linux 操作系统下的 PCB 是 : task_struct 1.5task_struct-PCB 的一种 在 Linux 中描述进程的结构体叫做 task_struct 。 task_struct 是 Linux 内核的一种数据结构,它会被装载到 RAM( 内存 ) 里并且包含着进程的信息 1.6 task_ struct 内容分类 标示符 : 描述本进程的唯一标示符,用来区别其他进程。 状态 : 任务状态,退出代码,退出信号等。 优先级 : 相对于其他进程的优先级。 程序计数器 : 程序中即将被执行的下一条指令的地址。 内存指针 : 包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针 上下文数据 : 进程执行时处理器的寄存器中的数据 [ 休学例子,要加图 CPU ,寄存器 ] 。 I / O 状态信息 : 包括显示的 I/O 请求 , 分配给进程的 I / O 设备和被进程使用的文件列表。 记账信息 : 可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。 其他信息 2.Linux中是如何组织进程 Linux内核中,最基本的组织进程task_struct的方式,采用双向链表组织的; 3.查看属性ls /proc //查看内存中的所有跑着的进程
//如:要获取PID为1的进程信息,你需要查看 /proc/1 这个文件夹。
cwd (current work dir) //当前进程的工作目录(当前路径),进程在启动时有自己的工作目录;
//为PCB创建时,展现的工作目录;
exe //
4.
ps ajx //查看所有进程
ps ajx | grep test //查看所有关于test的进程
kill -9 PID序号(进程ID) //关闭PID序号的程序
5.查看pid的函数
yum -y install man-pages //想要查看getpid这个函数必须要安装这个包;否则查不到
#include <sys/types.h> //头文件:
#include <unistd.h>
pid_t getpid(void); //函数原型
pid_t getppid(void); // 获取父进程pid
6.通过系统调用来创建进程—fork初识
#include <unistd.h> //头文件
pid_t fork(void); //函数类型
#include <stdio.h>
#include<unistd.h>
int main()
{
printf("before:only one line\n");
fork();
printf("after:only one line\n"); //fork之后的命令会被执行2次
}
./运行我们的程序 ——指令级别
fork()——————代码层面创建子进程;
7.为什么fork要给子进程返回0,给父进程返回子进程pid?
答:返回不同的返回值,是为了区分让不同的执行流,执行不同的代码块!
一般而言fork之后的代码父子共享,通过不同的返回值区分父子进程;
通俗来讲1个父亲可以有多个儿子,但是1个儿子只能有1个父亲,必须通过准确的pid来区分每个儿子;子进程可以直接调用getpid和getppid就直接可以获得相关的数据;不需要太高的成本;
7.1创建子进程:意味着系统中多了一个进程,进程=内核数据结构+对应的代码和数据,可是子进程应该执行什么样子的代码呢?刚开始创建子进程,子进程没有对应自己的代码,所以他只能执行父进程的代码,这就解释了上图fork命令之后为什么会被执行两次;fork之后父子进程代码是共享的;
7.2一般把c/c++加载到内存之后,代码是不可能被修改的
7.3我们为什么要创建子进程呢?答:为了让父和子执行不同的事情,需要想办法让父和子执行不同的代码块;rangfork具有了不同的返回值
8.一个变量怎样能够返回两次
答:fork是一个函数,在fork里创建了子进程,,填充了PCB,以及让子进程和父进程有了形同的代码,两者都有独立的task_struck,相同的代码;可以被cpu调度运行,return处于创建子进程之后,也是代码,自然是父子共享的,父进程调用返回了一份,子进程也调用也返回了一份,所以返回了两次;
9.一个变量怎样存在不同的值?
因为数据可能被修改,所以不能让父进程和子进程共享一份数据;(代码可以共享,数据不能共享)所以父进程被操作系统单独拷贝了一份数据,用来支持子进程的单独运行;但是这样会出现一个问题,无法判断父进程中的数据是否是子进程中需要的,会造成资源的浪费;这样就变成了,创建子进程时和父进程公用一块代码和数据,当子进程想要修改数据时,操作系统就重新创建一块空间来修改数据,想修改多少,就创建多少空间;——这种技术叫数据层面的写时拷贝;
9.如果父进程创建了子进程,那么他们谁先运行呢?答:谁先运行,由调度器决定,所以谁先运行是不确定的;
标签:fork,struct,创建,代码,PCB,Linux,进程 From: https://blog.csdn.net/qincjun/article/details/139262420