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/zh-tw/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

發表回復

登錄後才能評論