【从零开始的嵌入式生活】并发程序设计1——进程基本介绍(1)

简介: 【从零开始的嵌入式生活】并发程序设计1——进程基本介绍(1)

今天开始一个比较常用的模块,就是并发编程,可以极大的提高我们程序的运行效率,这部分内容非常重要。那么,让我们开始吧。


🧑🏻作者简介:一个学嵌入式的年轻人

✨联系方式:2201891280(QQ)

📔源码地址:https://gitee.com/xingleigao/study_qianrushi

⏳全文大约阅读时间: 60min


文章目录

进程的基本介绍

进程控制块

进程类型

进程状态

进程的控制命令

ps -elf

top

proc

改变用户优先级

控制命令

进程的创建和结束

进程创建 – fork

进程结束 – exit

进程的回收

进程回收 – wait

进程回收 – waitpid

DXEC函数族

进程 – execl / execlp

进程 – execv / execvp

system

守护进程

守护进程创建

写在最后

进程的基本介绍

打开资源管理器我们可以看到很多进程,所谓进程,就是运行中的程序。

程序


存放在磁盘上的指令和数据的有序集合(文件)

静态的

进程


执行一个程序所分配的资源的总称

进程是程序的一次执行过程

动态的,包括创建、调度、执行和消亡


进程控制块

进程标识PID

进程用户

进程状态、优先级

文件描述符表

进程类型

交互进程:在shell下启动。以在前台运行,也可以在后台运行

批处理进程:和在终端无关,被提交到一个作业队列中以便顺序执行

守护进程:和终端无关,一直在后台运行

进程状态

运行态:进程正在运行

就绪态:准备运行、等待cpu

等待态:进程在等待一个事件的发生或某种系统资源

可中断

不可中断

停止态:进程被中止,收到信号后可继续运行

死亡态:已终止的进程,但pcb没有被释放(僵尸态)

可以使用ps查看系统进程信息:


进程的控制命令

ps -elf


S:状态

UID:创建用户

PID:程序id

PPID:父进程id

NI:优先级

top

和ps看到的信息差不多。但是是动态显示的。


proc


本来一切皆文件,所以可以看目录里的文件开看。


改变用户优先级

优先级的范围是-20~19,其中-20是对高

nice 按用户指定的优先级运行进程


nice -n 19 ./test


renice 改变正在运行进程的优先级


renice 10 <PID>

控制命令

jobs 查看后台进程

bg 将挂起的进程在后台运行

fg 把后台运行的进程放到前台运行


进程的创建和结束

进程创建 – fork

#include  <unistd.h>
pid_t  fork(void);


创建新的进程,失败时返回-1

成功时父进程返回子进程的进程号,子进程返回0

通过fork的返回值区分父进程和子进程


#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(){
       pid_t pid;
       pid = fork();
       if(pid < 0){
               perror("fork");
               exit(-1);
       }else if(pid > 0){
               printf("this is parent process\n");
       }else if(pid == 0){
               printf("this is child process\n");
       }
       return 0;
}


父子进程


子进程继承了父进程的内容

父子进程有独立的地址空间,互不影响

若父进程先结束

子进程成为孤儿进程,被init进程收养

子进程变成后台进程

若子进程先结束

父进程如果没有及时回收,子进程变成僵尸进程

进程结束 – exit

exit / _exit

exit刷新缓冲区

_exit不清空缓冲区。


