Linux(多进程与多线程)

目录

1、进程与线程概念

1.1 进程

1.2 线程

1.3 进程与线程区别

2、多进程

2.1多进程概念

2.2 进程相关API

2.3 多进程编程

3、多线程

3.1 多线程概念

3.2 多线程相关API

3.3 多线程编程


1、进程与线程概念

1.1 进程

在计算机科学中,进程是正在执行中的程序的实例。一个进程包括程序的代码、数据、执行上下文和操作系统分配的资源。进程是操作系统中的最小执行单位,操作系统通过管理和调度进程来实现多任务处理。

以下是关于进程的一些关键概念:

  1. 程序 vs. 进程

    • 程序(Program):是一个静态的代码文件,包含了计算机指令。程序本身并没有在计算机上执行,而只是一组指令的集合。
    • 进程(Process):是程序在计算机上实际运行的实例。进程拥有自己的内存空间、寄存器、执行状态等。
  2. 进程特点

    • 独立性:每个进程都是独立运行的实体,不受其他进程的影响。
    • 并发性:多个进程可以同时执行,操作系统通过时间分片等机制实现并发。
    • 动态性:进程可以创建、运行和结束,具有生命周期。
  3. 进程状态

    • 就绪(Ready):进程已准备好执行,等待分配处理器资源。
    • 运行(Running):进程正在执行指令。
    • 阻塞(Blocked):进程等待某个事件(如输入输出完成)发生。
    • 终止(Terminated):进程执行完毕或被终止。
  4. 进程间通信: 进程可能需要相互通信和协作。常用的进程间通信方式包括管道、信号、共享内存、消息队列和套接字等。

  5. 进程调度: 操作系统负责管理和调度进程的执行。调度算法决定了哪个进程将获得处理器资源,并控制进程之间的切换。

  6. 进程控制块(PCB): PCB 是操作系统用于管理和描述进程的数据结构,包含了进程的状态、程序计数器、寄存器值、内存指针等信息。

进程是操作系统的基础概念,操作系统通过对进程的管理和调度,实现了计算机的多任务处理和资源共享。

1.2 线程

线程(Thread)是操作系统中最小的调度单位,它是进程的一个执行流程,是在进程内部进行调度和执行的基本单元。线程在同一进程内共享该进程的内存空间和资源,但每个线程拥有自己的栈空间和寄存器状态。

以下是关于线程的一些关键概念:

  1. 线程特点

    • 线程是在进程内部创建和管理的。一个进程可以包含多个线程,这些线程共享进程的资源。
    • 线程之间的切换开销较小,因为它们共享同一进程的内存空间和上下文。
    • 线程的创建和销毁通常比进程更快,因为线程共享进程的资源,不需要为每个线程都创建独立的资源。
    • 线程可以用于实现并发执行,提高系统的响应性和资源利用率。
  2. 线程与进程的关系

    • 一个进程可以包含多个线程,这些线程共享进程的代码、数据和资源。
    • 多个线程在同一进程内运行,它们之间可以进行通信和同步。
    • 多个进程则是相互独立的,拥有各自独立的内存空间和资源。
  3. 线程调度: 操作系统负责管理和调度线程的执行。不同的线程调度算法决定了哪个线程将获得处理器资源。

  4. 线程同步: 在多线程编程中,线程之间可能会互相干扰或冲突。线程同步机制,如互斥锁、信号量和条件变量,用于协调线程之间的操作,以确保数据一致性和正确性。

  5. 用户级线程和内核级线程

    • 用户级线程:线程的创建、调度和管理完全由用户程序控制,操作系统对线程无感知。
    • 内核级线程:线程的创建、调度和管理由操作系统控制,操作系统直接管理线程。

线程是操作系统中的基本调度单位,适用于需要并发执行的任务。通过多线程编程,可以充分利用多核处理器的能力,提高程序的性能和响应性。但同时,多线程编程也需要考虑到线程安全和同步的问题。

