当前位置: 首页 > article >正文

linux——进程

1、基本介绍 

Linux系统中的并发处理是指同时处理多个任务的能力。Linux作为一个多用户、多任务的操作系统,提供了多种机制来支持并发执行。以下是一些与Linux并发处理相关的基本概念和工具:

  1. 多线程(Multithreading)

    • 线程是操作系统能够进行运算调度的最小单位。在Linux中,线程可以共享进程的资源,如内存空间,这使得线程间的通信更加高效。
  2. 多进程(Multiprocessing)

    • 进程是操作系统进行资源分配和调度的基本单位。Linux支持多进程并发执行,每个进程拥有独立的内存空间。
  3. 进程调度(Process Scheduling)

    • Linux使用调度算法来决定哪个进程或线程应该在CPU上运行。常见的调度算法包括先来先服务(FCFS)、轮转调度(Round-Robin)、最短作业优先(SJF)等。
  4. 同步机制(Synchronization Mechanisms)

    • 为了协调并发执行的进程或线程,Linux提供了多种同步机制,如互斥锁(Mutexes)、信号量(Semaphores)、条件变量(Condition Variables)等。
  5. 异步I/O(Asynchronous I/O)

    • 异步I/O允许程序在等待I/O操作完成时继续执行其他任务,提高了系统的并发性能。
  6. 线程库(Thread Libraries)

    • Linux提供了多种线程库,如POSIX线程(pthreads)、GNU Pth等,用于在程序中创建和管理线程。
  7. 并发编程模型(Concurrency Models)

    • 并发编程模型提供了一种结构化的方式来处理并发,如使用事件驱动模型、反应堆模式(Reactor Pattern)等。
  8. 工具和命令

    • tophtop:实时显示系统中的进程和资源使用情况。
    • ps:显示当前系统中的进程状态。
    • strace:追踪程序执行时的系统调用和信号。
    • gdb:调试多线程程序。
  9. 编程语言支持

    • 许多编程语言,如C、C++、Python、Java等,都提供了在Linux上进行并发编程的支持。

并发编程是一个复杂的话题,涉及到操作系统、硬件、编程语言和具体的应用场景。正确地实现并发可以显著提高程序的性能和响应速度,但同时也需要仔细处理同步和并发带来的问题,如死锁、竞态条件等。

2、互斥锁

在Linux中,使用互斥锁(mutex)来实现线程同步是一种常见的方法。互斥锁可以保证在任何时刻只有一个线程可以访问共享资源。

 基本互斥锁涉及到的函数主要有:

1、pthread_mutex_init(),初始化一个互斥锁

2、pthread_mutex_lock(),在访问共享资源之前,线程需要锁定互斥锁,即不允许其他线程使用

3、pthread_mutex_unlock(),访问完共享资源后,线程需要解锁互斥锁,此时资源可被其他线程使用;

4、pthread_mutex_destroy(),摧毁互斥锁;

5、以下是一个使用线程访问共享资源的示例: 

#include <stdio.h>
#include <pthread.h>

// 定义一个全局变量作为共享资源
int counter = 0;

// 定义互斥锁
pthread_mutex_t mutex;

// 线程函数
void* increment_counter(void* arg) {
    for (int i = 0; i < 10000; i++) {
        // 锁定互斥锁
        pthread_mutex_lock(&mutex);
        // 访问并修改共享资源
        counter++;
        // 解锁互斥锁
        pthread_mutex_unlock(&mutex);
    }
    return NULL;
}

int main() {
    // 初始化互斥锁
    pthread_mutex_init(&mutex, NULL);

    // 创建两个线程
    pthread_t thread1, thread2;
    pthread_create(&thread1, NULL, increment_counter, NULL);
    pthread_create(&thread2, NULL, increment_counter, NULL);

    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);

    // 销毁互斥锁
    pthread_mutex_destroy(&mutex);

    // 打印最终的计数器值
    printf("Counter value: %d\n", counter);

    return 0;
}

 在这个示例中,两个线程都会增加counter变量的值,但是由于使用了互斥锁,每次只有一个线程能够修改counter,从而避免了竞态条件。

1、进程的含义?

进程是一个程序执行的过程,会去分配内存资源,cpu的调度。每个进程都有其自己的地址空间,内存分配,以及至少一个线程(即执行路径)。进程是操作系统进行资源分配和调度的基本单位。

2、进程和程序的区别? 

程序是静态的,是存储在硬盘中数据、代码的集合。
进程是动态的,程序执行的过程包括进程的创建,调度,消亡。
1、程序是永存的,进程是暂时的
2、进程有程序状态的变化,程序没有。
3、进程可以并发,程序无并发。
4、进程与进程间会存在争夺计算机资源。
5、一个程序可以运行多次,变成多个进程。
      一个进程可以运行一个或多个程序。

计算机中内存的分布:

