进程线程笔记

进程和线程是操作系统中的重要概念,对于编程人员来说,理解和掌握进程和线程的概念是非常重要的。本文将详细介绍进程和线程的概念、特点以及在C语言中的实现方式,并附带C语言代码实例。

一、进程的概念和特点
进程是计算机中的一个执行实体,它是程序的一次执行过程。每个进程都有独立的地址空间和系统资源,包括代码段、数据段、堆栈等。进程具有以下特点:

1. 独立性:每个进程都是独立运行的,它们之间相互隔离,不会互相干扰。一个进程的崩溃不会影响其他进程的运行。

2. 并发性:多个进程可以同时运行,操作系统通过时间片轮转的方式实现进程的切换,使得多个进程可以交替执行。

3. 通信机制:进程之间通信需要使用进程间通信(IPC)机制,常见的IPC机制包括管道、消息队列、共享内存等。

4. 系统资源:每个进程都可以使用操作系统提供的系统资源,如CPU、内存等。进程可以申请和释放系统资源,但是资源的分配和管理由操作系统负责。

二、线程的概念和特点
线程是进程的一个执行流,一个进程可以包含多个线程。线程共享进程的地址空间和系统资源,它们之间可以直接通信和共享数据。线程具有以下特点:

1. 轻量级:相比于进程,线程的创建和销毁的开销较小。线程的切换也比进程的切换快速,因为线程共享进程的资源。

2. 并发性:多个线程可以同时执行,操作系统通过时间片轮转的方式实现线程的切换。多线程的并发性可以提高程序的响应速度和处理能力。

3. 共享性:线程可以直接访问进程的地址空间和系统资源,可以共享数据。多线程的共享数据需要进行同步操作,以避免数据竞争和冲突。

4. 灵活性:线程的创建和销毁比进程快,可以根据实际需求动态调整线程的数量。线程可以实现任务的并行处理,提高程序的效率。

三、进程和线程的区别
进程和线程在概念上有一些区别,主要体现在以下几个方面:

1. 资源占用:进程拥有独立的地址空间和系统资源,而线程共享进程的地址空间和系统资源。创建一个新的进程需要分配独立的地址空间和系统资源,而创建一个新的线程只需要为线程分配堆栈空间。

2. 创建销毁:进程的创建和销毁开销较大,需要进行地址空间的分配和初始化。而线程的创建和销毁开销较小,只需要分配堆栈空间和初始化线程控制块。

3. 通信共享:进程之间通信需要使用进程间通信(IPC)机制,如管道、消息队列、共享内存等。而线程可以直接访问进程的地址空间和系统资源,可以通过共享变量等方式进行通信和共享数据。

4. 并发性:进程之间的并发性较低,因为进程之间需要进行地址空间的切换和资源的分配。而线程之间的并发性较高,因为线程共享进程的资源,线程的切换开销较小。

四、C语言中的进程和线程实现
在C语言中,可以使用系统调用来创建和管理进程和线程。常用的系统调用包括fork()、exec()、wait()等用于进程管理的函数,以及pthread_create()、pthread_join()等用于线程管理的函数。

1. 进程的创建和管理:
使用fork()函数可以创建一个新的进程,新进程是原进程的副本,它们共享代码段、数据段和堆栈。父进程通过fork()函数的返回值可以判断当前是在父进程还是子进程中,并可以根据返回值执行不同的逻辑。exec()函数可以用于在当前进程中执行新的程序。wait()函数可以用于等待子进程的结束。

下面是一个简单的进程创建和管理的示例代码:

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>

int main() {
    pid_t pid;
    int status;

    // 创建一个新的进程
    pid = fork();

    if (pid < 0) {
        // 创建进程失败
        perror("fork failed");
        return 1;
    } else if (pid == 0) {
        // 子进程
        printf("Child process: PID = %d\n", getpid());
        printf("Child process: Parent PID = %d\n", getppid());
        printf("Child process: Hello, world!\n");
        sleep(2);
        printf("Child process: Exiting...\n");
        _exit(0);
    } else {
        // 父进程
        printf("Parent process: PID = %d\n", getpid());
        printf("Parent process: Child PID = %d\n", pid);
        printf("Parent process: Waiting for child...\n");
        wait(&status);
        printf("Parent process: Child exited with status %d\n", status);
        printf("Parent process: Exiting...\n");
    }

    return 0;
}


 

2. 线程的创建和管理:
使用pthread_create()函数可以创建一个新的线程,新线程与原线程共享地址空间和系统资源。创建线程时,需要指定线程的入口函数和参数。pthread_join()函数可以用于等待线程的结束,防止主线程提前结束而导致其他线程也被终止。

下面是一个简单的线程创建和管理的示例代码:
 

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

void* thread_func(void* arg) {
    int* num = (int*)arg;
    printf("Thread: Hello, world! Number = %d\n", *num);
    *num = 100;
    return NULL;
}

int main() {
    pthread_t tid;
    int num = 10;

    // 创建一个新的线程
    pthread_create(&tid, NULL, thread_func, &num);

    printf("Main thread: Waiting for thread...\n");
    pthread_join(tid, NULL);

    printf("Main thread: Thread exited. Number = %d\n", num);
    printf("Main thread: Exiting...\n");

    return 0;
}

五、总结
进程和线程是操作系统中非常重要的概念,对于编程人员来说,理解和掌握进程和线程的概念是至关重要的。进程和线程在C语言中的实现方式主要是通过系统调用来创建和管理。进程和线程的区别在于资源占用、创建销毁、通信共享和并发性等方面。通过合理地使用进程和线程,可以提高程序的并发性和效率,实现更好的性能。

以上就是关于进程和线程的读书笔记,

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值