Linux进程概念1

这篇博客来简单介绍一下进程概念。在提到进程这个东西的时候,我们首先的先了解两个概念:什么是冯诺依曼体系结构?什么是操作系统?
我们常见的计算机大部分都遵循冯诺依曼体系结构,这个体系结构主要是大部分计算机都是由输入设备、存储器、运算器、控制器、输出设备组成。其中运算器和控制器加起来就是中央处理器。在存储器和中央处理器之间会以数据信号来交流。其他之间通过控制信号来交流。
关于冯诺依曼,必须强调几点:
这里的存储器指的是内存
不考虑缓存情况,这里的CPU能且只能对内存进行读写,不能访问外设(输入或输出设备)
外设(输入或输出设备)要输入或者输出数据,也只能写入内存或者从内存中读取。
一句话,所有设备都只能直接和内存打交道。
那什么是操作系统呢?
我们知道lunix就是一个操作系统,但是有没有什么更容易理解的概念呢?
我们首先得知道操作系统是一个软件,它等于操作系统内核+一组应用。它是操作系统:管理计算机资源的,合理安排计算机进程,让用户更好使用计算机的程序与数据的集合。
接下来介绍系统调用和库函数的概念。
系统调用:指的是操作系统提供的函数,称为系统调用函数
库函数:一帮大佬嫌弃系统调用函数比较难用,封装了系统调用函数,提供了一些封装后的函数供程序员去使用,封装的函数称之为库函数。
现在提出一个问题,操作系统具体的管理计算机的软硬件资源以及操作系统是怎么样管理进程的?
是描述+组织的方式管理的。
所以我们进入正题。首先得描述一个进程,那么进程是什么呢?

进程

基本概念
课本概念:程序的一个执行实例,正在执行的程序等
内核观点:担当分配系统资源(CPU时间,内存)的实体。
1.使用了一个结构体来描述 struct task_struct
进程模块:
a.程序和进程的区别
程序是一个文本文件,程序是静态的
进程是程序执行起来的一个实体(要创建一个task_struct结构体)
b.task_struct>>PCB:(进程控制块)
pid:进程标识符
进程状态:就绪状态,阻塞状态,运行状态。
内存指针:该指针指向程序地址空间(执行mmstruct指针)
程序计数器:保存程序执行下一条指令的内容
上下文信息:保存当时被CPU剥夺的寄存器的值。task_struct中
这是怎么样描述进程的。
接下来是如何组织进程得。
操作系统是使用双向链表来组织进程之间的关系
fork >>pid_t>>>int 类型
失败:返回-1
成功:返回0 给子进程
返回大于0 (pid的子进程)>>父进程的>>>
获取当前进程的pid,我们使用getpid函数
获取当前调用进程的父进程的pid,我们使用getppid函数
首先是base进程,它跟所有程序交互,首先是base申请的一个子进程。
创建PCB是需要耗费内存的,这里的内存是内核空间的内存(PCB还没创建出来是不会使用用户空间的,所以是内核空间)
为啥要讲fork返回值大于0的情况给父进程的逻辑?(fork等于0可不可行?)
等于0的时候给子进程,让他自己去调用getpidh或者getppid函数找自己的pid,给父进程的话它没有办法自己去区分那个是子进程。
查看进程

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 while(1){
 sleep(1);
 }
 return 0;
 }

通过系统调用获取进程标示符

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 printf("pid: %d\n", getpid());
 printf("ppid: %d\n", getppid());
 return 0;
 }

通过系统调用创建进程-fork初识

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 int ret = fork();
 printf("hello proc : %d!, ret: %d\n", getpid(), ret);
 sleep(1);
 return 0;
}
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
 int ret = fork();
 if(ret < 0){
 perror("fork");
 return 1;
 }
 else if(ret == 0){ //child
 printf("I am child : %d!, ret: %d\n", getpid(), ret);
 }else{ //father
 printf("I am father : %d!, ret: %d\n", getpid(), ret);
 }
 sleep(1);
 return 0;
}

这篇博客就结束了,关于进程状态下篇博客再介绍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值