Linux进程与线程实战:头哥操作系统实验解析

需积分: 5 1 下载量 34 浏览量 更新于2024-08-03 收藏 1KB TXT 举报
"头哥实践平台的操作系统实验提供了两个示例,一个是关于Linux中的线程操作,另一个涉及进程的创建和通信。实验旨在帮助学习者深入理解Linux内核中的线程与进程管理机制。" 实验一:Linux线程操作 在实验的第5部分,程序展示了如何在Linux中使用POSIX线程库(pthread)创建和管理线程。以下是一些关键知识点: 1. **线程创建**:`pthread_create()`函数用于创建新线程。在本例中,它接收四个参数:线程ID(tid)、线程属性(NULL表示使用默认属性)、线程执行函数(`thread1`)和传递给线程函数的参数(NULL)。线程创建成功返回0,失败则返回非0值。 2. **线程函数**:`thread1`是被创建线程执行的函数。在这个例子中,它将全局变量`i`赋值为5,并打印出线程内的`i`值。 3. **线程同步**:`pthread_join()`函数用于等待指定线程结束。在这里,主线程调用`pthread_join(id, NULL)`来等待子线程`thread1`完成。这确保了主线程不会在子线程完成之前继续执行。 4. **线程安全**:由于全局变量`i`在主线程和子线程之间共享,没有采取同步措施,可能会导致数据竞争问题。在实际应用中,需要使用互斥锁(mutex)或其他同步原语来保护共享资源。 实验二:进程创建与通信 在实验的第6部分,程序演示了如何在Linux中使用`fork()`函数创建进程,并通过`waitpid()`进行父子进程间的同步。以下是主要知识点: 1. **进程创建**:`fork()`函数创建一个与父进程几乎完全相同的子进程。在本例中,父进程`p1`成功创建后,通过判断`fork()`返回值判断当前进程是父进程还是子进程。 2. **进程标识符**:`pid_t`类型的变量`p1`、`p2`和`p3`分别保存子进程的PID。 3. **进程通信**:`waitpid()`函数用于等待指定子进程结束。父进程通过调用`waitpid()`等待子进程完成,从而实现同步。在子进程中,使用`waitpid()`可以等待其兄弟进程结束。 4. **进程树结构**:通过多次`fork()`,程序创建了一个简单的进程树。`p2`是`p1`的子进程,`p3`是`p2`的子进程。每个子进程根据其PID等待其父进程结束。 5. **进程结束**:每个进程使用`exit(EXIT_SUCCESS)`或`exit(EXIT_FAILURE)`来结束,其中`EXIT_SUCCESS`表示正常退出,`EXIT_FAILURE`表示异常退出。 这两个实验涵盖了操作系统中最基本的线程和进程概念,对于理解多线程编程和进程管理有重要作用。在实际开发中,这些基础会延伸到更复杂的并发控制、进程间通信(IPC)和系统资源调度等主题。