1.3 进程与线程区别

  1. 资源分配: 进程有独立的资源(内存、文件句柄等),而线程共享所属进程的资源。
  2. 切换开销: 进程之间的切换开销较大,线程之间切换开销较小。
  3. 隔离性: 进程之间相互隔离,一个进程的错误不会影响其他进程;线程共享内存,一个线程的错误可能会影响其他线程。
  4. 通信与同步: 进程通信较复杂,线程之间共享内存,通信和同步更方便但也更容易出错。

通常来说,多线程编程更轻量,可以更好地利用多核处理器,但需要更仔细地处理并发访问共享资源的问题。多进程编程相对来说更安全,但开销较大。选择使用进程还是线程取决于你的应用需求和对多任务处理的优先级。

2、多进程

2.1多进程概念

多个独立的进程在不同的地址空间中运行,相对安全但开销较大。

多进程编程是一种并发编程的方式,它利用操作系统的多进程能力来实现多个任务的并行执行。在多进程编程中,每个任务被封装为一个独立的进程,它们在不同的内存空间中运行,相互之间相对独立。这种方法可以有效利用多核处理器,提高程序的性能和响应性。

2.2 进程相关API

  1. fork() 函数:

    • 作用:创建一个新的子进程,子进程是父进程的副本,执行相同的程序代码。
    • 返回值:在父进程中,返回子进程的 PID;在子进程中,返回 0;如果失败,返回 -1。
    • 头文件:<unistd.h>
  2. exec 函数族(如 execl, execv, execle, execve 等):

    • 作用:用于在当前进程中加载并执行一个新的程序。
    • 使用不同的函数名和参数,支持不同的参数传递方式。
    • 返回值:只在出错时返回 -1,成功执行后不会返回。
  3. wait()waitpid() 函数

    • 作用:等待子进程结束,以获取子进程的退出状态。
    • wait() 阻塞调用进程,直到任意子进程退出。
    • waitpid() 允许指定要等待的子进程的 PID,可以非阻塞等待。
    • 返回值:退出的子进程 PID 或 -1(出错时)。
    • 头文件:<sys/wait.h>
  4. exit() 函数

    • 作用:终止调用进程,并返回一个状态码给父进程。
    • 参数:传递给父进程的状态码。
    • 没有返回值,直接终止进程。
  5. getpid() 函数:

    • 作用:获取当前进程的 PID(进程标识符)。
    • 返回值:当前进程的 PID。
    • 头文件:<unistd.h>
  6. getppid() 函数:

    • 作用:获取当前进程的父进程的 PID。
    • 返回值:父进程的 PID。
    • 头文件:<unistd.h>
  7. kill() 函数:

    • 作用:向指定进程发送信号。
    • 参数:目标进程的 PID 和信号编号。
    • 返回值:成功返回 0,失败返回 -1。
  8. getuid()getgid() 函数:

    • 作用:获取当前进程的用户 ID 和组 ID。
    • 返回值:用户 ID 和组 ID。
    • 头文件:<unistd.h>
  9. setuid()setgid() 函数:

    • 作用:设置当前进程的用户 ID 和组 ID。
    • 参数:要设置的用户 ID 和组 ID。
    • 返回值:成功返回 0,失败返回 -1。
  10. sleep() 函数:

    • 作用:让当前进程休眠一段指定的时间。
    • 参数:休眠时间(秒)。
    • 返回值:休眠完毕后返回剩余休眠时间(0 表示完整休眠,-1 表示休眠被中断)。

2.3 多进程编程

#include <stdio.h>
#include <unistd.h>
#include <sys/wait.h> // 包含用于等待子进程的头文件int main() {// 创建第一个子进程// 在父进程中,fork() 函数返回子进程的 PID,而在子进程中,fork() 返回 0。pid_t child1_pid = fork();if (child1_pid == -1) {// fork() 失败时返回 -1,输出错误信息并退出程序perror("Error creating child process");return 1;}if (child1_pid == 0) {// 子进程 1 逻辑printf("Child 1: My PID is %d\n", getpid());// 子进程 1 执行完毕return 0;}// 创建第二个子进程pid_t child2_pid = fork();if (child2_pid == -1) {// fork() 失败时返回 -1,输出错误信息并退出程序perror("Error creating child process");return 1;}if (child2_pid == 0) {// 子进程 2 逻辑printf("Child 2: My PID is %d\n", getpid());// 子进程 2 执行完毕return 0;}// 父进程逻辑printf("Parent: My PID is %d\n", getpid());printf("Parent: Child 1 PID is %d, Child 2 PID is %d\n", child1_pid, child2_pid);// 等待两个子进程执行完毕wait(NULL); // 等待第一个子进程wait(NULL); // 等待第二个子进程return 0;
}

