Linux进程详解

一、进程基本概念

进程是指正在执行中的程序,并且具有独立运行的能力,是操作系统分配资源和时间的基本单位。进程包括进程控制块和执行代码两部分。

每个进程都有唯一的进程号(PID),并且可以通过shell命令ps来查看系统中运行的所有进程及其状态。

二、进程间通信(IPC)

在Linux中,进程间通信(IPC)是非常重要的。常见的IPC方式有:管道、信号、共享内存、消息队列等。

共享内存是较高效的进程间通信方式之一,可以允许多个进程在同一段物理内存中进行读写操作。下面是获取共享内存并进行操作的示例代码:

    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/ipc.h>
    #include <sys/shm.h>
    #include <unistd.h>
    
    #define SHMSZ 27
    
    int main() {
        char c;
        int shmid;
        key_t key = 5678;
        char *shm, *s;
        
        if((shmid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
            perror("shmget");
            exit(1);
        }
        
        if((shm = shmat(shmid, NULL, 0)) == (char *) -1) {
            perror("shmat");
            exit(1);
        }
        
        s = shm;
        
        for(c = 'a'; c <= 'z'; c++){
            *s++ = c;
        }
        
        *s = '\0';
        
        while(*shm != '*') {
            sleep(1);
        }
        
        exit(0);
    }

三、进程调度

进程调度是指操作系统根据一定的算法从就绪队列中选择下一个进程,对其进行CPU分配,从而实现多个进程并发执行的过程。

Linux内核采用了抢占式调度和时间片轮转调度算法。常用的调度算法有:先来先服务、最短作业优先、优先级调度、时间片轮转调度等。

下面是进行进程优先级调度的示例代码:

    #include <linux/sched.h>
    #include <linux/kernel.h>
    #include <linux/module.h>
    
    static int __init my_init(void) {
        printk(KERN_INFO "Hello, world!\n");
        struct task_struct * p;
        
        for_each_process(p) { //遍历所有进程
            printk(KERN_INFO "name: %s, state: %ld, pid: %d\n", p->comm, p->state, p->pid);
        }
        
        return 0;
    }
    
    static void __exit my_exit(void) {
        printk(KERN_INFO "Bye, world!\n");
    }
    
    module_init(my_init);
    module_exit(my_exit);
    MODULE_LICENSE("GPL");

四、进程状态转换

在Linux中,进程状态可以分为就绪态、运行态、挂起态等几种状态。进程状态的转换涉及到进程阻塞、挂起、唤醒等操作。

下面是进程状态转换的示例代码:

    #include <stdio.h>
    #include <signal.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main() {
        int count;
        pid_t pid;
        
        if ((pid = fork()) == -1) {
            perror("fork");
            exit(1);
        }
        
        if (pid == 0) {
            for (count = 0; count < 10; count++) {
                printf("Child: %d\n", count);
                sleep(1);
            }
            exit(0);
        } else {
            sleep(5);
            kill(pid, SIGSTOP); //挂起子进程
            printf("Parent has stopped child!\n");
            sleep(5);
            kill(pid, SIGCONT); //恢复子进程
            printf("Parent has resumed child!\n");
            
            for (count = 0; count < 10; count++) {
                printf("Parent: %d\n", count);
                sleep(1);
            }
        }
        
        exit(0);
    }

五、多线程

在Linux中,一个进程可以包含多个线程,每个线程都可以独立地运行和执行任务。线程可以大大提高程序的并发性,提高程序的效率。

下面是创建线程的示例代码:

    #include <pthread.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    void *thread_function(void *arg){
        printf("Thread function is running. Argument was %s\n", (char *) arg);
        sleep(3); //睡眠3秒
        printf("Thread function is done.\n");
        
        return NULL;
    }
    
    int main() {
        int res;
        pthread_t a_thread;
        void *thread_result;
        
        res = pthread_create(&a_thread, NULL, thread_function, "Hello world!");
        
        if (res != 0) {
            perror("Thread creation failed");
            exit(EXIT_FAILURE);
        }
        
        printf("Waiting for thread to finish...\n");
        res = pthread_join(a_thread, &thread_result);
        
        if (res != 0) {
            perror("Thread join failed");
            exit(EXIT_FAILURE);
        }
        
        printf("Thread joined, it returned %s\n", (char *) thread_result);
        printf("Main function is done.\n");
        
        exit(EXIT_SUCCESS);
    }

原创文章,作者:APXFP,如若转载,请注明出处:https://www.506064.com/n/370954.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
APXFP的头像APXFP
上一篇 2025-04-23 00:48
下一篇 2025-04-23 00:48

相关推荐

  • 如何通过jstack工具列出假死的java进程

    假死的java进程是指在运行过程中出现了某些问题导致进程停止响应,此时无法通过正常的方式关闭或者重启该进程。在这种情况下,我们可以借助jstack工具来获取该进程的进程号和线程号,…

    编程 2025-04-29
  • Java中的僵尸进程简介与解决方法

    本文将对Java中的僵尸进程进行详细阐述,并给出几种解决方法。 一、僵尸进程的概念 在操作系统中,进程是指正在执行的程序。当一个进程创建了一个子进程,而该子进程完成了任务却没有被父…

    编程 2025-04-27
  • 如何在Linux中添加用户并修改配置文件

    本文将从多个方面详细介绍在Linux系统下如何添加新用户并修改配置文件 一、添加新用户 在Linux系统下创建新用户非常简单,只需使用adduser命令即可。使用以下命令添加新用户…

    编程 2025-04-27
  • 多线程和多进程的应用

    多线程和多进程是现代编程中常用的技术,可以提高程序的效率和性能。本文将从不同的角度对多线程和多进程进行详细的介绍和应用。 一、多线程 vs 多进程 多线程和多进程都是为了实现程序并…

    编程 2025-04-27
  • Python多进程读取数据

    本文将从多个方面详细阐述在Python中如何通过多进程读取数据,并给出完整的代码示例。 一、多进程概述 在计算机科学中,进程是正在执行的程序实例。多进程是指计算机系统同时执行多个进…

    编程 2025-04-27
  • 如何解决linux jar包 invalid or corrupt jarfile问题

    对于许多开发人员和系统管理员在Linux环境下使用Java开发过程中遇到的一个常见的问题是 invalid or corrupt jarfile(无效或损坏的jar文件)错误。当您…

    编程 2025-04-27
  • 在Linux上安装JRE并配置环境变量

    本文将从以下几个方面为您详细阐述如何在Linux系统上,通过自己账户安装JRE,并且配置环境变量。 一、安装JRE 在进行安装前,我们需要下载JRE的安装包并解压,可以从官方网站下…

    编程 2025-04-27
  • 进程a与进程b共享变量s1

    本文将从多个方面对进程a与进程b共享变量s1做详细的阐述,并给出代码示例。 一、定义全局变量s1 进程a与进程b共享变量s1,意味着s1是一个全局变量。在C语言中,可以使用关键字e…

    编程 2025-04-27
  • python多进程并行循环

    在大数据时代,我们通常需要处理大量的数据。处理大数据往往需要较长的时间,影响效率。Python提供了多线程、多进程等并行处理方式来提高数据处理效率。本文将主要讲解python多进程…

    编程 2025-04-27
  • Python进程池共享内存用法介绍

    本文将从多个方面详细阐述Python进程池共享内存的相关知识,包括如何使用进程池、进程池的实现原理、进程池中的共享内存管理等。本文内容将涵盖: 一、进程池的使用 进程池是一种有效的…

    编程 2025-04-27

发表回复

登录后才能评论