计算机内存的分布通常指的是内存中不同数据和程序的存储区域。在现代计算机系统中,内存(RAM)被划分为多个区域,每个区域都有特定的用途。以下是一些常见的内存分布区域:

  1. 代码段(Code Segment)

    • 存储程序的二进制指令。这部分内存是只读的,以防止程序在运行时被修改。
  2. 数据段(Data Segment)

    • 存储程序中已初始化的全局变量和静态变量。
    • 通常在程序启动时分配,并在程序结束时释放。
  3. 堆(Heap)

    • 动态内存分配区域。程序在运行时可以请求分配或释放内存。堆内存由操作系统管理,通常用于存储动态分配的数据结构,如链表、树等。
  4. 栈(Stack)

    • 用于存储局部变量、函数参数和返回地址。每个函数调用都会在栈上创建一个栈帧(Stack Frame),用于存储当前函数的局部变量和返回地址。
    • 栈是后进先出(LIFO)的数据结构,每次函数调用都会向栈顶添加数据,函数返回时从栈顶移除数据。
  5. 常量段(Constant Segment)

    • 存储程序中的常量值,这些值在程序执行过程中不会改变。
  6. BSS段(Block Started by Symbol)

    • 存储未初始化的全局变量和静态变量。BSS段在程序启动时被初始化为零。
  7. 内存映射段(Memory-Mapped Segment)

    • 用于将文件或设备映射到内存中,以便程序可以直接通过内存操作来访问文件或设备。
  8. 缓存(Cache)

    • 虽然不是内存的一部分,但CPU缓存(如L1、L2、L3缓存)是内存访问的重要组成部分,用于提高数据访问速度。
  9. 虚拟内存

    • 操作系统使用虚拟内存技术将物理内存与磁盘空间结合起来,以允许程序使用比实际物理内存更大的地址空间。

这些内存区域的分布和使用由操作系统的内存管理单元(MMU)和内存分配器负责管理。操作系统
        进程分类:
        1、交互式进程:需要用户输入或提供用户反馈的进程。
        2、批处理进程:不需要用户交互,自动执行一系列任务的进程。
        3、 守护进程 通过这些机制来确保程序能够高效、安全地使用内存资源。

进程的作用

  1. 资源分配:进程是资源分配的基本单位,操作系统通过进程来分配和管理CPU时间、内存、I/O设备等资源。

  2. 程序执行:进程是程序执行的实体,它包含了程序代码、当前活动、程序计数器、寄存器集合和进程状态等。

  3. 隔离性:每个进程都有自己独立的地址空间,这提供了一定程度的隔离,使得一个进程的崩溃不会直接影响到其他进程。

  4. 并发性:进程允许多个程序同时运行,提高了系统资源的利用率和系统的吞吐量。

  5. 独立性:每个进程都是一个独立的运行实体,拥有自己的生命周期和状态。

  6. 通信:进程间可以通过进程间通信(IPC)机制进行数据交换和同步。

  7. 调度:操作系统通过进程调度来决定哪个进程在何时使用CPU,从而实现多任务处理。

  8. 错误控制:进程提供了错误控制的边界,一个进程的错误通常不会传播到其他进程。

并发与并行的区别

  1. 并发(Concurrency)

    • 定义:并发是指在一段时间内,多个进程或任务交替执行,给用户的感觉是它们同时发生。
    • 时间共享:并发通常涉及到时间共享,即CPU在很短的时间内在多个进程之间切换,每个进程执行一小段时间。
    • 单核处理器:即使在单核处理器上,也可以通过操作系统的调度实现并发执行。
    • 目的:并发的主要目的是提高资源利用率和系统吞吐量。
  2. 并行(Parallelism)

    • 定义:并行是指多个进程或任务在同一时刻真正地同时执行。
    • 硬件支持:并行需要硬件支持,如多核处理器或多处理器系统。
    • 同时执行:并行执行意味着多个处理器或核心同时工作,每个处理器或核心可以执行不同的任务。
    • 目的:并行的主要目的是提高处理速度和性能。

总结

  • 并发是一种时间上的多任务处理,它允许多个任务在单个处理器上通过时间共享来交替执行。
  • 并行是一种空间上的多任务处理,它涉及到多个处理器或核心同时执行多个任务。

 


http://www.kler.cn/a/291672.html

相关文章:

  • 高斯数据库Postgresql死锁和锁表解决方法
  • MySQL的聚簇索引和二级索引
  • 物联网——UNIX时间戳、BKP备份寄存器、RTC时钟
  • PyTorch数据集方法
  • 鸿蒙网络编程系列48-仓颉版UDP回声服务器示例
  • Ubuntu22.04基于ROS2-Humble安装moveit2教程(亲测)
  • v$session_longops监控 PDB clone 进度
  • Elasticsearch在高并发下如何保证读写一致性
  • Git创建项目
  • 一款云笔记支持在线协同文档,脑图,白板演示的工具,多个设备同步,让灵感与你同行(附源码)
  • 深度学习实战3--GAN:基础手写数字对抗生成
  • HarmonyOS开发实战( Beta5版)不要使用函数/方法作为复用组件的入参规范实践
  • 基于vue框架的车辆交易管理系统n5xwr(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • day17JS-Cookle、webStorage和Promise
  • Day22_K8S
  • 使用GPU加速及配置
  • UNION和UNION ALL的区别
  • 假如你是HR,你怎么招「游戏策划」?
  • 创建一个Oracle版本的JDK的Docker镜像
  • taro ui 小程序at-calendar日历组件自定义样式+选择范围日历崩溃处理
  • PyTorch常用库函数:torch.acos()的详解实战使用
  • 世界时钟怎么设置?一键设置多个世界时钟 多个地区时间
  • 向量和矩阵学习笔记
  • vue3 VueUse useElementVisibility 来监听某一个元素或者div是否在当前视口viewport中可见。
  • 坐牢第三十五天(c++)
  • 智能手机、汽车新应用,星纪魅族幸运星号”卫星即将发射