运行结果

3、多线程

3.1 多线程概念

同一进程内的多个线程共享同一地址空间,更轻量但需要注意同步和共享数据。多线程编程可以提高程序的并发性和效率。然而,多线程编程需要注意处理并发访问共享资源的问题,如线程安全和竞态条件。

多线程编程是在同一个进程内创建和管理多个线程,使得这些线程可以并发执行不同的任务。每个线程共享进程的内存空间和资源,但每个线程有自己的栈空间和执行上下文。

3.2 多线程相关API

  1. pthread_create() 函数:

    • 作用:创建一个新线程。
    • 参数:新线程的引用、线程属性、线程函数和参数。
    • 返回值:成功创建线程时返回 0,否则返回错误码。
    • 头文件:<pthread.h>
  2. pthread_join() 函数:

    • 作用:等待一个线程终止,并获取它的退出状态。
    • 参数:要等待的线程的引用、线程退出状态的指针。
    • 返回值:成功返回 0,否则返回错误码。
    • 头文件:<pthread.h>
  3. pthread_exit() 函数:

    • 作用:终止当前线程,可指定线程退出状态。
    • 参数:线程退出状态。
    • 没有返回值,直接终止线程。
    • 头文件:<pthread.h>
  4. pthread_self() 函数:

    • 作用:获取当前线程的线程 ID。
    • 返回值:当前线程的线程 ID。
    • 头文件:<pthread.h>
  5. pthread_mutex_init() 函数:

    • 作用:初始化互斥锁。
    • 参数:互斥锁引用和互斥锁属性(可为 NULL)。
    • 返回值:成功返回 0,否则返回错误码。
    • 头文件:<pthread.h>
  6. pthread_mutex_lock()pthread_mutex_unlock() 函数:

    • 作用:锁定和解锁互斥锁。
    • 参数:互斥锁引用。
    • 返回值:成功返回 0,否则返回错误码。
    • 头文件:<pthread.h>
  7. pthread_mutex_destroy() 函数:

    • 作用:销毁互斥锁。
    • 参数:互斥锁引用。
    • 返回值:成功返回 0,否则返回错误码。
    • 头文件:<pthread.h>
  8. pthread_cond_init() 函数:

    • 作用:初始化条件变量。
    • 参数:条件变量引用和条件变量属性(可为 NULL)。
    • 返回值:成功返回 0,否则返回错误码。
    • 头文件:<pthread.h>
  9. pthread_cond_wait()pthread_cond_signal() 函数:

    • 作用:等待和唤醒条件变量。
    • 参数:条件变量引用和互斥锁引用。
    • 返回值:成功返回 0,否则返回错误码。
    • 头文件:<pthread.h>
  10. pthread_cond_destroy() 函数:

    • 作用:销毁条件变量。
    • 参数:条件变量引用。
    • 返回值:成功返回 0,否则返回错误码。
    • 头文件:<pthread.h>

