LINUX/操作系统下的进程相关

进程
首先问一个简单的问题,进程是什么?
说进程是一个正在运行的程序也没有问题,但是有点狭义。
那么程序又是什么呢?程序是一系列有序的指令集和,也就是程序员们所编写的代码,存储在硬盘中,那么运行的话是怎么运行的呢。

冯·诺依曼体系结构决定了所有数据指令想要被CPU处理都必须加载入内存。

在内存中,对这些指令和数据都有单独的描述,操作系统将这些运行的程序进行描述,然后将这些描述信息组织起来进行管理,而这个管理生成的东西就叫做PCB–进程控制块。
操作系统想要实现对多个程序的调度运行,就要通过对多个PCB的调度管理来实现对运行中程序的调度切换运行。
因此对于操作系统来说这个描述信息就是进程----PCB就是进程。
在这里插入图片描述
总的来说,进程就是一个PCB,操作系统通过对一个运行中的程序进行描述,通过这个描述实现对程序的调度运行。
这个PCB/这个描述,在LINUX系统下是一个结构体,struct task_struct{…}。

那么PCB(进程控制块)中的描述信息都是些什么呢?
大体上里面的描述信息包括:内存指针,程序计数器,上下文数据,进程PID,IO信息,进程状态等。

这里简单解释几个描述信息:
内存地址:用于指向程序指令数据在内存中的位置
程序计数器/上下文数据:用于保存程序当前运行的数据

当操作系统决定要运行哪一个程序时,则找到所对应的进程控制块,将PCB中的描述信息加载到CPU的寄存器中。

PS:CPU的分时机制:操作系统调度一个程序在CPU上运行,会给这个程序分配一个时间片,时间片运行完毕,则切换调度到另一个程序。

子进程
现在我们对进程有了基本的了解,那么如何创建一个进程呢?
进程即是PCB,因此创建一个进程就是创建一个PCB。
在LINUX下可以用 pid_t fork(void)------通过复制调用进程(父进程)创建一个新的进程(子进程)。
创建一个PCB,然后从父进程PCB复制很多数据过来。

复制的信息:内存指针,程序计数器,上下文数据…

内存指针:子进程和父进程的运行的代码是一样的-------指向同一块物理内存中的指令和数据。
程序计数器/上下文数据:子进程被创建出来后,运行位置是与父进程完全一样的,下一步开始的指令是从被创建出来后下一步的指令。
也就是一个子进程被创建出来后和父进程干的事情是一样的,因为他们运行的代码和数据以及当前的运行位置是完全一样的。
父子进程代码共享,数据独有。

pid_t fork(void)

函数对父进程返回一个创建的子进程的PID,子进程返回的值是0,因此不会出现重复创建子进程的情况。
通常根据fork的返回值进行代码的分流,让父子进程进入不同的判断执行体完成不同的功能。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值