Linux下的进程的有关知识点

?操作系统
是个软件系统,协调计算机硬件进行工作,为上层应用提供支持和用户操作。对编程开发来说,它提供API编程接口(文件操作,socket网络编程等)在计算机中,操作系统的定位是一个管理者,对上管理在系统中运行的进程,对下通过驱动程序管理各种硬件。
1、与硬件交互,管理所有的软件和硬件资源
2、为应用程序提供一个执行环境
常用的操作系统:
终端的应用:windows、IOS、Android等
服务器应用:windows server、linux(重点)、unix等
?Linux内核
内核是操作系统的核心,具有很多最基本功能,它负责管理系统的进程、内存、设备驱动程序、文件和网络系统,决定着系统的性能和稳定性 。Linux 内核由如下几部分组成:内存管理、进程管理、设备驱动程序、文件系统和网络管理等
?虚拟内存
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

进程

运行的程序就称为进程 ,进程是操作系统分配资源和调度的基本单元 ,其实可以理解为程序的运行实例
?进程的特征:
动态性:有生命周期
并发性:同时可以有多个程序,在内存中执行。常常代表的是同时启动多个程序,注意和并行的区别,并行强调的是多个进程同一时间在执行。
独立性:进程有自己的地址空间,运行时在这个地址空间中运行代码,各个进程之间互不影响。
异步性:指的是独立运行,以不可预知的速度推进
?进程的组成:
Linux系统中进程由以下三部分组成: ①进程控制块PCB;②数据段;③正文段
PID:进程ID号
PCB:进程控制块,
linux下叫具体为task_struct 进程的地址空间(虚拟地址空间:地址连续) 代码段、数据段、堆、栈等等(栈地址增长方向:从高到低。堆地址增长方向:从低到高)
假设32系统,共4G的空间
1G:Linux系统内核使用,3G:用户可以使用。
其中0-3G是用户空间,
3G-4G是内核空间 较低3G字节0x00000000 ~ 0xBFFFFFFF称为“用户空间” 最高的1G字节0xC0000000 ~ 0xFFFFFFFF称为“内核空间”
?进程的关系 父子关系、兄弟关系、亲缘关系
运行:占据CPU执行 就绪:进程进入就绪队列等待获取CPU执行,优先级高的先处理,当优先级相同时,轮询处理
阻塞:当有I/0请求时,释放CPU的使用权,因为IO操作比较耗时,此时进入阻塞状态,如果IO操作结束后,状态切换为就绪态(进入就绪队列等待获取CPU执行)
?Linux进程常用的五种状态
运行状态(TASK_RUNNING)
可中断睡眠状态(TASK_INTERRUPTIBLE)
不可中断睡眠状态(TASK_UNINTERRUPTIBLE)
暂停状态(TASK_STOPPED)
僵死状态(TASK_ZOMBIE)—僵尸进程
僵尸进程:子进程已经结束,但是父进程并没有回收其资源,此时的子进程就是一个僵尸进程。使用wait和waitpid函数可以解决这个问题
孤儿进程:父进程已经结束,但是子进程仍在运行。这时候子进程就是孤儿进程
守护进程:(相当于windows的服务程序)一种脱离终端,在后台运行的一种进程。终端的开关与他无关
?进程标识符pid 每个进程都有一个独一无二的进程标识符,标志符大于等于0,0号进程是内核进程,它创建1号进程,1号进程创建了2号进程 进程id的范围如下所示在这里插入图片描述 ?创建进程
分配id,分配PCB 分配地址空间 拷贝父进程的进程空间 将子进程置为就绪状态 放到就绪队列
?程序转换为进程
内核将程序读入内存,为程序分配内存空间 内核为该进程分配进程标识符pid和其他所需资源 内核为该进程保存PID及相应的状态信息,把进程放到运行队列中等待执行.程序转化为进程后就可以被操作系统的调度程序调度执行了
?销毁进程
回收各种资源 、记录系统日志、将进程换出内存,置为僵尸状态、转存储调度
?进程的终止方式 有5种方式使进程终止
1、从main返回
2、调用exit
3、调用_exit
4、调用abort
5、由一个信号终止
进程在终止的时候,系统会释放进程所拥有的资源,例如内存、文件描述符,内核结构等。
exit:退出时清理资源和IO缓冲区中的内容
_exit:不清理IO缓冲区中的内容

案例1:

#include<stdio.h>
#include<unistd.h> 
#include<sys/types.h> 
int main()
{
   
    int n = 10;    pid_t pid = getpid();
    pid_t ppid = getppid();    
    while(1)
    {
   
        printf("pid=%d,ppid=%d\n",pid,ppid);
        printf("&n=0x%x\n",&n);        
        sleep(5);
    }    
    return 0;
}
 

在这里插入图片描述
fork
进程复制,创建子进程
fork() 函数不需要参数,但返回两次,返回值有三种情况:
(1)对于父进程,fork函数返回新的子进程的ID。
(2)对于子进程,fork函数返回0。
(3)如果出错,fork函数返回-1。
fork()的特点是执行一次,返回两次。在父进程和子进程中返回的是不同的值,父进程返回的是子进程的ID号,而子进程中则返回0。
案例2:

#include<stdio.h>
#include<sys/types.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
   
 int n = 10;
 //进程复制
  int pid = fork();
  //fork失败
    if(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值