LINUX进程相关

每个进程都会有一个自己的程序计数器,用来记录下一个需要被执行的指令。LINUX允许进程在运行时创建额外的线程。

在某些用户空间中,即使用户退出登录,仍然会有一些后台进程在运行,这就是守护进程(daemon)。

LINUX中有一种特殊的守护进程被称为计划守护进程(Cron  daemon),计划守护进程可以每分钟醒来一次检查是否有工作要做,昨晚会继续回到睡眠状态等待下一次唤醒。

Cron是一个守护进程,可以做任何想做的事,比如可以定期进行系统维护,系统备份等。

fork()创建进程

fork系统调用会创建一个源进程的拷贝。父进程和子进程都有自己的内存映像。如果在子进程创建出来后,父进程修改了一些变量,子进程看不到变化,即fork后,父进程和子进程相互独立。

虽然父进程和子进程保持相互独立,但是它们却能够共享相同的文件。如果在fork之前,父进程已经打开了某个文件,在fork后,父进程和子进程仍然共享这个打开的文件。对共享文件的修改会对父进程和子进程同时可见。

进程通信(Internel-Process communication,IPC)

信号signal

 信号通过向一个或多个进程发送异步事件信号来实现。信号通过shell将任务发送给子进程。

进程可以选择忽略发送过来的信号,但是有两个不能忽略:SIGSTOP和SIGKILL。除此之外,进程可以选择它想要处理的信号,进程也可以选择阻止信号,如果不阻止,可以选择自行处理,也可以选择进行内核处理。如果选择交给内核进行处理,那么就执行默认处理。

操作系统会中断目标程序的进程来向其发送信号,在任何非原子指令(原子操作是指不会被线程调度机制打断的操作)中,执行都可以中断。如果进程已经注册了信号处理程序,那么就执行进程,如果没有注册,将采用默认处理的方式

例如:当进程收到SIGFPE浮点异常的信号后,默认操作是对其进行dump(转储)和退出。信号没有优先级的说法,如果同时为某个进程产生了两个信号,则可以将它们呈现给进程或者以任意的顺序进行处理。

共享内存shared  memory(进程间最快的通信方式)

两个或多个进程可以访问公共内存空间,一个进程所作的修改对另一个进程可见。

参考:https://blog.csdn.net/zwq68/article/details/93710009?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase

为什么说共享内存是进程间最快的通信方式?

进程1和进程2想要进行进程间通信,首先进程1需要将数据从用户态空间拷贝到内核态空间,接着进程2需要从内核态空间将数据拷贝到进程2,然而1共享内存没有数据拷贝过程,因此效率最高。

先入先出队列FIFO

即命名管道。与未命名管道区别:未命名管道没有备份文件,操作系统负责维护内存中缓冲区,用来将字节从写入器传输到读取器。一旦写入或输出终止的话,缓冲区将被回收,传输的数据会丢失。而命名管道在文件系统中作为设备的专用文件存在,当所有进程通信完成后,命名管道将保留在文件系统中以备后用。

消息队列Message Queue

消息队列是用来描述内核寻址空间内的内部链接列表。按不同方式将消息按顺序发送到队列并从队列中检索消息。每个消息队列由IPC唯一标识。它有两种模式,一种是严格模式,即先进先出;一种是非严格模式,消息的顺序性不是很重要。

套接字Socket

套接字一般用于两个进程间的网络通信,网络套接字需要来自诸如TCP(传输控制协议)或较低级别UDP(用户数据报协议)等基础协议的支持。

套接字有以下几种分类

  • 顺序包套接字(Sequential  Packet   Socket ):此类套接字为最大长度固定的数据报提供可靠的连接。此连接是双向的并且是顺序的。
  • 数据报套接字(Datagram  Socket):数据报套接字支持双向数据流。数据报套接字接收消息的顺序与发送者可能不同。
  • 流式套接字
  • 原始套接字(Raw  Socket):可以使用原始套接字访问基础通信协议

系统调用

exec

exec用于执行驻留在活动进程中的文件。即调用exec后,新的可执行文件会替换先前的可执行文件并获得执行(将旧文件或程序替换为新文件或程序,然后执行新文件或程序)。新的执行程序被加载到相同的执行空间中,因此进程的PID不会修改,因为没有创建新进程,只是替换旧进程,但是进程的数据、代码、堆栈都已经被修改。如果当前要被替换的进程包含多个线程,那么所有的线程将被终止,新的进程映像被加载执行。

exec工作原理

  1. 当前进程映像被替换为新的进程映像
  2. 新的进程映像为exec传递的参数
  3. 结束当前正在运行的进程
  4. 当前进程映像的虚拟内存被新进程映像的虚拟内存代替

进程映像

进程映像是执行程序时所需要的可执行文件,通常包括

  • 代码段

用来存放指令,运行代码的一块内存空间,此空间大小在代码运行前就已经确定。

  • 数据段

可读可写,存储初始化的全局变量和初始化的static变量

数据段中数据的生存期是随程序持续性存在,进程创建就存在,进程死亡就消失。

  • bss段

可读可写

存储未初始化的全局变量和未初始化的static变量

bss段中的数据一般默认为0

  • Data段

可读写,因为变量的值可以在运行时更改,此段的大小固定

  • 栈(stack)

可读可写,存储的是函数或代码中的局部变量

栈的生存期随代码块持续性,代码块运行就分配空间,代码块结束就自动回收空间

  • 堆(heap)

可读写

存储的是程序运行期间动态分配的malloc/realloc空间

线程

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值