3.3 多线程编程

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>#define NUM_THREADS 4 //创建线程数量// 共享资源
int shared_counter = 0;
pthread_mutex_t mutex; // 互斥锁// 增加计数器的函数,多个线程会同时调用这个函数
void* increment_counter(void* arg) {for (int i = 0; i < 100000; ++i) {pthread_mutex_lock(&mutex); // 加锁,开始临界区shared_counter++; // 对共享资源进行操作pthread_mutex_unlock(&mutex); // 解锁,结束临界区}return NULL;
}int main() {pthread_t threads[NUM_THREADS]; // 存储线程的数组pthread_mutex_init(&mutex, NULL); // 初始化互斥锁// 创建多个线程for (int i = 0; i < NUM_THREADS; ++i) {pthread_create(&threads[i], NULL, increment_counter, NULL);}// 等待所有线程执行完毕for (int i = 0; i < NUM_THREADS; ++i) {pthread_join(threads[i], NULL);}pthread_mutex_destroy(&mutex); // 销毁互斥锁printf("Final counter value: %d\n", shared_counter);return 0;
}

运行结果(为啥输出了三次?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/1620140.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

虚拟机搭建集群

基于3台虚拟机搭建集群架构图 1.服务器准备 使用VMware Workstation虚拟机创建虚拟服务器来搭建集群&#xff0c;所用软件及版本如下&#xff1a; VMware Workstation 12.0 CentOS-6.5-64bit 2.基础虚拟机安装 2.1新建虚拟机&#xff08;虚拟硬件&#xff09; 关键步骤&a…

【web集群简介-01】

文章目录 一、web服务基础二、集群简介 一、web服务基础 web服务器HTTP基本原理 web服务基础HTTP 1.URL / URI URL全称为Uniform Resource Location&#xff0c;统一资源定位符 URI全称为Uniform Resource Identifier&#xff0c;统一资源标识符 URN:统一资源名称 (Uniform Re…

什么是虚拟计算机集群

这个问题来自近期几位网友的私信&#xff0c;他们不约而同问到一个问题&#xff1a;什么是虚拟计算机集群&#xff1f;Laxcus分布式操作系统是如何做的&#xff1f;下面就正式回答一下这个问题。 在我们传统的认知里&#xff0c;或者大家平常比较多接触的&#xff0c;都…

Linux下的5款主流高可用集群软件介绍

Linux集群主要分成三大类:高可用集群(High Availability Cluster)、负载均衡集群(Load Balance Cluster)、科学计算集群(High Performance Computing Cluster)。 其中高可用集群具有保障应用程序持续提供服务的能力,可以将因软、硬件、人为造成的故障对业务的影响降低到最小…

高可用 - 01 闲聊高性能集群

文章目录 什么是集群集群的特点与功能1. 高可用性与可扩展性2. 负载均衡与错误恢复3. 心跳监测与漂移IP地址 集群的分类1. 高可用集群高可用的概念常见的HA集群双机冷备双机热备双机互备多机互备 高可用集群软件 2. 负载均衡集群3. 分布式计算集群 HA集群中的相关术语1&#xf…

常见集群(Cluster)软件和技术解析

集群就是通过软件将一组服务器作为一个整体向客户提供资源。这些单个的服务器就是集群的节点。当对外提供资源的节点故障后&#xff0c;集群中其余的节点能够将资源接管起来&#xff0c;继续对客户提供资源。 集群技术的核心就是资源访问控制。由于集群中所有节点都可以访问集群…

[Linux基础与服务管理——常用集群高可用软件 Keepalived]

1.Keepalived 简介 Keepalived是Linux下的一个免费的、轻量级的高可用解决方案。是一个由C语言编写的路由软件&#xff0c;主要目标是为Linux系统和基于Linux的基础架构提供简单而强大的负载平衡和高可用性设。Keepalived实现了一组检查器&#xff0c;以根据其健康状况动态地和…

集群分为几种,用的软件分别是什么?

集群分为几种&#xff0c;用的软件分别是什么? 补充&#xff1a;涉及的组件 1.1、apache 跨平台的网页服务器&#xff0c;主要使用它做静态资源服务器&#xff0c;也可以做代理服务器转发请求 1.2、ngnix 高性能的 HTTP和反向代理服务器&#xff0c;ngnix处理能力相当于apache…

轻量级集群管理软件-Ansible

ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成&#xff0c;类似于saltstack和Puppet&#xff0c;但是有一个不同和优点是我们不需要在节点中安装任何客户端 , 它使用SSH来和节点进行通信 Ansible基于 Pytho…

了解集群、集群的分类、常用的集群软硬件及选型介绍(内附详细图解)

Table of Contents 一、集群简介 二、集群的七大优点 三、集群的分类 四、常用的集群软硬件及选型介绍 一、集群简介 集群就是一组&#xff08;若干个&#xff09;相互独立的计算机&#xff0c;利用高速通信网络组成的一个较大的计算机服务系统&#xff0c;每个集群节点&…

数据I/O

I/O类型 区分同步或异步&#xff08;synchronous/asynchronous&#xff09;。 简单来说&#xff0c;同步是一种可靠的有序运行机制&#xff0c;当我们进行同步操作时&#xff0c;后续的任务是等待当前调用返回&#xff0c;才会进行下一步&#xff1b;而异步则相反&#xff0c;…

【赋权算法】Python实现熵权法

在开始之前&#xff0c;我们先说一下信息熵的概念。 当一件事情发生&#xff0c;如果是意料之中&#xff0c;那么这个事情就并不能拿来当做茶余饭后的谈资&#xff0c;我们可以说这个事情并没有什么信息和价值。而当一件不可能发生的事情发生的时候&#xff0c;我们可能就会觉…

【软件测试】大学毕业后顶着压力,巧合的开启了我人生的新篇章......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 小李&#xff1a;…

中国矿业大学徐海学院最不常见的网络工程计算机毕业设计题目推荐50例

之前有矿业大学徐海学院的童鞋在后台找我们&#xff0c;最近要准备毕业设计了&#xff0c;不会选题&#xff0c;希望可以帮忙给一些毕业设计题目&#xff0c;我整整花了一周把之前做的答辩通过的毕业设计成品进行整理&#xff0c;并精选一些容易实现且不会刷下来的题目列举下。…

电路叠加定理的例题

来看第二题 不擅长画这种图形&#xff0c;见谅 注:叠加定理中&#xff0c;电压源当导线短路处理&#xff0c;电流源当开路处理。

计算机春季高考考什么时候开始报名,2021春季高考报名时间 什么时候报名

2021春季高考报名时间是什么时候&#xff0c;小编整理了相关信息&#xff0c;来看一下&#xff01; 2021春季高考报名时间 春考招生简章公布(2020年12月下旬)&#xff1b; 春考校测方案公布(2021年1月) 春考(2021年1月)&#xff1b; 春考出分(通常为考试后两周)&#xff1b; 春…

【运维】hadoop集群安装(一)多节点安装

文章目录 一.Purpose二. Prerequisites三. Installation1. 节点规划2. Configuring Hadoop in Non-Secure Mode3. 准备工作4. 配置core-site.xmlhdfs-site.xmlyarn-site.xmlmapred-site.xmlworkers 4. 分发配置、创建文件夹5. 格式化6. 操作进程6.1. hdfs启动停止 6.2. yarn启动…

Mysql--技术文档--基本概念--《世界上最流行的关系型数据库之一》

官方网址 MySQL 阿丹&#xff1a; 作为关系型数据库管理的老大哥&#xff0c;一个合格的程序员多多少少一定要了解mysql库。 官方解释 MySQL是一个关系型数据库管理系统&#xff0c;由瑞典MySQL AB 公司开发&#xff0c;属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管…

Spring Boot中通过maven进行多环境配置

上文 java Spring Boot将不同配置拆分入不同文件管理 中 我们说到了&#xff0c;多环境的多文件区分管理 说到多环境 其实不止我们 Spring Boot有 很多的东西都有 那么 这就有一个问题 如果 spring 和 maven 都配置了环境 而且他们配的不一样 那么 会用谁的呢&#xff1f; 此…

二十年前的电脑配置单,大家见过吗?

去年搬家时&#xff0c;从角落里找到一台小时候用过的台式电脑&#xff0c;当时家人像宝贝供着&#xff0c;不让我用&#xff0c;后来出去读书&#xff0c;不知道什么时候淘汰的&#xff0c;现在放在角落里吃灰。如下图所示&#xff0c;不知道是什么牌子&#xff0c;还是挺重的…