相关文章
|
4月前
|
安全 Python
告别低效编程!Python线程与进程并发技术详解,让你的代码飞起来!
【7月更文挑战第9天】Python并发编程提升效率:**理解并发与并行,线程借助`threading`模块处理IO密集型任务,受限于GIL;进程用`multiprocessing`实现并行,绕过GIL限制。示例展示线程和进程创建及同步。选择合适模型,注意线程安全,利用多核,优化性能,实现高效并发编程。
74 3
|
4月前
|
Python
解锁Python并发新世界:线程与进程的并行艺术,让你的应用性能翻倍!
【7月更文挑战第9天】并发编程**是同时执行多个任务的技术,提升程序效率。Python的**threading**模块支持多线程,适合IO密集型任务,但受GIL限制。**multiprocessing**模块允许多进程并行,绕过GIL,适用于CPU密集型任务。例如,计算平方和,多线程版本使用`threading`分割工作并同步结果;多进程版本利用`multiprocessing.Pool`分块计算再合并。正确选择能优化应用性能。
36 1
|
2月前
|
网络协议 C语言
C语言 网络编程(十三)并发的TCP服务端-以进程完成功能
这段代码实现了一个基于TCP协议的多进程并发服务端和客户端程序。服务端通过创建子进程来处理多个客户端连接,解决了粘包问题,并支持不定长数据传输。客户端则循环发送数据并接收服务端回传的信息,同样处理了粘包问题。程序通过自定义的数据长度前缀确保了数据的完整性和准确性。
|
3月前
|
算法 Java
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
该博客文章综合介绍了Java并发编程的基础知识,包括线程与进程的区别、并发与并行的概念、线程的生命周期状态、`sleep`与`wait`方法的差异、`Lock`接口及其实现类与`synchronized`关键字的对比,以及生产者和消费者问题的解决方案和使用`Condition`对象替代`synchronized`关键字的方法。
JUC(1)线程和进程、并发和并行、线程的状态、lock锁、生产者和消费者问题
|
2月前
|
C语言
C语言 网络编程(八)并发的UDP服务端 以进程完成功能
这段代码展示了如何使用多进程处理 UDP 客户端和服务端通信。客户端通过发送登录请求与服务端建立连接,并与服务端新建的子进程进行数据交换。服务端则负责接收请求,验证登录信息,并创建子进程处理客户端的具体请求。子进程会创建一个新的套接字与客户端通信,实现数据收发功能。此方案有效利用了多进程的优势,提高了系统的并发处理能力。
|
2月前
|
数据采集 消息中间件 并行计算
进程、线程与协程:并发执行的三种重要概念与应用
进程、线程与协程:并发执行的三种重要概念与应用
59 0
|
3月前
|
存储 缓存 NoSQL
进程内缓存助你提高并发能力!
进程内缓存助你提高并发能力!
|
4月前
|
数据库 数据安全/隐私保护 C++
Python并发编程实战:线程(threading)VS进程(multiprocessing),谁才是并发之王?
【7月更文挑战第10天】Python并发对比:线程轻量级,适合I/O密集型任务,但受GIL限制;进程绕过GIL,擅CPU密集型,但通信成本高。选择取决于应用场景,线程利于数据共享,进程利于多核利用。并发无“王者”,灵活运用方为上策。
56 2
|
4月前
|
大数据 API 数据处理
Python高手都在用的并发秘籍:解锁线程与进程的终极奥义,性能飙升不是梦!
【7月更文挑战第8天】Python并发编程提升性能,线程(threading)适合I/O密集型任务,如网络请求,通过`start()`和`join()`实现并发。进程(multiprocessing)利用多核CPU,适用于CPU密集型任务,如大数据处理。结合两者可优化混合任务,实现最佳并发效果。
34 1
|
4月前
|
消息中间件 算法 Java
(十四)深入并发之线程、进程、纤程、协程、管程与死锁、活锁、锁饥饿详解
本文深入探讨了并发编程的关键概念和技术挑战。首先介绍了进程、线程、纤程、协程、管程等概念,强调了这些概念是如何随多核时代的到来而演变的,以满足高性能计算的需求。随后,文章详细解释了死锁、活锁与锁饥饿等问题,通过生动的例子帮助理解这些现象,并提供了预防和解决这些问题的方法。最后,通过一个具体的死锁示例代码展示了如何在实践中遇到并发问题,并提供了几种常用的工具和技术来诊断和解决这些问题。本文旨在为并发编程的实践者提供一个全面的理解框架,帮助他们在开发过程中更好地处理并发问题。

热门文章

最新文章