5.1 Linux 应用开发 进程(一)

一、进程相关的基础概念

  • 程序:存放在磁盘上的指令和数据的有序集合(可执行文件),放在 ROM 里,是静态的
  • 进程:是程序的一次完整执行过程,是动态的,包括创建、调度、执行和消亡。运行在 RAM 里,是执行一个程序所分配的资源总称,资源分配的基本单位
  • 进程控制块 (PCB):在 Linux 中描述进程的结构体是 task_struct,包括进程标示符 (PID)、优先级、状态、进程用户、文件描述符表。
  • 进程类型:交互进程:在 shell 下启动,可在前台也可在后台执行批处理进程:和终端无关,被提交到作业队列中顺序执行守护进程:和终端无关,一直在后台运行,Ctrl+C 无法控制
  • 进程状态:运行态:进程正在运行或准备运行等待态:进程在等待一个事件的发生或某种系统资源(分为可中断等待、不可中断等待)停止态:进程被中止,收到信号可继续运行死亡态:已终止的进程,其退出信息也被读取了,只是一个返回状态僵尸态:一个进程结束了,但其退出信息未被读取,PCB 没有释放它

二、进程常用命令

  • ps:查看当前运行的进程快照。ps -e 显示所有进程;ps -elf 显示更加详细信息
  • top:查看进程动态信息。top -p PID:查看某个进程
  • jobs:查看后台运行的进程
  • Ctrl+Z:将进程转入后台并停止
  • bg:将挂起的进程在后台运行
  • fg:将后台进程放在前台运行

三、进程通信方式

  • 管道通信:无名管道、有名管道
  • 信号通信:信号的发送、接受、处理
  • IPC 通信:共享内存、消息队列、信号量
  • Socket 通信:一个网络中的多进程通信

类型

方式

特点

适用场景

管道

无名管道

单向、父子进程、数据流

简单数据传递

有名管道

单向、无亲缘关系、文件系统

不相关进程

信号

signal/kill

异步通知、携带信息少

事件通知

IPC

共享内存

最快、需同步机制

大数据交换

消息队列

有格式、可优先级

结构化数据

信号灯

计数器、同步

进程同步

Socket

Unix Domain / Network

跨机器通信

网络/本地通信

四、进程间通信特点

在用户空间无法独立实现进程通信,因为进程地址空间相互隔离,必须通过内核提供的 IPC 机制通信。共享内存是例外,创建共享内存需要内核,但读写可在用户空间直接进行。

┌─────────────┐     ┌─────────────┐
│  进程 A     │     │  进程 B     │
│ 虚拟地址空间 │     │ 虚拟地址空间 │
│   0-4GB     │     │   0-4GB     │
└──────┬──────┘     └──────┬──────┘
       │                   │
       │    相互隔离!      │
       │  无法直接访问      │
       └─────────┬─────────┘
                 ↓
        ┌──────────────┐
        │  Linux 内核   │ ← 必须通过内核中转
        │  提供通信机制  │
        └──────────────┘

机制

是否每次经过内核

说明

管道

✅ 是

数据在内核缓冲区中转

消息队列

✅ 是

数据在内核中存储

信号量

✅ 是

内核同步机制

信号

✅ 是

内核通知机制

Socket

✅ 是

网络通信

共享内存(特例)

❌ 创建后不经过

创建需内核,读写在用户空间

五、Linux 进程状态转换

  • R 运行态:正在执行或就绪,可通过唤醒进入;缺资源进入 S,等 IO 进入 D,暂停进 T,退出进 Z
  • S 可中断等待:等待资源/事件,可被信号唤醒,资源就绪后回到 R
  • D :等待硬件 IO,不可被打断,完成后回到 R

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C++/嵌入式开发 秋招面经 文章被收录于专栏

一名985硕,在25年秋招中斩获多个C++/嵌入式开发Offer。本专栏将分享我的面经,涵盖C/C++、操作系统、计算机网络、ARM体系与架构、Linux应用/驱动开发、Qt、通信协议及开发工具链等核心内容。

全部评论

相关推荐

03-31 15:06
已编辑
安徽大学 Java
说下我自己的经历吧,211计算机,现在大四,秋招上岸。大二下的时候看到室友去字节实习了,我当时就急了。那段时间疯狂投简历,Boss直聘、实习僧、牛客全都刷了一遍,一个月投了30多家,结果呢——已读不回是常态,少数几个给了笔试机会,做完也没下文。当时真的很焦虑,觉得自己是不是完了。后来冷静下来复盘,发现自己就是个"空壳选手":数据结构学了但没刷题,项目经历只有课设,八股文背了一半记住的不到三成。说白了,大二的我以为"投简历"就是找实习,但其实"有东西可写"才是找实习的前提。大二暑假没实习成,但那个暑假是我大学最充实的两个月。白天刷题晚上做项目,LeetCode前150题过了一遍,跟着B站撸了一个完整的SpringBoot+Vue全栈项目从0到部署,牛客面经整理了一份自己的高频题文档。虽然没去实习,但这两个月补上的东西比大二一整年学的都多。大三上学期再投的时候,明显不一样了。简历有东西写了,面试也能聊几句了。最后拿到了一家中厂的后端实习,虽然不是大厂,但真正进了业务组写代码的感觉,比在学校写课设完全是两个世界。后来大三下春招拿到了大厂暑期实习offer,秋招也顺利上岸。所以我的结论是:大三上是性价比最高的实习时间点。大一大二基础没打好,就算进去了也只能打杂,简历上也不好写。大三上投实习,大三下暑期实习,秋招直接转正或者带实习经历投,时间线刚好。而且太早实习牺牲绩点不划算,很多大厂筛简历第一关就是GPA。当然每个人情况不一样,如果你大二就有完整项目+算法基础,那早投也没问题。但对大多数普通同学来说,与其焦虑"别人都实习了我还没有",不如先问自己"我现在去实习能干啥"。想早不如想好。共勉。
你觉得大几开始实习最合适...
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务