进程的概念
进程是参与分配资源(cpu,内存)得实体,比如打开qq,浏览器就是打开了进程。
进程这么多,如何管理进程呢?
在linux下进程通过PCB(task_struct)来管理进程
task_struct
task_struct是一个存放进程属性的结构,是一种内核数据结构。
有部分内容如下:
1.标示符
:
描述本进程的唯一标示符,用来区别其他进程。
2.状态
:
任务状态,退出代码,退出信号等。
3.优先级
:
相对于其他进程的优先级。
4.程序计数器
:
程序中即将被执行的下一条指令的地址。
5.内存指针
:
包括程序代码和进程相关数据的指针,还有和其他进程共享的内存块的指针
6.上下文数据
:
进程执行时处理器的寄存器中的数据
[
休学例子,要加图
CPU
,寄存器
]
。
7.I
/
O
状态信息
:
包括显示的
I/O
请求
,
分配给进程的
I
/
O
设备和被进程使用的文件列表。
8.记账信息:
可能包括处理器时间总和,使用的时钟数总和,时间限制,记账号等。
9.其他信息
进程的pid
pid是每一个进程的唯一标识符,每一个进程的是不一样的。每一个进程除了有pid还有ppid,ppid是该进程的父进程的pid。
获取进程的pid
getpid可以获取进程的pid,getppid可以获取父进程的pid。
使用ps -l 可以查看进程
通过系统调用fork创建子进程
1。创建子进程使用fork函数,使用fork函数创建的子进程的属性和数据从哪里来呢?
2.属性和数据是和父进程共用还是单独一份呢?
对于上述第一个问题,子进程的数据肯定是从父进程来的。
对于第二个问题,我们可以这样思考,如果子进程的属性和数据是单独一份,那么就会存在子进程和父进程有着大量的重复数据造成资源浪费,这显然是不合理的。
所以子进程和父进程是共用属性和数据。这样的话又会遇到另一个问题,子进程要对数据进行修改是就会影响父进程。通过引入写实拷贝就可以解决这个问题。
写实拷贝
写实拷贝到底是怎么回事呢?比如:在我们要对一个数据进行修改时,操作系统会在开辟一个相同大小的空间来存放这个你修改后的数据给修改此数据的进程,这就是写实拷贝。
总结:父进程和子进程的代码和数据大部分是共享的,对于需要要修改的数据通过写实拷贝技术完成。
写实拷贝的优点
1.写实拷贝可以避免子进程和父进程大量代码和数据冗余,在需要时在开辟空间。